liquid-tag-parser 1.9.0 → 2.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95964cbed02140b5f9a010ffbf65a105e56f90f84802e9db66e261dfa076990b
4
- data.tar.gz: 187f06b17685649c3413b2a6b5b04685b32bf4d1c2a4bc51077b9526020fa79f
3
+ metadata.gz: 3f793bd6e940a4bb73c68c1db50d5e702526e46e37c1b2cea3be739ec6b077df
4
+ data.tar.gz: ac8132ca543f70e5a2f5624e3f32b27941463180330a21676097a7daa79e2a71
5
5
  SHA512:
6
- metadata.gz: 7b3217969525dcb1a7909678eae91124b2ab0e794be553fcfa7e3a7faa24b2137f918fa24b6988cdc8f88a38ea158458c37aa00a7c155f25468eb062f3e432bc
7
- data.tar.gz: 0ab6f3201ad06af9145bf3e94274b0e85946633707450d7af2bb2991869d08e54732d42b1aafcacb9ef7ef2a96c1735e8de62daf96fac621acffd923b735c67f
6
+ metadata.gz: def93bb9961d3281023246070b8d4fa8bfe7d402b19d1678ba3ab31c191ae6fca4343596287c2782c793c9ca0309cdb16977751fcb531c57065a777c420ad02e
7
+ data.tar.gz: fcaa8a00be1c9ef020d3d8eb5a51ad0cb3e2f3d9957d2cfb287e897c30b815865c1c4e4e4a56838fbbf11850e92f30687631bac2e155b54d0f6acf0c953d5471
data/Gemfile CHANGED
@@ -1,10 +1,11 @@
1
1
  # Frozen-string-literal: true
2
- # Copyright: 2017 Jordon Bedwell - MIT License
2
+ # Copyright: 2017 - 2020 - ISC License
3
+ # Author: Jordon Bedwell
3
4
  # Encoding: utf-8
4
5
 
5
- source "https://rubygems.org"
6
+ source 'https://rubygems.org'
6
7
  gemspec
7
8
 
8
- if ENV["LIQUID_VERSION"]
9
- gem "liquid", ENV["LIQUID_VERSION"]
9
+ if ENV.key?('LIQUID_VERSION')
10
+ gem 'liquid', ENV['LIQUID_VERSION']
10
11
  end
@@ -0,0 +1,6 @@
1
+ # Frozen-string-literal: true
2
+ # Copyright: 2017 - 2020 - ISC License
3
+ # Author: Jordon Bedwell
4
+ # Encoding: utf-8
5
+
6
+ require_relative 'liquid/tag/parser'
@@ -1,58 +1,51 @@
1
1
  # Frozen-string-literal: true
2
- # Copyright: 2017 - 2018 - MIT License
2
+ # Copyright: 2017 - 2020 - ISC License
3
3
  # Author: Jordon Bedwell
4
4
  # Encoding: utf-8
5
5
 
6
- require "extras/hash"
7
- require "forwardable/extended"
8
- require "liquid"
6
+ require 'extras/hash'
7
+ require 'liquid'
9
8
 
10
9
  module Liquid
11
10
  class Tag
12
11
  class Parser
13
12
  attr_reader :args
14
- extend Forwardable::Extended
15
13
  alias raw_args args
16
-
17
- # --
18
- rb_delegate :each, to: :@args
19
- rb_delegate :key?, to: :@args
20
- rb_delegate :to_h, to: :@args
21
- rb_delegate :each_key, to: :@args
22
- rb_delegate :each_with_object, to: :@args
23
- rb_delegate :each_value, to: :@args
24
- rb_delegate :values_at, to: :@args
25
- rb_delegate :to_enum, to: :@args
26
- rb_delegate :map, to: :@args
27
- rb_delegate :[]=, to: :@args
28
- rb_delegate :[], to: :@args
29
- rb_delegate :merge, to: :@args
30
- rb_delegate :merge!, to: :@args
31
- rb_delegate :deep_merge, to: :@args
32
- rb_delegate :deep_merge!, to: :@args
33
- rb_delegate :select, to: :@args
34
- rb_delegate :args_with_indifferent_access, {
35
- to: :@args, alias_of: :with_indifferent_access
36
- }
37
-
38
- # --
39
- FALSE = "!"
40
- FLOAT = %r!\A\d+\.\d+\Z!
41
- QUOTE = %r!("|')([^\1]*)(\1)!
42
- SPECIAL = %r{(?<!\\)(@|!|:|=)}
43
- BOOL = %r{\A(?<!\\)(!|@)([\w:]+)\Z}
44
- UNQUOTED_SPECIAL = %r{(?<!\\)(://)}
45
- SPECIAL_ESCAPED = %r{\\(@|!|:|=)}
46
- KEY = %r{\b(?<!\\):}
47
- INT = %r!^\d+$!
48
- TRUE = "@"
49
-
50
- # This is taken from Ruby 2.4 standard library.
51
- SHELLSPLIT = %r!\G\s*(?>([^\s\\\'\"]+)|'([^\']*)'|"((?:[^\"\\]|
52
- \\.)*)"|(\\.?)|(\S))(\s|\z)?!mx
53
-
54
- # --
55
- def initialize(raw, defaults: {}, sep: "=")
14
+ extend Forwardable
15
+
16
+ def_delegator :@args, :each
17
+ def_delegator :@args, :key?
18
+ def_delegator :@args, :to_h
19
+ def_delegator :@args, :each_key
20
+ def_delegator :@args, :each_with_object
21
+ def_delegator :@args, :each_value
22
+ def_delegator :@args, :values_at
23
+ def_delegator :@args, :to_enum
24
+ def_delegator :@args, :map
25
+ def_delegator :@args, :[]=
26
+ def_delegator :@args, :[]
27
+ def_delegator :@args, :merge
28
+ def_delegator :@args, :merge!
29
+ def_delegator :@args, :deep_merge
30
+ def_delegator :@args, :deep_merge!
31
+ def_delegator :@args, :update
32
+ def_delegator :@args, :select
33
+ def_delegator :@args, :find
34
+ def_delegator :@args, :dig
35
+
36
+ # --
37
+ FALSE = '!'
38
+ FLOAT = %r!\A\d+\.\d+\Z!.freeze
39
+ QUOTE = %r!(["'])([^\1]*)(\1)!.freeze
40
+ SPECIAL = %r{(?<!\\)([@!:=])}.freeze
41
+ BOOL = %r{\A(?<!\\)([!@])([\w:]+)\z}.freeze
42
+ UNQUOTED_SPECIAL = %r{(?<!\\)(://)}.freeze
43
+ SPECIAL_ESCAPED = %r{\\([@!:=])}.freeze
44
+ KEY = %r{\b(?<!\\):}.freeze
45
+ INT = %r!^\d+$!.freeze
46
+ TRUE = '@'
47
+
48
+ def initialize(raw, defaults: {}, sep: '=')
56
49
  @sep = sep
57
50
  @unescaped_sep = sep
58
51
  @rsep = Regexp.escape(sep)
@@ -65,84 +58,107 @@ module Liquid
65
58
  parse
66
59
  end
67
60
 
68
- # --
61
+ #
69
62
  # Consumes a block and wraps around reusably on arguments.
70
63
  # @return [Hash<Symbol,Object>,Array<String>]
71
- # --
64
+ #
72
65
  def skippable_loop(skip: [], hash: false)
73
- @args.each_with_object(hash ? {} : []) do |(k, v), o|
74
- skip_in_html?(k: k, v: v, skips: skip) ? next : yield([k, v], o)
66
+ @args.each_with_object(hash ? {} : []) do |(key, val), obj|
67
+ next obj if skip_in_html?(key: key, val: val, skips: skip)
68
+ yield(
69
+ [
70
+ key,
71
+ val
72
+ ],
73
+ obj
74
+ )
75
75
  end
76
76
  end
77
77
 
78
- # --
78
+ #
79
79
  # @param [Array<Symbol>] skip keys to skip.
80
80
  # Converts the arguments into an HTML attribute string.
81
81
  # @return [String]
82
- # --
82
+ #
83
83
  def to_html(skip: [])
84
84
  skippable_loop(skip: skip, hash: false) do |(k, v), o|
85
85
  o << (v == true ? k.to_s : "#{k}=\"#{v}\"")
86
- end.join(" ")
86
+ end.join(' ')
87
87
  end
88
88
 
89
- # --
89
+ #
90
+ # indifferent args as a hash
91
+ # @note this will require you to have ActiveSupport
92
+ # @return [HashWithIndifferentAccess]
93
+ #
94
+ def args_with_indifferent_access
95
+ @args.send(
96
+ :with_indifferent_access
97
+ )
98
+ end
99
+
100
+ #
90
101
  # @param [Array<Symbol>] skip keys to skip.
91
- # @param [true,false] for_html skip non-html values.
102
+ # @param [true,false] html skip non-html values.
92
103
  # Converts arguments into an HTML hash (or to arguments).
93
- # @return [Hash]
94
- # --
104
+ # @return [Hash<Object>,Array<String>]
105
+ #
95
106
  def to_h(skip: [], html: false)
96
107
  return @args unless html
108
+
97
109
  skippable_loop(skip: skip, hash: true) do |(k, v), o|
98
110
  o[k] = v
99
111
  end
100
112
  end
101
113
 
102
- # --
103
- # @param [String] k the key
104
- # @param [Object] v the value
114
+ #
115
+ # @param [String] key the key
116
+ # @param [Object] val the value
105
117
  # @param [Array<Symbol>] skips personal skips.
106
118
  # Determines if we should skip in HTML.
107
119
  # @return [true,false]
108
- # --
120
+ #
109
121
  private
110
- def skip_in_html?(k:, v:, skips: [])
111
- k == :argv1 || v.is_a?(Array) || skips.include?(k) \
112
- || v.is_a?(Hash) || v == false
122
+ def skip_in_html?(key:, val:, skips: [])
123
+ key == :argv1 || val.is_a?(Array) || skips.include?(key) \
124
+ || val.is_a?(Hash) || val == false
113
125
  end
114
126
 
115
- # --
127
+ #
116
128
  # @return [true,nil] a truthy value.
117
- # @param [Integer] i the current iteration.
129
+ # @param [Integer] idx the current iteration.
118
130
  # @param [String] keys the keys that will be split.
119
131
  # @param [String] val the value.
120
- # --
132
+ #
121
133
  private
122
- def argv1(i:, k:, v:)
123
- if i.zero? && k.empty? && v !~ BOOL && v !~ @sep_regexp
124
- @args[:argv1] = unescape(convert(v))
134
+ def argv1(idx:, keys:, val:)
135
+ if idx.zero? && keys.empty? && val !~ BOOL && val !~ @sep_regexp
136
+ @args[:argv1] = unescape(
137
+ convert(
138
+ val
139
+ )
140
+ )
125
141
  end
126
142
  end
127
143
 
128
- # --
144
+ #
129
145
  # @return [Array<String,true|false>]
130
146
  # Allows you to flip a value based on condition.
131
- # @param [String] v the value.
132
- # --
147
+ # @param [String] val the value.
148
+ #
133
149
  private
134
- def flip_kv_bool(v)
150
+ def flip_kv_bool(val)
135
151
  [
136
- v.gsub(BOOL, "\\2"),
137
- v.start_with?(TRUE) ? true : false,
152
+ val.gsub(BOOL, '\2'),
153
+ val.start_with?(TRUE) ? true : false
138
154
  ]
139
155
  end
140
156
 
141
- # --
157
+ #
142
158
  # @param [Array<Symbol>] keys the keys.
143
159
  # Builds a sub-hash or returns parent hash.
144
160
  # @return [Hash]
145
- # --
161
+ #
146
162
  private
147
163
  def build_hash(keys)
148
164
  out = @args
@@ -160,86 +176,62 @@ module Liquid
160
176
  private
161
177
  def unescape(val)
162
178
  return unless val
179
+
163
180
  val.gsub(@escaped_sep_regexp, @unescaped_sep).gsub(
164
- SPECIAL_ESCAPED, "\\1")
181
+ SPECIAL_ESCAPED, '\1')
165
182
  end
166
183
 
167
- # --
168
184
  private
169
185
  def parse
170
186
  from_shellwords.each_with_index do |k, i|
171
187
  keys, _, val = k.rpartition(@sep_regexp)
172
- next if argv1(i: i, k: keys, v: val)
188
+ next if argv1(idx: i, keys: keys, val: val)
173
189
 
174
190
  val = unescape(val)
175
191
  keys, val = flip_kv_bool(val) if val =~ BOOL && keys.empty?
176
192
  keys, val = val, nil if keys.empty?
177
193
  keys = keys.split(KEY).map(&:to_sym)
178
194
 
179
- set_val({
180
- v: convert(val),
195
+ set_val(
196
+ val: convert(val),
181
197
  hash: build_hash(keys),
182
- k: keys.last,
183
- })
198
+ key: keys.last
199
+ )
184
200
  end
185
201
  end
186
202
 
187
- # --
188
203
  private
189
- def set_val(k:, v:, hash:)
190
- hash[k] << v if hash[k].is_a?(Array)
191
- hash[k] = [hash[k]].flatten << v if hash[k] && !hash[k].is_a?(Array)
192
- hash[k] = v unless hash[k]
204
+ def set_val(key:, val:, hash:)
205
+ hash[key] << val if hash[key].is_a?(Array)
206
+ hash[key] = [hash[key]].flatten << val if hash[key] && !hash[key].is_a?(Array)
207
+ hash[key] = val unless hash[key]
193
208
  end
194
209
 
195
- # --
210
+ #
196
211
  # @return [true,false,Float,Integer]
197
212
  # Convert a value to a native value.
198
- # --
213
+ #
199
214
  private
200
215
  def convert(val)
216
+ return if val.nil?
217
+ return val if [true, false].include?(val)
201
218
  return val.to_f if val =~ FLOAT
202
219
  return val.to_i if val =~ INT
220
+
203
221
  val
204
222
  end
205
223
 
206
- # --
224
+ #
207
225
  # Wraps into `#shellsplit`, and first substitutes some values.
208
226
  # @return [Array<String>]
209
- # --
227
+ #
210
228
  private
211
229
  def from_shellwords
212
- shellsplit(
213
- @raw.gsub(SPECIAL, "\\\\\\1")
214
- .gsub(UNQUOTED_SPECIAL, "\\\\\\1")
230
+ Shellwords.shellsplit(
231
+ @raw.gsub(SPECIAL, '\1')
232
+ .gsub(UNQUOTED_SPECIAL, '\1')
215
233
  .gsub(@sep_regexp, @escaped_sep))
216
234
  end
217
-
218
- # --
219
- # @see Shellwords.shellsplit
220
- # Because Shellwords.shellwords on < 2.4 has problems with
221
- # quotes and \\, we ported this back, this pretty much the
222
- # same thing except we replace some of the questionable
223
- # code like `String.new`
224
- # --
225
- private
226
- def shellsplit(line)
227
- out, field = [], ""
228
-
229
- # rubocop:disable Metrics/ParameterLists
230
- line.scan(SHELLSPLIT) do |w, s, d, e, g, se|
231
- raise ArgumentError, "Unmatched double quote: #{line.inspect}" if g
232
- field = field + (w || s || (d&.gsub(%r!\\([$`"\\\n])!,
233
- '\\1')) || e.gsub(%r!\\(.)!, '\\1'))
234
-
235
- if se
236
- out << field
237
- field = ""
238
- end
239
- end
240
-
241
- out
242
- end
243
235
  end
244
236
  end
245
237
  end
@@ -1,12 +1,12 @@
1
1
  # Frozen-string-literal: true
2
- # Copyright: 2017 - 2018 - MIT License
2
+ # Copyright: 2017 - 2020 - ISC License
3
3
  # Author: Jordon Bedwell
4
4
  # Encoding: utf-8
5
5
 
6
6
  module Liquid
7
7
  class Tag
8
8
  class Parser
9
- VERSION = "1.9.0"
9
+ VERSION = '2.0.0'
10
10
  end
11
11
  end
12
12
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: liquid-tag-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jordon Bedwell
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-12 00:00:00.000000000 Z
11
+ date: 2020-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: rake
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '12'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '12'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: pry
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -39,19 +25,19 @@ dependencies:
39
25
  - !ruby/object:Gem::Version
40
26
  version: '0.11'
41
27
  - !ruby/object:Gem::Dependency
42
- name: rubocop
28
+ name: rake
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
- - - '='
31
+ - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '0.52'
33
+ version: '13.0'
48
34
  type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
- - - '='
38
+ - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '0.52'
40
+ version: '13.0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: simplecov
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +72,20 @@ dependencies:
86
72
  - - "<"
87
73
  - !ruby/object:Gem::Version
88
74
  version: '4'
75
+ - !ruby/object:Gem::Dependency
76
+ name: envygeeks-rubocop
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - '='
80
+ - !ruby/object:Gem::Version
81
+ version: '1'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - '='
87
+ - !ruby/object:Gem::Version
88
+ version: '1'
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: luna-rspec-formatters
91
91
  requirement: !ruby/object:Gem::Requirement
@@ -142,6 +142,7 @@ extensions: []
142
142
  extra_rdoc_files: []
143
143
  files:
144
144
  - Gemfile
145
+ - lib/liquid-tag-parser.rb
145
146
  - lib/liquid/tag/parser.rb
146
147
  - lib/liquid/tag/parser/version.rb
147
148
  homepage: http://github.com/envygeeks/liquid-tag-parser
@@ -163,8 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
163
164
  - !ruby/object:Gem::Version
164
165
  version: '0'
165
166
  requirements: []
166
- rubyforge_project:
167
- rubygems_version: 2.7.6
167
+ rubygems_version: 3.1.2
168
168
  signing_key:
169
169
  specification_version: 4
170
170
  summary: Parse liquid tags like a professional