synvert-core 1.27.1 → 1.28.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: 76a57aa5fe7a0dfc34c17b5afb0be7657f08b29e7efa7aceb85350a5d7571260
4
- data.tar.gz: 6706bbbce5a521aaa00b625ae1c0052241485f7eb230f5c99af68466b0effc7e
3
+ metadata.gz: 5d42815151ad1672667f0bc09cc57083b0620722a8416f2d6e30ebb1f6faabe5
4
+ data.tar.gz: 51ebfcd1b6022a91e1739974d89c6172f7358ebb3ddae69132408a6f07b76564
5
5
  SHA512:
6
- metadata.gz: 2b87be0f4fc6ce7aa88c96644182cb7c479a89104cee0a43779b1e2345cc1e24709e360970896890000042e2f80d8fd297eec435a499ebd28feb1abd283ff6f5
7
- data.tar.gz: bc08baeaa494b5307428ec5e2ce4e88d639f8262200fed27d8b5dae4da646e5c0b470be3ceb7f6e55650b4fdcd0daefcb48ca921fafa43763ce34ed91c24e08c
6
+ metadata.gz: 2bf88532f763fa4c3e4b3c7f12d914ad383c838c8b99ca2faf897e50390e409f941b7b59a8f0dde7350d3c1d29bacc972c8d36abb5aee814ff2337eb2dfc9409
7
+ data.tar.gz: d5ebb445329da6a3b93d34174150238753b299e0a67b7600a0286e19971cb81a789f3a1017e78729439b68e6ceea0f8cf402cfd1e0eab2d51b360f8f5d6755d8
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 1.28.0 (2023-06-01)
4
+
5
+ * Add `Synvert::Core::Helper`
6
+ * Add `call_helper` dsl in rewriter
7
+
3
8
  ## 1.27.1 (2023-05-30)
4
9
 
5
10
  * Puts error message when rescue `Parser::SyntaxError`
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- synvert-core (1.27.1)
4
+ synvert-core (1.28.0)
5
5
  activesupport (< 7.0.0)
6
6
  node_mutation (>= 1.18.2)
7
7
  node_query (>= 1.13.2)
data/README.md CHANGED
@@ -69,6 +69,7 @@ DSLs are as follows
69
69
  * [remove_file](https://xinminlabs.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#remove_file-instance_method) - remove a file
70
70
  * [helper_method](https://xinminlabs.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#helper_method-instance_method) - define a helper method
71
71
  * [add_snippet](https://xinminlabs.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#add_snippet-instance_method) - call another rewriter
72
+ * [call_helper](https://xinminlabs.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#call_helper-instance_method) - call a shared rewriter
72
73
  * [redo_until_no_change](https://xinminlabs.github.io/synvert-core-ruby/Synvert/Core/Rewriter.html#redo_until_no_change-instance_method) - run the snippet until no change
73
74
 
74
75
  Scopes:
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Synvert::Core
4
+ # Helper is used to define shared snippet.
5
+ class Helper
6
+ attr_reader :name, :block
7
+
8
+ class << self
9
+ # Register a helper with its name.
10
+ #
11
+ # @param name [String] the unique rewriter name.
12
+ # @param helper [Synvert::Core::Helper] the helper to register.
13
+ def register(name, helper)
14
+ name = name.to_s
15
+ helpers[name] = helper
16
+ end
17
+
18
+ # Fetch a helper by name.
19
+ #
20
+ # @param name [String] rewrtier name.
21
+ # @return [Synvert::Core::Helper] the matching helper.
22
+ def fetch(name)
23
+ name = name.to_s
24
+ helpers[name]
25
+ end
26
+
27
+ # Get all available helpers
28
+ #
29
+ # @return [Hash<String, Synvert::Core::Helper>]
30
+ def availables
31
+ helpers
32
+ end
33
+
34
+ # Clear all registered helpers.
35
+ def clear
36
+ helpers.clear
37
+ end
38
+
39
+ private
40
+
41
+ def helpers
42
+ @helpers ||= {}
43
+ end
44
+ end
45
+
46
+ # Initialize a Helper.
47
+ # When a helper is initialized, it is already registered.
48
+ #
49
+ # @param name [String] name of the helper.
50
+ # @yield defines the behaviors of the helper, block code won't be called when initialization.
51
+ def initialize(name, &block)
52
+ @name = name
53
+ @block = block
54
+ self.class.register(name, self)
55
+ end
56
+ end
57
+ end
@@ -57,7 +57,7 @@ module Synvert::Core
57
57
 
58
58
  # Get all available rewriters
59
59
  #
60
- # @return [Hash<String, Hash<String, Rewriter>>]
60
+ # @return [Hash<String, Hash<String, Synvert::Core::Rewriter>>]
61
61
  def availables
62
62
  rewriters
63
63
  end
@@ -357,6 +357,22 @@ module Synvert::Core
357
357
  @sub_snippets << rewriter
358
358
  end
359
359
 
360
+ # It calls a shared rewriter.
361
+ # @example
362
+ # Synvert::Rewriter.new 'rails', 'upgrade_6_0_to_6_1' do
363
+ # call_helper 'rails/set_load_defaults', options: { rails_version: '6.1' }
364
+ # add_snippet '/Users/flyerhzm/.synvert-ruby/lib/rails/set_load_defaults.rb', options: { rails_version: '6.1' }
365
+ # add_snippet 'https://github.com/xinminlabs/synvert-snippets-ruby/blob/main/lib/rails/set_load_defaults.rb', options: { rails_version: '6.1' }
366
+ # end
367
+ # @param name [String] name of helper.
368
+ # @param options [Hash] options to pass to helper.
369
+ def call_helper(name, options: {})
370
+ helper = Synvert::Core::Helper.fetch(name) || Utils.eval_snippet(name)
371
+ return unless helper && helper.is_a?(Synvert::Core::Helper)
372
+
373
+ instance_exec(options, &helper.block)
374
+ end
375
+
360
376
  # It defines helper method for {Synvert::Core::Rewriter::Instance}.
361
377
  # @example
362
378
  # Synvert::Rewriter.new 'rails', 'convert_active_record_dirty_5_0_to_5_1' do
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Synvert
4
4
  module Core
5
- VERSION = '1.27.1'
5
+ VERSION = '1.28.0'
6
6
  end
7
7
  end
data/lib/synvert/core.rb CHANGED
@@ -11,6 +11,7 @@ module Synvert
11
11
  module Core
12
12
  autoload :Configuration, 'synvert/core/configuration'
13
13
  autoload :Rewriter, 'synvert/core/rewriter'
14
+ autoload :Helper, 'synvert/core/helper'
14
15
  autoload :Engine, 'synvert/core/engine'
15
16
  autoload :Utils, 'synvert/core/utils'
16
17
  autoload :Strategy, 'synvert/core/strategy'
@@ -20,6 +21,7 @@ end
20
21
 
21
22
  module Synvert
22
23
  Rewriter = Core::Rewriter
24
+ Helper = Core::Helper
23
25
  Strategy = Core::Strategy
24
26
 
25
27
  ALL_RUBY_FILES = %w[**/*.rb]
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ module Synvert::Core
6
+ RSpec.describe Helper do
7
+ describe 'class methods' do
8
+ before :each do
9
+ described_class.clear
10
+ end
11
+
12
+ it 'registers and fetches' do
13
+ helper = described_class.new 'helper' do; end
14
+ expect(described_class.fetch('helper')).to eq helper
15
+ end
16
+
17
+ context 'available' do
18
+ it 'lists empty helpers' do
19
+ expect(described_class.availables).to eq({})
20
+ end
21
+
22
+ it 'registers and lists all available helpers' do
23
+ helper1 = Helper.new 'helper1' do; end
24
+ helper2 = Helper.new 'helper2' do; end
25
+ expect(Helper.availables).to eq({ 'helper1' => helper1, 'helper2' => helper2 })
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -309,6 +309,47 @@ module Synvert::Core
309
309
  end
310
310
  end
311
311
 
312
+ describe 'parses call_helper' do
313
+ it 'eval helper by name' do
314
+ block_receiver = nil
315
+ block_options = {}
316
+ helper =
317
+ Synvert::Helper.new 'helper' do |options|
318
+ block_receiver = self.class.name
319
+ block_options = options
320
+ end
321
+ rewriter =
322
+ Rewriter.new 'group', 'rewriter' do
323
+ call_helper('helper', options: { foo: 'bar' })
324
+ end
325
+ rewriter.process
326
+ expect(block_receiver).to eq 'Synvert::Core::Rewriter'
327
+ expect(block_options).to eq(foo: 'bar')
328
+ end
329
+
330
+ it 'adds snippet by http url' do
331
+ expect(Utils).to receive(:remote_snippet_exists?).with(URI.parse('http://synvert.net/foo/bar.rb')).and_return(true)
332
+ expect_any_instance_of(URI::HTTP).to receive(:open).and_return(StringIO.new("Synvert::Helper.new 'helper' do\nend"))
333
+ rewriter =
334
+ Rewriter.new 'group', 'rewriter' do
335
+ call_helper 'http://synvert.net/foo/bar.rb'
336
+ end
337
+ rewriter.process
338
+ expect(Synvert::Helper.fetch('helper')).not_to be_nil
339
+ end
340
+
341
+ it 'adds snippet by file path' do
342
+ expect(File).to receive(:exist?).and_return(true)
343
+ expect(File).to receive(:read).and_return("Synvert::Helper.new 'helper' do\nend")
344
+ rewriter =
345
+ Rewriter.new 'group', 'rewriter' do
346
+ call_helper '/home/richard/foo/bar.rb'
347
+ end
348
+ rewriter.process
349
+ expect(Synvert::Helper.fetch('helper')).not_to be_nil
350
+ end
351
+ end
352
+
312
353
  it 'parses helper_method' do
313
354
  rewriter =
314
355
  Rewriter.new 'group', 'name' do
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.27.1
4
+ version: 1.28.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: 2023-05-30 00:00:00.000000000 Z
11
+ date: 2023-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -148,6 +148,7 @@ files:
148
148
  - lib/synvert/core/engine/haml.rb
149
149
  - lib/synvert/core/engine/slim.rb
150
150
  - lib/synvert/core/errors.rb
151
+ - lib/synvert/core/helper.rb
151
152
  - lib/synvert/core/node_ext.rb
152
153
  - lib/synvert/core/rewriter.rb
153
154
  - lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb
@@ -171,6 +172,7 @@ files:
171
172
  - spec/synvert/core/engine/erb_spec.rb
172
173
  - spec/synvert/core/engine/haml_spec.rb
173
174
  - spec/synvert/core/engine/slim_spec.rb
175
+ - spec/synvert/core/helper_spec.rb
174
176
  - spec/synvert/core/node_ext_spec.rb
175
177
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb
176
178
  - spec/synvert/core/rewriter/condition/if_exist_condition_spec.rb
@@ -217,6 +219,7 @@ test_files:
217
219
  - spec/synvert/core/engine/erb_spec.rb
218
220
  - spec/synvert/core/engine/haml_spec.rb
219
221
  - spec/synvert/core/engine/slim_spec.rb
222
+ - spec/synvert/core/helper_spec.rb
220
223
  - spec/synvert/core/node_ext_spec.rb
221
224
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb
222
225
  - spec/synvert/core/rewriter/condition/if_exist_condition_spec.rb