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.
@@ -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
- case op
71
- when :NOOP
72
- optimize1(options)
73
- when :NOT
74
- case expression
75
- when EverythingNode
76
- NothingNode.new(options)
77
- when NothingNode
78
- EverythingNode.new(options)
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
- @expression = expression.optimize(options)
84
- self
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
- private
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
- @expression = expression.optimize(options)
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
- @left = @left.optimize(options)
258
- @right = @right.optimize(options)
276
+ o_left = @left.optimize(options)
277
+ o_right = @right.optimize(options)
259
278
  case op
260
279
  when :AND
261
- case left
280
+ case o_left
262
281
  when EverythingNode
263
- right
282
+ o_right
264
283
  when NothingNode
265
- left
284
+ o_left
266
285
  else
267
- if left == right
268
- left
286
+ if o_left == o_right
287
+ o_left
269
288
  else
270
- optimize1(options)
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 left
297
+ case o_left
275
298
  when EverythingNode
276
- left
299
+ o_left
277
300
  when NothingNode
278
- right
301
+ o_right
279
302
  else
280
- if left == right
281
- left
303
+ if o_left == o_right
304
+ o_left
282
305
  else
283
- if MultinaryExpressionNode === left
284
- if left.op == op
285
- left.merge(right, fallback: self)
306
+ if MultinaryExpressionNode === o_left
307
+ if o_left.op == op
308
+ o_left.merge(o_right, fallback: self)
286
309
  else
287
- optimize1(options)
310
+ BinaryExpressionNode.new(
311
+ op,
312
+ o_left,
313
+ o_right,
314
+ ).optimize1(options)
288
315
  end
289
316
  else
290
- if MultinaryExpressionNode === right
291
- if right.op == op
292
- right.merge(left, fallback: self)
317
+ if MultinaryExpressionNode === o_right
318
+ if o_right.op == op
319
+ o_right.merge(o_left, fallback: self)
293
320
  else
294
- optimize1(options)
321
+ BinaryExpressionNode.new(
322
+ op,
323
+ o_left,
324
+ o_right,
325
+ ).optimize1(options)
295
326
  end
296
327
  else
297
- MultinaryExpressionNode.new(op, [left, right], fallback: self)
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 left == right
334
+ if o_left == o_right
304
335
  NothingNode.new(options)
305
336
  else
306
- optimize1(options)
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
- private
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
- @fallback = options[:fallback]
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
- @fallback = options[:fallback]
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
- @args[0] = @args[0].optimize(options)
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
- @args[1] = @args[1].tagname
530
+ o_args << @args[1].tagname
497
531
  else
498
- @args[1] = @args[1]
532
+ o_args << @args[1]
499
533
  end
500
534
  when :ORDER_BY
501
- @args[0] = @args[0].optimize(options)
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
- @args[1] = @args[1].tagname
539
+ o_args << @args[1].tagname
506
540
  else
507
- @args[1] = @args[1]
541
+ o_args << @args[1]
508
542
  end
509
543
  end
510
- when :REVERSE
511
- @args[0] = @args[0].optimize(options)
512
- when :SHUFFLE
513
- @args[0] = @args[0].optimize(options)
514
- when :SLICE
515
- @args[0] = @args[0].optimize(options)
516
- when :TAIL
517
- @args[0] = @args[0].optimize(options)
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
- self
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, fallback: nil).evaluate(environment, options)
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, fallback: nil).evaluate(environment, options)
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, fallback: nil).evaluate(environment, options)
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
- @fallback = nil
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
- values = @fallback.evaluate(environment, options.merge(did_fallback: true))
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
- if reload(environment, options)
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
- @fallback = maybe_fallback(options)
695
- self
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 ] = @fallback.dump(options) if @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={})