rubyang 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +13 -2
- data/README.md +2 -3
- data/lib/rubyang/database/data_tree.rb +494 -130
- data/lib/rubyang/database/schema_tree.rb +541 -293
- data/lib/rubyang/database.rb +10 -0
- data/lib/rubyang/logger.rb +19 -0
- data/lib/rubyang/model/parser/parser.tab.rb +919 -901
- data/lib/rubyang/model/parser/parser.y +9 -1
- data/lib/rubyang/model/parser.rb +48 -18
- data/lib/rubyang/model.rb +16 -1
- data/lib/rubyang/version.rb +1 -1
- data/lib/rubyang/xpath/parser/parser.tab.rb +561 -548
- data/lib/rubyang/xpath/parser/parser.y +74 -78
- data/lib/rubyang/xpath/parser.rb +12 -2
- data/lib/rubyang/xpath.rb +342 -105
- data/lib/rubyang.rb +1 -0
- data/rubyang.gemspec +2 -2
- metadata +8 -7
data/lib/rubyang/xpath.rb
CHANGED
@@ -1,12 +1,220 @@
|
|
1
1
|
# coding utf-8
|
2
2
|
|
3
3
|
require_relative 'xpath/parser'
|
4
|
+
require_relative 'database/data_tree'
|
4
5
|
|
5
6
|
module Rubyang
|
6
7
|
module Xpath
|
7
|
-
|
8
|
-
|
9
|
-
|
8
|
+
module BasicType
|
9
|
+
class NodeSet
|
10
|
+
include Enumerable
|
11
|
+
|
12
|
+
attr_reader :value
|
13
|
+
def initialize value=[]
|
14
|
+
raise "#{self.class} argument must be Array but #{value.class}" unless Array === value
|
15
|
+
value.each{ |v|
|
16
|
+
unless Rubyang::Database::DataTree::Node === v
|
17
|
+
raise "#{self.class} argument must be Rubyang::Database::DataTree::Node but #{v.class}"
|
18
|
+
end
|
19
|
+
}
|
20
|
+
@value = value
|
21
|
+
end
|
22
|
+
|
23
|
+
def each
|
24
|
+
@value.each do |v|
|
25
|
+
yield v
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_boolean
|
30
|
+
value = if @value == [] then false else true end
|
31
|
+
Boolean.new value
|
32
|
+
end
|
33
|
+
|
34
|
+
def == right
|
35
|
+
@value.each{ |v|
|
36
|
+
unless Rubyang::Database::DataTree::Leaf === v
|
37
|
+
raise "#{self.class} argument must be Rubyang::Database::DataTree::Leaf but #{v.class}"
|
38
|
+
end
|
39
|
+
}
|
40
|
+
case right
|
41
|
+
when NodeSet
|
42
|
+
right.value.each{ |v|
|
43
|
+
unless Rubyang::Database::DataTree::Leaf === v
|
44
|
+
raise "#{right.class} argument must be Rubyang::Database::DataTree::Leaf but #{v.class}"
|
45
|
+
end
|
46
|
+
}
|
47
|
+
value = if (@value.map{ |v| v.value } & right.value.map{ |v| v.value }).size > 0 then true else false end
|
48
|
+
Boolean.new value
|
49
|
+
when Boolean
|
50
|
+
value = if @value.size > 0
|
51
|
+
if right.value then true else false end
|
52
|
+
else
|
53
|
+
if right.value then false else true end
|
54
|
+
end
|
55
|
+
Boolean.new value
|
56
|
+
when Number
|
57
|
+
value = @value.any?{ |v| Float(v.value) == right.value rescue false }
|
58
|
+
Boolean.new value
|
59
|
+
when String
|
60
|
+
value = @value.any?{ |v| v.value == right.value }
|
61
|
+
Boolean.new value
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def != right
|
66
|
+
value = ! (self == right).value
|
67
|
+
Boolean.new value
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class Boolean
|
72
|
+
attr_reader :value
|
73
|
+
def initialize value
|
74
|
+
raise "#{self.class} argument must be true or false but #{value.class}" unless [true, false].include?( value )
|
75
|
+
@value = value
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_boolean
|
79
|
+
self
|
80
|
+
end
|
81
|
+
|
82
|
+
def and right
|
83
|
+
value = (@value and right.to_boolean.value)
|
84
|
+
Boolean.new value
|
85
|
+
end
|
86
|
+
|
87
|
+
def or right
|
88
|
+
value = (@value or right.to_boolean.value)
|
89
|
+
Boolean.new value
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class Number
|
94
|
+
attr_reader :value
|
95
|
+
def initialize value
|
96
|
+
@value = Float(value)
|
97
|
+
end
|
98
|
+
|
99
|
+
def to_boolean
|
100
|
+
value = if @value == Float(0) then false else true end
|
101
|
+
Boolean.new value
|
102
|
+
end
|
103
|
+
|
104
|
+
def -@
|
105
|
+
value = (- @value)
|
106
|
+
Number.new value
|
107
|
+
end
|
108
|
+
|
109
|
+
def + right
|
110
|
+
case right
|
111
|
+
when Number
|
112
|
+
value = (@value + right.value)
|
113
|
+
Number.new value
|
114
|
+
else
|
115
|
+
raise
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def - right
|
120
|
+
case right
|
121
|
+
when Number
|
122
|
+
value = (@value - right.value)
|
123
|
+
Number.new value
|
124
|
+
else
|
125
|
+
raise
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def * right
|
130
|
+
case right
|
131
|
+
when Number
|
132
|
+
value = (@value * right.value)
|
133
|
+
Number.new value
|
134
|
+
else
|
135
|
+
raise
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def / right
|
140
|
+
case right
|
141
|
+
when Number
|
142
|
+
value = (@value / right.value)
|
143
|
+
Number.new value
|
144
|
+
else
|
145
|
+
raise
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def == right
|
150
|
+
case right
|
151
|
+
when Number
|
152
|
+
value = (@value == right.value)
|
153
|
+
Boolean.new value
|
154
|
+
else
|
155
|
+
raise
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def != right
|
160
|
+
case right
|
161
|
+
when Number
|
162
|
+
value = (@value != right.value)
|
163
|
+
Boolean.new value
|
164
|
+
else
|
165
|
+
raise
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
class String
|
171
|
+
attr_reader :value
|
172
|
+
def initialize value
|
173
|
+
@value = value
|
174
|
+
end
|
175
|
+
|
176
|
+
def to_boolean
|
177
|
+
value = if @value == '' then false else true end
|
178
|
+
Boolean.new value
|
179
|
+
end
|
180
|
+
|
181
|
+
def == right
|
182
|
+
case right
|
183
|
+
when String
|
184
|
+
value = (@value == right.value)
|
185
|
+
Boolean.new value
|
186
|
+
else
|
187
|
+
raise
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
def != right
|
192
|
+
case right
|
193
|
+
when String
|
194
|
+
value = (@value != right.value)
|
195
|
+
Boolean.new value
|
196
|
+
else
|
197
|
+
raise
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
class Expr
|
204
|
+
attr_reader :op
|
205
|
+
def initialize op
|
206
|
+
@op = op
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
class LocationPath
|
211
|
+
attr_reader :location_step_sequence
|
212
|
+
def initialize *location_step_sequence
|
213
|
+
@location_step_sequence = location_step_sequence
|
214
|
+
end
|
215
|
+
def add *location_step_sequence
|
216
|
+
@location_step_sequence.push *location_step_sequence
|
217
|
+
self
|
10
218
|
end
|
11
219
|
end
|
12
220
|
|
@@ -86,139 +294,168 @@ module Rubyang
|
|
86
294
|
end
|
87
295
|
|
88
296
|
class Predicate
|
89
|
-
|
297
|
+
attr_reader :expr
|
298
|
+
def initialize expr
|
299
|
+
@expr = expr
|
90
300
|
end
|
301
|
+
end
|
91
302
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end
|
303
|
+
class OrExpr
|
304
|
+
attr_reader :op1, :op2
|
305
|
+
def initialize op1, op2=nil
|
306
|
+
@op1 = op1
|
307
|
+
@op2 = op2
|
98
308
|
end
|
309
|
+
end
|
99
310
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
311
|
+
class AndExpr
|
312
|
+
attr_reader :op1, :op2
|
313
|
+
def initialize op1, op2=nil
|
314
|
+
@op1 = op1
|
315
|
+
@op2 = op2
|
106
316
|
end
|
317
|
+
end
|
107
318
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
end
|
319
|
+
class EqualityExpr
|
320
|
+
attr_reader :op1, :operator, :op2
|
321
|
+
def initialize op1, operator=nil, op2=nil
|
322
|
+
@op1 = op1
|
323
|
+
@operator = operator
|
324
|
+
@op2 = op2
|
115
325
|
end
|
326
|
+
end
|
116
327
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
end
|
328
|
+
class RelationalExpr
|
329
|
+
attr_reader :op1, :operator, :op2
|
330
|
+
def initialize op1, operator=nil, op2=nil
|
331
|
+
@op1 = op1
|
332
|
+
@operator = operator
|
333
|
+
@op2 = op2
|
124
334
|
end
|
335
|
+
end
|
125
336
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
end
|
337
|
+
class AdditiveExpr
|
338
|
+
attr_reader :op1, :operator, :op2
|
339
|
+
def initialize op1, operator=nil, op2=nil
|
340
|
+
@op1 = op1
|
341
|
+
@operator = operator
|
342
|
+
@op2 = op2
|
133
343
|
end
|
344
|
+
end
|
134
345
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
end
|
346
|
+
class MultiplicativeExpr
|
347
|
+
attr_reader :op1, :operator, :op2
|
348
|
+
def initialize op1, operator=nil, op2=nil
|
349
|
+
@op1 = op1
|
350
|
+
@operator = operator
|
351
|
+
@op2 = op2
|
142
352
|
end
|
353
|
+
end
|
143
354
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
end
|
355
|
+
class UnaryExpr
|
356
|
+
attr_reader :op1, :operator
|
357
|
+
def initialize op1, operator=nil
|
358
|
+
@op1 = op1
|
359
|
+
@operator = operator
|
150
360
|
end
|
361
|
+
end
|
151
362
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
end
|
363
|
+
class UnionExpr
|
364
|
+
attr_reader :op1, :operator, :op2
|
365
|
+
def initialize op1, operator=nil, op2=nil
|
366
|
+
@op1 = op1
|
367
|
+
@operator = operator
|
368
|
+
@op2 = op2
|
159
369
|
end
|
370
|
+
end
|
160
371
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
end
|
372
|
+
class PathExpr
|
373
|
+
attr_reader :op1, :operator, :op2
|
374
|
+
def initialize op1, operator=nil, op2=nil
|
375
|
+
@op1 = op1
|
376
|
+
@operator = operator
|
377
|
+
@op2 = op2
|
168
378
|
end
|
379
|
+
end
|
169
380
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
end
|
381
|
+
class FilterExpr
|
382
|
+
attr_reader :op1, :op2
|
383
|
+
def initialize op1, op2=nil
|
384
|
+
@op1 = op1
|
385
|
+
@op2 = op2
|
176
386
|
end
|
387
|
+
end
|
177
388
|
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
end
|
389
|
+
class PrimaryExpr
|
390
|
+
attr_reader :op1
|
391
|
+
def initialize op1
|
392
|
+
@op1 = op1
|
183
393
|
end
|
394
|
+
end
|
184
395
|
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
when /^"(?:[^"])*"/
|
190
|
-
value.gsub(/^"/,'').gsub(/"$/,'').gsub(/\\n/,"\n").gsub(/\\t/,"\t").gsub(/\\"/,"\"").gsub(/\\\\/,"\\")
|
191
|
-
when /^'(?:[^'])*'/
|
192
|
-
value.gsub(/^'/,'').gsub(/'$/,'')
|
193
|
-
else
|
194
|
-
value
|
195
|
-
end
|
196
|
-
end
|
396
|
+
class VariableReference
|
397
|
+
attr_reader :name
|
398
|
+
def initialize name
|
399
|
+
@name = name
|
197
400
|
end
|
401
|
+
end
|
198
402
|
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
403
|
+
class Literal
|
404
|
+
attr_reader :value
|
405
|
+
def initialize value
|
406
|
+
@value = case value
|
407
|
+
when /^"(?:[^"])*"/
|
408
|
+
value.gsub(/^"/,'').gsub(/"$/,'').gsub(/\\n/,"\n").gsub(/\\t/,"\t").gsub(/\\"/,"\"").gsub(/\\\\/,"\\")
|
409
|
+
when /^'(?:[^'])*'/
|
410
|
+
value.gsub(/^'/,'').gsub(/'$/,'')
|
411
|
+
else
|
412
|
+
value
|
413
|
+
end
|
204
414
|
end
|
415
|
+
end
|
205
416
|
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
def initialize name, args=[]
|
211
|
-
@name = name
|
212
|
-
@args = args
|
213
|
-
end
|
417
|
+
class Number
|
418
|
+
attr_reader :value
|
419
|
+
def initialize value
|
420
|
+
@value = value.to_f.to_s
|
214
421
|
end
|
422
|
+
end
|
215
423
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
424
|
+
class FunctionCall
|
425
|
+
CURRENT ||= :current
|
426
|
+
LAST ||= :last
|
427
|
+
POSITION ||= 'position'
|
428
|
+
COUNT ||= 'count'
|
429
|
+
ID ||= 'id'
|
430
|
+
LOCAL_NAME ||= 'local-name'
|
431
|
+
NAMESPACE_URI ||= 'namespace-uri'
|
432
|
+
NAME ||= 'name'
|
433
|
+
STRING ||= 'string'
|
434
|
+
CONCAT ||= 'concat'
|
435
|
+
STARTS_WITH ||= 'starts-with'
|
436
|
+
CONTAINS ||= 'contains'
|
437
|
+
SUBSTRING_BEFORE ||= 'substring-before'
|
438
|
+
SUBSTRING_AFTER ||= 'substring-after'
|
439
|
+
SUBSTRING ||= 'substring'
|
440
|
+
STRING_LENGTH ||= 'string-length'
|
441
|
+
NORMALIZE_SPACE ||= 'normalize-space'
|
442
|
+
TRANSLATE ||= 'translate'
|
443
|
+
BOOLEAN ||= 'boolean'
|
444
|
+
NOT ||= 'not'
|
445
|
+
TRUE ||= 'true'
|
446
|
+
FALSE ||= 'false'
|
447
|
+
LANG ||= 'lang'
|
448
|
+
NUMBER ||= 'number'
|
449
|
+
SUM ||= 'sum'
|
450
|
+
FLOOR ||= 'floor'
|
451
|
+
CEILING ||= 'ceiling'
|
452
|
+
ROUND ||= 'round'
|
453
|
+
|
454
|
+
attr_reader :name, :args
|
455
|
+
def initialize name, args=[]
|
456
|
+
@name = name
|
457
|
+
@args = args
|
220
458
|
end
|
221
459
|
end
|
222
|
-
|
223
460
|
end
|
224
461
|
end
|
data/lib/rubyang.rb
CHANGED
data/rubyang.gemspec
CHANGED
@@ -30,9 +30,9 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_dependency "sinatra", '~> 1.0'
|
31
31
|
spec.add_dependency "sinatra-contrib", '~> 1.0'
|
32
32
|
|
33
|
-
spec.add_development_dependency "bundler", '~> 1.
|
33
|
+
spec.add_development_dependency "bundler", '~> 1.16'
|
34
34
|
spec.add_development_dependency "rake", '~> 11.0'
|
35
35
|
spec.add_development_dependency "rspec", '~> 3.0'
|
36
36
|
spec.add_development_dependency "racc", '~> 1.0'
|
37
|
-
spec.add_development_dependency "codeclimate-test-reporter", '~> 0.
|
37
|
+
spec.add_development_dependency "codeclimate-test-reporter", '~> 1.0.8'
|
38
38
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyang
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hirura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sinatra
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
47
|
+
version: '1.16'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1.
|
54
|
+
version: '1.16'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
103
|
+
version: 1.0.8
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version:
|
110
|
+
version: 1.0.8
|
111
111
|
description: YANG parser and tree structure data store
|
112
112
|
email:
|
113
113
|
- hirura@gmail.com
|
@@ -138,6 +138,7 @@ files:
|
|
138
138
|
- lib/rubyang/database/data_tree.rb
|
139
139
|
- lib/rubyang/database/helper.rb
|
140
140
|
- lib/rubyang/database/schema_tree.rb
|
141
|
+
- lib/rubyang/logger.rb
|
141
142
|
- lib/rubyang/model.rb
|
142
143
|
- lib/rubyang/model/parser.rb
|
143
144
|
- lib/rubyang/model/parser/parser.tab.rb
|
@@ -180,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
180
181
|
version: '0'
|
181
182
|
requirements: []
|
182
183
|
rubyforge_project:
|
183
|
-
rubygems_version: 2.
|
184
|
+
rubygems_version: 2.7.3
|
184
185
|
signing_key:
|
185
186
|
specification_version: 4
|
186
187
|
summary: YANG parser and tree structure data store
|