sexp2ruby 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/CHANGELOG.md +20 -7
- data/lib/sexp2ruby/node/call.rb +35 -1
- data/lib/sexp2ruby/node/iter.rb +50 -7
- data/lib/sexp2ruby/version.rb +1 -1
- data/sexp2ruby.gemspec +3 -3
- data/spec/lib/processor_spec.rb +19 -0
- metadata +9 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e85bdfc910bdea5229b1808b0751e8d75277199d
|
4
|
+
data.tar.gz: 8d280d6b355022806feba17979c97a3d273ca996
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 701652fb216fd8b7bf4df826d177675b932ecfd270c65a5d982e28f0c94fa33ab14380ec352c6aeaa5c9b072a84172e87b78fb3c9cc97e094582109dc6d862c0
|
7
|
+
data.tar.gz: ef682dec8338256d2552fc14164442384c76a07c47cf52249dbe785c6cd977c3db618b34e21ffa8f80f6177f3ec2afc7c8a3655bb5ca227b18c44766a308a455
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,10 +4,25 @@ Change Log
|
|
4
4
|
This project follows [semver 2.0.0][1] and the recommendations
|
5
5
|
of [keepachangelog.com][2].
|
6
6
|
|
7
|
-
0.0.
|
8
|
-
-----
|
7
|
+
## 0.0.4
|
9
8
|
|
10
|
-
###
|
9
|
+
### Breaking Changes
|
10
|
+
|
11
|
+
None
|
12
|
+
|
13
|
+
### Added
|
14
|
+
|
15
|
+
None
|
16
|
+
|
17
|
+
### Fixed
|
18
|
+
|
19
|
+
- Iter whitespace: an empty body should render as `{}`, not `{ }`.
|
20
|
+
- A bug where a one-line iter whose call matches no_paren_methods produced
|
21
|
+
invalid output. Example: `a B {}` is now `a B do\nend`
|
22
|
+
|
23
|
+
## 0.0.3
|
24
|
+
|
25
|
+
### Breaking Changes
|
11
26
|
- Configuration
|
12
27
|
- Changed default of `:hash_syntax` from `:ruby18` to `:ruby19`
|
13
28
|
|
@@ -16,14 +31,12 @@ of [keepachangelog.com][2].
|
|
16
31
|
- Configuration
|
17
32
|
- Added `:no_paren_methods` omit argument parentheses
|
18
33
|
|
19
|
-
0.0.2
|
20
|
-
-----
|
34
|
+
## 0.0.2
|
21
35
|
|
22
36
|
### Changed
|
23
37
|
- Normalize block arguments. See [ruby_parser PR 189][3] (Ryan Davis)
|
24
38
|
|
25
|
-
0.0.1
|
26
|
-
-----
|
39
|
+
## 0.0.1
|
27
40
|
|
28
41
|
Initial version. Just claiming the gem name.
|
29
42
|
|
data/lib/sexp2ruby/node/call.rb
CHANGED
@@ -1,10 +1,44 @@
|
|
1
1
|
module Sexp2Ruby
|
2
2
|
module Node
|
3
|
+
# A method call.
|
4
|
+
#
|
5
|
+
# Examples:
|
6
|
+
#
|
7
|
+
# ```
|
8
|
+
# a
|
9
|
+
# s(:call, nil, :a)
|
10
|
+
#
|
11
|
+
# A.b
|
12
|
+
# s(:call, s(:const, :A), :b)
|
13
|
+
#
|
14
|
+
# a(b)
|
15
|
+
# s(:call, nil, :a, s(:call, nil, :b))
|
16
|
+
#
|
17
|
+
# a(b, c: d, &e)
|
18
|
+
# s(
|
19
|
+
# :call,
|
20
|
+
# nil,
|
21
|
+
# :a,
|
22
|
+
# s(:call, nil, :b),
|
23
|
+
# s(:hash, s(:lit, :c), s(:call, nil, :d)),
|
24
|
+
# s(:block_pass, s(:call, nil, :e))
|
25
|
+
# )
|
26
|
+
#
|
27
|
+
# a = :a; a.b
|
28
|
+
# s(
|
29
|
+
# :block,
|
30
|
+
# s(:lasgn, :a, s(:lit, :a)),
|
31
|
+
# s(:call, s(:lvar, :a), :b)
|
32
|
+
# )
|
33
|
+
# ```
|
3
34
|
class Call < Base
|
4
|
-
|
5
35
|
# binary operation messages
|
6
36
|
BINARY = [:<=>, :==, :<, :>, :<=, :>=, :-, :+, :*, :/, :%, :<<, :>>, :**, :'!=']
|
7
37
|
|
38
|
+
def arguments?(exp)
|
39
|
+
exp.length > 2 # 1. receiver, 2. method name, 3+ arguments
|
40
|
+
end
|
41
|
+
|
8
42
|
def to_s(exp)
|
9
43
|
receiver_node_type = exp.first.nil? ? nil : exp.first.first
|
10
44
|
receiver = process exp.shift
|
data/lib/sexp2ruby/node/iter.rb
CHANGED
@@ -1,9 +1,35 @@
|
|
1
1
|
module Sexp2Ruby
|
2
2
|
module Node
|
3
|
+
# An `Iter`, AFAICT, is a `Call` with a block.
|
4
|
+
#
|
5
|
+
# Example:
|
6
|
+
#
|
7
|
+
# ```
|
8
|
+
# # ruby
|
9
|
+
# derp(foo) { |bar| herp }
|
10
|
+
#
|
11
|
+
# # sexp
|
12
|
+
# s(
|
13
|
+
# :iter,
|
14
|
+
# s(:call, nil, :a, s(:call, nil, :b)),
|
15
|
+
# s(:args, :c),
|
16
|
+
# s(:call, nil, :d)
|
17
|
+
# )
|
18
|
+
# ```
|
19
|
+
#
|
3
20
|
class Iter < Base
|
4
21
|
def to_s(exp)
|
5
|
-
|
22
|
+
call_sexp = exp.shift
|
23
|
+
|
24
|
+
# Process the `Call`. The Sexp is not consumed here (it is cloned)
|
25
|
+
# because we will need to refer to it later, when determining which
|
26
|
+
# block delimiters to use (brackets vs. do/end).
|
27
|
+
iter = process(call_sexp.deep_clone)
|
28
|
+
|
29
|
+
# The block arguments (as opposed to the `Call` arguments)
|
6
30
|
args = exp.shift
|
31
|
+
|
32
|
+
# The body of the block.
|
7
33
|
body = exp.empty? ? nil : process(exp.shift)
|
8
34
|
|
9
35
|
args = case args
|
@@ -25,15 +51,16 @@ module Sexp2Ruby
|
|
25
51
|
result = []
|
26
52
|
result << "#{iter} {"
|
27
53
|
result << args
|
28
|
-
|
29
|
-
result << " #{body.strip} "
|
30
|
-
else
|
31
|
-
result << ' '
|
32
|
-
end
|
54
|
+
result << (body ? " #{body.strip} " : "")
|
33
55
|
result << "}"
|
34
56
|
result = result.join
|
35
|
-
return result if result !~ /\n/ and result.size < LINE_LENGTH
|
36
57
|
|
58
|
+
# Can we squeeze the block onto the same line as the call?
|
59
|
+
if same_line_bracket_block?(result, iter, call_sexp.deep_clone)
|
60
|
+
return result
|
61
|
+
end
|
62
|
+
|
63
|
+
# We will not try to squeeze the block onto one line.
|
37
64
|
result = []
|
38
65
|
result << "#{iter} #{b}"
|
39
66
|
result << args
|
@@ -45,6 +72,22 @@ module Sexp2Ruby
|
|
45
72
|
result << e
|
46
73
|
result.join
|
47
74
|
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
# Given `iter` (a rendered `Call`), and `result`, should we try to
|
79
|
+
# squeeze the body (`result`) onto the same line as `iter`? There are two
|
80
|
+
# considerations.
|
81
|
+
#
|
82
|
+
# - Syntactic - did the `Call` parenthesize its arguments?
|
83
|
+
# - Stylistic - would it exceed the line length
|
84
|
+
#
|
85
|
+
def same_line_bracket_block?(result, iter, call_sexp)
|
86
|
+
call_sexp.shift # discard the sexp_type, as the processor would
|
87
|
+
syntactic = !Call.new(processor).arguments?(call_sexp) || iter.end_with?(")")
|
88
|
+
stylistic = result !~ /\n/ && result.size < LINE_LENGTH
|
89
|
+
syntactic && stylistic
|
90
|
+
end
|
48
91
|
end
|
49
92
|
end
|
50
93
|
end
|
data/lib/sexp2ruby/version.rb
CHANGED
data/sexp2ruby.gemspec
CHANGED
@@ -26,8 +26,8 @@ It is a fork of ruby2ruby with slightly different goals.
|
|
26
26
|
spec.add_runtime_dependency "activesupport", "~> 4.2"
|
27
27
|
spec.add_runtime_dependency "sexp_processor", "~> 4.6"
|
28
28
|
|
29
|
-
spec.add_development_dependency "rspec-core", "~> 3.
|
30
|
-
spec.add_development_dependency "rspec-expectations", "~> 3.
|
31
|
-
spec.add_development_dependency "rspec-mocks", "~> 3.
|
29
|
+
spec.add_development_dependency "rspec-core", "~> 3.4"
|
30
|
+
spec.add_development_dependency "rspec-expectations", "~> 3.4"
|
31
|
+
spec.add_development_dependency "rspec-mocks", "~> 3.4"
|
32
32
|
spec.add_development_dependency "ruby_parser", "~> 3.7"
|
33
33
|
end
|
data/spec/lib/processor_spec.rb
CHANGED
@@ -149,6 +149,25 @@ module Sexp2Ruby
|
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
152
|
+
context "iter" do
|
153
|
+
context "empty body" do
|
154
|
+
it "does not put spaces inside brackets" do
|
155
|
+
inp = s(:iter, s(:call, nil, :x, s(:lit, 1)), 0)
|
156
|
+
out = "x(1) {}"
|
157
|
+
compare(inp, out, processor)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
context "when configured to omit parentheses for method x" do
|
162
|
+
it "uses do/end because brackets would be invalid" do
|
163
|
+
pro = described_class.new(no_paren_methods: [:x])
|
164
|
+
inp = s(:iter, s(:call, nil, :x, s(:lit, 1)), 0)
|
165
|
+
out = "x 1 do\nend"
|
166
|
+
compare(inp, out, pro)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
152
171
|
context "hash" do
|
153
172
|
it "ruby19_one_pair" do
|
154
173
|
inp = s(:hash, s(:lit, :foo), s(:str, "bar"))
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sexp2ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-08-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -45,42 +45,42 @@ dependencies:
|
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '3.
|
48
|
+
version: '3.4'
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '3.
|
55
|
+
version: '3.4'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rspec-expectations
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '3.
|
62
|
+
version: '3.4'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '3.
|
69
|
+
version: '3.4'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rspec-mocks
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '3.
|
76
|
+
version: '3.4'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '3.
|
83
|
+
version: '3.4'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: ruby_parser
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -224,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
224
224
|
version: '0'
|
225
225
|
requirements: []
|
226
226
|
rubyforge_project:
|
227
|
-
rubygems_version: 2.
|
227
|
+
rubygems_version: 2.5.1
|
228
228
|
signing_key:
|
229
229
|
specification_version: 4
|
230
230
|
summary: Generates ruby from RubyParser S-expressions
|