synvert-core 0.25.1 → 0.26.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1aab544b0a434d8d34f445906448203f8ebf670f2e3fc14ac791163c1c059bbb
4
- data.tar.gz: c913b856a8281cbd07ac6ca59fea393a633b3d920b0849b9a9f16dd897989b0f
3
+ metadata.gz: a2dcb08f4af325c83596a4ab4ff8ddf43a11500629e96dbccce9fa070dcf7fbc
4
+ data.tar.gz: 4d428fd96a41f1a31b32d6f301562f093c752d6ec63a1dd5641f6f66a62605b7
5
5
  SHA512:
6
- metadata.gz: cc0c4ea16085329d3385227885af3fc10fc925be5abe0bf408afa89ee95d5aba048225be488b8624dd0cdb7c6c0b4ed994f9d8c66aa8891c252eaf5784e3f06c
7
- data.tar.gz: d3a6ac011d673c981cc59e34ad0bbcba5c5042a5bc20ea15a46d6c77b775d8f682d212951ec8503432473044e2f58c80342810fe9d4521cf405bf719e845bdd3
6
+ metadata.gz: ae47fbf7a0ce9ddae8e221b9508f981534118e5c303ec1736d391db51477a477d338bbfdc215ecd3af5ba4ff6cd0090995c5a17fab6d249a24d46501f941d3b7
7
+ data.tar.gz: 6cf6396cbd3deb8b1d66a1166caa8a584ef0145ebd719b067d1d705f73f7f1d0177e910e16c16c55f19034995d4b641837149185ee318aefe1303e3d8e7db625
data/CHANGELOG.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.25.1 (2021-03-24)
3
+ ## 0.26.0 (2021-03-30)
4
4
 
5
5
  * attr_reader ruby_version and gem_spec
6
+ * Add `replace` action
6
7
 
7
8
  ## 0.25.0 (2021-03-23)
8
9
 
@@ -317,6 +317,28 @@ module Parser::AST
317
317
  loc.expression.line
318
318
  end
319
319
 
320
+ # Get the source range of child node.
321
+ #
322
+ # @param [String] name of child node.
323
+ # @return [Parser::Source::Range] source range of child node.
324
+ def child_node_range(child_name)
325
+ case type
326
+ when :send
327
+ case child_name
328
+ when :receiver
329
+ receiver&.loc&.expression
330
+ when :dot
331
+ loc.dot
332
+ when :message
333
+ loc.selector
334
+ when :arguments
335
+ Parser::Source::Range.new('(string)', arguments.first.loc.expression.begin_pos, arguments.last.loc.expression.end_pos) unless arguments.empty?
336
+ end
337
+ else
338
+ raise Synvert::Core::MethodNotSupported, "child_node_range is not handled for #{evaluated.inspect}, child_name: #{child_name}"
339
+ end
340
+ end
341
+
320
342
  # Recursively iterate all child nodes of current node.
321
343
  #
322
344
  # @yield [child] Gives a child node.
@@ -21,6 +21,7 @@ module Synvert::Core
21
21
  autoload :InsertAction, 'synvert/core/rewriter/action/insert_action'
22
22
  autoload :InsertAfterAction, 'synvert/core/rewriter/action/insert_after_action'
23
23
  autoload :ReplaceWithAction, 'synvert/core/rewriter/action/replace_with_action'
24
+ autoload :ReplaceAction, 'synvert/core/rewriter/action/replace_action'
24
25
  autoload :ReplaceErbStmtWithExprAction, 'synvert/core/rewriter/action/replace_erb_stmt_with_expr_action'
25
26
  autoload :RemoveAction, 'synvert/core/rewriter/action/remove_action'
26
27
 
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Synvert::Core
4
+ # ReplaceAction to replace child node with code.
5
+ class Rewriter::ReplaceAction < Rewriter::Action
6
+ def initialize(instance, selector, with:)
7
+ @instance = instance
8
+ @selector = selector
9
+ @code = with
10
+ @node = @instance.current_node
11
+ end
12
+
13
+ # Begin position of code to replace.
14
+ #
15
+ # @return [Integer] begin position.
16
+ def begin_pos
17
+ @node.child_node_range(@selector).begin_pos
18
+ end
19
+
20
+ # End position of code to replace.
21
+ #
22
+ # @return [Integer] end position.
23
+ def end_pos
24
+ @node.child_node_range(@selector).end_pos
25
+ end
26
+
27
+ # The rewritten source code.
28
+ #
29
+ # @return [String] rewritten code.
30
+ def rewritten_code
31
+ rewritten_source
32
+ end
33
+ end
34
+ end
@@ -251,6 +251,15 @@ module Synvert::Core
251
251
  @actions << Rewriter::ReplaceWithAction.new(self, code, options)
252
252
  end
253
253
 
254
+ # Parse replace with dsl, it creates a [Synvert::Core::Rewriter::ReplaceAction] to
255
+ # replace child node with code.
256
+ #
257
+ # @param selector [Symbol] selector name of child name.
258
+ # @param with [String] code need to be replaced with.
259
+ def replace(selector, with:)
260
+ @actions << Rewriter::ReplaceAction.new(self, selector, with: with)
261
+ end
262
+
254
263
  # Parse replace_erb_stmt_with_expr dsl, it creates a [Synvert::Core::Rewriter::ReplaceErbStmtWithExprAction] to
255
264
  # replace erb stmt code to expr code.
256
265
  def replace_erb_stmt_with_expr
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Synvert
4
4
  module Core
5
- VERSION = '0.25.1'
5
+ VERSION = '0.26.0'
6
6
  end
7
7
  end
@@ -394,6 +394,54 @@ describe Parser::AST::Node do
394
394
  end
395
395
  end
396
396
 
397
+ describe '#child_node_range' do
398
+ context 'send node' do
399
+ it 'checks receiver' do
400
+ node = parse('foo.bar(test)')
401
+ range = node.child_node_range(:receiver)
402
+ expect(range.to_range).to eq(0...3)
403
+
404
+ node = parse('foobar(test)')
405
+ range = node.child_node_range(:receiver)
406
+ expect(range).to be_nil
407
+ end
408
+
409
+ it 'checks dot' do
410
+ node = parse('foo.bar(test)')
411
+ range = node.child_node_range(:dot)
412
+ expect(range.to_range).to eq(3...4)
413
+
414
+ node = parse('foobar(test)')
415
+ range = node.child_node_range(:dot)
416
+ expect(range).to be_nil
417
+ end
418
+
419
+ it 'checks message' do
420
+ node = parse('foo.bar(test)')
421
+ range = node.child_node_range(:message)
422
+ expect(range.to_range).to eq(4...7)
423
+
424
+ node = parse('foobar(test)')
425
+ range = node.child_node_range(:message)
426
+ expect(range.to_range).to eq(0...6)
427
+ end
428
+
429
+ it 'checks arguments' do
430
+ node = parse('foo.bar(test)')
431
+ range = node.child_node_range(:arguments)
432
+ expect(range.to_range).to eq(8...12)
433
+
434
+ node = parse('foobar(test)')
435
+ range = node.child_node_range(:arguments)
436
+ expect(range.to_range).to eq(7...11)
437
+
438
+ node = parse('foo.bar')
439
+ range = node.child_node_range(:arguments)
440
+ expect(range).to be_nil
441
+ end
442
+ end
443
+ end
444
+
397
445
  describe '#rewritten_source' do
398
446
  let(:instance) {
399
447
  rewriter = Synvert::Rewriter.new('foo', 'bar')
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ module Synvert::Core
6
+ describe Rewriter::ReplaceAction do
7
+ context 'replace with single line' do
8
+ subject {
9
+ source = "'slug from title'.gsub(' ', '_')"
10
+ node = Parser::CurrentRuby.parse(source)
11
+ instance = double(current_node: node)
12
+ Rewriter::ReplaceAction.new(instance, :message, with: 'tr')
13
+ }
14
+
15
+ it 'gets begin_pos' do
16
+ expect(subject.begin_pos).to eq "'slug from title'.".length
17
+ end
18
+
19
+ it 'gets end_pos' do
20
+ expect(subject.end_pos).to eq "'slug from title'.gsub".length
21
+ end
22
+
23
+ it 'gets rewritten_code' do
24
+ expect(subject.rewritten_code).to eq 'tr'
25
+ end
26
+ end
27
+ end
28
+ end
@@ -117,6 +117,11 @@ module Synvert::Core
117
117
  instance.replace_with 'create {{arguments}}'
118
118
  end
119
119
 
120
+ it 'parses replace with' do
121
+ expect(Rewriter::ReplaceAction).to receive(:new).with(instance, :message, with: 'test')
122
+ instance.replace :message, with: 'test'
123
+ end
124
+
120
125
  it 'parses remove' do
121
126
  expect(Rewriter::RemoveAction).to receive(:new).with(instance)
122
127
  instance.remove
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.25.1
4
+ version: 0.26.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-03-24 00:00:00.000000000 Z
11
+ date: 2021-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -150,6 +150,7 @@ files:
150
150
  - lib/synvert/core/rewriter/action/insert_action.rb
151
151
  - lib/synvert/core/rewriter/action/insert_after_action.rb
152
152
  - lib/synvert/core/rewriter/action/remove_action.rb
153
+ - lib/synvert/core/rewriter/action/replace_action.rb
153
154
  - lib/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action.rb
154
155
  - lib/synvert/core/rewriter/action/replace_with_action.rb
155
156
  - lib/synvert/core/rewriter/condition.rb
@@ -173,6 +174,7 @@ files:
173
174
  - spec/synvert/core/rewriter/action/insert_action_spec.rb
174
175
  - spec/synvert/core/rewriter/action/insert_after_action_spec.rb
175
176
  - spec/synvert/core/rewriter/action/remove_action_spec.rb
177
+ - spec/synvert/core/rewriter/action/replace_action_spec.rb
176
178
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb
177
179
  - spec/synvert/core/rewriter/action/replace_with_action_spec.rb
178
180
  - spec/synvert/core/rewriter/action_spec.rb
@@ -222,6 +224,7 @@ test_files:
222
224
  - spec/synvert/core/rewriter/action/insert_action_spec.rb
223
225
  - spec/synvert/core/rewriter/action/insert_after_action_spec.rb
224
226
  - spec/synvert/core/rewriter/action/remove_action_spec.rb
227
+ - spec/synvert/core/rewriter/action/replace_action_spec.rb
225
228
  - spec/synvert/core/rewriter/action/replace_erb_stmt_with_expr_action_spec.rb
226
229
  - spec/synvert/core/rewriter/action/replace_with_action_spec.rb
227
230
  - spec/synvert/core/rewriter/action_spec.rb