rails5-spec-converter 1.0.17 → 1.0.18
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
|
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
|