rubyang 0.1.2.1 → 0.1.3

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.
data/lib/rubyang/xpath.rb CHANGED
@@ -1,461 +1,463 @@
1
1
  # coding utf-8
2
+ # vim: et ts=2 sw=2
2
3
 
3
- require_relative 'xpath/parser'
4
- require_relative 'database/data_tree'
4
+ require 'rubyang/xpath/logger'
5
+ require 'rubyang/xpath/parser'
6
+ require 'rubyang/database/data_tree'
5
7
 
6
8
  module Rubyang
7
- module Xpath
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
218
- end
219
- end
220
-
221
- class LocationStep
222
- attr_reader :axis, :node_test, :predicates
223
-
224
- def initialize axis, node_test, predicates
225
- @axis = axis
226
- @node_test = node_test
227
- @predicates = predicates
228
- end
229
- end
230
-
231
- class Axis
232
- ANCESTOR ||= 'ancestor'
233
- ANCESTOR_OR_SELF ||= 'ancestor-or-self'
234
- ATTRIBUTE ||= 'attribute'
235
- CHILD ||= 'child'
236
- DESCENDANT ||= 'descendant'
237
- DESCENDANT_OR_SELF ||= 'descendant-or-self'
238
- FOLLOWING ||= 'following'
239
- FOLLOWING_SIBLING ||= 'following-sibling'
240
- NAMESPACE ||= 'namespace'
241
- PARENT ||= 'parent'
242
- PRECEDING ||= 'preceding'
243
- PRECEDING_SIBLING ||= 'preceding-sibling'
244
- SELF ||= 'self'
245
-
246
- attr_reader :name
247
-
248
- def initialize name
249
- @name = name
250
- end
251
- end
252
-
253
- class NodeTest
254
- module NodeTestType
255
- NAME_TEST ||= 'name-test'
256
- NODE_TYPE ||= 'node-type'
257
- PROCESSING_INSTRUCTION ||= 'processing-instruction'
258
- end
259
-
260
- class NameTest
261
- attr_reader :name
262
-
263
- def initialize name
264
- @name = name
265
- end
266
- end
267
-
268
- module NodeType
269
- COMMENT ||= 'comment'
270
- TEXT ||= 'text'
271
- NODE ||= 'node'
272
- end
273
-
274
- class ProcessingInstruction
275
- attr_reader :literal
276
-
277
- def initialize literal
278
- @literal = literal
279
- end
280
- end
281
-
282
- attr_reader :node_test_type, :node_test
283
-
284
- def initialize node_test_type, node_test
285
- @node_test_type = node_test_type
286
- @node_test = node_test
287
- end
288
- end
289
-
290
- class Predicates < Array
291
- def initialize *predicates
292
- self.push *predicates
293
- end
294
- end
295
-
296
- class Predicate
297
- attr_reader :expr
298
- def initialize expr
299
- @expr = expr
300
- end
301
- end
302
-
303
- class OrExpr
304
- attr_reader :op1, :op2
305
- def initialize op1, op2=nil
306
- @op1 = op1
307
- @op2 = op2
308
- end
309
- end
310
-
311
- class AndExpr
312
- attr_reader :op1, :op2
313
- def initialize op1, op2=nil
314
- @op1 = op1
315
- @op2 = op2
316
- end
317
- end
318
-
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
325
- end
326
- end
327
-
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
334
- end
335
- end
336
-
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
343
- end
344
- end
345
-
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
352
- end
353
- end
354
-
355
- class UnaryExpr
356
- attr_reader :op1, :operator
357
- def initialize op1, operator=nil
358
- @op1 = op1
359
- @operator = operator
360
- end
361
- end
362
-
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
369
- end
370
- end
371
-
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
378
- end
379
- end
380
-
381
- class FilterExpr
382
- attr_reader :op1, :op2
383
- def initialize op1, op2=nil
384
- @op1 = op1
385
- @op2 = op2
386
- end
387
- end
388
-
389
- class PrimaryExpr
390
- attr_reader :op1
391
- def initialize op1
392
- @op1 = op1
393
- end
394
- end
395
-
396
- class VariableReference
397
- attr_reader :name
398
- def initialize name
399
- @name = name
400
- end
401
- end
402
-
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
414
- end
415
- end
416
-
417
- class Number
418
- attr_reader :value
419
- def initialize value
420
- @value = value.to_f.to_s
421
- end
422
- end
423
-
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
458
- end
459
- end
460
- end
9
+ module Xpath
10
+ module BasicType
11
+ class NodeSet
12
+ include Enumerable
13
+
14
+ attr_reader :value
15
+ def initialize value=[]
16
+ raise "#{self.class} argument must be Array but #{value.class}" unless Array === value
17
+ value.each{ |v|
18
+ unless Rubyang::Database::DataTree::Node === v
19
+ raise "#{self.class} argument must be Rubyang::Database::DataTree::Node but #{v.class}"
20
+ end
21
+ }
22
+ @value = value
23
+ end
24
+
25
+ def each
26
+ @value.each do |v|
27
+ yield v
28
+ end
29
+ end
30
+
31
+ def to_boolean
32
+ value = if @value == [] then false else true end
33
+ Boolean.new value
34
+ end
35
+
36
+ def == right
37
+ @value.each{ |v|
38
+ unless Rubyang::Database::DataTree::Leaf === v
39
+ raise "#{self.class} argument must be Rubyang::Database::DataTree::Leaf but #{v.class}"
40
+ end
41
+ }
42
+ case right
43
+ when NodeSet
44
+ right.value.each{ |v|
45
+ unless Rubyang::Database::DataTree::Leaf === v
46
+ raise "#{right.class} argument must be Rubyang::Database::DataTree::Leaf but #{v.class}"
47
+ end
48
+ }
49
+ value = if (@value.map{ |v| v.value } & right.value.map{ |v| v.value }).size > 0 then true else false end
50
+ Boolean.new value
51
+ when Boolean
52
+ value = if @value.size > 0
53
+ if right.value then true else false end
54
+ else
55
+ if right.value then false else true end
56
+ end
57
+ Boolean.new value
58
+ when Number
59
+ value = @value.any?{ |v| Float(v.value) == right.value rescue false }
60
+ Boolean.new value
61
+ when String
62
+ value = @value.any?{ |v| v.value == right.value }
63
+ Boolean.new value
64
+ end
65
+ end
66
+
67
+ def != right
68
+ value = ! (self == right).value
69
+ Boolean.new value
70
+ end
71
+ end
72
+
73
+ class Boolean
74
+ attr_reader :value
75
+ def initialize value
76
+ raise "#{self.class} argument must be true or false but #{value.class}" unless [true, false].include?( value )
77
+ @value = value
78
+ end
79
+
80
+ def to_boolean
81
+ self
82
+ end
83
+
84
+ def and right
85
+ value = (@value and right.to_boolean.value)
86
+ Boolean.new value
87
+ end
88
+
89
+ def or right
90
+ value = (@value or right.to_boolean.value)
91
+ Boolean.new value
92
+ end
93
+ end
94
+
95
+ class Number
96
+ attr_reader :value
97
+ def initialize value
98
+ @value = Float(value)
99
+ end
100
+
101
+ def to_boolean
102
+ value = if @value == Float(0) then false else true end
103
+ Boolean.new value
104
+ end
105
+
106
+ def -@
107
+ value = (- @value)
108
+ Number.new value
109
+ end
110
+
111
+ def + right
112
+ case right
113
+ when Number
114
+ value = (@value + right.value)
115
+ Number.new value
116
+ else
117
+ raise
118
+ end
119
+ end
120
+
121
+ def - right
122
+ case right
123
+ when Number
124
+ value = (@value - right.value)
125
+ Number.new value
126
+ else
127
+ raise
128
+ end
129
+ end
130
+
131
+ def * right
132
+ case right
133
+ when Number
134
+ value = (@value * right.value)
135
+ Number.new value
136
+ else
137
+ raise
138
+ end
139
+ end
140
+
141
+ def / right
142
+ case right
143
+ when Number
144
+ value = (@value / right.value)
145
+ Number.new value
146
+ else
147
+ raise
148
+ end
149
+ end
150
+
151
+ def == right
152
+ case right
153
+ when Number
154
+ value = (@value == right.value)
155
+ Boolean.new value
156
+ else
157
+ raise
158
+ end
159
+ end
160
+
161
+ def != right
162
+ case right
163
+ when Number
164
+ value = (@value != right.value)
165
+ Boolean.new value
166
+ else
167
+ raise
168
+ end
169
+ end
170
+ end
171
+
172
+ class String
173
+ attr_reader :value
174
+ def initialize value
175
+ @value = value
176
+ end
177
+
178
+ def to_boolean
179
+ value = if @value == '' then false else true end
180
+ Boolean.new value
181
+ end
182
+
183
+ def == right
184
+ case right
185
+ when String
186
+ value = (@value == right.value)
187
+ Boolean.new value
188
+ else
189
+ raise
190
+ end
191
+ end
192
+
193
+ def != right
194
+ case right
195
+ when String
196
+ value = (@value != right.value)
197
+ Boolean.new value
198
+ else
199
+ raise
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ class Expr
206
+ attr_reader :op
207
+ def initialize op
208
+ @op = op
209
+ end
210
+ end
211
+
212
+ class LocationPath
213
+ attr_reader :location_step_sequence
214
+ def initialize *location_step_sequence
215
+ @location_step_sequence = location_step_sequence
216
+ end
217
+ def add *location_step_sequence
218
+ @location_step_sequence.push *location_step_sequence
219
+ self
220
+ end
221
+ end
222
+
223
+ class LocationStep
224
+ attr_reader :axis, :node_test, :predicates
225
+
226
+ def initialize axis, node_test, predicates
227
+ @axis = axis
228
+ @node_test = node_test
229
+ @predicates = predicates
230
+ end
231
+ end
232
+
233
+ class Axis
234
+ ANCESTOR ||= 'ancestor'
235
+ ANCESTOR_OR_SELF ||= 'ancestor-or-self'
236
+ ATTRIBUTE ||= 'attribute'
237
+ CHILD ||= 'child'
238
+ DESCENDANT ||= 'descendant'
239
+ DESCENDANT_OR_SELF ||= 'descendant-or-self'
240
+ FOLLOWING ||= 'following'
241
+ FOLLOWING_SIBLING ||= 'following-sibling'
242
+ NAMESPACE ||= 'namespace'
243
+ PARENT ||= 'parent'
244
+ PRECEDING ||= 'preceding'
245
+ PRECEDING_SIBLING ||= 'preceding-sibling'
246
+ SELF ||= 'self'
247
+
248
+ attr_reader :name
249
+
250
+ def initialize name
251
+ @name = name
252
+ end
253
+ end
254
+
255
+ class NodeTest
256
+ module NodeTestType
257
+ NAME_TEST ||= 'name-test'
258
+ NODE_TYPE ||= 'node-type'
259
+ PROCESSING_INSTRUCTION ||= 'processing-instruction'
260
+ end
261
+
262
+ class NameTest
263
+ attr_reader :name
264
+
265
+ def initialize name
266
+ @name = name
267
+ end
268
+ end
269
+
270
+ module NodeType
271
+ COMMENT ||= 'comment'
272
+ TEXT ||= 'text'
273
+ NODE ||= 'node'
274
+ end
275
+
276
+ class ProcessingInstruction
277
+ attr_reader :literal
278
+
279
+ def initialize literal
280
+ @literal = literal
281
+ end
282
+ end
283
+
284
+ attr_reader :node_test_type, :node_test
285
+
286
+ def initialize node_test_type, node_test
287
+ @node_test_type = node_test_type
288
+ @node_test = node_test
289
+ end
290
+ end
291
+
292
+ class Predicates < Array
293
+ def initialize *predicates
294
+ self.push *predicates
295
+ end
296
+ end
297
+
298
+ class Predicate
299
+ attr_reader :expr
300
+ def initialize expr
301
+ @expr = expr
302
+ end
303
+ end
304
+
305
+ class OrExpr
306
+ attr_reader :op1, :op2
307
+ def initialize op1, op2=nil
308
+ @op1 = op1
309
+ @op2 = op2
310
+ end
311
+ end
312
+
313
+ class AndExpr
314
+ attr_reader :op1, :op2
315
+ def initialize op1, op2=nil
316
+ @op1 = op1
317
+ @op2 = op2
318
+ end
319
+ end
320
+
321
+ class EqualityExpr
322
+ attr_reader :op1, :operator, :op2
323
+ def initialize op1, operator=nil, op2=nil
324
+ @op1 = op1
325
+ @operator = operator
326
+ @op2 = op2
327
+ end
328
+ end
329
+
330
+ class RelationalExpr
331
+ attr_reader :op1, :operator, :op2
332
+ def initialize op1, operator=nil, op2=nil
333
+ @op1 = op1
334
+ @operator = operator
335
+ @op2 = op2
336
+ end
337
+ end
338
+
339
+ class AdditiveExpr
340
+ attr_reader :op1, :operator, :op2
341
+ def initialize op1, operator=nil, op2=nil
342
+ @op1 = op1
343
+ @operator = operator
344
+ @op2 = op2
345
+ end
346
+ end
347
+
348
+ class MultiplicativeExpr
349
+ attr_reader :op1, :operator, :op2
350
+ def initialize op1, operator=nil, op2=nil
351
+ @op1 = op1
352
+ @operator = operator
353
+ @op2 = op2
354
+ end
355
+ end
356
+
357
+ class UnaryExpr
358
+ attr_reader :op1, :operator
359
+ def initialize op1, operator=nil
360
+ @op1 = op1
361
+ @operator = operator
362
+ end
363
+ end
364
+
365
+ class UnionExpr
366
+ attr_reader :op1, :operator, :op2
367
+ def initialize op1, operator=nil, op2=nil
368
+ @op1 = op1
369
+ @operator = operator
370
+ @op2 = op2
371
+ end
372
+ end
373
+
374
+ class PathExpr
375
+ attr_reader :op1, :operator, :op2
376
+ def initialize op1, operator=nil, op2=nil
377
+ @op1 = op1
378
+ @operator = operator
379
+ @op2 = op2
380
+ end
381
+ end
382
+
383
+ class FilterExpr
384
+ attr_reader :op1, :op2
385
+ def initialize op1, op2=nil
386
+ @op1 = op1
387
+ @op2 = op2
388
+ end
389
+ end
390
+
391
+ class PrimaryExpr
392
+ attr_reader :op1
393
+ def initialize op1
394
+ @op1 = op1
395
+ end
396
+ end
397
+
398
+ class VariableReference
399
+ attr_reader :name
400
+ def initialize name
401
+ @name = name
402
+ end
403
+ end
404
+
405
+ class Literal
406
+ attr_reader :value
407
+ def initialize value
408
+ @value = case value
409
+ when /^"(?:[^"])*"/
410
+ value.gsub(/^"/,'').gsub(/"$/,'').gsub(/\\n/,"\n").gsub(/\\t/,"\t").gsub(/\\"/,"\"").gsub(/\\\\/,"\\")
411
+ when /^'(?:[^'])*'/
412
+ value.gsub(/^'/,'').gsub(/'$/,'')
413
+ else
414
+ value
415
+ end
416
+ end
417
+ end
418
+
419
+ class Number
420
+ attr_reader :value
421
+ def initialize value
422
+ @value = value.to_f.to_s
423
+ end
424
+ end
425
+
426
+ class FunctionCall
427
+ CURRENT = :current
428
+ LAST = :last
429
+ POSITION = 'position'
430
+ COUNT = 'count'
431
+ ID = 'id'
432
+ LOCAL_NAME = 'local-name'
433
+ NAMESPACE_URI = 'namespace-uri'
434
+ NAME = 'name'
435
+ STRING = 'string'
436
+ CONCAT = 'concat'
437
+ STARTS_WITH = 'starts-with'
438
+ CONTAINS = 'contains'
439
+ SUBSTRING_BEFORE = 'substring-before'
440
+ SUBSTRING_AFTER = 'substring-after'
441
+ SUBSTRING = 'substring'
442
+ STRING_LENGTH = 'string-length'
443
+ NORMALIZE_SPACE = 'normalize-space'
444
+ TRANSLATE = 'translate'
445
+ BOOLEAN = 'boolean'
446
+ NOT = 'not'
447
+ TRUE = 'true'
448
+ FALSE = 'false'
449
+ LANG = 'lang'
450
+ NUMBER = 'number'
451
+ SUM = 'sum'
452
+ FLOOR = 'floor'
453
+ CEILING = 'ceiling'
454
+ ROUND = 'round'
455
+
456
+ attr_reader :name, :args
457
+ def initialize name, args=[]
458
+ @name = name
459
+ @args = args
460
+ end
461
+ end
462
+ end
461
463
  end