@128technology/yinz
Advanced tools
Comparing version 4.0.6 to 4.0.7
@@ -5,3 +5,4 @@ import BuiltInType from './BuiltInType'; | ||
import SerializationType from './SerializationType'; | ||
import Status from './Status'; | ||
import Visibility from './Visibility'; | ||
export { BuiltInType, ContextNode, OrderedBy, SerializationType, Visibility }; | ||
export { BuiltInType, ContextNode, OrderedBy, SerializationType, Status, Visibility }; |
@@ -11,4 +11,6 @@ "use strict"; | ||
exports.SerializationType = SerializationType_1.default; | ||
const Status_1 = require("./Status"); | ||
exports.Status = Status_1.default; | ||
const Visibility_1 = require("./Visibility"); | ||
exports.Visibility = Visibility_1.default; | ||
//# sourceMappingURL=index.js.map |
@@ -70,8 +70,7 @@ "use strict"; | ||
}; | ||
const dataModel = new _1.default(options); | ||
it('should parse a data model', () => { | ||
const dataModel = new _1.default(options); | ||
chai_1.expect(dataModel.root.size).to.equal(1); | ||
}); | ||
it('should get the model for a given path', () => { | ||
const dataModel = new _1.default(options); | ||
const model = dataModel.getModelForPath('stats.session.flow.add.failure'); | ||
@@ -78,0 +77,0 @@ chai_1.expect(model.name).to.equal('failure'); |
import { Element } from 'libxmljs'; | ||
import { Visibility } from '../enum'; | ||
import { Statement, Whenable } from './mixins'; | ||
import { Visibility, Status } from '../enum'; | ||
import { Statement, Whenable, WithRegistry } from './mixins'; | ||
import { IWhen } from './mixins/Whenable'; | ||
import { Model, Case } from './'; | ||
export default class Choice implements Statement, Whenable { | ||
export default class Choice implements Statement, Whenable, WithRegistry { | ||
private static CASE_TYPES; | ||
@@ -13,2 +13,3 @@ private static isCase(el); | ||
description: string; | ||
isObsolete: boolean; | ||
isPrototype: boolean; | ||
@@ -23,2 +24,3 @@ isVisible: boolean; | ||
path: string; | ||
status: Status; | ||
visibility: Visibility | null; | ||
@@ -30,2 +32,3 @@ when: IWhen[]; | ||
getName: (camelCase?: boolean) => string; | ||
register: (parentModel: Model, thisModel: Model | Choice) => void; | ||
constructor(el: Element, parentModel?: Model); | ||
@@ -32,0 +35,0 @@ readonly caseNames: string[]; |
@@ -19,2 +19,3 @@ "use strict"; | ||
}.bind(this)()); | ||
this.register(parentModel, this); | ||
} | ||
@@ -39,3 +40,3 @@ static isCase(el) { | ||
exports.default = Choice; | ||
applyMixins_1.default(Choice, [mixins_1.Statement, mixins_1.Whenable]); | ||
applyMixins_1.default(Choice, [mixins_1.Statement, mixins_1.Whenable, mixins_1.WithRegistry]); | ||
//# sourceMappingURL=Choice.js.map |
import { Element } from 'libxmljs'; | ||
import { ContainerInstance, Instance } from '../instance'; | ||
import { Visibility } from '../enum'; | ||
import { Statement, Searchable, Whenable } from './mixins'; | ||
import { Visibility, Status } from '../enum'; | ||
import { Statement, Whenable, WithRegistry } from './mixins'; | ||
import { IWhen } from './mixins/Whenable'; | ||
import { Model, Case, Choice, Identities } from './'; | ||
export default class Container implements Statement, Searchable, Whenable { | ||
import { Model, Case, Choice, Identities, ModelRegistry } from './'; | ||
export default class Container implements Statement, Whenable, WithRegistry { | ||
children: Map<string, Model>; | ||
@@ -13,4 +13,6 @@ choiceCase: Case; | ||
identities: Identities; | ||
isObsolete: boolean; | ||
isPrototype: boolean; | ||
isVisible: boolean; | ||
modelRegistry: ModelRegistry; | ||
modelType: string; | ||
@@ -22,2 +24,3 @@ name: string; | ||
path: string; | ||
status: Status; | ||
presence: string; | ||
@@ -30,5 +33,4 @@ visibility: Visibility | null; | ||
getName: (camelCase?: boolean) => string; | ||
handleNoMatch: () => void; | ||
isMatch: (segments: string[]) => boolean; | ||
constructor(el: Element, parentModel?: Model, identities?: Identities); | ||
register: (parentModel: Model, thisModel: Model | Choice) => void; | ||
constructor(el: Element, parentModel?: Model, identities?: Identities, modelRegistry?: ModelRegistry); | ||
isPresenceContainer(): boolean; | ||
@@ -40,3 +42,2 @@ getPresenceDescription(): string; | ||
buildInstance(config: Element, parent?: Instance): ContainerInstance; | ||
getModelForPath(segments: string[]): Model | Choice; | ||
} |
@@ -10,3 +10,3 @@ "use strict"; | ||
class Container { | ||
constructor(el, parentModel, identities) { | ||
constructor(el, parentModel, identities, modelRegistry) { | ||
this.modelType = 'container'; | ||
@@ -16,2 +16,3 @@ this.addStatementProps(el, parentModel); | ||
this.identities = identities; | ||
this.modelRegistry = modelRegistry; | ||
const { children, choices } = childBuilder_1.buildChildren(el, this); | ||
@@ -21,2 +22,8 @@ this.children = children; | ||
this.presence = parsers_1.PresenceParser.parse(el); | ||
if (this.modelRegistry) { | ||
this.modelRegistry.addModel(this); | ||
} | ||
else { | ||
this.register(parentModel, this); | ||
} | ||
} | ||
@@ -41,18 +48,5 @@ isPresenceContainer() { | ||
} | ||
getModelForPath(segments) { | ||
if (this.isMatch(segments)) { | ||
return this; | ||
} | ||
else if (this.children.has(segments[0])) { | ||
const firstSegment = segments.shift(); | ||
return this.children.get(firstSegment).getModelForPath(segments); | ||
} | ||
else if (this.choices.has(segments[0]) && segments.length === 1) { | ||
return this.choices.get(segments[0]); | ||
} | ||
this.handleNoMatch(); | ||
} | ||
} | ||
exports.default = Container; | ||
applyMixins_1.default(Container, [mixins_1.Statement, mixins_1.Searchable, mixins_1.Whenable]); | ||
applyMixins_1.default(Container, [mixins_1.Statement, mixins_1.Whenable, mixins_1.WithRegistry]); | ||
//# sourceMappingURL=Container.js.map |
import { Element } from 'libxmljs'; | ||
import { Container, Model, Choice, Identities } from './'; | ||
import { Container, Model, Choice, Identities, ModelRegistry } from './'; | ||
export interface IOptions { | ||
@@ -13,4 +13,5 @@ modelElement: Element; | ||
}; | ||
modelRegistry: ModelRegistry; | ||
constructor(options: IOptions); | ||
getModelForPath(path: string): Model | Choice; | ||
} |
@@ -6,4 +6,4 @@ "use strict"; | ||
const _1 = require("./"); | ||
function parseConsolidatedModel(modelXML, identities) { | ||
const rootContainer = new _1.Container(modelXML, undefined, identities); | ||
function parseConsolidatedModel(modelXML, identities, modelRegistry) { | ||
const rootContainer = new _1.Container(modelXML, undefined, identities, modelRegistry); | ||
const root = new Map(); | ||
@@ -19,12 +19,11 @@ root.set(rootContainer.name, rootContainer); | ||
this.namespaces = parsers_1.NamespacesParser.parse(modelElement); | ||
this.root = parseConsolidatedModel(rootEl, this.identities); | ||
this.modelRegistry = new _1.ModelRegistry(); | ||
this.root = parseConsolidatedModel(rootEl, this.identities, this.modelRegistry); | ||
} | ||
getModelForPath(path) { | ||
const segments = path.split('.'); | ||
if (segments.length > 0 && this.root.has(segments[0])) { | ||
const head = segments.shift(); | ||
return this.root.get(head).getModelForPath(segments); | ||
if (this.modelRegistry.registry.has(path)) { | ||
return this.modelRegistry.registry.get(path); | ||
} | ||
else { | ||
throw new Error(`Path must have at least one segment and start with ${[...this.root.keys()][0]}.`); | ||
throw new Error(`Model not found for path ${path}`); | ||
} | ||
@@ -31,0 +30,0 @@ } |
@@ -10,3 +10,4 @@ import Case from './Case'; | ||
import Model from './Model'; | ||
export { Case, Choice, Container, Identities, Leaf, LeafList, List, Model }; | ||
import ModelRegistry from './ModelRegistry'; | ||
export { Case, Choice, Container, Identities, Leaf, LeafList, List, Model, ModelRegistry }; | ||
export default DataModel; |
@@ -18,3 +18,5 @@ "use strict"; | ||
exports.List = List_1.default; | ||
const ModelRegistry_1 = require("./ModelRegistry"); | ||
exports.ModelRegistry = ModelRegistry_1.default; | ||
exports.default = DataModel_1.default; | ||
//# sourceMappingURL=index.js.map |
import { Element } from 'libxmljs'; | ||
import { Visibility } from '../enum'; | ||
import { Visibility, Status } from '../enum'; | ||
import { LeafInstance, Instance } from '../instance'; | ||
import { Type } from '../types'; | ||
import { Statement, Searchable, Typed, Whenable, WithIdentities } from './mixins'; | ||
import { Statement, Typed, Whenable, WithIdentities, WithRegistry } from './mixins'; | ||
import { IWhen } from './mixins/Whenable'; | ||
import { Model, Case, Identities } from './'; | ||
export default class Leaf implements Statement, Searchable, Typed, Whenable, WithIdentities { | ||
import { Model, Case, Identities, Choice } from './'; | ||
export default class Leaf implements Statement, Typed, Whenable, WithIdentities, WithRegistry { | ||
choiceCase: Case; | ||
@@ -13,2 +13,3 @@ default: string; | ||
identities: Identities; | ||
isObsolete: boolean; | ||
isPrototype: boolean; | ||
@@ -23,2 +24,3 @@ isVisible: boolean; | ||
path: string; | ||
status: Status; | ||
type: Type; | ||
@@ -33,4 +35,3 @@ visibility: Visibility | null; | ||
getName: (camelCase?: boolean) => string; | ||
handleNoMatch: () => void; | ||
isMatch: (segments: string[]) => boolean; | ||
register: (parentModel: Model, thisModel: Model | Choice) => void; | ||
constructor(el: Element, parentModel?: Model); | ||
@@ -40,5 +41,4 @@ readonly isKey: boolean; | ||
buildInstance(config: Element, parent?: Instance): LeafInstance; | ||
getModelForPath(segments: string[]): Model; | ||
getResolvedType(): Type; | ||
private parseDefault(el); | ||
} |
@@ -19,2 +19,3 @@ "use strict"; | ||
this.parseDefault(el); | ||
this.register(parentModel, this); | ||
} | ||
@@ -30,8 +31,2 @@ get isKey() { | ||
} | ||
getModelForPath(segments) { | ||
if (this.isMatch(segments)) { | ||
return this; | ||
} | ||
this.handleNoMatch(); | ||
} | ||
getResolvedType() { | ||
@@ -51,3 +46,3 @@ return this.type instanceof types_1.DerivedType ? this.type.baseType : this.type; | ||
exports.default = Leaf; | ||
applyMixins_1.default(Leaf, [mixins_1.Statement, mixins_1.Searchable, mixins_1.Typed, mixins_1.Whenable, mixins_1.WithIdentities]); | ||
applyMixins_1.default(Leaf, [mixins_1.Statement, mixins_1.Typed, mixins_1.Whenable, mixins_1.WithIdentities, mixins_1.WithRegistry]); | ||
//# sourceMappingURL=Leaf.js.map |
import { Element } from 'libxmljs'; | ||
import { OrderedBy, Visibility } from '../enum'; | ||
import { OrderedBy, Visibility, Status } from '../enum'; | ||
import { LeafListInstance, Instance } from '../instance/index'; | ||
import { Type } from '../types'; | ||
import { ListLike, Statement, Searchable, Typed, Whenable, WithIdentities } from './mixins'; | ||
import { ListLike, Statement, Typed, Whenable, WithIdentities, WithRegistry } from './mixins'; | ||
import { IWhen } from './mixins/Whenable'; | ||
import { Model, Case, Identities } from './'; | ||
export default class LeafList implements ListLike, Statement, Searchable, Typed, Whenable, WithIdentities { | ||
import { Model, Case, Identities, Choice } from './'; | ||
export default class LeafList implements ListLike, Statement, Typed, Whenable, WithIdentities, WithRegistry { | ||
choiceCase: Case; | ||
description: string; | ||
identities: Identities; | ||
isObsolete: boolean; | ||
isPrototype: boolean; | ||
@@ -24,2 +25,3 @@ isVisible: boolean; | ||
path: string; | ||
status: Status; | ||
type: Type; | ||
@@ -35,7 +37,5 @@ visibility: Visibility | null; | ||
getName: (camelCase?: boolean) => string; | ||
handleNoMatch: () => void; | ||
isMatch: (segments: string[]) => boolean; | ||
register: (parentModel: Model, thisModel: Model | Choice) => void; | ||
constructor(el: Element, parentModel?: Model); | ||
buildInstance(config: Element, parent?: Instance): LeafListInstance; | ||
getModelForPath(segments: string[]): Model; | ||
} |
@@ -14,2 +14,3 @@ "use strict"; | ||
this.addWhenableProps(el); | ||
this.register(parentModel, this); | ||
} | ||
@@ -19,11 +20,5 @@ buildInstance(config, parent) { | ||
} | ||
getModelForPath(segments) { | ||
if (this.isMatch(segments)) { | ||
return this; | ||
} | ||
this.handleNoMatch(); | ||
} | ||
} | ||
exports.default = LeafList; | ||
applyMixins_1.default(LeafList, [mixins_1.ListLike, mixins_1.Statement, mixins_1.Searchable, mixins_1.Typed, mixins_1.Whenable, mixins_1.WithIdentities]); | ||
applyMixins_1.default(LeafList, [mixins_1.ListLike, mixins_1.Statement, mixins_1.Typed, mixins_1.Whenable, mixins_1.WithIdentities, mixins_1.WithRegistry]); | ||
//# sourceMappingURL=LeafList.js.map |
import { Element } from 'libxmljs'; | ||
import { ListInstance, Instance } from '../instance'; | ||
import { OrderedBy, Visibility } from '../enum'; | ||
import { Statement, ListLike, Searchable, Whenable } from './mixins'; | ||
import { OrderedBy, Visibility, Status } from '../enum'; | ||
import { Statement, ListLike, Whenable, WithRegistry } from './mixins'; | ||
import { IWhen } from './mixins/Whenable'; | ||
import { Model, Case, Choice, Identities } from './'; | ||
export default class List implements ListLike, Statement, Searchable, Whenable { | ||
export default class List implements ListLike, Statement, Whenable, WithRegistry { | ||
private static getKeys(el); | ||
@@ -14,2 +14,3 @@ children: Map<string, Model>; | ||
identities: Identities; | ||
isObsolete: boolean; | ||
isPrototype: boolean; | ||
@@ -27,2 +28,3 @@ isVisible: boolean; | ||
path: string; | ||
status: Status; | ||
visibility: Visibility | null; | ||
@@ -35,4 +37,3 @@ when: IWhen[]; | ||
getName: (camelCase?: boolean) => string; | ||
handleNoMatch: () => void; | ||
isMatch: (segments: string[]) => boolean; | ||
register: (parentModel: Model, thisModel: Model | Choice) => void; | ||
constructor(el: Element, parentModel?: Model, identities?: Identities); | ||
@@ -44,3 +45,2 @@ hasChild(name: string): boolean; | ||
buildInstance(config: Element, parent?: Instance): ListInstance; | ||
getModelForPath(segments: string[]): Model | Choice; | ||
} |
@@ -26,2 +26,3 @@ "use strict"; | ||
this.choices = choices; | ||
this.register(parentModel, this); | ||
} | ||
@@ -43,18 +44,5 @@ hasChild(name) { | ||
} | ||
getModelForPath(segments) { | ||
if (this.isMatch(segments)) { | ||
return this; | ||
} | ||
else if (this.children.has(segments[0])) { | ||
const firstSegment = segments.shift(); | ||
return this.children.get(firstSegment).getModelForPath(segments); | ||
} | ||
else if (this.choices.has(segments[0]) && segments.length === 1) { | ||
return this.choices.get(segments[0]); | ||
} | ||
this.handleNoMatch(); | ||
} | ||
} | ||
exports.default = List; | ||
applyMixins_1.default(List, [mixins_1.ListLike, mixins_1.Statement, mixins_1.Searchable, mixins_1.Whenable]); | ||
applyMixins_1.default(List, [mixins_1.ListLike, mixins_1.Statement, mixins_1.Whenable, mixins_1.WithRegistry]); | ||
//# sourceMappingURL=List.js.map |
@@ -6,2 +6,3 @@ "use strict"; | ||
const applyMixins_1 = require("../../../util/applyMixins"); | ||
const enum_1 = require("../../../enum"); | ||
const ns_1 = require("../../../util/ns"); | ||
@@ -36,2 +37,3 @@ const _1 = require("../"); | ||
<t128ext:test/> | ||
<yin:status>current</yin:status> | ||
<t128-internal:visibility>visible</t128-internal:visibility> | ||
@@ -71,2 +73,8 @@ <yin:description> | ||
`); | ||
const obsolete = xmlUtil_1.default.toElement(` | ||
<yin:leaf name="name" ${xmlUtil_1.yinNS}> | ||
<yin:type name="string" /> | ||
<yin:status>obsolete</yin:status> | ||
</yin:leaf> | ||
`); | ||
const withKebabCase = xmlUtil_1.default.toElement(` | ||
@@ -95,2 +103,18 @@ <yin:leaf name="name-with-dashes" ${xmlUtil_1.yinNS}></yin:leaf> | ||
}); | ||
it('should have a status', () => { | ||
const statement = new Test(withDescription); | ||
chai_1.expect(statement.status).to.equal(enum_1.Status.current); | ||
}); | ||
it('should determine if a field itself is obsolete', () => { | ||
const statement = new Test(obsolete); | ||
chai_1.expect(statement.isObsolete).to.equal(true); | ||
}); | ||
it('should determine if a field is obsolete if it has an obsolete ancestor', () => { | ||
const statement = new Test(withoutDescription, { isObsolete: true }); | ||
chai_1.expect(statement.isObsolete).to.equal(true); | ||
}); | ||
it('should determine if a field is not obsolete', () => { | ||
const statement = new Test(withoutDescription); | ||
chai_1.expect(statement.isObsolete).to.equal(false); | ||
}); | ||
it('should determine its visibility if specified', () => { | ||
@@ -97,0 +121,0 @@ const statement = new Test(withDescription); |
import ListLike from './ListLike'; | ||
import Statement from './Statement'; | ||
import Searchable from './Searchable'; | ||
import Typed from './Typed'; | ||
import Whenable from './Whenable'; | ||
import WithIdentities from './WithIdentities'; | ||
export { ListLike, Statement, Searchable, Typed, Whenable, WithIdentities }; | ||
import WithRegistry from './WithRegistry'; | ||
export { ListLike, Statement, Typed, Whenable, WithIdentities, WithRegistry }; |
@@ -7,4 +7,2 @@ "use strict"; | ||
exports.Statement = Statement_1.default; | ||
const Searchable_1 = require("./Searchable"); | ||
exports.Searchable = Searchable_1.default; | ||
const Typed_1 = require("./Typed"); | ||
@@ -16,2 +14,4 @@ exports.Typed = Typed_1.default; | ||
exports.WithIdentities = WithIdentities_1.default; | ||
const WithRegistry_1 = require("./WithRegistry"); | ||
exports.WithRegistry = WithRegistry_1.default; | ||
//# sourceMappingURL=index.js.map |
import { Element } from 'libxmljs'; | ||
import { Visibility } from '../../enum'; | ||
import { Visibility, Status } from '../../enum'; | ||
import { Model, Case } from '../'; | ||
@@ -10,2 +10,3 @@ export default class Statement { | ||
parentModel: Model; | ||
status: Status; | ||
visibility: Visibility | null; | ||
@@ -17,3 +18,4 @@ choiceCase: Case; | ||
readonly isPrototype: boolean; | ||
readonly isObsolete: boolean; | ||
getName(camelCase?: boolean): string; | ||
} |
@@ -14,2 +14,3 @@ "use strict"; | ||
this.visibility = parsers_1.VisibilityParser.parse(el); | ||
this.status = parsers_1.StatusParser.parse(el); | ||
this.otherProps = parsers_1.PropertiesParser.parse(el); | ||
@@ -29,2 +30,5 @@ } | ||
} | ||
get isObsolete() { | ||
return this.status !== null ? this.status === enum_1.Status.obsolete : _.get(this, 'parentModel.isObsolete', false); | ||
} | ||
getName(camelCase = false) { | ||
@@ -31,0 +35,0 @@ return camelCase ? _.camelCase(this.name) : this.name; |
@@ -41,2 +41,34 @@ "use strict"; | ||
}); | ||
describe('Status Parser', () => { | ||
it('should parse current nodes', () => { | ||
const el = xmlUtil_1.default.toElement(` | ||
<mock ${xmlUtil_1.yinNS}> | ||
<yin:status>current</yin:status> | ||
</mock> | ||
`); | ||
chai_1.expect(Parsers.StatusParser.parse(el)).to.equal(enum_1.Status.current); | ||
}); | ||
it('should parse deprecated nodes', () => { | ||
const el = xmlUtil_1.default.toElement(` | ||
<mock ${xmlUtil_1.yinNS}> | ||
<yin:status>deprecated</yin:status> | ||
</mock> | ||
`); | ||
chai_1.expect(Parsers.StatusParser.parse(el)).to.equal(enum_1.Status.deprecated); | ||
}); | ||
it('should parse obsolete nodes', () => { | ||
const el = xmlUtil_1.default.toElement(` | ||
<mock ${xmlUtil_1.yinNS}> | ||
<yin:status>obsolete</yin:status> | ||
</mock> | ||
`); | ||
chai_1.expect(Parsers.StatusParser.parse(el)).to.equal(enum_1.Status.obsolete); | ||
}); | ||
it('should parse nodes with no status', () => { | ||
const el = xmlUtil_1.default.toElement(` | ||
<mock ${xmlUtil_1.yinNS} /> | ||
`); | ||
chai_1.expect(Parsers.StatusParser.parse(el)).to.equal(null); | ||
}); | ||
}); | ||
describe('Max Elements Parser', () => { | ||
@@ -43,0 +75,0 @@ it('should parse max elements nodes', () => { |
import { Element } from 'libxmljs'; | ||
import { OrderedBy, Visibility } from '../../enum'; | ||
import { OrderedBy, Visibility, Status } from '../../enum'; | ||
import ContextNode from '../../enum/ContextNode'; | ||
@@ -8,2 +8,5 @@ export { default as TypeParser } from '../../types/util/TypeParser'; | ||
} | ||
export declare class StatusParser { | ||
static parse(el: Element): Status; | ||
} | ||
export declare class MaxElementsParser { | ||
@@ -10,0 +13,0 @@ static parse(el: Element): number; |
@@ -20,2 +20,9 @@ "use strict"; | ||
exports.VisibilityParser = VisibilityParser; | ||
class StatusParser { | ||
static parse(el) { | ||
const statusElem = el.get('./yin:status', ns_1.default); | ||
return statusElem ? enum_1.Status[statusElem.text()] : null; | ||
} | ||
} | ||
exports.StatusParser = StatusParser; | ||
class MaxElementsParser { | ||
@@ -22,0 +29,0 @@ static parse(el) { |
{ | ||
"name": "@128technology/yinz", | ||
"version": "4.0.6", | ||
"version": "4.0.7", | ||
"description": "A module for injesting a YIN datamodel and handling instance data.", | ||
@@ -5,0 +5,0 @@ "main": "dist/index.js", |
# Yinz [![Build Status](https://travis-ci.org/128technology/yinz.svg?branch=master)](https://travis-ci.org/128technology/yinz) [![npm version](https://badge.fury.io/js/%40128technology%2Fyinz.svg)](https://badge.fury.io/js/%40128technology%2Fyinz) | ||
A library for Node.js that can parse YIN ([RFC 6020](https://tools.ietf.org/html/rfc6020)) models and ingest XML instance data associated with them. | ||
A library for Node.js that can parse YIN ([RFC 6020](https://tools.ietf.org/html/rfc6020)) models and ingest XML instance data associated with them. Note that is library is designed to work with consolidated XML models produced by [YINsolidated](https://github.com/128technology/yinsolidated), it will not work on standard YIN models. | ||
This library aims to accomplish the following: | ||
* Ingest XML datamodels produced by [YINsolidated](https://github.com/128technology/yinsolidated). | ||
* Allow querying and walking of the ingested models, including support for the types outlined in [RFC 6020](https://tools.ietf.org/html/rfc6020). | ||
* Ingest an XML instance of data matching the ingested datamodel. This typically comes from a [NETCONF](https://tools.ietf.org/html/rfc6241) response. | ||
* Allow querying of the instance data, including evaluation of when conditions, leaf references, etc. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
404703
324
5600
10