synvert 0.0.12 → 0.0.13
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/.travis.yml +1 -0
- data/CHANGELOG.md +7 -0
- data/README.md +8 -5
- data/lib/synvert/cli.rb +3 -3
- data/lib/synvert/node_ext.rb +32 -0
- data/lib/synvert/snippets/rails/convert_dynamic_finders.rb +42 -10
- data/lib/synvert/snippets/ruby/new_hash_syntax.rb +15 -0
- data/lib/synvert/snippets/ruby/new_lambda_syntax.rb +14 -0
- data/lib/synvert/version.rb +1 -1
- data/spec/synvert/node_ext_spec.rb +28 -0
- data/spec/synvert/snippets/rails/convert_dynamic_finders_spec.rb +12 -36
- data/spec/synvert/snippets/rspec/new_syntax_spec.rb +1 -1
- data/spec/synvert/snippets/ruby/new_hash_syntax_spec.rb +27 -0
- data/spec/synvert/snippets/ruby/new_lambda_syntax_spec.rb +27 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9b185412549d5579efb12b82033786c586cc6f7
|
4
|
+
data.tar.gz: cce0f663f05dc9a481edb2f46c41d4e3e0ee2ed2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 796bf4d58f0a30083a1522b70ff8d6cc746d5c982e0081df157a073278dc0e99c45e977390211adaea88979e12019b5da69972eac7fe667ff7df076ab4c2b5fe
|
7
|
+
data.tar.gz: 05d8b0d8c84a2141fa93c245f4d5a7be3095b86c1782bee74fa2656db3386f4e20e33c9d5e34d9d14e3853fd440869f8619fbbf5cce9c396a3edac4fe98705dd
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 0.0.13
|
4
|
+
|
5
|
+
* Add keys and values rules for hash node
|
6
|
+
* Add key and value rules for pair node
|
7
|
+
* Add ruby new hash syntax snippet
|
8
|
+
* Add ruby new lambda syntax snippet
|
9
|
+
|
3
10
|
## 0.0.12
|
4
11
|
|
5
12
|
* Allow define multiple scopes and conditions in one instance
|
data/README.md
CHANGED
@@ -9,6 +9,8 @@ automatically.
|
|
9
9
|
|
10
10
|
**synvert is still in alpha stage**
|
11
11
|
|
12
|
+
synvert supports ruby >= 1.9.3
|
13
|
+
|
12
14
|
## Installation
|
13
15
|
|
14
16
|
Install it using rubygems
|
@@ -21,11 +23,10 @@ $ gem install synvert
|
|
21
23
|
|
22
24
|
```
|
23
25
|
$ synvert -h
|
24
|
-
Usage: synvert [
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
--run-snippets SNIPPET_NAMES run specified snippets
|
26
|
+
Usage: synvert [project_path]
|
27
|
+
-d, --load SNIPPET_PATHS load additional snippets, snippet paths can be local file path or remote http url
|
28
|
+
-l, --list list all available snippets
|
29
|
+
-r, --run SNIPPET_NAMES run specified snippets
|
29
30
|
```
|
30
31
|
|
31
32
|
e.g.
|
@@ -60,6 +61,8 @@ rspec_new_syntax | Use RSpec new syntax, it contains all
|
|
60
61
|
convert_rspec_one_liner_expectation | RSpec converts one liner expectation
|
61
62
|
convert_rspec_should_to_expect | RSpec converts should to expect
|
62
63
|
convert_rspec_stub_and_mock_to_double | RSpec converts stub and mock to double
|
64
|
+
ruby_new_hash_syntax | Ruby uses new hash syntax
|
65
|
+
ruby_new_lambda_syntax | Ruby uses new lambda syntax
|
63
66
|
|
64
67
|
## Documentation
|
65
68
|
|
data/lib/synvert/cli.rb
CHANGED
@@ -16,13 +16,13 @@ module Synvert
|
|
16
16
|
command = :run
|
17
17
|
optparse = OptionParser.new do |opts|
|
18
18
|
opts.banner = "Usage: synvert [project_path]"
|
19
|
-
opts.on '--load
|
19
|
+
opts.on '-d', '--load SNIPPET_PATHS', 'load additional snippets, snippet paths can be local file path or remote http url' do |snippet_paths|
|
20
20
|
Configuration.instance.set 'snippet_paths', snippet_paths.split(',')
|
21
21
|
end
|
22
|
-
opts.on '--list
|
22
|
+
opts.on '-l', '--list', 'list all available snippets' do
|
23
23
|
command = :list
|
24
24
|
end
|
25
|
-
opts.on '--run
|
25
|
+
opts.on '-r', '--run SNIPPET_NAMES', 'run specified snippets' do |snippet_names|
|
26
26
|
Configuration.instance.set 'snippet_names', snippet_names.split(',')
|
27
27
|
end
|
28
28
|
end
|
data/lib/synvert/node_ext.rb
CHANGED
@@ -66,6 +66,38 @@ class Parser::AST::Node
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
+
def keys
|
70
|
+
if :hash == self.type
|
71
|
+
self.children.map { |child| child.children[0] }
|
72
|
+
else
|
73
|
+
raise NotImplementedError.new "keys is not handled for #{self.inspect}"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def values
|
78
|
+
if :hash == self.type
|
79
|
+
self.children.map { |child| child.children[1] }
|
80
|
+
else
|
81
|
+
raise NotImplementedError.new "keys is not handled for #{self.inspect}"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def key
|
86
|
+
if :pair == self.type
|
87
|
+
self.children.first
|
88
|
+
else
|
89
|
+
raise NotImplementedError.new "key is not handled for #{self.inspect}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def value
|
94
|
+
if :pair == self.type
|
95
|
+
self.children.last
|
96
|
+
else
|
97
|
+
raise NotImplementedError.new "value is not handled for #{self.inspect}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
69
101
|
def source(instance)
|
70
102
|
if self.loc.expression
|
71
103
|
instance.current_source[self.loc.expression.begin_pos...self.loc.expression.end_pos]
|
@@ -1,50 +1,82 @@
|
|
1
1
|
Synvert::Rewriter.new "convert_rails_dynamic_finders", "Convert rails dynamic finders" do
|
2
2
|
helper_method 'dynamic_finder_to_hash' do |prefix|
|
3
3
|
fields = node.message.to_s[prefix.length..-1].split("_and_")
|
4
|
-
fields.length.
|
5
|
-
fields
|
6
|
-
|
4
|
+
if fields.length == node.arguments.length && :hash != node.arguments.first.type
|
5
|
+
fields.length.times.map { |i|
|
6
|
+
fields[i] + ": " + node.arguments[i].source(self)
|
7
|
+
}.join(", ")
|
8
|
+
else
|
9
|
+
"{{arguments}}"
|
10
|
+
end
|
7
11
|
end
|
8
12
|
|
9
13
|
within_files '**/*.rb' do
|
10
14
|
# find_all_by_... => where(...)
|
11
15
|
with_node type: 'send', message: /find_all_by_/ do
|
12
16
|
hash_params = dynamic_finder_to_hash("find_all_by_")
|
13
|
-
|
17
|
+
if node.receiver
|
18
|
+
replace_with "{{receiver}}.where(#{hash_params})"
|
19
|
+
else
|
20
|
+
replace_with "where(#{hash_params})"
|
21
|
+
end
|
14
22
|
end
|
15
23
|
|
16
24
|
# find_by_... => where(...).first
|
17
25
|
with_node type: 'send', message: /find_by_/ do
|
18
26
|
if :find_by_id == node.message
|
19
|
-
|
27
|
+
if node.receiver
|
28
|
+
replace_with "{{receiver}}.find({{arguments}})"
|
29
|
+
else
|
30
|
+
replace_with "find({{arguments}}"
|
31
|
+
end
|
20
32
|
elsif :find_by_sql != node.message
|
21
33
|
hash_params = dynamic_finder_to_hash("find_by_")
|
22
|
-
|
34
|
+
if node.receiver
|
35
|
+
replace_with "{{receiver}}.where(#{hash_params}).first"
|
36
|
+
else
|
37
|
+
replace_with "where(#{hash_params}).first"
|
38
|
+
end
|
23
39
|
end
|
24
40
|
end
|
25
41
|
|
26
42
|
# find_last_by_... => where(...).last
|
27
43
|
with_node type: 'send', message: /find_last_by_/ do
|
28
44
|
hash_params = dynamic_finder_to_hash("find_last_by_")
|
29
|
-
|
45
|
+
if node.receiver
|
46
|
+
replace_with "{{receiver}}.where(#{hash_params}).last"
|
47
|
+
else
|
48
|
+
replace_with "where(#{hash_params}).last"
|
49
|
+
end
|
30
50
|
end
|
31
51
|
|
32
52
|
# scoped_by_... => where(...)
|
33
53
|
with_node type: 'send', message: /scoped_by_/ do
|
34
54
|
hash_params = dynamic_finder_to_hash("scoped_by_")
|
35
|
-
|
55
|
+
if node.receiver
|
56
|
+
replace_with "{{receiver}}.where(#{hash_params})"
|
57
|
+
else
|
58
|
+
replace_with "where(#{hash_params})"
|
59
|
+
end
|
36
60
|
end
|
37
61
|
|
38
62
|
# find_or_initialize_by_... => find_or_initialize_by(...)
|
39
63
|
with_node type: 'send', message: /find_or_initialize_by_/ do
|
40
64
|
hash_params = dynamic_finder_to_hash("find_or_initialize_by_")
|
41
|
-
|
65
|
+
if node.receiver
|
66
|
+
replace_with "{{receiver}}.find_or_initialize_by(#{hash_params})"
|
67
|
+
else
|
68
|
+
replace_with "find_or_initialize_by(#{hash_params})"
|
69
|
+
end
|
42
70
|
end
|
43
71
|
|
44
72
|
# find_or_create_by_... => find_or_create_by(...)
|
45
73
|
with_node type: 'send', message: /find_or_create_by_/ do
|
46
74
|
hash_params = dynamic_finder_to_hash("find_or_create_by_")
|
47
|
-
|
75
|
+
if node.receiver
|
76
|
+
replace_with "{{receiver}}.find_or_create_by(#{hash_params})"
|
77
|
+
else
|
78
|
+
replace_with "find_or_create_by(#{hash_params})"
|
79
|
+
end
|
48
80
|
end
|
49
81
|
end
|
50
82
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Synvert::Rewriter.new "ruby_new_hash_syntax", "Ruby uses new hash syntax" do
|
2
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0")
|
3
|
+
within_files '**/*.rb' do
|
4
|
+
# {:foo => 'bar'} => {foo: 'bar'}
|
5
|
+
within_node type: 'hash' do
|
6
|
+
with_node type: 'pair' do
|
7
|
+
if :sym == node.key.type
|
8
|
+
new_key = node.key.source(self)[1..-1]
|
9
|
+
replace_with "#{new_key}: {{value}}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Synvert::Rewriter.new "ruby_new_lambda_syntax", "Ruby uses new lambda syntax" do
|
2
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("1.9.0")
|
3
|
+
within_files '**/*.rb' do
|
4
|
+
# lambda { |a, b, c| a + b + c } => ->(a, b, c) { a + b + c }
|
5
|
+
within_node type: 'block', caller: {type: 'send', message: 'lambda'} do
|
6
|
+
if node.arguments.empty?
|
7
|
+
replace_with "-> { {{body}} }"
|
8
|
+
else
|
9
|
+
replace_with "->({{arguments}}) { {{body}} }"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/synvert/version.rb
CHANGED
@@ -83,6 +83,34 @@ describe Parser::AST::Node do
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
+
describe "#keys" do
|
87
|
+
it 'gets for hash node' do
|
88
|
+
node = parse("{:foo => :bar, 'foo' => 'bar'}")
|
89
|
+
expect(node.keys).to eq [Parser::CurrentRuby.parse(':foo'), Parser::CurrentRuby.parse("'foo'")]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
describe "#values" do
|
94
|
+
it 'gets for hash node' do
|
95
|
+
node = parse("{:foo => :bar, 'foo' => 'bar'}")
|
96
|
+
expect(node.values).to eq [Parser::CurrentRuby.parse(':bar'), Parser::CurrentRuby.parse("'bar'")]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe "#key" do
|
101
|
+
it 'gets for pair node' do
|
102
|
+
node = parse("{:foo => 'bar'}").children[0]
|
103
|
+
expect(node.key).to eq Parser::CurrentRuby.parse(':foo')
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "#value" do
|
108
|
+
it 'gets for hash node' do
|
109
|
+
node = parse("{:foo => 'bar'}").children[0]
|
110
|
+
expect(node.value).to eq Parser::CurrentRuby.parse("'bar'")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
86
114
|
describe "#condition" do
|
87
115
|
it 'gets for if node' do
|
88
116
|
node = parse('if defined?(Bundler); end')
|
@@ -11,63 +11,39 @@ describe 'Convert dynamic finders' do
|
|
11
11
|
describe 'with fakefs', fakefs: true do
|
12
12
|
let(:post_model_content) {'''
|
13
13
|
class Post < ActiveRecord::Base
|
14
|
-
def
|
14
|
+
def active_users
|
15
15
|
User.find_all_by_email_and_active(email, true)
|
16
|
-
end
|
17
|
-
|
18
|
-
def first_active_user_by_email(email)
|
19
16
|
User.find_by_email_and_active(email, true)
|
20
|
-
end
|
21
|
-
|
22
|
-
def last_active_user_by_email(email)
|
23
17
|
User.find_last_by_email_and_active(email, true)
|
24
|
-
end
|
25
|
-
|
26
|
-
def scoped_active_user_by_email(email)
|
27
18
|
User.scoped_by_email_and_active(email, true)
|
28
|
-
end
|
29
|
-
|
30
|
-
def active_users_by_sql(email)
|
31
19
|
User.find_by_sql(["select * from users where email = ?", email])
|
32
|
-
end
|
33
|
-
|
34
|
-
def active_user_by_id(id)
|
35
20
|
User.find_by_id(id)
|
21
|
+
User.find_by_account_id(Account.find_by_email(account_email).id)
|
22
|
+
User.find_or_create_by_email_and_login(parmas)
|
23
|
+
User.find_or_initialize_by_account_id(:account_id => account_id)
|
36
24
|
end
|
37
25
|
|
38
|
-
def
|
39
|
-
|
26
|
+
def self.active_admins
|
27
|
+
find_all_by_role_and_active("admin", true)
|
40
28
|
end
|
41
29
|
end
|
42
30
|
'''}
|
43
31
|
let(:post_model_rewritten_content) {'''
|
44
32
|
class Post < ActiveRecord::Base
|
45
|
-
def
|
33
|
+
def active_users
|
46
34
|
User.where(email: email, active: true)
|
47
|
-
end
|
48
|
-
|
49
|
-
def first_active_user_by_email(email)
|
50
35
|
User.where(email: email, active: true).first
|
51
|
-
end
|
52
|
-
|
53
|
-
def last_active_user_by_email(email)
|
54
36
|
User.where(email: email, active: true).last
|
55
|
-
end
|
56
|
-
|
57
|
-
def scoped_active_user_by_email(email)
|
58
37
|
User.where(email: email, active: true)
|
59
|
-
end
|
60
|
-
|
61
|
-
def active_users_by_sql(email)
|
62
38
|
User.find_by_sql(["select * from users where email = ?", email])
|
63
|
-
end
|
64
|
-
|
65
|
-
def active_user_by_id(id)
|
66
39
|
User.find(id)
|
40
|
+
User.where(account_id: Account.where(email: account_email).first.id).first
|
41
|
+
User.find_or_create_by(parmas)
|
42
|
+
User.find_or_initialize_by(:account_id => account_id)
|
67
43
|
end
|
68
44
|
|
69
|
-
def
|
70
|
-
|
45
|
+
def self.active_admins
|
46
|
+
where(role: "admin", active: true)
|
71
47
|
end
|
72
48
|
end
|
73
49
|
'''}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Ruby uses new hash synax' do
|
4
|
+
before do
|
5
|
+
Synvert::Configuration.instance.set :path, '.'
|
6
|
+
allow_any_instance_of(Synvert::Rewriter::GemSpec).to receive(:match?).and_return(true)
|
7
|
+
rewriter_path = File.join(File.dirname(__FILE__), '../../../../lib/synvert/snippets/ruby/new_hash_syntax.rb')
|
8
|
+
@rewriter = eval(File.read(rewriter_path))
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'with fakefs', fakefs: true do
|
12
|
+
let(:test_content) {"""
|
13
|
+
{:foo => 'bar', 'foo' => 'bar'}
|
14
|
+
{:key1 => 'value1', :key2 => 'value2'}
|
15
|
+
"""}
|
16
|
+
let(:test_rewritten_content) {"""
|
17
|
+
{foo: 'bar', 'foo' => 'bar'}
|
18
|
+
{key1: 'value1', key2: 'value2'}
|
19
|
+
"""}
|
20
|
+
|
21
|
+
it 'process' do
|
22
|
+
File.write 'test.rb', test_content
|
23
|
+
@rewriter.process
|
24
|
+
expect(File.read 'test.rb').to eq test_rewritten_content
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Ruby uses new -> synax' do
|
4
|
+
before do
|
5
|
+
Synvert::Configuration.instance.set :path, '.'
|
6
|
+
allow_any_instance_of(Synvert::Rewriter::GemSpec).to receive(:match?).and_return(true)
|
7
|
+
rewriter_path = File.join(File.dirname(__FILE__), '../../../../lib/synvert/snippets/ruby/new_lambda_syntax.rb')
|
8
|
+
@rewriter = eval(File.read(rewriter_path))
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'with fakefs', fakefs: true do
|
12
|
+
let(:test_content) {"""
|
13
|
+
lambda { test }
|
14
|
+
lambda { |a, b, c| a + b + c }
|
15
|
+
"""}
|
16
|
+
let(:test_rewritten_content) {"""
|
17
|
+
-> { test }
|
18
|
+
->(a, b, c) { a + b + c }
|
19
|
+
"""}
|
20
|
+
|
21
|
+
it 'process' do
|
22
|
+
File.write 'test.rb', test_content
|
23
|
+
@rewriter.process
|
24
|
+
expect(File.read 'test.rb').to eq test_rewritten_content
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: synvert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -140,6 +140,8 @@ files:
|
|
140
140
|
- lib/synvert/snippets/rspec/one_liner_expectation.rb
|
141
141
|
- lib/synvert/snippets/rspec/should_to_expect.rb
|
142
142
|
- lib/synvert/snippets/rspec/stub_and_mock_to_double.rb
|
143
|
+
- lib/synvert/snippets/ruby/new_hash_syntax.rb
|
144
|
+
- lib/synvert/snippets/ruby/new_lambda_syntax.rb
|
143
145
|
- lib/synvert/version.rb
|
144
146
|
- spec/spec_helper.rb
|
145
147
|
- spec/support/parser_helper.rb
|
@@ -157,6 +159,8 @@ files:
|
|
157
159
|
- spec/synvert/snippets/rails/upgrade_3_1_to_3_2_spec.rb
|
158
160
|
- spec/synvert/snippets/rails/upgrade_3_2_to_4_0_spec.rb
|
159
161
|
- spec/synvert/snippets/rspec/new_syntax_spec.rb
|
162
|
+
- spec/synvert/snippets/ruby/new_hash_syntax_spec.rb
|
163
|
+
- spec/synvert/snippets/ruby/new_lambda_syntax_spec.rb
|
160
164
|
- synvert.gemspec
|
161
165
|
homepage: ''
|
162
166
|
licenses:
|
@@ -199,3 +203,5 @@ test_files:
|
|
199
203
|
- spec/synvert/snippets/rails/upgrade_3_1_to_3_2_spec.rb
|
200
204
|
- spec/synvert/snippets/rails/upgrade_3_2_to_4_0_spec.rb
|
201
205
|
- spec/synvert/snippets/rspec/new_syntax_spec.rb
|
206
|
+
- spec/synvert/snippets/ruby/new_hash_syntax_spec.rb
|
207
|
+
- spec/synvert/snippets/ruby/new_lambda_syntax_spec.rb
|