synvert-core 0.38.0 → 0.39.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: 02bb61b261f5a4b8a3f528736987402add733b18c98228b0e2345559d2694d63
4
- data.tar.gz: 6dd428e975dcbcadbdc4b03dd3ed2b7a846ce37c1d9e13303a68ba33a6d4e6fa
3
+ metadata.gz: bd079f46cc8d4a8097a794b11c02e98294c217d801538e4c9dafa4305fd3b6d8
4
+ data.tar.gz: 81018b9a711fca607aa4b2dc3170e9172531140392172b5cd27d4118383a6c31
5
5
  SHA512:
6
- metadata.gz: 7b374648741dc853387ff5c2f4bb5ad9518bee56a1646377e8cac22e7c208285f9c9db52882c05de823cf53cb3bdc6dbd365b9a1c505c88726eb3358651c1dc6
7
- data.tar.gz: 8097ef7ad23287c35bf9d40a258a4d7c0b5d63ab0e99ab3667dc52d46cd7a51fa0e7f8d0cddee07054e87019bbf449704f3c01ba4cafcda425a30161894a5130
6
+ metadata.gz: 78fd6e0b7b28661b5d352a6835f35b713ca829a2a9ae4260e605541b00e9eb151b66b45018a954e1b98682b45bbbddaac359a582281904dd784b2004ded00c9b
7
+ data.tar.gz: 6a4a33419eafeac609f92d68593ee12b5e5608c24865289cd53f6bb631ef047dc83f1cb7648984d70fded95c9141b6c4a58056280675b55f321836e2b3005dbd
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ ## 0.39.0 (2021-06-23)
4
+
5
+ * Add `prepend` dsl instead of `insert`
6
+
3
7
  ## 0.38.0 (2021-06-21)
4
8
 
5
9
  * Add `xxx_source` for `hash` node
@@ -18,6 +18,7 @@ module Synvert::Core
18
18
  class Rewriter
19
19
  autoload :Action, 'synvert/core/rewriter/action'
20
20
  autoload :AppendAction, 'synvert/core/rewriter/action/append_action'
21
+ autoload :PrependAction, 'synvert/core/rewriter/action/prepend_action'
21
22
  autoload :InsertAction, 'synvert/core/rewriter/action/insert_action'
22
23
  autoload :InsertAfterAction, 'synvert/core/rewriter/action/insert_after_action'
23
24
  autoload :ReplaceWithAction, 'synvert/core/rewriter/action/replace_with_action'
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Synvert::Core
4
+ # AddAction to add code to the node.
5
+ class Rewriter::AddAction < Rewriter::Action
6
+ # Begin position to insert code.
7
+ #
8
+ # @return [Integer] begin position.
9
+ def begin_pos
10
+ @node.loc.expression.end_pos
11
+ end
12
+
13
+ # End position, always same to begin position.
14
+ #
15
+ # @return [Integer] end position.
16
+ def end_pos
17
+ begin_pos
18
+ end
19
+
20
+ private
21
+
22
+ # The rewritten source code.
23
+ #
24
+ # @return [String] rewritten code.
25
+ def rewritten_code
26
+ rewritten_source
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Synvert::Core
4
+ # PrependAction to prepend code to the top of node body.
5
+ class Rewriter::PrependAction < Rewriter::Action
6
+ DO_LENGTH = ' do'.length
7
+
8
+ # Begin position to prepend code.
9
+ #
10
+ # @return [Integer] begin position.
11
+ def begin_pos
12
+ case @node.type
13
+ when :block
14
+ if @node.children[1].children.empty?
15
+ @node.children[0].loc.expression.end_pos + DO_LENGTH
16
+ else
17
+ @node.children[1].loc.expression.end_pos
18
+ end
19
+ when :class
20
+ @node.children[1] ? @node.children[1].loc.expression.end_pos : @node.children[0].loc.expression.end_pos
21
+ else
22
+ @node.children.last.loc.expression.end_pos
23
+ end
24
+ end
25
+
26
+ # End position, always same to begin position.
27
+ #
28
+ # @return [Integer] end position.
29
+ def end_pos
30
+ begin_pos
31
+ end
32
+
33
+ private
34
+
35
+ # Indent of the node.
36
+ #
37
+ # @param node [Parser::AST::Node]
38
+ # @return [String] n times whitesphace
39
+ def indent(node)
40
+ if %i[block class].include? node.type
41
+ ' ' * (node.indent + DEFAULT_INDENT)
42
+ else
43
+ ' ' * node.indent
44
+ end
45
+ end
46
+ end
47
+ end
@@ -224,6 +224,15 @@ module Synvert::Core
224
224
  @actions << Rewriter::AppendAction.new(self, code, options)
225
225
  end
226
226
 
227
+ # Parse prepend dsl, it creates a [Synvert::Core::Rewriter::PrependAction] to
228
+ # prepend the code to the top of current node body.
229
+ #
230
+ # @param code [String] code need to be prepended.
231
+ # @param options [Hash] action options.
232
+ def prepend(code, options = {})
233
+ @actions << Rewriter::PrependAction.new(self, code, options)
234
+ end
235
+
227
236
  # Parse insert dsl, it creates a [Synvert::Core::Rewriter::InsertAction] to
228
237
  # insert the code to the top of current node body.
229
238
  #
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Synvert
4
4
  module Core
5
- VERSION = '0.38.0'
5
+ VERSION = '0.39.0'
6
6
  end
7
7
  end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ module Synvert::Core
6
+ describe Rewriter::PrependAction do
7
+ describe 'block node without args' do
8
+ subject {
9
+ source = "Synvert::Application.configure do\nend"
10
+ block_node = Parser::CurrentRuby.parse(source)
11
+ instance = double(current_node: block_node)
12
+ Rewriter::PrependAction.new(instance, 'config.eager_load = true')
13
+ }
14
+
15
+ it 'gets begin_pos' do
16
+ expect(subject.begin_pos).to eq 'Synvert::Application.configure do'.length
17
+ end
18
+
19
+ it 'gets end_pos' do
20
+ expect(subject.end_pos).to eq 'Synvert::Application.configure do'.length
21
+ end
22
+
23
+ it 'gets rewritten_code' do
24
+ expect(subject.rewritten_code).to eq "\n config.eager_load = true"
25
+ end
26
+ end
27
+
28
+ describe 'block node with args' do
29
+ subject {
30
+ source = "RSpec.configure do |config|\nend"
31
+ block_node = Parser::CurrentRuby.parse(source)
32
+ instance = double(current_node: block_node)
33
+ Rewriter::PrependAction.new(instance, '{{arguments.first}}.include FactoryGirl::Syntax::Methods')
34
+ }
35
+
36
+ it 'gets begin_pos' do
37
+ expect(subject.begin_pos).to eq 'RSpec.configure do |config|'.length
38
+ end
39
+
40
+ it 'gets end_pos' do
41
+ expect(subject.end_pos).to eq 'RSpec.configure do |config|'.length
42
+ end
43
+
44
+ it 'gets rewritten_code' do
45
+ expect(subject.rewritten_code).to eq "\n config.include FactoryGirl::Syntax::Methods"
46
+ end
47
+ end
48
+
49
+ describe 'class node without superclass' do
50
+ subject {
51
+ source = "class User\n has_many :posts\nend"
52
+ class_node = Parser::CurrentRuby.parse(source)
53
+ instance = double(current_node: class_node)
54
+ Rewriter::PrependAction.new(instance, 'include Deletable')
55
+ }
56
+
57
+ it 'gets begin_pos' do
58
+ expect(subject.begin_pos).to eq 'class User'.length
59
+ end
60
+
61
+ it 'gets end_pos' do
62
+ expect(subject.end_pos).to eq 'class User'.length
63
+ end
64
+
65
+ it 'gets rewritten_code' do
66
+ expect(subject.rewritten_code).to eq "\n include Deletable"
67
+ end
68
+ end
69
+
70
+ describe 'class node with superclass' do
71
+ subject {
72
+ source = "class User < ActiveRecord::Base\n has_many :posts\nend"
73
+ class_node = Parser::CurrentRuby.parse(source)
74
+ instance = double(current_node: class_node)
75
+ Rewriter::PrependAction.new(instance, 'include Deletable')
76
+ }
77
+
78
+ it 'gets begin_pos' do
79
+ expect(subject.begin_pos).to eq 'class User < ActionRecord::Base'.length
80
+ end
81
+
82
+ it 'gets end_pos' do
83
+ expect(subject.end_pos).to eq 'class User < ActionRecord::Base'.length
84
+ end
85
+
86
+ it 'gets rewritten_code' do
87
+ expect(subject.rewritten_code).to eq "\n include Deletable"
88
+ end
89
+ end
90
+ end
91
+ end
@@ -94,6 +94,15 @@ module Synvert::Core
94
94
  instance.append 'include FactoryGirl::Syntax::Methods'
95
95
  end
96
96
 
97
+ it 'parses prepend' do
98
+ expect(Rewriter::PrependAction).to receive(:new).with(
99
+ instance,
100
+ '{{arguments.first}}.include FactoryGirl::Syntax::Methods',
101
+ {}
102
+ )
103
+ instance.prepend '{{arguments.first}}.include FactoryGirl::Syntax::Methods'
104
+ end
105
+
97
106
  it 'parses insert' do
98
107
  expect(Rewriter::InsertAction).to receive(:new).with(
99
108
  instance,
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: 0.38.0
4
+ version: 0.39.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: 2021-06-21 00:00:00.000000000 Z
11
+ date: 2021-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -146,10 +146,12 @@ files:
146
146
  - lib/synvert/core/node_ext.rb
147
147
  - lib/synvert/core/rewriter.rb
148
148
  - lib/synvert/core/rewriter/action.rb
149
+ - lib/synvert/core/rewriter/action/add_action.rb
149
150
  - lib/synvert/core/rewriter/action/append_action.rb
150
151
  - lib/synvert/core/rewriter/action/delete_action.rb
151
152
  - lib/synvert/core/rewriter/action/insert_action.rb
152
153
  - lib/synvert/core/rewriter/action/insert_after_action.rb
154
+ - lib/synvert/core/rewriter/action/prepend_action.rb
153
155
  - lib/synvert/core/rewriter/action/remove_action.rb
154
156
  - lib/synvert/core/rewriter/action/replace_action.rb
155
157
  - lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb
@@ -176,6 +178,7 @@ files:
176
178
  - spec/synvert/core/rewriter/action/delete_action_spec.rb
177
179
  - spec/synvert/core/rewriter/action/insert_action_spec.rb
178
180
  - spec/synvert/core/rewriter/action/insert_after_action_spec.rb
181
+ - spec/synvert/core/rewriter/action/prepend_action_spec.rb
179
182
  - spec/synvert/core/rewriter/action/remove_action_spec.rb
180
183
  - spec/synvert/core/rewriter/action/replace_action_spec.rb
181
184
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb
@@ -227,6 +230,7 @@ test_files:
227
230
  - spec/synvert/core/rewriter/action/delete_action_spec.rb
228
231
  - spec/synvert/core/rewriter/action/insert_action_spec.rb
229
232
  - spec/synvert/core/rewriter/action/insert_after_action_spec.rb
233
+ - spec/synvert/core/rewriter/action/prepend_action_spec.rb
230
234
  - spec/synvert/core/rewriter/action/remove_action_spec.rb
231
235
  - spec/synvert/core/rewriter/action/replace_action_spec.rb
232
236
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb