rails5-spec-converter 1.0.17 → 1.0.18
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
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfd9be6c8436f667718042b22fb9c3c4391175f3
|
4
|
+
data.tar.gz: d5213028fc60af13ff39ea58167d55b038271416
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0aa8e20f7b38a4702fd4729ea175b176fe9284a04f3367a5d01a16dd42379bb7d2742c7b16333a5500e0914f23ae79b5536525cec7f8e949041d4d42faf2f21
|
7
|
+
data.tar.gz: 718159ad161733c7b8384ea519560fae793caa430be899ef561a6b9b7c8cbb1224fcb73c649a143070bdb83c08c8db0e60744163628d248eeabbb38b0a0a910b
|
data/README.md
CHANGED
@@ -68,6 +68,20 @@ even though `format` should be **outside** the params hash.
|
|
68
68
|
|
69
69
|
* `--strategy skip` will never wrap the unknowable args in `params`
|
70
70
|
|
71
|
+
* `--strategy uglify` will attempt to split the hash into `params` and non-`params` hashes at runtime, like so:
|
72
|
+
|
73
|
+
```
|
74
|
+
all_the_params = {
|
75
|
+
search: 'bayleef',
|
76
|
+
format: :json
|
77
|
+
}
|
78
|
+
|
79
|
+
_inner, _outer = all_the_params.partition { |k,v| %i{session flash method body xhr format}.include?(k) }.map { |a| Hash[a] }
|
80
|
+
get :users, _outer.merge(params: _inner)
|
81
|
+
```
|
82
|
+
|
83
|
+
This should allow your tests to pass without deprecation warnings while introducing an enticing code cleanup oppurtunity.
|
84
|
+
|
71
85
|
### Whitespace
|
72
86
|
|
73
87
|
#### Indentation
|
@@ -114,22 +128,6 @@ To force hashes to be written without extra whitespace in all files regardless o
|
|
114
128
|
|
115
129
|
To force hashes to be written WITH extra whitespace in all files regardless of context, use the argument `--hash-spacing`.
|
116
130
|
|
117
|
-
### Future Work
|
118
|
-
|
119
|
-
Future versions may introduce an `uglify` argument for `--strategy`, which resolves the runtime hash heys problem the following way:
|
120
|
-
|
121
|
-
```
|
122
|
-
all_the_params = {
|
123
|
-
search: 'bayleef',
|
124
|
-
format: :json
|
125
|
-
}
|
126
|
-
|
127
|
-
r5sc_user_params, r5sc_other_params = all_the_params.partition { |k,v| %i{session flash method body xhr format}.include?(k) }.map { |a| Hash[a] }
|
128
|
-
get :users, r5sc_other_params.merge(params: r5sc_user_params)
|
129
|
-
```
|
130
|
-
|
131
|
-
This should allow your tests to pass without deprecation warnings while introducing an enticing code cleanup oppurtunity.
|
132
|
-
|
133
131
|
## Development
|
134
132
|
|
135
133
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rspec spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -11,6 +11,7 @@ module Rails5
|
|
11
11
|
def initialize(content, options = TextTransformerOptions.new)
|
12
12
|
@options = options
|
13
13
|
@content = content
|
14
|
+
@textifier = NodeTextifier.new(@content)
|
14
15
|
|
15
16
|
@source_buffer = Parser::Source::Buffer.new('(string)')
|
16
17
|
@source_buffer.source = @content
|
@@ -48,7 +49,7 @@ module Rails5
|
|
48
49
|
content: @content,
|
49
50
|
options: @options,
|
50
51
|
hash_node: args[0],
|
51
|
-
original_indent: node
|
52
|
+
original_indent: line_indent(node)
|
52
53
|
)
|
53
54
|
|
54
55
|
@source_rewriter.replace(
|
@@ -58,7 +59,7 @@ module Rails5
|
|
58
59
|
end
|
59
60
|
else
|
60
61
|
warn_about_ambiguous_params(node) if @options.warn_about_ambiguous_params?
|
61
|
-
|
62
|
+
handle_ambiguous_method_call!(node)
|
62
63
|
end
|
63
64
|
|
64
65
|
wrap_arg(args[1], 'headers') if args[1]
|
@@ -69,6 +70,52 @@ module Rails5
|
|
69
70
|
|
70
71
|
private
|
71
72
|
|
73
|
+
def handle_ambiguous_method_call!(node)
|
74
|
+
target, verb, action, *args = node.children
|
75
|
+
|
76
|
+
if @options.wrap_ambiguous_params?
|
77
|
+
wrap_arg(args[0], 'params') if @options.wrap_ambiguous_params?
|
78
|
+
end
|
79
|
+
|
80
|
+
if @options.uglify_ambiguous_params?
|
81
|
+
keys = (HashRewriter::ALLOWED_KWARG_KEYS - [:params]).join(' ')
|
82
|
+
partition_clause = [
|
83
|
+
@textifier.node_to_string(args[0]),
|
84
|
+
"partition { |k,v| %i{#{keys}}.include?(k) }",
|
85
|
+
'map { |a| Hash[a] }'
|
86
|
+
].join('.')
|
87
|
+
|
88
|
+
text_before_node = node.loc.expression.source_line[0...node.loc.expression.column]
|
89
|
+
first_line_content = "_inner, _outer = #{partition_clause}"
|
90
|
+
if text_before_node =~ /^\s+$/
|
91
|
+
@source_rewriter.insert_before(node.loc.expression, "#{first_line_content}\n#{line_indent(node)}")
|
92
|
+
@source_rewriter.replace(args[0].loc.expression, '_outer.merge(params: _inner)')
|
93
|
+
else
|
94
|
+
return unless in_a_block_with_only_whitespace?(node)
|
95
|
+
|
96
|
+
new_indent = line_indent(node) + @options.indent
|
97
|
+
@source_rewriter.insert_before(node.loc.expression, "\n" + new_indent + first_line_content + "\n" + new_indent)
|
98
|
+
@source_rewriter.replace(args[0].loc.expression, '_outer.merge(params: _inner)')
|
99
|
+
@source_rewriter.insert_after(node.loc.expression, "\n#{line_indent(node)}")
|
100
|
+
trim_enclosing_spaces!(node)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def in_a_block_with_only_whitespace?(node)
|
106
|
+
return false unless node.parent && node.parent.block_type?
|
107
|
+
content_before = @content[node.parent.loc.begin.end_pos...node.loc.expression.begin_pos]
|
108
|
+
content_after = @content[node.loc.expression.end_pos...node.parent.loc.end.begin_pos]
|
109
|
+
content_before =~ /^\s*$/ && content_after =~ /^\s*$/
|
110
|
+
end
|
111
|
+
|
112
|
+
def trim_enclosing_spaces!(node)
|
113
|
+
before_range = Parser::Source::Range.new(@source_buffer, node.parent.loc.begin.end_pos, node.loc.expression.begin_pos)
|
114
|
+
after_range = Parser::Source::Range.new(@source_buffer, node.loc.expression.end_pos, node.parent.loc.end.begin_pos)
|
115
|
+
@source_rewriter.remove(before_range)
|
116
|
+
@source_rewriter.remove(after_range)
|
117
|
+
end
|
118
|
+
|
72
119
|
def looks_like_route_definition?(hash_node)
|
73
120
|
keys = hash_node.children.map { |pair| pair.children[0].children[0] }
|
74
121
|
route_definition_keys = [:to, :controller]
|
@@ -110,6 +157,10 @@ module Rails5
|
|
110
157
|
log "```\n#{node.loc.expression.source}\n```\n\n"
|
111
158
|
end
|
112
159
|
|
160
|
+
def line_indent(node)
|
161
|
+
node.loc.expression.source_line.match(/^(\s*)/)[1]
|
162
|
+
end
|
163
|
+
|
113
164
|
def log(str)
|
114
165
|
return if @options.quiet?
|
115
166
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails5-spec-converter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.18
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Travis Grathwell
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|