hotdog 0.26.0 → 0.27.0
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 +4 -4
- data/lib/hotdog/application.rb +61 -7
- data/lib/hotdog/commands/down.rb +3 -3
- data/lib/hotdog/commands/search.rb +9 -1
- data/lib/hotdog/commands/ssh.rb +14 -12
- data/lib/hotdog/commands.rb +54 -36
- data/lib/hotdog/expression/semantics.rb +162 -163
- data/lib/hotdog/version.rb +1 -1
- data/spec/core/commands_spec.rb +21 -0
- data/spec/optimizer/binary_expression_spec.rb +36 -34
- data/spec/optimizer/glob_expression_spec.rb +93 -91
- data/spec/optimizer/regexp_expression_spec.rb +43 -41
- data/spec/optimizer/string_expression_spec.rb +93 -91
- data/spec/optimizer/unary_expression_spec.rb +258 -257
- data/spec/spec_helper.rb +6 -0
- metadata +2 -2
@@ -8,6 +8,10 @@ module Hotdog
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def optimize(options={})
|
11
|
+
self.dup
|
12
|
+
end
|
13
|
+
|
14
|
+
def compact(options={})
|
11
15
|
self
|
12
16
|
end
|
13
17
|
|
@@ -23,7 +27,7 @@ module Hotdog
|
|
23
27
|
class UnaryExpressionNode < ExpressionNode
|
24
28
|
attr_reader :op, :expression
|
25
29
|
|
26
|
-
def initialize(op, expression)
|
30
|
+
def initialize(op, expression, options={})
|
27
31
|
case (op || "not").to_s
|
28
32
|
when "NOOP", "noop"
|
29
33
|
@op = :NOOP
|
@@ -33,6 +37,7 @@ module Hotdog
|
|
33
37
|
raise(SyntaxError.new("unknown unary operator: #{op.inspect}"))
|
34
38
|
end
|
35
39
|
@expression = expression
|
40
|
+
@options = {}
|
36
41
|
end
|
37
42
|
|
38
43
|
def evaluate(environment, options={})
|
@@ -67,21 +72,35 @@ module Hotdog
|
|
67
72
|
end
|
68
73
|
|
69
74
|
def optimize(options={})
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
75
|
+
o_self = compact(options)
|
76
|
+
if UnaryExpressionNode === o_self
|
77
|
+
case o_self.op
|
78
|
+
when :NOT
|
79
|
+
case o_self.expression
|
80
|
+
when EverythingNode
|
81
|
+
NothingNode.new(options)
|
82
|
+
when NothingNode
|
83
|
+
EverythingNode.new(options)
|
84
|
+
else
|
85
|
+
o_self.optimize1(options)
|
86
|
+
end
|
79
87
|
else
|
80
|
-
optimize1(options)
|
88
|
+
o_self.optimize1(options)
|
81
89
|
end
|
82
90
|
else
|
83
|
-
|
84
|
-
|
91
|
+
o_self.optimize(options)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def compact(options={})
|
96
|
+
case op
|
97
|
+
when :NOOP
|
98
|
+
expression.compact(options)
|
99
|
+
else
|
100
|
+
UnaryExpressionNode.new(
|
101
|
+
op,
|
102
|
+
expression.compact(options),
|
103
|
+
)
|
85
104
|
end
|
86
105
|
end
|
87
106
|
|
@@ -93,7 +112,7 @@ module Hotdog
|
|
93
112
|
{unary_op: @op.to_s, expression: @expression.dump(options)}
|
94
113
|
end
|
95
114
|
|
96
|
-
|
115
|
+
protected
|
97
116
|
def optimize1(options={})
|
98
117
|
case op
|
99
118
|
when :NOOP
|
@@ -102,18 +121,17 @@ module Hotdog
|
|
102
121
|
if UnaryExpressionNode === expression
|
103
122
|
case expression.op
|
104
123
|
when :NOOP
|
105
|
-
|
106
|
-
optimize2(options)
|
124
|
+
expression.optimize(options)
|
107
125
|
when :NOT
|
108
126
|
expression.expression.optimize(options)
|
109
127
|
else
|
110
|
-
self
|
128
|
+
self.dup
|
111
129
|
end
|
112
130
|
else
|
113
131
|
optimize2(options)
|
114
132
|
end
|
115
133
|
else
|
116
|
-
self
|
134
|
+
self.dup
|
117
135
|
end
|
118
136
|
end
|
119
137
|
|
@@ -126,7 +144,7 @@ module Hotdog
|
|
126
144
|
if q and v.length <= sqlite_limit_compound_select
|
127
145
|
QueryExpressionNode.new("SELECT id AS host_id FROM hosts EXCEPT #{q.sub(/\s*;\s*\z/, "")};", v)
|
128
146
|
else
|
129
|
-
self
|
147
|
+
self.dup
|
130
148
|
end
|
131
149
|
when TagExpressionNode
|
132
150
|
q = expression.maybe_query(options)
|
@@ -134,10 +152,10 @@ module Hotdog
|
|
134
152
|
if q and v.length <= sqlite_limit_compound_select
|
135
153
|
QueryExpressionNode.new("SELECT id AS host_id FROM hosts EXCEPT #{q.sub(/\s*;\s*\z/, "")};", v)
|
136
154
|
else
|
137
|
-
self
|
155
|
+
self.dup
|
138
156
|
end
|
139
157
|
else
|
140
|
-
self
|
158
|
+
self.dup
|
141
159
|
end
|
142
160
|
end
|
143
161
|
end
|
@@ -145,7 +163,7 @@ module Hotdog
|
|
145
163
|
class BinaryExpressionNode < ExpressionNode
|
146
164
|
attr_reader :op, :left, :right
|
147
165
|
|
148
|
-
def initialize(op, left, right)
|
166
|
+
def initialize(op, left, right, options={})
|
149
167
|
case (op || "or").to_s
|
150
168
|
when "&&", "&", "AND", "and"
|
151
169
|
@op = :AND
|
@@ -158,6 +176,7 @@ module Hotdog
|
|
158
176
|
end
|
159
177
|
@left = left
|
160
178
|
@right = right
|
179
|
+
@options = {}
|
161
180
|
end
|
162
181
|
|
163
182
|
def evaluate(environment, options={})
|
@@ -254,59 +273,75 @@ module Hotdog
|
|
254
273
|
end
|
255
274
|
|
256
275
|
def optimize(options={})
|
257
|
-
|
258
|
-
|
276
|
+
o_left = @left.optimize(options)
|
277
|
+
o_right = @right.optimize(options)
|
259
278
|
case op
|
260
279
|
when :AND
|
261
|
-
case
|
280
|
+
case o_left
|
262
281
|
when EverythingNode
|
263
|
-
|
282
|
+
o_right
|
264
283
|
when NothingNode
|
265
|
-
|
284
|
+
o_left
|
266
285
|
else
|
267
|
-
if
|
268
|
-
|
286
|
+
if o_left == o_right
|
287
|
+
o_left
|
269
288
|
else
|
270
|
-
|
289
|
+
BinaryExpressionNode.new(
|
290
|
+
op,
|
291
|
+
o_left,
|
292
|
+
o_right,
|
293
|
+
).optimize1(options)
|
271
294
|
end
|
272
295
|
end
|
273
296
|
when :OR
|
274
|
-
case
|
297
|
+
case o_left
|
275
298
|
when EverythingNode
|
276
|
-
|
299
|
+
o_left
|
277
300
|
when NothingNode
|
278
|
-
|
301
|
+
o_right
|
279
302
|
else
|
280
|
-
if
|
281
|
-
|
303
|
+
if o_left == o_right
|
304
|
+
o_left
|
282
305
|
else
|
283
|
-
if MultinaryExpressionNode ===
|
284
|
-
if
|
285
|
-
|
306
|
+
if MultinaryExpressionNode === o_left
|
307
|
+
if o_left.op == op
|
308
|
+
o_left.merge(o_right, fallback: self)
|
286
309
|
else
|
287
|
-
|
310
|
+
BinaryExpressionNode.new(
|
311
|
+
op,
|
312
|
+
o_left,
|
313
|
+
o_right,
|
314
|
+
).optimize1(options)
|
288
315
|
end
|
289
316
|
else
|
290
|
-
if MultinaryExpressionNode ===
|
291
|
-
if
|
292
|
-
|
317
|
+
if MultinaryExpressionNode === o_right
|
318
|
+
if o_right.op == op
|
319
|
+
o_right.merge(o_left, fallback: self)
|
293
320
|
else
|
294
|
-
|
321
|
+
BinaryExpressionNode.new(
|
322
|
+
op,
|
323
|
+
o_left,
|
324
|
+
o_right,
|
325
|
+
).optimize1(options)
|
295
326
|
end
|
296
327
|
else
|
297
|
-
MultinaryExpressionNode.new(op, [
|
328
|
+
MultinaryExpressionNode.new(op, [o_left, o_right], fallback: self)
|
298
329
|
end
|
299
330
|
end
|
300
331
|
end
|
301
332
|
end
|
302
333
|
when :XOR
|
303
|
-
if
|
334
|
+
if o_left == o_right
|
304
335
|
NothingNode.new(options)
|
305
336
|
else
|
306
|
-
|
337
|
+
BinaryExpressionNode.new(
|
338
|
+
op,
|
339
|
+
o_left,
|
340
|
+
o_right,
|
341
|
+
).optimize1(options)
|
307
342
|
end
|
308
343
|
else
|
309
|
-
self
|
344
|
+
self.dup
|
310
345
|
end
|
311
346
|
end
|
312
347
|
|
@@ -318,7 +353,7 @@ module Hotdog
|
|
318
353
|
{left: @left.dump(options), binary_op: @op.to_s, right: @right.dump(options)}
|
319
354
|
end
|
320
355
|
|
321
|
-
|
356
|
+
protected
|
322
357
|
def optimize1(options)
|
323
358
|
if TagExpressionNode === left and TagExpressionNode === right
|
324
359
|
lq = left.maybe_query(options)
|
@@ -340,13 +375,13 @@ module Hotdog
|
|
340
375
|
"INTERSECT #{rq.sub(/\s*;\s*\z/, "")};"
|
341
376
|
QueryExpressionNode.new(q, lv + rv, fallback: self)
|
342
377
|
else
|
343
|
-
self
|
378
|
+
self.dup
|
344
379
|
end
|
345
380
|
else
|
346
|
-
self
|
381
|
+
self.dup
|
347
382
|
end
|
348
383
|
else
|
349
|
-
self
|
384
|
+
self.dup
|
350
385
|
end
|
351
386
|
end
|
352
387
|
end
|
@@ -366,7 +401,7 @@ module Hotdog
|
|
366
401
|
raise(ArgumentError.new("expressions limit exceeded: #{expressions.length} for #{sqlite_limit_compound_select}"))
|
367
402
|
end
|
368
403
|
@expressions = expressions
|
369
|
-
@
|
404
|
+
@options = options
|
370
405
|
end
|
371
406
|
|
372
407
|
def merge(other, options={})
|
@@ -401,8 +436,8 @@ module Hotdog
|
|
401
436
|
values = []
|
402
437
|
end
|
403
438
|
if values.empty?
|
404
|
-
if @fallback
|
405
|
-
@fallback.evaluate(environment, options={})
|
439
|
+
if @options[:fallback]
|
440
|
+
@options[:fallback].evaluate(environment, options={})
|
406
441
|
else
|
407
442
|
[]
|
408
443
|
end
|
@@ -420,15 +455,15 @@ module Hotdog
|
|
420
455
|
def initialize(query, values=[], options={})
|
421
456
|
@query = query
|
422
457
|
@values = values
|
423
|
-
@
|
458
|
+
@options = options
|
424
459
|
end
|
425
460
|
attr_reader :query
|
426
461
|
attr_reader :values
|
427
462
|
|
428
463
|
def evaluate(environment, options={})
|
429
464
|
values = environment.execute(@query, @values).map { |row| row.first }
|
430
|
-
if values.empty? and @fallback
|
431
|
-
@fallback.evaluate(environment, options)
|
465
|
+
if values.empty? and @options[:fallback]
|
466
|
+
@options[:fallback].evaluate(environment, options)
|
432
467
|
else
|
433
468
|
values
|
434
469
|
end
|
@@ -436,7 +471,7 @@ module Hotdog
|
|
436
471
|
|
437
472
|
def dump(options={})
|
438
473
|
data = {query: @query, values: @values}
|
439
|
-
data[:fallback] = @fallback.dump(options) if @fallback
|
474
|
+
data[:fallback] = @options[:fallback].dump(options) if @options[:fallback]
|
440
475
|
data
|
441
476
|
end
|
442
477
|
end
|
@@ -444,7 +479,7 @@ module Hotdog
|
|
444
479
|
class FuncallNode < ExpressionNode
|
445
480
|
attr_reader :function, :args
|
446
481
|
|
447
|
-
def initialize(function, args)
|
482
|
+
def initialize(function, args, options={})
|
448
483
|
# FIXME: smart argument handling (e.g. arity & type checking)
|
449
484
|
case function.to_s
|
450
485
|
when "HEAD", "head"
|
@@ -472,6 +507,7 @@ module Hotdog
|
|
472
507
|
raise(SyntaxError.new("unknown function call: #{function}"))
|
473
508
|
end
|
474
509
|
@args = args
|
510
|
+
@options = options
|
475
511
|
end
|
476
512
|
|
477
513
|
def dump(options={})
|
@@ -487,36 +523,37 @@ module Hotdog
|
|
487
523
|
|
488
524
|
def optimize(options={})
|
489
525
|
case function
|
490
|
-
when :HEAD
|
491
|
-
@args[0] = @args[0].optimize(options)
|
492
526
|
when :GROUP_BY
|
493
|
-
|
527
|
+
o_args = [@args[0].optimize(options)]
|
494
528
|
if TagExpressionNode === args[1]
|
495
529
|
# workaround for expressions like `ORDER_BY((environment:development),role)`
|
496
|
-
|
530
|
+
o_args << @args[1].tagname
|
497
531
|
else
|
498
|
-
|
532
|
+
o_args << @args[1]
|
499
533
|
end
|
500
534
|
when :ORDER_BY
|
501
|
-
|
535
|
+
o_args = [@args[0].optimize(options)]
|
502
536
|
if @args[1]
|
503
537
|
if TagExpressionNode === @args[1]
|
504
538
|
# workaround for expressions like `ORDER_BY((environment:development),role)`
|
505
|
-
|
539
|
+
o_args << @args[1].tagname
|
506
540
|
else
|
507
|
-
|
541
|
+
o_args << @args[1]
|
508
542
|
end
|
509
543
|
end
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
544
|
+
else
|
545
|
+
o_args = @args.map { |arg|
|
546
|
+
if ExpressionNode === arg
|
547
|
+
arg.optimize(options)
|
548
|
+
else
|
549
|
+
arg
|
550
|
+
end
|
551
|
+
}
|
518
552
|
end
|
519
|
-
|
553
|
+
FuncallNode.new(
|
554
|
+
@function,
|
555
|
+
o_args,
|
556
|
+
)
|
520
557
|
end
|
521
558
|
|
522
559
|
def evaluate(environment, options={})
|
@@ -529,7 +566,7 @@ module Hotdog
|
|
529
566
|
"INNER JOIN tags ON hosts_tags.tag_id = tags.id " \
|
530
567
|
"WHERE tags.name = ? AND hosts_tags.host_id IN (%s) " \
|
531
568
|
"GROUP BY tags.value;" % intermediate.map { "?" }.join(", ")
|
532
|
-
QueryExpressionNode.new(q, [args[1]] + intermediate
|
569
|
+
QueryExpressionNode.new(q, [args[1]] + intermediate).evaluate(environment, options)
|
533
570
|
when :ORDER_BY
|
534
571
|
intermediate = args[0].evaluate(environment, options)
|
535
572
|
if args[1]
|
@@ -537,13 +574,13 @@ module Hotdog
|
|
537
574
|
"INNER JOIN tags ON hosts_tags.tag_id = tags.id " \
|
538
575
|
"WHERE tags.name = ? AND hosts_tags.host_id IN (%s) " \
|
539
576
|
"ORDER BY tags.value;" % intermediate.map { "?" }.join(", ")
|
540
|
-
QueryExpressionNode.new(q, [args[1]] + intermediate
|
577
|
+
QueryExpressionNode.new(q, [args[1]] + intermediate).evaluate(environment, options)
|
541
578
|
else
|
542
579
|
q = "SELECT DISTINCT hosts_tags.host_id FROM hosts_tags " \
|
543
580
|
"INNER JOIN tags ON hosts_tags.tag_id = tags.id " \
|
544
581
|
"WHERE hosts_tags.host_id IN (%s) " \
|
545
582
|
"ORDER BY hosts_tags.host_id;" % intermediate.map { "?" }.join(", ")
|
546
|
-
QueryExpressionNode.new(q, intermediate
|
583
|
+
QueryExpressionNode.new(q, intermediate).evaluate(environment, options)
|
547
584
|
end
|
548
585
|
when :REVERSE
|
549
586
|
args[0].evaluate(environment, options).reverse()
|
@@ -569,22 +606,14 @@ module Hotdog
|
|
569
606
|
def initialize(options={})
|
570
607
|
super("SELECT NULL AS host_id WHERE host_id NOT NULL;", [], options)
|
571
608
|
end
|
572
|
-
|
573
|
-
def evaluate(environment, options={})
|
574
|
-
if @fallback
|
575
|
-
@fallback.evaluate(environment, options)
|
576
|
-
else
|
577
|
-
[]
|
578
|
-
end
|
579
|
-
end
|
580
609
|
end
|
581
610
|
|
582
611
|
class TagExpressionNode < ExpressionNode
|
583
|
-
def initialize(tagname, tagvalue, separator=nil)
|
612
|
+
def initialize(tagname, tagvalue, separator=nil, options={})
|
584
613
|
@tagname = tagname
|
585
614
|
@tagvalue = tagvalue
|
586
615
|
@separator = separator
|
587
|
-
@
|
616
|
+
@options = options
|
588
617
|
end
|
589
618
|
attr_reader :tagname
|
590
619
|
attr_reader :tagvalue
|
@@ -649,32 +678,11 @@ module Hotdog
|
|
649
678
|
if options[:did_fallback]
|
650
679
|
[]
|
651
680
|
else
|
652
|
-
if not environment.fixed_string? and @fallback
|
653
|
-
# avoid optimizing @fallback to prevent infinite recursion
|
654
|
-
|
655
|
-
if values.empty?
|
656
|
-
if reload(environment, options)
|
657
|
-
evaluate(environment, options).tap do |values|
|
658
|
-
if values.empty?
|
659
|
-
environment.logger.info("no result: #{self.dump.inspect}")
|
660
|
-
end
|
661
|
-
end
|
662
|
-
else
|
663
|
-
[]
|
664
|
-
end
|
665
|
-
else
|
666
|
-
values
|
667
|
-
end
|
681
|
+
if not environment.fixed_string? and @options[:fallback]
|
682
|
+
# avoid optimizing @options[:fallback] to prevent infinite recursion
|
683
|
+
@options[:fallback].evaluate(environment, options.merge(did_fallback: true))
|
668
684
|
else
|
669
|
-
|
670
|
-
evaluate(environment, options).tap do |values|
|
671
|
-
if values.empty?
|
672
|
-
environment.logger.info("no result: #{self.dump.inspect}")
|
673
|
-
end
|
674
|
-
end
|
675
|
-
else
|
676
|
-
[]
|
677
|
-
end
|
685
|
+
[]
|
678
686
|
end
|
679
687
|
end
|
680
688
|
else
|
@@ -691,8 +699,11 @@ module Hotdog
|
|
691
699
|
|
692
700
|
def optimize(options={})
|
693
701
|
# fallback to glob expression
|
694
|
-
|
695
|
-
|
702
|
+
self.dup.tap do |o_self|
|
703
|
+
o_self.instance_eval {
|
704
|
+
@options[:fallback] ||= maybe_fallback(options)
|
705
|
+
}
|
706
|
+
end
|
696
707
|
end
|
697
708
|
|
698
709
|
def to_glob(s)
|
@@ -703,24 +714,12 @@ module Hotdog
|
|
703
714
|
s ? to_glob(s.to_s) : nil
|
704
715
|
end
|
705
716
|
|
706
|
-
def reload(environment, options={})
|
707
|
-
$did_reload ||= false
|
708
|
-
if $did_reload
|
709
|
-
false
|
710
|
-
else
|
711
|
-
$did_reload = true
|
712
|
-
environment.logger.info("force reloading all hosts and tags.")
|
713
|
-
environment.reload(force: true)
|
714
|
-
true
|
715
|
-
end
|
716
|
-
end
|
717
|
-
|
718
717
|
def dump(options={})
|
719
718
|
data = {}
|
720
719
|
data[:tagname] = tagname.to_s if tagname
|
721
720
|
data[:separator] = separator.to_s if separator
|
722
721
|
data[:tagvalue] = tagvalue.to_s if tagvalue
|
723
|
-
data[:fallback
|
722
|
+
data[:fallback] = @options[:fallback].dump(options) if @options[:fallback]
|
724
723
|
data
|
725
724
|
end
|
726
725
|
|
@@ -730,8 +729,8 @@ module Hotdog
|
|
730
729
|
end
|
731
730
|
|
732
731
|
class AnyHostNode < TagExpressionNode
|
733
|
-
def initialize(separator=nil)
|
734
|
-
super("host", nil, separator)
|
732
|
+
def initialize(separator=nil, options={})
|
733
|
+
super("host", nil, separator, options)
|
735
734
|
end
|
736
735
|
|
737
736
|
def condition(options={})
|
@@ -751,8 +750,8 @@ module Hotdog
|
|
751
750
|
end
|
752
751
|
|
753
752
|
class StringHostNode < StringExpressionNode
|
754
|
-
def initialize(tagvalue, separator=nil)
|
755
|
-
super("host", tagvalue.to_s, separator)
|
753
|
+
def initialize(tagvalue, separator=nil, options={})
|
754
|
+
super("host", tagvalue.to_s, separator, options)
|
756
755
|
end
|
757
756
|
|
758
757
|
def condition(options={})
|
@@ -779,8 +778,8 @@ module Hotdog
|
|
779
778
|
end
|
780
779
|
|
781
780
|
class StringTagNode < StringExpressionNode
|
782
|
-
def initialize(tagname, tagvalue, separator=nil)
|
783
|
-
super(tagname.to_s, tagvalue.to_s, separator)
|
781
|
+
def initialize(tagname, tagvalue, separator=nil, options={})
|
782
|
+
super(tagname.to_s, tagvalue.to_s, separator, options)
|
784
783
|
end
|
785
784
|
|
786
785
|
def condition(options={})
|
@@ -807,8 +806,8 @@ module Hotdog
|
|
807
806
|
end
|
808
807
|
|
809
808
|
class StringTagnameNode < StringExpressionNode
|
810
|
-
def initialize(tagname, separator=nil)
|
811
|
-
super(tagname.to_s, nil, separator)
|
809
|
+
def initialize(tagname, separator=nil, options={})
|
810
|
+
super(tagname.to_s, nil, separator, options)
|
812
811
|
end
|
813
812
|
|
814
813
|
def condition(options={})
|
@@ -835,8 +834,8 @@ module Hotdog
|
|
835
834
|
end
|
836
835
|
|
837
836
|
class StringTagvalueNode < StringExpressionNode
|
838
|
-
def initialize(tagvalue, separator=nil)
|
839
|
-
super(nil, tagvalue.to_s, separator)
|
837
|
+
def initialize(tagvalue, separator=nil, options={})
|
838
|
+
super(nil, tagvalue.to_s, separator, options)
|
840
839
|
end
|
841
840
|
|
842
841
|
def condition(options={})
|
@@ -863,8 +862,8 @@ module Hotdog
|
|
863
862
|
end
|
864
863
|
|
865
864
|
class StringHostOrTagNode < StringExpressionNode
|
866
|
-
def initialize(tagname, separator=nil)
|
867
|
-
super(tagname.to_s, nil, separator)
|
865
|
+
def initialize(tagname, separator=nil, options={})
|
866
|
+
super(tagname.to_s, nil, separator, options)
|
868
867
|
end
|
869
868
|
|
870
869
|
def condition(options={})
|
@@ -896,14 +895,14 @@ module Hotdog
|
|
896
895
|
data[:tagname_glob] = tagname.to_s if tagname
|
897
896
|
data[:separator] = separator.to_s if separator
|
898
897
|
data[:tagvalue_glob] = tagvalue.to_s if tagvalue
|
899
|
-
data[:fallback] = @fallback.dump(options) if @fallback
|
898
|
+
data[:fallback] = @options[:fallback].dump(options) if @options[:fallback]
|
900
899
|
data
|
901
900
|
end
|
902
901
|
end
|
903
902
|
|
904
903
|
class GlobHostNode < GlobExpressionNode
|
905
|
-
def initialize(tagvalue, separator=nil)
|
906
|
-
super("host", tagvalue.to_s, separator)
|
904
|
+
def initialize(tagvalue, separator=nil, options={})
|
905
|
+
super("host", tagvalue.to_s, separator, options)
|
907
906
|
end
|
908
907
|
|
909
908
|
def condition(options={})
|
@@ -930,8 +929,8 @@ module Hotdog
|
|
930
929
|
end
|
931
930
|
|
932
931
|
class GlobTagNode < GlobExpressionNode
|
933
|
-
def initialize(tagname, tagvalue, separator=nil)
|
934
|
-
super(tagname.to_s, tagvalue.to_s, separator)
|
932
|
+
def initialize(tagname, tagvalue, separator=nil, options={})
|
933
|
+
super(tagname.to_s, tagvalue.to_s, separator, options)
|
935
934
|
end
|
936
935
|
|
937
936
|
def condition(options={})
|
@@ -958,8 +957,8 @@ module Hotdog
|
|
958
957
|
end
|
959
958
|
|
960
959
|
class GlobTagnameNode < GlobExpressionNode
|
961
|
-
def initialize(tagname, separator=nil)
|
962
|
-
super(tagname.to_s, nil, separator)
|
960
|
+
def initialize(tagname, separator=nil, options={})
|
961
|
+
super(tagname.to_s, nil, separator, options)
|
963
962
|
end
|
964
963
|
|
965
964
|
def condition(options={})
|
@@ -986,8 +985,8 @@ module Hotdog
|
|
986
985
|
end
|
987
986
|
|
988
987
|
class GlobTagvalueNode < GlobExpressionNode
|
989
|
-
def initialize(tagvalue, separator=nil)
|
990
|
-
super(nil, tagvalue.to_s, separator)
|
988
|
+
def initialize(tagvalue, separator=nil, options={})
|
989
|
+
super(nil, tagvalue.to_s, separator, options)
|
991
990
|
end
|
992
991
|
|
993
992
|
def condition(options={})
|
@@ -1014,8 +1013,8 @@ module Hotdog
|
|
1014
1013
|
end
|
1015
1014
|
|
1016
1015
|
class GlobHostOrTagNode < GlobExpressionNode
|
1017
|
-
def initialize(tagname, separator=nil)
|
1018
|
-
super(tagname.to_s, nil, separator)
|
1016
|
+
def initialize(tagname, separator=nil, options={})
|
1017
|
+
super(tagname.to_s, nil, separator, options)
|
1019
1018
|
end
|
1020
1019
|
|
1021
1020
|
def condition(options={})
|
@@ -1047,18 +1046,18 @@ module Hotdog
|
|
1047
1046
|
data[:tagname_regexp] = tagname.to_s if tagname
|
1048
1047
|
data[:separator] = separator.to_s if separator
|
1049
1048
|
data[:tagvalue_regexp] = tagvalue.to_s if tagvalue
|
1050
|
-
data[:fallback] = @fallback.dump(options) if @fallback
|
1049
|
+
data[:fallback] = @options[:fallback].dump(options) if @options[:fallback]
|
1051
1050
|
data
|
1052
1051
|
end
|
1053
1052
|
end
|
1054
1053
|
|
1055
1054
|
class RegexpHostNode < RegexpExpressionNode
|
1056
|
-
def initialize(tagvalue, separator=nil)
|
1055
|
+
def initialize(tagvalue, separator=nil, options={})
|
1057
1056
|
case tagvalue
|
1058
1057
|
when /\A\/(.*)\/\z/
|
1059
1058
|
tagvalue = $1
|
1060
1059
|
end
|
1061
|
-
super("host", tagvalue, separator)
|
1060
|
+
super("host", tagvalue, separator, options)
|
1062
1061
|
end
|
1063
1062
|
|
1064
1063
|
def condition(options={})
|
@@ -1075,7 +1074,7 @@ module Hotdog
|
|
1075
1074
|
end
|
1076
1075
|
|
1077
1076
|
class RegexpTagNode < RegexpExpressionNode
|
1078
|
-
def initialize(tagname, tagvalue, separator=nil)
|
1077
|
+
def initialize(tagname, tagvalue, separator=nil, options={})
|
1079
1078
|
case tagname
|
1080
1079
|
when /\A\/(.*)\/\z/
|
1081
1080
|
tagname = $1
|
@@ -1084,7 +1083,7 @@ module Hotdog
|
|
1084
1083
|
when /\A\/(.*)\/\z/
|
1085
1084
|
tagvalue = $1
|
1086
1085
|
end
|
1087
|
-
super(tagname, tagvalue, separator)
|
1086
|
+
super(tagname, tagvalue, separator, options)
|
1088
1087
|
end
|
1089
1088
|
|
1090
1089
|
def condition(options={})
|
@@ -1101,12 +1100,12 @@ module Hotdog
|
|
1101
1100
|
end
|
1102
1101
|
|
1103
1102
|
class RegexpTagnameNode < RegexpExpressionNode
|
1104
|
-
def initialize(tagname, separator=nil)
|
1103
|
+
def initialize(tagname, separator=nil, options={})
|
1105
1104
|
case tagname
|
1106
1105
|
when /\A\/(.*)\/\z/
|
1107
1106
|
tagname = $1
|
1108
1107
|
end
|
1109
|
-
super(tagname.to_s, nil, separator)
|
1108
|
+
super(tagname.to_s, nil, separator, options)
|
1110
1109
|
end
|
1111
1110
|
|
1112
1111
|
def condition(options={})
|
@@ -1123,12 +1122,12 @@ module Hotdog
|
|
1123
1122
|
end
|
1124
1123
|
|
1125
1124
|
class RegexpTagvalueNode < RegexpExpressionNode
|
1126
|
-
def initialize(tagvalue, separator=nil)
|
1125
|
+
def initialize(tagvalue, separator=nil, options={})
|
1127
1126
|
case tagvalue
|
1128
1127
|
when /\A\/(.*)\/\z/
|
1129
1128
|
tagvalue = $1
|
1130
1129
|
end
|
1131
|
-
super(nil, tagvalue.to_s, separator)
|
1130
|
+
super(nil, tagvalue.to_s, separator, options)
|
1132
1131
|
end
|
1133
1132
|
|
1134
1133
|
def condition(options={})
|
@@ -1145,8 +1144,8 @@ module Hotdog
|
|
1145
1144
|
end
|
1146
1145
|
|
1147
1146
|
class RegexpHostOrTagNode < RegexpExpressionNode
|
1148
|
-
def initialize(tagname, separator=nil)
|
1149
|
-
super(tagname, separator)
|
1147
|
+
def initialize(tagname, separator=nil, options={})
|
1148
|
+
super(tagname, nil, separator, options)
|
1150
1149
|
end
|
1151
1150
|
|
1152
1151
|
def condition(options={})
|