synvert-core 1.9.2 → 1.10.1
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 +4 -4
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +1 -1
- data/lib/synvert/core/rewriter.rb +46 -67
- data/lib/synvert/core/utils.rb +44 -0
- data/lib/synvert/core/version.rb +1 -1
- data/lib/synvert/core.rb +1 -2
- data/spec/synvert/core/rewriter_spec.rb +19 -32
- data/spec/synvert/core/utils_spec.rb +30 -0
- metadata +6 -4
- data/lib/synvert/core/exceptions.rb +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 966c0db8262c57bb94be47d44c5638c9c9607728da335b4bde9d39c49f7bc665
|
4
|
+
data.tar.gz: e2be9da04e58da3b236d03006883778f6e202d9bbb5a8fa922dd6339117a6a2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e1f6a8a25817ebe46c03bdbf6e7982f559c426bf5537c2ae28549215ad77a03c45768af6b3f74ba84e34105c6d1e8c9cbb365cb1f431220b59028678c373dcd
|
7
|
+
data.tar.gz: 44f57f854c537825acb57217b216294f226df391b1eb185fd1558f463084a91ad9fcc296f54eba05c5b66e1d995a40c897d267fff662ff5bf85472d83d993be1
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.10.1 (2022-10-09)
|
4
|
+
|
5
|
+
* Do not reset `@options`
|
6
|
+
* `Rewriter.fetch` does not raise error if rewriter not found
|
7
|
+
|
8
|
+
## 1.10.0 (2022-10-09)
|
9
|
+
|
10
|
+
* Eval snippet by http url, file path or snippet name
|
11
|
+
* Remove `execute_command` option
|
12
|
+
* Remove `Rewriter.call`
|
13
|
+
* Remove `Rewriter.execute`
|
14
|
+
|
3
15
|
## 1.9.2 (2022-10-03)
|
4
16
|
|
5
17
|
* Fix `test` in sub_snippets
|
data/Gemfile.lock
CHANGED
@@ -8,6 +8,8 @@ module Synvert::Core
|
|
8
8
|
# One Rewriter checks if the depndency version matches, and it can contain one or many {Synvert::Core::Rewriter::Instance},
|
9
9
|
# which define the behavior what files and what codes to detect and rewrite to what code.
|
10
10
|
class Rewriter
|
11
|
+
DEFAULT_OPTIONS = { run_instance: true, write_to_file: true }.freeze
|
12
|
+
|
11
13
|
autoload :ReplaceErbStmtWithExprAction, 'synvert/core/rewriter/action/replace_erb_stmt_with_expr_action'
|
12
14
|
|
13
15
|
autoload :Warning, 'synvert/core/rewriter/warning'
|
@@ -32,15 +34,6 @@ module Synvert::Core
|
|
32
34
|
autoload :AnyValue, 'synvert/core/rewriter/any_value'
|
33
35
|
|
34
36
|
class << self
|
35
|
-
# Execute the temporary rewriter without group and name.
|
36
|
-
#
|
37
|
-
# @yield defines the behaviors of the rewriter.
|
38
|
-
def execute(&block)
|
39
|
-
rewriter = Rewriter.new('', '', &block)
|
40
|
-
rewriter.process
|
41
|
-
rewriter
|
42
|
-
end
|
43
|
-
|
44
37
|
# Register a rewriter with its group and name.
|
45
38
|
#
|
46
39
|
# @param group [String] the rewriter group.
|
@@ -58,35 +51,10 @@ module Synvert::Core
|
|
58
51
|
# @param group [String] rewrtier group.
|
59
52
|
# @param name [String] rewrtier name.
|
60
53
|
# @return [Synvert::Core::Rewriter] the matching rewriter.
|
61
|
-
# @raise [Synvert::Core::RewriterNotFound] if the registered rewriter is not found.
|
62
54
|
def fetch(group, name)
|
63
55
|
group = group.to_s
|
64
56
|
name = name.to_s
|
65
|
-
|
66
|
-
raise RewriterNotFound, "Rewriter #{group} #{name} not found" unless rewriter
|
67
|
-
|
68
|
-
rewriter
|
69
|
-
end
|
70
|
-
|
71
|
-
# Get a registered rewriter by group and name, then process that rewriter.
|
72
|
-
#
|
73
|
-
# @param group [String] the rewriter group.
|
74
|
-
# @param name [String] the rewriter name.
|
75
|
-
# @param options [Hash]
|
76
|
-
# @option options [Boolean] :run_instance (true) process the instance.
|
77
|
-
# @option options [String] :execute_command ('process') process or test the rewriter
|
78
|
-
# @return [Synvert::Core::Rewriter] the registered rewriter.
|
79
|
-
# @raise [Synvert::Core::RewriterNotFound] if the registered rewriter is not found.
|
80
|
-
def call(group, name, options = { run_instance: true, execute_command: 'process' })
|
81
|
-
rewriter = fetch(group, name)
|
82
|
-
if options[:execute_command] == 'test'
|
83
|
-
rewriter.test
|
84
|
-
elsif options[:run_instance]
|
85
|
-
rewriter.process
|
86
|
-
else
|
87
|
-
rewriter.process_with_sandbox
|
88
|
-
end
|
89
|
-
rewriter
|
57
|
+
rewriters.dig(group, name)
|
90
58
|
end
|
91
59
|
|
92
60
|
# Get all available rewriters
|
@@ -125,8 +93,11 @@ module Synvert::Core
|
|
125
93
|
# @!attribute [r] gem_spec
|
126
94
|
# @return [Rewriter::GemSpec] the gem spec
|
127
95
|
# @!attribute [r] test_results
|
128
|
-
# @return [Object] the test results
|
96
|
+
# @return [Array<Object>] the test results
|
97
|
+
# @!attribute [rw] options
|
98
|
+
# @return [Hash] the rewriter options
|
129
99
|
attr_reader :group, :name, :sub_snippets, :helpers, :warnings, :affected_files, :ruby_version, :gem_spec, :test_results
|
100
|
+
attr_accessor :options
|
130
101
|
|
131
102
|
# Initialize a Rewriter.
|
132
103
|
# When a rewriter is initialized, it is already registered.
|
@@ -143,7 +114,7 @@ module Synvert::Core
|
|
143
114
|
@warnings = []
|
144
115
|
@affected_files = Set.new
|
145
116
|
@redo_until_no_change = false
|
146
|
-
@options =
|
117
|
+
@options = DEFAULT_OPTIONS.dup
|
147
118
|
@test_results = []
|
148
119
|
self.class.register(@group, @name, self)
|
149
120
|
end
|
@@ -161,26 +132,16 @@ module Synvert::Core
|
|
161
132
|
# It will call the block but doesn't change any file.
|
162
133
|
def process_with_sandbox
|
163
134
|
@options[:run_instance] = false
|
164
|
-
|
165
|
-
process
|
166
|
-
ensure
|
167
|
-
@options[:run_instance] = true
|
168
|
-
end
|
135
|
+
process
|
169
136
|
end
|
170
137
|
|
171
138
|
def test
|
172
139
|
@options[:write_to_file] = false
|
173
|
-
@
|
174
|
-
|
175
|
-
@affected_files = Set.new
|
176
|
-
instance_eval(&@block)
|
140
|
+
@affected_files = Set.new
|
141
|
+
instance_eval(&@block)
|
177
142
|
|
178
|
-
|
179
|
-
|
180
|
-
end
|
181
|
-
ensure
|
182
|
-
@options[:write_to_file] = true
|
183
|
-
@options[:execute_command] = 'process'
|
143
|
+
if !@affected_files.empty? && @redo_until_no_change # redo
|
144
|
+
test
|
184
145
|
end
|
185
146
|
@test_results
|
186
147
|
end
|
@@ -260,7 +221,7 @@ module Synvert::Core
|
|
260
221
|
instance.process
|
261
222
|
else
|
262
223
|
results = instance.test
|
263
|
-
|
224
|
+
merge_test_results(results)
|
264
225
|
end
|
265
226
|
end
|
266
227
|
|
@@ -309,22 +270,34 @@ module Synvert::Core
|
|
309
270
|
# Synvert::Rewriter.new 'minitest', 'better_syntax' do
|
310
271
|
# add_snippet 'minitest', 'assert_empty'
|
311
272
|
# add_snippet 'minitest', 'assert_equal_arguments_order'
|
312
|
-
# add_snippet 'minitest'
|
313
|
-
# add_snippet 'minitest'
|
314
|
-
# add_snippet 'minitest'
|
315
|
-
# add_snippet 'minitest'
|
316
|
-
# add_snippet 'minitest'
|
317
|
-
# add_snippet 'minitest'
|
318
|
-
# add_snippet 'minitest', 'assert_path_exists'
|
319
|
-
# add_snippet 'minitest', 'assert_predicate'
|
320
|
-
# add_snippet 'minitest', 'assert_respond_to'
|
321
|
-
# add_snippet 'minitest', 'assert_silent'
|
322
|
-
# add_snippet 'minitest', 'assert_truthy'
|
273
|
+
# add_snippet 'minitest/assert_instance_of'
|
274
|
+
# add_snippet 'minitest/assert_kind_of'
|
275
|
+
# add_snippet '/Users/flyerhzm/.synvert-ruby/lib/minitest/assert_match.rb'
|
276
|
+
# add_snippet '/Users/flyerhzm/.synvert-ruby/lib/minitest/assert_nil.rb'
|
277
|
+
# add_snippet 'https://github.com/xinminlabs/synvert-snippets-ruby/blob/main/lib/minitest/assert_silent.rb'
|
278
|
+
# add_snippet 'https://github.com/xinminlabs/synvert-snippets-ruby/blob/main/lib/minitest/assert_truthy.rb'
|
323
279
|
# end
|
324
|
-
# @param group [String] group of another rewriter.
|
280
|
+
# @param group [String] group of another rewriter, if there's no name parameter, the group can be http url, file path or snippet name.
|
325
281
|
# @param name [String] name of another rewriter.
|
326
|
-
def add_snippet(group, name)
|
327
|
-
|
282
|
+
def add_snippet(group, name = nil)
|
283
|
+
rewriter =
|
284
|
+
if name
|
285
|
+
Rewriter.fetch(group, name) || Utils.eval_snippet([group, name].join('/'))
|
286
|
+
else
|
287
|
+
Utils.eval_snippet(group)
|
288
|
+
end
|
289
|
+
return unless rewriter && rewriter.is_a?(Rewriter)
|
290
|
+
|
291
|
+
rewriter.options = @options
|
292
|
+
if !rewriter.options[:write_to_file]
|
293
|
+
results = rewriter.test
|
294
|
+
merge_test_results(results)
|
295
|
+
elsif rewriter.options[:run_instance]
|
296
|
+
rewriter.process
|
297
|
+
else
|
298
|
+
rewriter.process_with_sandbox
|
299
|
+
end
|
300
|
+
@sub_snippets << rewriter
|
328
301
|
end
|
329
302
|
|
330
303
|
# Parse +helper_method+ dsl, it defines helper method for {Synvert::Core::Rewriter::Instance}.
|
@@ -374,5 +347,11 @@ module Synvert::Core
|
|
374
347
|
def redo_until_no_change
|
375
348
|
@redo_until_no_change = true
|
376
349
|
end
|
350
|
+
|
351
|
+
private
|
352
|
+
|
353
|
+
def merge_test_results(results)
|
354
|
+
@test_results += results.select { |result| result.affected? }
|
355
|
+
end
|
377
356
|
end
|
378
357
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
module Synvert::Core
|
6
|
+
class Utils
|
7
|
+
class << self
|
8
|
+
def eval_snippet(snippet_name)
|
9
|
+
if is_valid_url?(snippet_name)
|
10
|
+
uri = URI.parse(format_url(snippet_name))
|
11
|
+
eval(uri.open.read)
|
12
|
+
elsif is_valid_file?(snippet_name)
|
13
|
+
eval(File.read(snippet_name))
|
14
|
+
else
|
15
|
+
eval(File.read(File.join(default_snippets_home, 'lib', "#{snippet_name}.rb")))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def is_valid_url?(url)
|
22
|
+
/^http/.match?(url)
|
23
|
+
end
|
24
|
+
|
25
|
+
def is_valid_file?(path)
|
26
|
+
File.exist?(path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def default_snippets_home
|
30
|
+
ENV['SYNVERT_SNIPPETS_HOME'] || File.join(ENV['HOME'], '.synvert-ruby')
|
31
|
+
end
|
32
|
+
|
33
|
+
def format_url(url)
|
34
|
+
convert_to_github_raw_url(url)
|
35
|
+
end
|
36
|
+
|
37
|
+
def convert_to_github_raw_url(url)
|
38
|
+
return url unless url.include?('//github.com/')
|
39
|
+
|
40
|
+
url.sub('//github.com/', '//raw.githubusercontent.com/').sub('/blob/', '/')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/synvert/core/version.rb
CHANGED
data/lib/synvert/core.rb
CHANGED
@@ -17,8 +17,7 @@ module Synvert
|
|
17
17
|
autoload :Configuration, 'synvert/core/configuration'
|
18
18
|
autoload :Rewriter, 'synvert/core/rewriter'
|
19
19
|
autoload :Engine, 'synvert/core/engine'
|
20
|
-
autoload :
|
21
|
-
autoload :MethodNotSupported, 'synvert/core/exceptions'
|
20
|
+
autoload :Utils, 'synvert/core/utils'
|
22
21
|
end
|
23
22
|
end
|
24
23
|
|
@@ -4,12 +4,6 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
module Synvert::Core
|
6
6
|
describe Rewriter do
|
7
|
-
it '.execute' do
|
8
|
-
run = false
|
9
|
-
Rewriter.execute { run = true }
|
10
|
-
expect(run).to be_truthy
|
11
|
-
end
|
12
|
-
|
13
7
|
it 'parses description' do
|
14
8
|
rewriter =
|
15
9
|
Rewriter.new 'group', 'name' do
|
@@ -209,7 +203,7 @@ module Synvert::Core
|
|
209
203
|
rewriter1 = Rewriter.new 'group', 'rewriter1'
|
210
204
|
rewriter2 =
|
211
205
|
Rewriter.new 'group', 'rewriter2' do
|
212
|
-
add_snippet
|
206
|
+
add_snippet 'group', 'rewriter1'
|
213
207
|
end
|
214
208
|
expect(rewriter1).to receive(:process)
|
215
209
|
rewriter2.process
|
@@ -219,20 +213,30 @@ module Synvert::Core
|
|
219
213
|
rewriter1 = Rewriter.new 'group', 'rewriter1'
|
220
214
|
rewriter2 =
|
221
215
|
Rewriter.new 'group', 'rewriter2' do
|
222
|
-
add_snippet
|
216
|
+
add_snippet 'group', 'rewriter1'
|
223
217
|
end
|
224
218
|
expect(rewriter1).to receive(:process)
|
225
219
|
rewriter2.process
|
226
220
|
expect(rewriter2.sub_snippets).to eq [rewriter1]
|
227
221
|
end
|
228
222
|
|
229
|
-
it '
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
223
|
+
it 'adds snippet by http url' do
|
224
|
+
expect_any_instance_of(URI).to receive(:open).and_return(StringIO.new("Rewriter.new 'group', 'sub_rewriter' do\nend"))
|
225
|
+
rewriter = Rewriter.new 'group', 'rewriter' do
|
226
|
+
add_snippet 'http://synvert.net/foo/bar.rb'
|
227
|
+
end
|
228
|
+
rewriter.process
|
229
|
+
expect(Rewriter.fetch('group', 'sub_rewriter')).not_to be_nil
|
230
|
+
end
|
231
|
+
|
232
|
+
it 'adds snippet by file path' do
|
233
|
+
expect(File).to receive(:exist?).and_return(true)
|
234
|
+
expect(File).to receive(:read).and_return("Rewriter.new 'group', 'sub_rewriter' do\nend")
|
235
|
+
rewriter = Rewriter.new 'group', 'rewriter' do
|
236
|
+
add_snippet '/home/richard/foo/bar.rb'
|
237
|
+
end
|
238
|
+
rewriter.process
|
239
|
+
expect(Rewriter.fetch('group', 'sub_rewriter')).not_to be_nil
|
236
240
|
end
|
237
241
|
end
|
238
242
|
|
@@ -276,23 +280,6 @@ module Synvert::Core
|
|
276
280
|
expect(Rewriter.fetch('group', 'rewriter')).to eq rewriter
|
277
281
|
end
|
278
282
|
|
279
|
-
it 'registers and calls rewriter' do
|
280
|
-
rewriter = Rewriter.new 'group', 'rewriter'
|
281
|
-
expect(rewriter).to receive(:process)
|
282
|
-
Rewriter.call 'group', 'rewriter'
|
283
|
-
end
|
284
|
-
|
285
|
-
it 'registers and calls rewriter in sandbox mode' do
|
286
|
-
rewriter = Rewriter.new 'group', 'rewriter'
|
287
|
-
expect(rewriter).to receive(:process_with_sandbox)
|
288
|
-
Rewriter.call 'group', 'rewriter', run_instance: false
|
289
|
-
end
|
290
|
-
|
291
|
-
it 'raises RewriterNotFound if rewriter not found' do
|
292
|
-
expect { Rewriter.call 'group', 'rewriter' }
|
293
|
-
.to raise_error(RewriterNotFound)
|
294
|
-
end
|
295
|
-
|
296
283
|
context 'available' do
|
297
284
|
it 'lists empty rewriters' do
|
298
285
|
expect(Rewriter.availables).to eq({})
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Synvert::Core
|
4
|
+
RSpec.describe Utils do
|
5
|
+
describe '.eval_snippet' do
|
6
|
+
it 'evals snippet by http url' do
|
7
|
+
expect_any_instance_of(URI).to receive(:open).and_return(StringIO.new("Rewriter.new 'group', 'name' do\nend"))
|
8
|
+
rewriter = described_class.eval_snippet('http://example.com/rewriter.rb')
|
9
|
+
expect(rewriter.group).to eq 'group'
|
10
|
+
expect(rewriter.name).to eq 'name'
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'adds snippet by file path' do
|
14
|
+
expect(File).to receive(:exist?).and_return(true)
|
15
|
+
expect(File).to receive(:read).and_return("Rewriter.new 'group', 'name' do\nend")
|
16
|
+
rewriter = described_class.eval_snippet('/home/richard/foo/bar.rb')
|
17
|
+
expect(rewriter.group).to eq 'group'
|
18
|
+
expect(rewriter.name).to eq 'name'
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'adds snippet by snippet name' do
|
22
|
+
expect(File).to receive(:exist?).and_return(false)
|
23
|
+
expect(File).to receive(:read).and_return("Rewriter.new 'group', 'name' do\nend")
|
24
|
+
rewriter = described_class.eval_snippet('/home/richard/foo/bar.rb')
|
25
|
+
expect(rewriter.group).to eq 'group'
|
26
|
+
expect(rewriter.name).to eq 'name'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: synvert-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.10.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-10-
|
11
|
+
date: 2022-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -116,7 +116,6 @@ files:
|
|
116
116
|
- lib/synvert/core/configuration.rb
|
117
117
|
- lib/synvert/core/engine.rb
|
118
118
|
- lib/synvert/core/engine/erb.rb
|
119
|
-
- lib/synvert/core/exceptions.rb
|
120
119
|
- lib/synvert/core/node_ext.rb
|
121
120
|
- lib/synvert/core/rewriter.rb
|
122
121
|
- lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb
|
@@ -134,6 +133,7 @@ files:
|
|
134
133
|
- lib/synvert/core/rewriter/scope/query_scope.rb
|
135
134
|
- lib/synvert/core/rewriter/scope/within_scope.rb
|
136
135
|
- lib/synvert/core/rewriter/warning.rb
|
136
|
+
- lib/synvert/core/utils.rb
|
137
137
|
- lib/synvert/core/version.rb
|
138
138
|
- spec/spec_helper.rb
|
139
139
|
- spec/support/parser_helper.rb
|
@@ -154,6 +154,7 @@ files:
|
|
154
154
|
- spec/synvert/core/rewriter/scope_spec.rb
|
155
155
|
- spec/synvert/core/rewriter/warning_spec.rb
|
156
156
|
- spec/synvert/core/rewriter_spec.rb
|
157
|
+
- spec/synvert/core/utils_spec.rb
|
157
158
|
- synvert-core-ruby.gemspec
|
158
159
|
homepage: https://github.com/xinminlabs/synvert-core-ruby
|
159
160
|
licenses:
|
@@ -174,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
175
|
- !ruby/object:Gem::Version
|
175
176
|
version: '0'
|
176
177
|
requirements: []
|
177
|
-
rubygems_version: 3.3.
|
178
|
+
rubygems_version: 3.3.22
|
178
179
|
signing_key:
|
179
180
|
specification_version: 4
|
180
181
|
summary: convert ruby code to better syntax.
|
@@ -198,3 +199,4 @@ test_files:
|
|
198
199
|
- spec/synvert/core/rewriter/scope_spec.rb
|
199
200
|
- spec/synvert/core/rewriter/warning_spec.rb
|
200
201
|
- spec/synvert/core/rewriter_spec.rb
|
202
|
+
- spec/synvert/core/utils_spec.rb
|