hotdog 0.26.0 → 0.27.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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={})