liquid2 0.1.0 → 0.2.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.
@@ -5,6 +5,8 @@ require_relative "errors"
5
5
  module Liquid2
6
6
  # The default undefined type. Can be iterated over an indexed without error.
7
7
  class Undefined
8
+ include Enumerable
9
+
8
10
  attr_reader :force_default
9
11
 
10
12
  def initialize(name, node: nil)
@@ -37,87 +39,87 @@ module Liquid2
37
39
  class StrictUndefined < Undefined
38
40
  def initialize(name, node: nil)
39
41
  super
40
- @message = "#{name.inspect} is undefined"
42
+ @message = "#{@node.is_a?(Path) ? @node : name.inspect} is undefined"
41
43
  end
42
44
 
43
45
  def respond_to_missing? = true
44
46
 
45
47
  def method_missing(...)
46
- raise UndefinedError.new(@message, @node)
48
+ raise UndefinedError.new(@message, @node.token)
47
49
  end
48
50
 
49
51
  def [](...)
50
- raise UndefinedError.new(@message, @node)
52
+ raise UndefinedError.new(@message, @node.token)
51
53
  end
52
54
 
53
55
  def key?(...)
54
- raise UndefinedError.new(@message, @node)
56
+ raise UndefinedError.new(@message, @node.token)
55
57
  end
56
58
 
57
59
  def include?(...)
58
- raise UndefinedError.new(@message, @node)
60
+ raise UndefinedError.new(@message, @node.token)
59
61
  end
60
62
 
61
63
  def member?(...)
62
- raise UndefinedError.new(@message, @node)
64
+ raise UndefinedError.new(@message, @node.token)
63
65
  end
64
66
 
65
67
  def fetch(...)
66
- raise UndefinedError.new(@message, @node)
68
+ raise UndefinedError.new(@message, @node.token)
67
69
  end
68
70
 
69
71
  def !
70
- raise UndefinedError.new(@message, @node)
72
+ raise UndefinedError.new(@message, @node.token)
71
73
  end
72
74
 
73
75
  def ==(_other)
74
- raise UndefinedError.new(@message, @node)
76
+ raise UndefinedError.new(@message, @node.token)
75
77
  end
76
78
 
77
79
  def !=(_other)
78
- raise UndefinedError.new(@message, @node)
80
+ raise UndefinedError.new(@message, @node.token)
79
81
  end
80
82
 
81
83
  alias eql? ==
82
84
 
83
85
  def size
84
- raise UndefinedError.new(@message, @node)
86
+ raise UndefinedError.new(@message, @node.token)
85
87
  end
86
88
 
87
89
  def length
88
- raise UndefinedError.new(@message, @node)
90
+ raise UndefinedError.new(@message, @node.token)
89
91
  end
90
92
 
91
93
  def to_s
92
- raise UndefinedError.new(@message, @node)
94
+ raise UndefinedError.new(@message, @node.token)
93
95
  end
94
96
 
95
97
  def to_i
96
- raise UndefinedError.new(@message, @node)
98
+ raise UndefinedError.new(@message, @node.token)
97
99
  end
98
100
 
99
101
  def to_f
100
- raise UndefinedError.new(@message, @node)
102
+ raise UndefinedError.new(@message, @node.token)
101
103
  end
102
104
 
103
105
  def each(...)
104
- raise UndefinedError.new(@message, @node)
106
+ raise UndefinedError.new(@message, @node.token)
105
107
  end
106
108
 
107
109
  def each_with_index(...)
108
- raise UndefinedError.new(@message, @node)
110
+ raise UndefinedError.new(@message, @node.token)
109
111
  end
110
112
 
111
113
  def join(...)
112
- raise UndefinedError.new(@message, @node)
114
+ raise UndefinedError.new(@message, @node.token)
113
115
  end
114
116
 
115
117
  def to_liquid(_context)
116
- raise UndefinedError.new(@message, @node)
118
+ raise UndefinedError.new(@message, @node.token)
117
119
  end
118
120
 
119
121
  def poke
120
- raise UndefinedError.new(@message, @node)
122
+ raise UndefinedError.new(@message, @node.token)
121
123
  end
122
124
  end
123
125
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Liquid2
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/liquid2.rb CHANGED
@@ -73,6 +73,8 @@ module Liquid2
73
73
  # @param obj [Object]
74
74
  # @return [bool]
75
75
  def self.truthy?(context, obj)
76
+ return false if context.env.falsy_undefined && undefined?(obj)
77
+
76
78
  obj = obj.to_liquid(context) if obj.respond_to?(:to_liquid)
77
79
  !!obj
78
80
  end
data/sig/liquid2.rbs CHANGED
@@ -76,6 +76,8 @@ module Liquid2
76
76
 
77
77
  @undefined: singleton(Undefined)
78
78
 
79
+ @falsy_undefined: bool
80
+
79
81
  @loader: TemplateLoader
80
82
 
81
83
  @globals: Hash[String, untyped]?
@@ -98,7 +100,9 @@ module Liquid2
98
100
 
99
101
  attr_reader shorthand_indexes: bool
100
102
 
101
- def initialize: (?context_depth_limit: ::Integer, ?globals: Hash[String, untyped]?, ?loader: TemplateLoader?, ?local_namespace_limit: Integer?, ?loop_iteration_limit: Integer?, ?output_stream_limit: Integer?, ?shorthand_indexes: bool, ?suppress_blank_control_flow_blocks: bool, ?undefined: singleton(Undefined)) -> void
103
+ attr_reader falsy_undefined: bool
104
+
105
+ def initialize: (?context_depth_limit: ::Integer, ?globals: Hash[String, untyped]?, ?loader: TemplateLoader?, ?local_namespace_limit: Integer?, ?loop_iteration_limit: Integer?, ?output_stream_limit: Integer?, ?shorthand_indexes: bool, ?suppress_blank_control_flow_blocks: bool, ?undefined: singleton(Undefined), ?falsy_undefined: bool) -> void
102
106
 
103
107
  # @param source [String] template source text.
104
108
  # @return [Template]
@@ -123,6 +127,10 @@ module Liquid2
123
127
  # if _name_ did not exist in the filter register.
124
128
  def delete_filter: (String name) -> ([_Filter, (Integer | nil)] | nil)
125
129
 
130
+ def register_tag: (String name, _Tag tag) -> void
131
+
132
+ def delete_tag: (String name) -> (_Tag | nil)
133
+
126
134
  def setup_tags_and_filters: () -> void
127
135
 
128
136
  def undefined: (String name, ?node: _HasToken?) -> Undefined
@@ -336,6 +344,8 @@ module Liquid2
336
344
  def parse_string: () -> String
337
345
 
338
346
  def parse_identifier: (?trailing_question: bool) -> Identifier
347
+
348
+ def parse_name: () -> String
339
349
 
340
350
  # Parse comma separated expression.
341
351
  # Leading commas should be consumed by the caller.
@@ -346,6 +356,10 @@ module Liquid2
346
356
  # Leading commas should be consumed by the caller.
347
357
  # @return [Array<KeywordArgument>]
348
358
  def parse_keyword_arguments: () -> Array[KeywordArgument]
359
+
360
+ def parse_parameters: () -> Hash[String, Parameter]
361
+
362
+ def parse_arguments: () -> [Array[untyped], Array[KeywordArgument]]
349
363
 
350
364
  class Precedence
351
365
  LOWEST: 1
@@ -461,6 +475,8 @@ module Liquid2
461
475
 
462
476
  attr_reader up_to_date: Proc::_Callable?
463
477
 
478
+ attr_reader source: String
479
+
464
480
  # @param env [Environment]
465
481
  # @param ast [RootNode]
466
482
  # @param name [String] The template's name.
@@ -489,6 +505,10 @@ module Liquid2
489
505
 
490
506
  def comments: () -> Array[BlockComment | InlineComment | Comment]
491
507
 
508
+ def docs: () -> Array[DocTag]
509
+
510
+ def macros: (?include_partials: bool) -> [Array[MacroTag], Array[CallTag]]
511
+
492
512
  # Return an array of variables used in this template, without path segments.
493
513
  # @param include_partials [bool]
494
514
  # @return [Array[String]]
@@ -830,11 +850,11 @@ module Liquid2
830
850
  @loops: Array[ForLoop]
831
851
 
832
852
  # A stack of interrupts used to signal breaking and continuing `for` loops.
833
- @interrupts: Array[:break | :continue]
853
+ @interrupts: Array[Symbol]
834
854
 
835
855
  attr_reader env: Environment
836
856
 
837
- attr_reader template: Template
857
+ attr_accessor template: Template
838
858
 
839
859
  attr_reader globals: _Namespace
840
860
 
@@ -842,8 +862,7 @@ module Liquid2
842
862
 
843
863
  attr_reader tag_namespace: Hash[Symbol, untyped]
844
864
 
845
- attr_accessor interrupts: Array[:break | :continue]
846
-
865
+ attr_accessor interrupts: Array[Symbol]
847
866
 
848
867
  BUILT_IN: BuiltIn
849
868
 
@@ -911,16 +930,13 @@ module Liquid2
911
930
 
912
931
  def get_output_buffer: (untyped parent_buffer) -> untyped
913
932
 
914
- # Mark _string_ as "safe" if auto escape is enabled.
915
- def markup: (untyped string) -> untyped
916
-
917
933
  def cycle: (untyped key, untyped length) -> untyped
918
934
 
919
- def increment: (untyped name) -> untyped
935
+ def increment: (untyped name) -> Integer
920
936
 
921
- def decrement: (untyped name) -> untyped
937
+ def decrement: (untyped name) -> Integer
922
938
 
923
- def assign_score: (untyped value) -> untyped
939
+ def assign_score: (untyped value) -> Integer
924
940
 
925
941
  end
926
942
  end
@@ -942,7 +958,7 @@ module Liquid2
942
958
 
943
959
  attr_accessor source: (String | nil)
944
960
 
945
- def initialize: (String message, ?[Symbol, String?, Integer]? token) -> void
961
+ def initialize: (String message, ?[Symbol, String?, Integer]? token, ?template_name: String?) -> void
946
962
 
947
963
  def detailed_message: (?highlight: bool, **untyped kwargs) -> String
948
964
 
@@ -975,6 +991,12 @@ module Liquid2
975
991
  class DisabledTagError < LiquidError
976
992
  end
977
993
 
994
+ class TemplateInheritanceError < LiquidError
995
+ end
996
+
997
+ class RequiredBlockError < TemplateInheritanceError
998
+ end
999
+
978
1000
  # The standard _for_ tag.
979
1001
  class ForTag < Tag
980
1002
  @expression: LoopExpression
@@ -1117,6 +1139,26 @@ module Liquid2
1117
1139
 
1118
1140
  def evaluate: (RenderContext context) -> [String, untyped]
1119
1141
  end
1142
+
1143
+ class Parameter < Expression
1144
+ @name: String
1145
+
1146
+ @sym: Symbol
1147
+
1148
+ @value: untyped
1149
+
1150
+ attr_reader name: String
1151
+
1152
+ attr_reader sym: Symbol
1153
+
1154
+ attr_reader value: (untyped | :undefined)
1155
+
1156
+ # @param name [Token]
1157
+ # @param value [Expression]
1158
+ def initialize: ([Symbol, String?, Integer] token, String name, untyped value) -> void
1159
+
1160
+ def evaluate: (RenderContext context) -> [String, untyped]
1161
+ end
1120
1162
  end
1121
1163
 
1122
1164
  module Liquid2
@@ -1170,11 +1212,11 @@ module Liquid2
1170
1212
  class FilteredExpression < Expression
1171
1213
  @left: Expression
1172
1214
 
1173
- @filters: Array[Filter]
1215
+ @filters: Array[Filter]?
1174
1216
 
1175
- attr_reader filters: Array[Filter]
1217
+ attr_reader filters: Array[Filter]?
1176
1218
 
1177
- def initialize: ([Symbol, String?, Integer] token, untyped left, Array[Filter] filters) -> void
1219
+ def initialize: ([Symbol, String?, Integer] token, untyped left, Array[Filter]? filters) -> void
1178
1220
 
1179
1221
  def evaluate: (RenderContext context) -> untyped
1180
1222
  end
@@ -1207,25 +1249,17 @@ module Liquid2
1207
1249
  class Filter < Expression
1208
1250
  @name: String
1209
1251
 
1210
- @args: Array[untyped]
1252
+ @args: Array[untyped]?
1211
1253
 
1212
1254
  attr_reader name: String
1213
1255
 
1214
- attr_reader args: Array[untyped]
1256
+ attr_reader args: Array[untyped]?
1215
1257
 
1216
1258
  # @param name [Token]
1217
1259
  # @param args [Array[Expression]]
1218
- def initialize: ([Symbol, String?, Integer] token, String name, Array[untyped] args) -> void
1260
+ def initialize: ([Symbol, String?, Integer] token, String name, Array[untyped]? args) -> void
1219
1261
 
1220
1262
  def evaluate: (untyped left, RenderContext context) -> untyped
1221
-
1222
- private
1223
-
1224
- # @param context [RenderContext]
1225
- # @return [positional arguments, keyword arguments] An array with two elements.
1226
- # The first is an array of evaluates positional arguments. The second is a hash
1227
- # of keyword names to evaluated keyword values.
1228
- def evaluate_args: (RenderContext context) -> [Array[untyped], Hash[Symbol, untyped]]
1229
1263
  end
1230
1264
  end
1231
1265
 
@@ -1341,10 +1375,16 @@ module Liquid2
1341
1375
  attr_reader segments: Array[String | Integer | Path]
1342
1376
  attr_reader head: (String | Integer | Path)
1343
1377
 
1378
+ RE_PROPERTY: ::Regexp
1379
+
1344
1380
  # @param segments [Array[String | Integer | Path]]
1345
1381
  def initialize: ([Symbol, String?, Integer] token, Array[String | Integer | Path] segments) -> void
1346
1382
 
1347
1383
  def evaluate: (RenderContext context) -> untyped
1384
+
1385
+ private
1386
+
1387
+ def segment_to_s: (untyped segment, ?head: bool) -> ::String
1348
1388
  end
1349
1389
  end
1350
1390
 
@@ -1717,6 +1757,8 @@ module Liquid2
1717
1757
 
1718
1758
  def self.nil_safe_casecmp: (untyped a, untyped b) -> (0 | 1 | -1)
1719
1759
 
1760
+ INFINITY_ARRAY: [Float]
1761
+
1720
1762
  def self.numeric_compare: (untyped left, untyped right) -> (0 | 1 | -1)
1721
1763
 
1722
1764
  def self.ints: (untyped obj) -> Array[(Integer | Float | BigDecimal)]
@@ -1956,6 +1998,8 @@ module Liquid2
1956
1998
  class DocTag < Tag
1957
1999
  @text: String
1958
2000
 
2001
+ attr_reader text: String
2002
+
1959
2003
  def self.parse: ([Symbol, String?, Integer] token, Parser parser) -> DocTag
1960
2004
 
1961
2005
  # @param text [String]
@@ -1984,7 +2028,7 @@ end
1984
2028
  module Liquid2
1985
2029
  # The standard _include_ tag.
1986
2030
  class IncludeTag < Tag
1987
- @name: untyped
2031
+ @template_name: untyped
1988
2032
 
1989
2033
  @repeat: bool
1990
2034
 
@@ -2014,7 +2058,7 @@ module Liquid2
2014
2058
 
2015
2059
  # The standard _render_ tag.
2016
2060
  class RenderTag < Tag
2017
- @name: untyped
2061
+ @template_name: untyped
2018
2062
 
2019
2063
  @repeat: bool
2020
2064
 
@@ -2345,4 +2389,166 @@ module Liquid2
2345
2389
  # Return _left_ serialized in JSON format.
2346
2390
  def self.json: (untyped left, ?pretty: bool) -> String
2347
2391
  end
2392
+ end
2393
+
2394
+ module Liquid2
2395
+ # The _macro_ tag.
2396
+ class MacroTag < Tag
2397
+ @macro_name: String
2398
+
2399
+ @params: Hash[String, Parameter]
2400
+
2401
+ @block: Block
2402
+
2403
+ @blank: bool
2404
+
2405
+ END_BLOCK: Set[String]
2406
+
2407
+ attr_reader macro_name: String
2408
+
2409
+ attr_reader params: Hash[String, Parameter]
2410
+
2411
+ attr_reader Block: Block
2412
+
2413
+ # @param parser [Parser]
2414
+ # @return [MacroTag]
2415
+ def self.parse: ([Symbol, String?, Integer] token, Parser parser) -> MacroTag
2416
+
2417
+ def initialize: ([Symbol, String?, Integer] token, String name, Hash[String, Parameter] params, Block block) -> void
2418
+
2419
+ def render: (RenderContext context, String _buffer) -> void
2420
+ end
2421
+
2422
+ # The _call_ tag.
2423
+ class CallTag < Tag
2424
+ @macro_name: String
2425
+
2426
+ @args: Array[untyped]
2427
+
2428
+ @kwargs: Array[KeywordArgument]
2429
+
2430
+ @blank: bool
2431
+
2432
+ DISABLED_TAGS: Set[String]
2433
+
2434
+ attr_reader macro_name: String
2435
+
2436
+ attr_reader args: Array[untyped]
2437
+
2438
+ attr_reader kwargs: Array[KeywordArgument]
2439
+
2440
+ # @param parser [Parser]
2441
+ # @return [CallTag]
2442
+ def self.parse: ([Symbol, String?, Integer] token, Parser parser) -> CallTag
2443
+
2444
+ def initialize: ([Symbol, String?, Integer] token, String name, Array[untyped] args, Array[KeywordArgument] kwargs) -> void
2445
+
2446
+ def render: (RenderContext context, String buffer) -> void
2447
+ end
2448
+ end
2449
+
2450
+ module Liquid2
2451
+ # The _extends_ tag.
2452
+ class ExtendsTag < Tag
2453
+ @template_name: String
2454
+
2455
+ @blank: bool
2456
+
2457
+ attr_reader template_name: String
2458
+
2459
+ # @param token [[Symbol, String?, Integer]]
2460
+ # @param parser [Parser]
2461
+ # @return [ExtendsTag]
2462
+ def self.parse: ([Symbol, String?, Integer] token, Parser parser) -> ExtendsTag
2463
+
2464
+ def initialize: ([Symbol, String?, Integer] token, String name) -> void
2465
+
2466
+ def render: (RenderContext context, String buffer) -> void
2467
+
2468
+ def stack_blocks: (RenderContext context, Template template) -> Template?
2469
+
2470
+ def inheritance_nodes: (RenderContext context, Template template) -> [Array[ExtendsTag], Array[BlockTag]]
2471
+ end
2472
+
2473
+ # The _block_ tag.
2474
+ class BlockTag < Tag
2475
+ @block_name: String
2476
+
2477
+ @block: Block
2478
+
2479
+ @required: bool
2480
+
2481
+ @blank: bool
2482
+
2483
+ END_BLOCK: Set[String]
2484
+
2485
+ attr_reader block_name: String
2486
+
2487
+ attr_reader block: Block
2488
+
2489
+ attr_reader required: bool
2490
+
2491
+ # @param token [[Symbol, String?, Integer]]
2492
+ # @param parser [Parser]
2493
+ # @return [BlockTag]
2494
+ def self.parse: ([Symbol, String?, Integer] token, Parser parser) -> BlockTag
2495
+
2496
+ def initialize: ([Symbol, String?, Integer] token, String name, Block block, required: bool) -> void
2497
+
2498
+ def render: (RenderContext context, String buffer) -> void
2499
+ end
2500
+
2501
+ class BlockDrop
2502
+ @token: [Symbol, String?, Integer]
2503
+
2504
+ @context: RenderContext
2505
+
2506
+ @buffer: String
2507
+
2508
+ @name: String
2509
+
2510
+ @parent: [BlockTag, bool, Template, untyped?]?
2511
+
2512
+ attr_reader token: [Symbol, String?, Integer]
2513
+
2514
+ # @param token [[Symbol, String?, Integer]]
2515
+ # @param context [RenderContext]
2516
+ # @param name [String]
2517
+ # @param parent [[BlockTag, bool, String, Block?]?]
2518
+ def initialize: ([Symbol, String?, Integer] token, RenderContext context, String name, untyped parent) -> void
2519
+
2520
+ def to_s: () -> ::String
2521
+
2522
+ def key?: (untyped key) -> bool
2523
+
2524
+ def []: (untyped key) -> untyped
2525
+ end
2526
+ end
2527
+
2528
+ module Liquid2
2529
+ class WithTag < Tag
2530
+ @args: Array[KeywordArgument]
2531
+
2532
+ @block: Block
2533
+
2534
+ @blank: bool
2535
+
2536
+ END_BLOCK: Set[String]
2537
+
2538
+ # @param token [[Symbol, String?, Integer]]
2539
+ # @param parser [Parser]
2540
+ # @return [WithTag]
2541
+ def self.parse: ([Symbol, String?, Integer] token, Parser parser) -> WithTag
2542
+
2543
+ # @param token [[Symbol, String?, Integer]]
2544
+ # @param args [Array[KeywordArgument]]
2545
+ # @param block [Block]
2546
+ def initialize: ([Symbol, String?, Integer] token, Array[KeywordArgument] args, Block block) -> void
2547
+
2548
+ def render: (RenderContext context, String buffer) -> void
2549
+
2550
+ def children: (untyped _static_context, ?include_partials: bool) -> ::Array[Node]
2551
+
2552
+ def block_scope: () -> Array[Identifier]
2553
+ end
2348
2554
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: liquid2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Prior
@@ -51,6 +51,20 @@ dependencies:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
53
  version: '3.1'
54
+ - !ruby/object:Gem::Dependency
55
+ name: base64
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.2'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.2'
54
68
  email:
55
69
  - jamesgr.prior@gmail.com
56
70
  executables: []
@@ -59,7 +73,6 @@ extra_rdoc_files: []
59
73
  files:
60
74
  - ".rubocop.yml"
61
75
  - ".ruby-version"
62
- - ".vscode/settings.json"
63
76
  - CHANGELOG.md
64
77
  - LICENSE.txt
65
78
  - LICENSE_SHOPIFY.txt
metadata.gz.sig CHANGED
Binary file
@@ -1,32 +0,0 @@
1
- {
2
- "rubocop.mode": "enableUnconditionally",
3
- "cSpell.words": [
4
- "bigdecimal",
5
- "bytesize",
6
- "byteslice",
7
- "charpos",
8
- "Cyclomatic",
9
- "endcapture",
10
- "endcase",
11
- "endcomment",
12
- "endraw",
13
- "forloop",
14
- "ivar",
15
- "keyreq",
16
- "kwargs",
17
- "ljust",
18
- "lparen",
19
- "lstrip",
20
- "ndigits",
21
- "nodoc",
22
- "parentloop",
23
- "rparen",
24
- "rpartition",
25
- "rstrip",
26
- "tablerow",
27
- "truncatewords"
28
- ],
29
- "cSpell.enabledFileTypes": {
30
- "ruby": true
31
- }
32
- }