template-ruby 2.0.0 → 2.0.2

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: 6e1de5aacb6227032062253398346bdf048b54c60a8ca8c4a38e4ee9f6acb6f2
4
- data.tar.gz: 132127967a371ccc8581aa68571337762874c34080fac445edc948800df1c2a5
3
+ metadata.gz: 665b3ed31b59ab356649bb8722c2f974dfa632682cfeaea79614208514dbce58
4
+ data.tar.gz: a08beddc4e3f614c99838d5a23bba7ad398206ae4035eba2981b2c2c8c844260
5
5
  SHA512:
6
- metadata.gz: b55376fd43886d3e939d48c34e0f1406b2b471cffb287b0534e77287ad6140f40b49e2d1f1064053aa443c40a9a9876e6595ab8246e34b5df5e4e025eb135e1f
7
- data.tar.gz: 464558243762247e67c7260f68587affd7349e8d53f3dd2bb9116a4dc4043552307b32c6aa6e8801fba541cba7d8a3a42ef0de5496816adccda2f217934e22ed
6
+ metadata.gz: 0d4f04517728011c40fba3d9044a6974309e6936f71b9e2a92416b78eeff3bc7a8a5e38cd1300641c9ca6dee0d74211aa36a62931666f1780a9a76a57f7d0610
7
+ data.tar.gz: 0d64e9391461bc48fcef190e1c7559d7bdb03eb6f9c1a9bd93e502343e12b49849ce2d31cfb0728903818985d8ad2a6f829a20da8c4fe0cd788d409d1a6ed862
data/.rubocop.yml CHANGED
@@ -143,7 +143,6 @@ Style/StringLiterals:
143
143
  Style/StringLiteralsInInterpolation:
144
144
  Enabled: false
145
145
  plugins:
146
- - rubocop-factory_bot
147
146
  - rubocop-performance
148
147
  - rubocop-rails
149
148
  - rubocop-rake
data/Gemfile CHANGED
@@ -10,7 +10,6 @@ gem "bundler-audit"
10
10
  gem "dorian"
11
11
  gem "rspec"
12
12
  gem "rubocop-capybara"
13
- gem "rubocop-factory_bot"
14
13
  gem "rubocop-performance"
15
14
  gem "rubocop-rails"
16
15
  gem "rubocop-rake"
data/Gemfile.lock CHANGED
@@ -1,16 +1,16 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- template-ruby (2.0.0)
5
- code-ruby
6
- dorian-arguments
7
- language-ruby
8
- zeitwerk
4
+ template-ruby (2.0.2)
5
+ code-ruby (>= 5.0.10, < 6)
6
+ dorian-arguments (>= 2.0.1, < 3)
7
+ language-ruby (>= 2.0.2, < 3)
8
+ zeitwerk (>= 2.8.3, < 3)
9
9
 
10
10
  GEM
11
11
  remote: https://rubygems.org/
12
12
  specs:
13
- activesupport (8.1.3)
13
+ activesupport (8.1.3.1)
14
14
  base64
15
15
  bigdecimal
16
16
  concurrent-ruby (~> 1.0, >= 1.3.1)
@@ -23,8 +23,6 @@ GEM
23
23
  securerandom (>= 0.3)
24
24
  tzinfo (~> 2.0, >= 2.0.5)
25
25
  uri (>= 0.13.1)
26
- addressable (2.9.0)
27
- public_suffix (>= 2.0.2, < 8.0)
28
26
  ast (2.4.3)
29
27
  base64 (0.3.0)
30
28
  bigdecimal (4.1.2)
@@ -32,107 +30,103 @@ GEM
32
30
  bundler (>= 1.2.0)
33
31
  thor (~> 1.0)
34
32
  cmdparse (3.0.7)
35
- code-ruby (4.0.3)
36
- activesupport (>= 8.1, < 9)
37
- base64 (>= 0.3, < 1)
38
- bigdecimal (>= 4.0, < 5)
39
- did-you-mean (>= 0.1, < 1)
40
- dorian-arguments (>= 1.2, < 2)
41
- icalendar (>= 2.12, < 3)
42
- json (>= 2.19, < 3)
43
- language-ruby (>= 1.2, < 2)
44
- mail (>= 2.9, < 3)
45
- net-http (>= 0.9, < 1)
46
- net-smtp (>= 0.5, < 1)
47
- nokogiri (>= 1.19, < 2)
48
- uri (>= 1.1, < 2)
49
- zeitwerk (>= 2.7, < 3)
50
- concurrent-ruby (1.3.7)
33
+ code-ruby (5.0.10)
34
+ activesupport (>= 7.1.6, < 9)
35
+ base64 (>= 0.3.0, < 1)
36
+ bigdecimal (>= 4.1.2, < 5)
37
+ did-you-mean (>= 0.1.1, < 1)
38
+ dorian-arguments (>= 2.0.1, < 3)
39
+ icalendar (>= 2.12.4, < 3)
40
+ json (>= 2.21.2, < 3)
41
+ language-ruby (>= 2.0.2, < 3)
42
+ mail (>= 2.9.1, < 3)
43
+ net-http (>= 0.9.1, < 1)
44
+ net-smtp (>= 0.5.1, < 1)
45
+ nokogiri (>= 1.19.4, < 2)
46
+ uri (>= 1.1.1, < 2)
47
+ zeitwerk (>= 2.8.3, < 3)
48
+ concurrent-ruby (1.3.8)
51
49
  connection_pool (3.0.2)
52
- csv (3.3.5)
50
+ csv (3.3.6)
53
51
  date (3.5.1)
54
52
  did-you-mean (0.1.1)
55
53
  levenshtein (>= 0.2.0)
56
54
  diff-lcs (1.6.2)
57
- dorian (2.6.8)
58
- csv
59
- dorian-arguments
60
- dorian-eval
61
- dorian-progress
62
- dorian-to_struct
63
- git
64
- hexapdf
65
- json
66
- mini_racer
67
- ostruct
68
- parallel
69
- syntax_tree
70
- syntax_tree-haml
71
- syntax_tree-xml
72
- terminal-table
73
- w_syntax_tree-erb
74
- yaml
75
- dorian-arguments (1.2.3)
55
+ dorian (3.0.2)
56
+ csv (>= 3.3.6, < 4)
57
+ dorian-arguments (>= 2.0.1, < 3)
58
+ dorian-eval (>= 2.0.1, < 3)
59
+ dorian-progress (>= 2.0.1, < 3)
60
+ dorian-to_struct (>= 3.0.1, < 4)
61
+ haml (>= 7.5.1, < 8.0)
62
+ hexapdf (>= 1.10.0, < 2)
63
+ json (>= 2.21.2, < 3)
64
+ mini_racer (>= 0.22.1, < 1)
65
+ ostruct (>= 0.6.3, < 1)
66
+ parallel (>= 2.1.0, < 3.0)
67
+ syntax_tree (>= 6.3.0, < 7)
68
+ syntax_tree-haml (>= 4.0.3, < 5)
69
+ syntax_tree-xml (>= 0.1.0, < 1)
70
+ terminal-table (>= 4.0.0, < 5)
71
+ w_syntax_tree-erb (>= 0.12.0, < 1)
72
+ yaml (>= 0.4.0, < 1)
73
+ dorian-arguments (2.0.1)
76
74
  bigdecimal (>= 3.1, < 5)
77
- dorian-eval (1.5.1)
75
+ dorian-eval (2.0.1)
78
76
  yaml (>= 0.3, < 1)
79
- dorian-progress (1.1.3)
77
+ dorian-progress (2.0.1)
80
78
  ruby-progressbar (>= 1.13, < 2)
81
- dorian-to_struct (2.0.3)
79
+ dorian-to_struct (3.0.1)
82
80
  drb (2.2.3)
83
81
  geom2d (0.4.1)
84
- git (4.3.2)
85
- activesupport (>= 5.0)
86
- addressable (~> 2.8)
87
- process_executer (~> 4.0)
88
- rchardet (~> 1.9)
89
- haml (7.2.0)
82
+ haml (7.5.1)
83
+ prism (>= 1.1.0)
90
84
  temple (>= 0.8.2)
91
85
  thor
92
86
  tilt
93
- hexapdf (1.9.1)
87
+ hexapdf (1.10.0)
94
88
  cmdparse (~> 3.0, >= 3.0.3)
95
89
  geom2d (~> 0.4, >= 0.4.1)
96
90
  openssl (>= 2.2.1)
97
91
  strscan (>= 3.1.2)
98
92
  i18n (1.15.2)
99
93
  concurrent-ruby (~> 1.0)
100
- icalendar (2.12.3)
94
+ icalendar (2.12.4)
101
95
  base64
102
96
  ice_cube (~> 0.16)
103
97
  logger
104
98
  ostruct
105
99
  ice_cube (0.17.0)
106
- json (2.20.0)
107
- language-ruby (1.2.0)
108
- dorian-arguments
109
- zeitwerk
110
- language_server-protocol (3.17.0.5)
100
+ json (2.21.2)
101
+ language-ruby (2.0.2)
102
+ dorian-arguments (>= 2.0.1, < 3)
103
+ zeitwerk (>= 2.8.3, < 3)
104
+ language_server-protocol (3.17.0.6)
111
105
  levenshtein (0.2.2)
112
106
  libv8-node (24.12.0.1-arm64-darwin)
113
107
  libv8-node (24.12.0.1-x86_64-linux)
114
108
  lint_roller (1.1.0)
115
109
  logger (1.7.0)
116
- mail (2.9.0)
110
+ mail (2.9.1)
117
111
  logger
118
112
  mini_mime (>= 0.1.1)
119
113
  net-imap
120
114
  net-pop
121
115
  net-smtp
122
116
  mini_mime (1.1.5)
123
- mini_racer (0.21.4)
117
+ mini_racer (0.22.1)
124
118
  libv8-node (~> 24.12.0.1)
125
119
  minitest (6.0.6)
126
120
  drb (~> 2.0)
127
121
  prism (~> 1.5)
128
122
  net-http (0.9.1)
129
123
  uri (>= 0.11.1)
130
- net-imap (0.6.4.1)
124
+ net-imap (0.6.6)
131
125
  date
132
126
  net-protocol
133
127
  net-pop (0.1.2)
134
128
  net-protocol
135
- net-protocol (0.2.2)
129
+ net-protocol (0.3.0)
136
130
  timeout
137
131
  net-smtp (0.5.1)
138
132
  net-protocol
@@ -143,18 +137,14 @@ GEM
143
137
  openssl (4.0.2)
144
138
  ostruct (0.6.3)
145
139
  parallel (2.1.0)
146
- parser (3.3.11.1)
140
+ parser (3.3.12.0)
147
141
  ast (~> 2.4.1)
148
142
  racc
149
143
  prettier_print (1.2.1)
150
144
  prism (1.9.0)
151
- process_executer (4.0.4)
152
- track_open_instances (~> 0.1)
153
- public_suffix (7.0.5)
154
145
  racc (1.8.1)
155
- rack (3.2.6)
146
+ rack (3.2.7)
156
147
  rainbow (3.1.1)
157
- rchardet (1.10.2)
158
148
  regexp_parser (2.12.0)
159
149
  rspec (3.13.2)
160
150
  rspec-core (~> 3.13.0)
@@ -169,8 +159,8 @@ GEM
169
159
  diff-lcs (>= 1.2.0, < 2.0)
170
160
  rspec-support (~> 3.13.0)
171
161
  rspec-support (3.13.7)
172
- rubocop (1.88.0)
173
- json (~> 2.3)
162
+ rubocop (1.90.0)
163
+ json (>= 2.3)
174
164
  language_server-protocol (~> 3.17.0.2)
175
165
  lint_roller (~> 1.1.0)
176
166
  parallel (>= 1.10)
@@ -180,24 +170,21 @@ GEM
180
170
  rubocop-ast (>= 1.49.0, < 2.0)
181
171
  ruby-progressbar (~> 1.7)
182
172
  unicode-display_width (>= 2.4.0, < 4.0)
183
- rubocop-ast (1.49.1)
173
+ rubocop-ast (1.50.0)
184
174
  parser (>= 3.3.7.2)
185
175
  prism (~> 1.7)
186
176
  rubocop-capybara (3.0.0)
187
177
  lint_roller (~> 1.1)
188
178
  rubocop (~> 1.81)
189
- rubocop-factory_bot (2.28.0)
190
- lint_roller (~> 1.1)
191
- rubocop (~> 1.72, >= 1.72.1)
192
- rubocop-performance (1.26.1)
179
+ rubocop-performance (1.27.0)
193
180
  lint_roller (~> 1.1)
194
- rubocop (>= 1.75.0, < 2.0)
181
+ rubocop (>= 1.89.0, < 2.0)
195
182
  rubocop-ast (>= 1.47.1, < 2.0)
196
- rubocop-rails (2.35.5)
183
+ rubocop-rails (2.37.0)
197
184
  activesupport (>= 4.2.0)
198
185
  lint_roller (~> 1.1)
199
186
  rack (>= 1.1)
200
- rubocop (>= 1.75.0, < 2.0)
187
+ rubocop (>= 1.89.0, < 2.0)
201
188
  rubocop-ast (>= 1.44.0, < 2.0)
202
189
  rubocop-rake (0.7.1)
203
190
  lint_roller (~> 1.1)
@@ -225,13 +212,12 @@ GEM
225
212
  syntax_tree-xml (0.1.0)
226
213
  prettier_print
227
214
  syntax_tree (>= 2.0.1)
228
- temple (0.10.4)
215
+ temple (0.10.7)
229
216
  terminal-table (4.0.0)
230
217
  unicode-display_width (>= 1.1.1, < 4)
231
218
  thor (1.5.0)
232
- tilt (2.7.0)
219
+ tilt (2.9.0)
233
220
  timeout (0.6.1)
234
- track_open_instances (0.1.15)
235
221
  tzinfo (2.0.6)
236
222
  concurrent-ruby (~> 1.0)
237
223
  unicode-display_width (3.2.0)
@@ -242,7 +228,7 @@ GEM
242
228
  prettier_print (~> 1.2, >= 1.2.0)
243
229
  syntax_tree (~> 6.1, >= 6.1.1)
244
230
  yaml (0.4.0)
245
- zeitwerk (2.8.2)
231
+ zeitwerk (2.8.3)
246
232
 
247
233
  PLATFORMS
248
234
  arm64-darwin-22
@@ -256,7 +242,6 @@ DEPENDENCIES
256
242
  dorian
257
243
  rspec
258
244
  rubocop-capybara
259
- rubocop-factory_bot
260
245
  rubocop-performance
261
246
  rubocop-rails
262
247
  rubocop-rake
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.0.0
1
+ 2.0.2
@@ -11,11 +11,65 @@ class Template
11
11
  end
12
12
 
13
13
  def parse
14
- ::Template::Parser::Template.parse(input)
14
+ parts = []
15
+ text = +""
16
+ cursor = 0
17
+
18
+ while cursor < input.length
19
+ if input[cursor, 2] == '\\{'
20
+ text << "{"
21
+ cursor += 2
22
+ elsif input[cursor] == "{"
23
+ parts << { text: text } unless text.empty?
24
+ text = +""
25
+
26
+ closing_cursor = closing_curly_bracket(cursor + 1)
27
+ code = input[(cursor + 1)...closing_cursor]
28
+ parts << { code: ::Code::Parser.parse(code).to_raw }
29
+ cursor = closing_cursor + (closing_cursor < input.length ? 1 : 0)
30
+ else
31
+ text << input[cursor]
32
+ cursor += 1
33
+ end
34
+ end
35
+
36
+ parts << { text: text } unless text.empty?
37
+ parts << { text: "" } if parts.empty?
38
+ Language::Output.from_raw(parts)
15
39
  end
16
40
 
17
41
  private
18
42
 
19
43
  attr_reader :input
44
+
45
+ def closing_curly_bracket(cursor)
46
+ depth = 0
47
+ quote = nil
48
+
49
+ while cursor < input.length
50
+ character = input[cursor]
51
+
52
+ if quote
53
+ if character == "\\"
54
+ cursor += 2
55
+ next
56
+ end
57
+
58
+ quote = nil if character == quote
59
+ elsif ["'", '"'].include?(character)
60
+ quote = character
61
+ elsif character == "{"
62
+ depth += 1
63
+ elsif character == "}"
64
+ return cursor if depth.zero?
65
+
66
+ depth -= 1
67
+ end
68
+
69
+ cursor += 1
70
+ end
71
+
72
+ cursor
73
+ end
20
74
  end
21
75
  end
data/lib/template.rb CHANGED
@@ -15,6 +15,7 @@ class Template
15
15
  @error = error
16
16
  @timeout = timeout || DEFAULT_TIMEOUT
17
17
  @context = ::Code::Object::Context.new
18
+ @object = ::Code::Object::Global.new
18
19
  end
19
20
 
20
21
  def self.parse(input, timeout: DEFAULT_TIMEOUT)
@@ -33,7 +34,17 @@ class Template
33
34
  def evaluate
34
35
  Timeout.timeout(timeout) do
35
36
  parsed = Template.parse(input)
36
- Node::Template.new(parsed).evaluate(context:, output:, error:)
37
+ Node::Template.new(parsed).evaluate(
38
+ context:,
39
+ error:,
40
+ global_control_flow_root: true,
41
+ input: StringIO.new,
42
+ object:,
43
+ output:,
44
+ previous_object: object,
45
+ source: input,
46
+ timeout:
47
+ )
37
48
 
38
49
  output.is_a?(StringIO) ? output.string : ""
39
50
  end
@@ -41,5 +52,5 @@ class Template
41
52
 
42
53
  private
43
54
 
44
- attr_reader :input, :timeout, :output, :error, :context
55
+ attr_reader :input, :timeout, :output, :error, :context, :object
45
56
  end
@@ -4,7 +4,10 @@ require "spec_helper"
4
4
 
5
5
  RSpec.describe Template do
6
6
  [
7
- ["{name = :Dorian nothing}Hello {name}", "Hello Dorian"]
7
+ ["{name = :Dorian nothing}Hello {name}", "Hello Dorian"],
8
+ ['{"}"}', "}"],
9
+ ["\\{name}", "{name}"],
10
+ ["", ""]
8
11
  ].each do |input, expected|
9
12
  it "#{input} == #{expected}" do
10
13
  expect(described_class.evaluate(input)).to eq(expected)
@@ -12,10 +12,10 @@ Gem::Specification.new do |s|
12
12
  s.homepage = "https://github.com/dorianmariecom/template-ruby"
13
13
  s.license = "MIT"
14
14
  s.executables = "template"
15
- s.add_dependency "code-ruby"
16
- s.add_dependency "dorian-arguments"
17
- s.add_dependency "language-ruby"
18
- s.add_dependency "zeitwerk"
15
+ s.add_dependency "code-ruby", ">= 5.0.10", "< 6"
16
+ s.add_dependency "dorian-arguments", ">= 2.0.1", "< 3"
17
+ s.add_dependency "language-ruby", ">= 2.0.2", "< 3"
18
+ s.add_dependency "zeitwerk", ">= 2.8.3", "< 3"
19
19
  s.metadata["rubygems_mfa_required"] = "true"
20
20
  s.required_ruby_version = ">= 4.0"
21
21
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: template-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Marié
@@ -15,56 +15,80 @@ dependencies:
15
15
  requirements:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
- version: '0'
18
+ version: 5.0.10
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '6'
19
22
  type: :runtime
20
23
  prerelease: false
21
24
  version_requirements: !ruby/object:Gem::Requirement
22
25
  requirements:
23
26
  - - ">="
24
27
  - !ruby/object:Gem::Version
25
- version: '0'
28
+ version: 5.0.10
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '6'
26
32
  - !ruby/object:Gem::Dependency
27
33
  name: dorian-arguments
28
34
  requirement: !ruby/object:Gem::Requirement
29
35
  requirements:
30
36
  - - ">="
31
37
  - !ruby/object:Gem::Version
32
- version: '0'
38
+ version: 2.0.1
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '3'
33
42
  type: :runtime
34
43
  prerelease: false
35
44
  version_requirements: !ruby/object:Gem::Requirement
36
45
  requirements:
37
46
  - - ">="
38
47
  - !ruby/object:Gem::Version
39
- version: '0'
48
+ version: 2.0.1
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '3'
40
52
  - !ruby/object:Gem::Dependency
41
53
  name: language-ruby
42
54
  requirement: !ruby/object:Gem::Requirement
43
55
  requirements:
44
56
  - - ">="
45
57
  - !ruby/object:Gem::Version
46
- version: '0'
58
+ version: 2.0.2
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '3'
47
62
  type: :runtime
48
63
  prerelease: false
49
64
  version_requirements: !ruby/object:Gem::Requirement
50
65
  requirements:
51
66
  - - ">="
52
67
  - !ruby/object:Gem::Version
53
- version: '0'
68
+ version: 2.0.2
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: '3'
54
72
  - !ruby/object:Gem::Dependency
55
73
  name: zeitwerk
56
74
  requirement: !ruby/object:Gem::Requirement
57
75
  requirements:
58
76
  - - ">="
59
77
  - !ruby/object:Gem::Version
60
- version: '0'
78
+ version: 2.8.3
79
+ - - "<"
80
+ - !ruby/object:Gem::Version
81
+ version: '3'
61
82
  type: :runtime
62
83
  prerelease: false
63
84
  version_requirements: !ruby/object:Gem::Requirement
64
85
  requirements:
65
86
  - - ">="
66
87
  - !ruby/object:Gem::Version
67
- version: '0'
88
+ version: 2.8.3
89
+ - - "<"
90
+ - !ruby/object:Gem::Version
91
+ version: '3'
68
92
  description: templating language
69
93
  email: dorian@dorianmarie.fr
70
94
  executables:
@@ -129,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
129
153
  - !ruby/object:Gem::Version
130
154
  version: '0'
131
155
  requirements: []
132
- rubygems_version: 4.0.15
156
+ rubygems_version: 4.0.17
133
157
  specification_version: 4
134
158
  summary: templating language
135
159
  test_files: []