synvert-core 0.45.2 → 0.49.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: 425514bc071364c9908b0eff57e626c19fecf611ce3504dd51875af747969aea
4
- data.tar.gz: 2120c05146eab24a6f6c36c9213fcce70ed3102862b1f572d2ba208659b8053a
3
+ metadata.gz: ff7201f9f25e9092d5bebf6359bf5fb7889d37dae90187666fc208a2a688d01d
4
+ data.tar.gz: 6ff9746cef63978f4cbd62cdc9862dabab9f8ba10512f12bbc1292dda19d6483
5
5
  SHA512:
6
- metadata.gz: 65ff93235c9c5a437017f59a4e63fc6ef0a569b4b4f9de6cf23cbb0bf8203c796ea8cdd564ee4a434b87fb4346b0569140f4b75e94ebacfea1dc3cb3e54168f2
7
- data.tar.gz: 5902bcfda3dfe77f362df46e1e8dcad4c269ff5057827936279ebfb8dcd82b19fe6b01e6e52db190d1a7b8d40233a8b15b03864191070e8ef2da8deeb0161ca3
6
+ metadata.gz: e7b44b09b43013829adeb097eafbf143da5d2acbeb731eeb6239388e39dd596c6946ae9cccd91c6e6c9d795bd8118e7a375794f18692461b572bad425b076c9b
7
+ data.tar.gz: 3b14e2a314d04bb0699125c69bef1a5ed46e2ebf79123017c342dccf66ccf6eb1b1f39f27cca3fa817e5eae51ab41d587b606c0a714bd6df1cbb862b3b9e4646
data/CHANGELOG.md CHANGED
@@ -1,11 +1,25 @@
1
1
  # CHANGELOG
2
2
 
3
- ## 0.45.2 (2021-07-24)
3
+ ## 0.49.0 (2021-08-04)
4
4
 
5
- * Simplify symbol `match_value?`
5
+ * Support :erange in to_value
6
+ * Do not use to_value in match_value?
7
+
8
+ ## 0.48.0 (2021-08-01)
9
+
10
+ * Force to read file as utf-8
11
+ * Add logo
6
12
 
7
- ## 0.45.1 (2021-07-24)
13
+ ## 0.47.0 (2021-07-28)
8
14
 
15
+ * Add `to_single_quote` to `str` node
16
+ * Add `to_symbol` to `str` node
17
+ * Add `to_lambda_literal` to `lambda` node
18
+
19
+ ## 0.46.0 (2021-07-25)
20
+
21
+ * Add `strip_curly_braces` and `wrap_curly_braces` for `hash` node
22
+ * Simplify symbol `match_value?`
9
23
  * Unwrap quote when matching string value
10
24
 
11
25
  ## 0.45.0 (2021-07-22)
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Synvert::Core
2
2
 
3
+ <img src="https://xinminlabs.github.io/synvert/img/logo_96.png" alt="logo" width="32" height="32" />
4
+
3
5
  ![Main workflow](https://github.com/xinminlabs/synvert-core/actions/workflows/main.yml/badge.svg)
4
6
  [![Coverage Status](https://coveralls.io/repos/xinminlabs/synvert-core/badge.png?branch=master)](https://coveralls.io/r/xinminlabs/synvert-core)
5
7
  [![Gem Version](https://badge.fury.io/rb/synvert-core.png)](http://badge.fury.io/rb/synvert-core)
@@ -35,5 +37,5 @@ Or install it yourself as:
35
37
  4. Push to the branch (`git push origin my-new-feature`)
36
38
  5. Create a new Pull Request
37
39
 
38
- [1]: http://xinminlabs.github.io/synvert/
39
- [2]: http://rubydoc.info/github/xinminlabs/synvert-core/master/frames
40
+ [1]: https://xinminlabs.github.io/synvert/
41
+ [2]: https://rubydoc.info/github/xinminlabs/synvert-core/master/frames
@@ -252,6 +252,8 @@ module Parser::AST
252
252
  children.map(&:to_value)
253
253
  when :irange
254
254
  (children.first.to_value..children.last.to_value)
255
+ when :erange
256
+ (children.first.to_value...children.last.to_value)
255
257
  when :begin
256
258
  children.first.to_value
257
259
  else
@@ -490,6 +492,50 @@ module Parser::AST
490
492
  end
491
493
  end
492
494
 
495
+ # strip curly braces for hash
496
+ def strip_curly_braces
497
+ return to_source unless type == :hash
498
+
499
+ to_source.sub(/^{(.*)}$/) { Regexp.last_match(1).strip }
500
+ end
501
+
502
+ # wrap curly braces for hash
503
+ def wrap_curly_braces
504
+ return to_source unless type == :hash
505
+
506
+ "{ #{to_source} }"
507
+ end
508
+
509
+ # get single quote string
510
+ def to_single_quote
511
+ return to_source unless type == :str
512
+
513
+ "'#{to_value}'"
514
+ end
515
+
516
+ # convert string to symbol
517
+ def to_symbol
518
+ return to_source unless type == :str
519
+
520
+ ":#{to_value}"
521
+ end
522
+
523
+ # convert lambda {} to -> {}
524
+ def to_lambda_literal
525
+ if type == :block && caller.type == :send && caller.receiver.nil? && caller.message == :lambda
526
+ new_source = to_source
527
+ if arguments.size > 1
528
+ new_source = new_source[0...arguments.loc.begin.to_range.begin - 1] + new_source[arguments.loc.end.to_range.end..-1]
529
+ new_source = new_source.sub('lambda', "->(#{arguments.map(&:to_source).join(', ')})")
530
+ else
531
+ new_source = new_source.sub('lambda', '->')
532
+ end
533
+ new_source
534
+ else
535
+ to_source
536
+ end
537
+ end
538
+
493
539
  private
494
540
 
495
541
  # Compare actual value with expected value.
@@ -504,14 +550,14 @@ module Parser::AST
504
550
  case expected
505
551
  when Symbol
506
552
  if actual.is_a?(Parser::AST::Node)
507
- actual.to_value == expected
553
+ actual.to_source == ":#{expected}"
508
554
  else
509
555
  actual.to_sym == expected
510
556
  end
511
557
  when String
512
558
  if actual.is_a?(Parser::AST::Node)
513
- actual.to_source == expected || actual.to_value == expected ||
514
- actual.to_source == unwrap_quote(expected) || actual.to_value == unwrap_quote(expected)
559
+ actual.to_source == expected || actual.to_source == unwrap_quote(expected) ||
560
+ unwrap_quote(actual.to_source) == expected || unwrap_quote(actual.to_source) == unwrap_quote(expected)
515
561
  else
516
562
  actual.to_s == expected || wrap_quote(actual.to_s) == expected
517
563
  end
@@ -66,7 +66,7 @@ module Synvert::Core
66
66
  # strip_brackets("(1..100)") #=> "1..100"
67
67
  def strip_brackets(code)
68
68
  code.sub(/^\((.*)\)$/) { Regexp.last_match(1) }.sub(/^\[(.*)\]$/) { Regexp.last_match(1) }.sub(/^{(.*)}$/) {
69
- Regexp.last_match(1)
69
+ Regexp.last_match(1).strip
70
70
  }
71
71
  end
72
72
 
@@ -17,7 +17,7 @@ module Synvert::Core
17
17
  @file_source ||= {}
18
18
  @file_source[file_path] ||=
19
19
  begin
20
- source = File.read(file_path)
20
+ source = File.read(file_path, encoding: 'UTF-8')
21
21
  source = Engine::ERB.encode(source) if /\.erb$/.match?(file_path)
22
22
  source
23
23
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Synvert
4
4
  module Core
5
- VERSION = '0.45.2'
5
+ VERSION = '0.49.0'
6
6
  end
7
7
  end
@@ -316,18 +316,23 @@ describe Parser::AST::Node do
316
316
  expect(node.to_value).to eq :str
317
317
  end
318
318
 
319
- it 'get for boolean' do
319
+ it 'gets for boolean' do
320
320
  node = parse('true')
321
321
  expect(node.to_value).to be_truthy
322
322
  node = parse('false')
323
323
  expect(node.to_value).to be_falsey
324
324
  end
325
325
 
326
- it 'get for range' do
326
+ it 'gets for irange' do
327
327
  node = parse('(1..10)')
328
328
  expect(node.to_value).to eq(1..10)
329
329
  end
330
330
 
331
+ it 'gets for erange' do
332
+ node = parse('(1...10)')
333
+ expect(node.to_value).to eq(1...10)
334
+ end
335
+
331
336
  it 'gets for array' do
332
337
  node = parse("['str', :str]")
333
338
  expect(node.to_value).to eq ['str', :str]
@@ -679,4 +684,91 @@ describe Parser::AST::Node do
679
684
  EOS
680
685
  end
681
686
  end
687
+
688
+ describe '#strip_curly_braces' do
689
+ context 'hash node' do
690
+ it 'removes curly braces' do
691
+ node = parse("{ foo: 'bar' }")
692
+ expect(node.strip_curly_braces).to eq("foo: 'bar'")
693
+ end
694
+ end
695
+
696
+ context 'other node' do
697
+ it 'do nothing' do
698
+ node = parse("'foobar'")
699
+ expect(node.strip_curly_braces).to eq("'foobar'")
700
+ end
701
+ end
702
+ end
703
+
704
+ describe '#wrap_curly_braces' do
705
+ context 'hash node' do
706
+ it 'adds curly braces' do
707
+ node = parse("test(foo: 'bar')").arguments.first
708
+ expect(node.to_source).to eq("foo: 'bar'")
709
+ expect(node.wrap_curly_braces).to eq("{ foo: 'bar' }")
710
+ end
711
+ end
712
+
713
+ context 'other node' do
714
+ it 'does nothing' do
715
+ node = parse("'foobar'")
716
+ expect(node.wrap_curly_braces).to eq("'foobar'")
717
+ end
718
+ end
719
+ end
720
+
721
+ describe '#to_single_quote' do
722
+ context 'str node' do
723
+ it 'converts double quote to single quote' do
724
+ node = parse('"foobar"')
725
+ expect(node.to_source).to eq '"foobar"'
726
+ expect(node.to_single_quote).to eq "'foobar'"
727
+ end
728
+ end
729
+
730
+ context 'other node' do
731
+ it 'does nothing' do
732
+ node = parse(':foobar')
733
+ expect(node.to_single_quote).to eq ':foobar'
734
+ end
735
+ end
736
+ end
737
+
738
+ describe '#to_symbol' do
739
+ context 'str node' do
740
+ it 'converts string to symbol' do
741
+ node = parse("'foobar'")
742
+ expect(node.to_symbol).to eq ':foobar'
743
+ end
744
+ end
745
+
746
+ context 'other node' do
747
+ it 'does nothing' do
748
+ node = parse(':foobar')
749
+ expect(node.to_symbol).to eq ':foobar'
750
+ end
751
+ end
752
+ end
753
+
754
+ describe '#to_lambda_literal' do
755
+ context 'lambda node' do
756
+ it 'converts to lambda literal without arguments' do
757
+ node = parse('lambda { foobar }')
758
+ expect(node.to_lambda_literal).to eq('-> { foobar }')
759
+ end
760
+
761
+ it 'converts to lambda literal with arguments' do
762
+ node = parse('lambda { |x, y| foobar }')
763
+ expect(node.to_lambda_literal).to eq('->(x, y) { foobar }')
764
+ end
765
+ end
766
+
767
+ context 'other node' do
768
+ it 'does nothing' do
769
+ node = parse(':foobar')
770
+ expect(node.to_lambda_literal).to eq ':foobar'
771
+ end
772
+ end
773
+ end
682
774
  end
@@ -170,7 +170,7 @@ module Synvert::Core
170
170
  end
171
171
  EOS
172
172
  expect(Dir).to receive(:glob).with('./spec/**/*_spec.rb').and_return(['spec/models/post_spec.rb'])
173
- expect(File).to receive(:read).with('spec/models/post_spec.rb').and_return(input)
173
+ expect(File).to receive(:read).with('spec/models/post_spec.rb', encoding: 'UTF-8').and_return(input)
174
174
  expect(File).to receive(:write).with('spec/models/post_spec.rb', output)
175
175
  instance.process
176
176
  end
@@ -195,7 +195,7 @@ module Synvert::Core
195
195
  end
196
196
  EOS
197
197
  expect(Dir).to receive(:glob).with('./spec/spec_helper.rb').and_return(['spec/spec_helper.rb'])
198
- expect(File).to receive(:read).with('spec/spec_helper.rb').and_return(input)
198
+ expect(File).to receive(:read).with('spec/spec_helper.rb', encoding: 'UTF-8').and_return(input)
199
199
  expect(File).not_to receive(:write).with('spec/spec_helper.rb', output)
200
200
  instance.process
201
201
  end
@@ -220,7 +220,7 @@ module Synvert::Core
220
220
  end
221
221
  EOS
222
222
  expect(Dir).to receive(:glob).with('./spec/spec_helper.rb').and_return(['spec/spec_helper.rb']).twice
223
- expect(File).to receive(:read).with('spec/spec_helper.rb').and_return(input).once
223
+ expect(File).to receive(:read).with('spec/spec_helper.rb', encoding: 'UTF-8').and_return(input).once
224
224
  expect(File).not_to receive(:write).with('spec/spec_helper.rb', output)
225
225
  instance.process
226
226
  instance.process
@@ -248,9 +248,9 @@ module Synvert::Core
248
248
  end
249
249
  EOS
250
250
  expect(Dir).to receive(:glob).with('./spec/**/*_spec.rb').and_return(['spec/models/post_spec.rb']).twice
251
- expect(File).to receive(:read).with('spec/models/post_spec.rb').and_return(input)
251
+ expect(File).to receive(:read).with('spec/models/post_spec.rb', encoding: 'UTF-8').and_return(input)
252
252
  expect(File).to receive(:write).with('spec/models/post_spec.rb', output)
253
- expect(File).to receive(:read).with('spec/models/post_spec.rb').and_return(output)
253
+ expect(File).to receive(:read).with('spec/models/post_spec.rb', encoding: 'UTF-8').and_return(output)
254
254
  instance.process
255
255
  instance.process
256
256
  expect(rewriter.affected_files).to be_include('spec/models/post_spec.rb')
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.45.2
4
+ version: 0.49.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-07-24 00:00:00.000000000 Z
11
+ date: 2021-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport