synvert-core 1.9.2 → 1.10.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 +4 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile.lock +1 -1
- data/lib/synvert/core/rewriter.rb +40 -49
- data/lib/synvert/core/utils.rb +44 -0
- data/lib/synvert/core/version.rb +1 -1
- data/lib/synvert/core.rb +1 -0
- data/spec/synvert/core/rewriter_spec.rb +21 -25
- data/spec/synvert/core/utils_spec.rb +30 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16de1af456b15373297aebe409711e1725bb329e3da7d4fa8d84023348ceb236
|
4
|
+
data.tar.gz: e034ccf44cfce96335f10a38d5aa36793faa08c84e8d75509fc658824cf64676
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f745e87c308b417c5938c2731af00254abe5beba70472bca1ebfdf534127b7df8f6ab33261b8eb5d31d33deaa471927a780a14720f0ee406eea44f5a7e06495
|
7
|
+
data.tar.gz: ac2c35d21a4e6558b14c861966c6326446926bc27cc9e2d278757df31cf68a33142e62d47f9d40e5ec72c1d3fd8efde6574046e00506c9a12d0a800580a00023
|
data/CHANGELOG.md
CHANGED
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.
|
@@ -68,27 +61,6 @@ module Synvert::Core
|
|
68
61
|
rewriter
|
69
62
|
end
|
70
63
|
|
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
|
90
|
-
end
|
91
|
-
|
92
64
|
# Get all available rewriters
|
93
65
|
#
|
94
66
|
# @return [Hash<String, Hash<String, Rewriter>>]
|
@@ -125,8 +97,11 @@ module Synvert::Core
|
|
125
97
|
# @!attribute [r] gem_spec
|
126
98
|
# @return [Rewriter::GemSpec] the gem spec
|
127
99
|
# @!attribute [r] test_results
|
128
|
-
# @return [Object] the test results
|
100
|
+
# @return [Array<Object>] the test results
|
101
|
+
# @!attribute [rw] options
|
102
|
+
# @return [Hash] the rewriter options
|
129
103
|
attr_reader :group, :name, :sub_snippets, :helpers, :warnings, :affected_files, :ruby_version, :gem_spec, :test_results
|
104
|
+
attr_accessor :options
|
130
105
|
|
131
106
|
# Initialize a Rewriter.
|
132
107
|
# When a rewriter is initialized, it is already registered.
|
@@ -143,7 +118,7 @@ module Synvert::Core
|
|
143
118
|
@warnings = []
|
144
119
|
@affected_files = Set.new
|
145
120
|
@redo_until_no_change = false
|
146
|
-
@options =
|
121
|
+
@options = DEFAULT_OPTIONS.dup
|
147
122
|
@test_results = []
|
148
123
|
self.class.register(@group, @name, self)
|
149
124
|
end
|
@@ -170,7 +145,6 @@ module Synvert::Core
|
|
170
145
|
|
171
146
|
def test
|
172
147
|
@options[:write_to_file] = false
|
173
|
-
@options[:execute_command] = 'test'
|
174
148
|
begin
|
175
149
|
@affected_files = Set.new
|
176
150
|
instance_eval(&@block)
|
@@ -180,7 +154,6 @@ module Synvert::Core
|
|
180
154
|
end
|
181
155
|
ensure
|
182
156
|
@options[:write_to_file] = true
|
183
|
-
@options[:execute_command] = 'process'
|
184
157
|
end
|
185
158
|
@test_results
|
186
159
|
end
|
@@ -260,7 +233,7 @@ module Synvert::Core
|
|
260
233
|
instance.process
|
261
234
|
else
|
262
235
|
results = instance.test
|
263
|
-
|
236
|
+
merge_test_results(results)
|
264
237
|
end
|
265
238
|
end
|
266
239
|
|
@@ -309,22 +282,34 @@ module Synvert::Core
|
|
309
282
|
# Synvert::Rewriter.new 'minitest', 'better_syntax' do
|
310
283
|
# add_snippet 'minitest', 'assert_empty'
|
311
284
|
# 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'
|
285
|
+
# add_snippet 'minitest/assert_instance_of'
|
286
|
+
# add_snippet 'minitest/assert_kind_of'
|
287
|
+
# add_snippet '/Users/flyerhzm/.synvert-ruby/lib/minitest/assert_match.rb'
|
288
|
+
# add_snippet '/Users/flyerhzm/.synvert-ruby/lib/minitest/assert_nil.rb'
|
289
|
+
# add_snippet 'https://github.com/xinminlabs/synvert-snippets-ruby/blob/main/lib/minitest/assert_silent.rb'
|
290
|
+
# add_snippet 'https://github.com/xinminlabs/synvert-snippets-ruby/blob/main/lib/minitest/assert_truthy.rb'
|
323
291
|
# end
|
324
|
-
# @param group [String] group of another rewriter.
|
292
|
+
# @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
293
|
# @param name [String] name of another rewriter.
|
326
|
-
def add_snippet(group, name)
|
327
|
-
|
294
|
+
def add_snippet(group, name = nil)
|
295
|
+
rewriter =
|
296
|
+
if name
|
297
|
+
Rewriter.fetch(group, name) || Utils.eval_snippet([group, name].join('/'))
|
298
|
+
else
|
299
|
+
Utils.eval_snippet(group)
|
300
|
+
end
|
301
|
+
return unless rewriter && rewriter.is_a?(Rewriter)
|
302
|
+
|
303
|
+
rewriter.options = @options
|
304
|
+
if !rewriter.options[:write_to_file]
|
305
|
+
results = rewriter.test
|
306
|
+
merge_test_results(results)
|
307
|
+
elsif rewriter.options[:run_instance]
|
308
|
+
rewriter.process
|
309
|
+
else
|
310
|
+
rewriter.process_with_sandbox
|
311
|
+
end
|
312
|
+
@sub_snippets << rewriter
|
328
313
|
end
|
329
314
|
|
330
315
|
# Parse +helper_method+ dsl, it defines helper method for {Synvert::Core::Rewriter::Instance}.
|
@@ -374,5 +359,11 @@ module Synvert::Core
|
|
374
359
|
def redo_until_no_change
|
375
360
|
@redo_until_no_change = true
|
376
361
|
end
|
362
|
+
|
363
|
+
private
|
364
|
+
|
365
|
+
def merge_test_results(results)
|
366
|
+
@test_results += results.select { |result| result.affected? }
|
367
|
+
end
|
377
368
|
end
|
378
369
|
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
@@ -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,13 +213,32 @@ 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
|
|
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
|
240
|
+
end
|
241
|
+
|
229
242
|
it 'raises RewriterNotFound' do
|
230
243
|
rewriter =
|
231
244
|
Rewriter.new 'group', 'name' do
|
@@ -276,23 +289,6 @@ module Synvert::Core
|
|
276
289
|
expect(Rewriter.fetch('group', 'rewriter')).to eq rewriter
|
277
290
|
end
|
278
291
|
|
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
292
|
context 'available' do
|
297
293
|
it 'lists empty rewriters' do
|
298
294
|
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.0
|
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
|
@@ -134,6 +134,7 @@ files:
|
|
134
134
|
- lib/synvert/core/rewriter/scope/query_scope.rb
|
135
135
|
- lib/synvert/core/rewriter/scope/within_scope.rb
|
136
136
|
- lib/synvert/core/rewriter/warning.rb
|
137
|
+
- lib/synvert/core/utils.rb
|
137
138
|
- lib/synvert/core/version.rb
|
138
139
|
- spec/spec_helper.rb
|
139
140
|
- spec/support/parser_helper.rb
|
@@ -154,6 +155,7 @@ files:
|
|
154
155
|
- spec/synvert/core/rewriter/scope_spec.rb
|
155
156
|
- spec/synvert/core/rewriter/warning_spec.rb
|
156
157
|
- spec/synvert/core/rewriter_spec.rb
|
158
|
+
- spec/synvert/core/utils_spec.rb
|
157
159
|
- synvert-core-ruby.gemspec
|
158
160
|
homepage: https://github.com/xinminlabs/synvert-core-ruby
|
159
161
|
licenses:
|
@@ -174,7 +176,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
174
176
|
- !ruby/object:Gem::Version
|
175
177
|
version: '0'
|
176
178
|
requirements: []
|
177
|
-
rubygems_version: 3.3.
|
179
|
+
rubygems_version: 3.3.22
|
178
180
|
signing_key:
|
179
181
|
specification_version: 4
|
180
182
|
summary: convert ruby code to better syntax.
|
@@ -198,3 +200,4 @@ test_files:
|
|
198
200
|
- spec/synvert/core/rewriter/scope_spec.rb
|
199
201
|
- spec/synvert/core/rewriter/warning_spec.rb
|
200
202
|
- spec/synvert/core/rewriter_spec.rb
|
203
|
+
- spec/synvert/core/utils_spec.rb
|