rails5-spec-converter 1.0.11 → 1.0.12
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: dd33f82a367cba9cb53594ef8b6606e265267bf7
|
4
|
+
data.tar.gz: 369d01c3d4b27d19ea7de004054fc8376f5a5d6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2694b5710bf049e67d199b643a07cf7fb456e8d83ee65c51e99f2ca4ef60a3174f564a732018a599191e728cf9e68d7ee36126828849d5bbc1bc9077d7b0e1a5
|
7
|
+
data.tar.gz: 0004df17a2b3a31d88ace9af26194c6281acd92da24fa58d707d00b3e83934b759d4b42bb453e4003aaa9df3d12d199fdf9cff1be6ec2ff729cfbdd2e44c6600
|
data/README.md
CHANGED
@@ -39,6 +39,35 @@ If you want to specify a specific set of files instead, you can run `rails5-spec
|
|
39
39
|
|
40
40
|
By default it will make some noise, run with `rails5-spec-converter --quiet` if you want it not to.
|
41
41
|
|
42
|
+
### Strategy
|
43
|
+
|
44
|
+
`rails5-spec-converter` wants to partition your arguments into two sets, those that belong in `params` and those that don't.
|
45
|
+
|
46
|
+
But it doesn't do any runtime analysis, so it can only effectively sort out non-`params` keys if they're included in a hash literal on the test invocation site. Hence:
|
47
|
+
|
48
|
+
```
|
49
|
+
all_the_params = {
|
50
|
+
search: 'bayleef',
|
51
|
+
format: :json
|
52
|
+
}
|
53
|
+
|
54
|
+
get :users, all_the_params
|
55
|
+
```
|
56
|
+
|
57
|
+
will become
|
58
|
+
|
59
|
+
```
|
60
|
+
get :users, params: all_the_params
|
61
|
+
```
|
62
|
+
|
63
|
+
even though `format` should be **outside** the params hash.
|
64
|
+
|
65
|
+
* `--warn-if-ambiguous` will print a message every time `rails5-spec-converter` encounters this situation
|
66
|
+
|
67
|
+
* `--strategy optimistic` (default) will always wrap the unknowable args in `params`
|
68
|
+
|
69
|
+
* `--strategy skip` will never wrap the unknowable args in `params`
|
70
|
+
|
42
71
|
### Whitespace
|
43
72
|
|
44
73
|
#### Indentation
|
@@ -85,32 +114,9 @@ To force hashes to be written without extra whitespace in all files regardless o
|
|
85
114
|
|
86
115
|
To force hashes to be written WITH extra whitespace in all files regardless of context, use the argument `--hash-spacing`.
|
87
116
|
|
88
|
-
|
89
|
-
|
90
|
-
`rails5-spec-converter` wants to partition your arguments into two sets, those that belong in `params` and those that don't.
|
91
|
-
|
92
|
-
But it doesn't do any runtime analysis, so it can only effectively sort out non-`params` keys if they're included in a hash literal on the test invocation site. Hence:
|
93
|
-
|
94
|
-
```
|
95
|
-
all_the_params = {
|
96
|
-
search: 'bayleef',
|
97
|
-
format: :json
|
98
|
-
}
|
99
|
-
|
100
|
-
get :users, all_the_params
|
101
|
-
```
|
102
|
-
|
103
|
-
will become
|
104
|
-
|
105
|
-
```
|
106
|
-
get :users, params: all_the_params
|
107
|
-
```
|
108
|
-
|
109
|
-
even though `format` should be **outside** the params hash.
|
110
|
-
|
111
|
-
#### Future Work
|
117
|
+
### Future Work
|
112
118
|
|
113
|
-
|
119
|
+
Future versions may introduce an `uglify` argument for `--strategy`, which resolves the runtime hash heys problem the following way:
|
114
120
|
|
115
121
|
```
|
116
122
|
all_the_params = {
|
@@ -122,7 +128,7 @@ r5sc_user_params, r5sc_other_params = all_the_params.partition { |k,v| %i{sessio
|
|
122
128
|
get :users, r5sc_other_params.merge(params: r5sc_user_params)
|
123
129
|
```
|
124
130
|
|
125
|
-
|
131
|
+
This should allow your tests to pass without deprecation warnings while introducing an enticing code cleanup oppurtunity.
|
126
132
|
|
127
133
|
## Development
|
128
134
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'rails5/spec_converter/text_transformer'
|
2
|
+
require 'rails5/spec_converter/text_transformer_options'
|
2
3
|
require 'rails5/spec_converter/version'
|
3
4
|
require 'optparse'
|
4
5
|
|
@@ -6,7 +7,7 @@ module Rails5
|
|
6
7
|
module SpecConverter
|
7
8
|
class CLI
|
8
9
|
def initialize
|
9
|
-
@options =
|
10
|
+
@options = TextTransformerOptions.new
|
10
11
|
OptionParser.new do |opts|
|
11
12
|
opts.banner = "Usage: rails5-spec-converter [options] [files]"
|
12
13
|
|
@@ -16,15 +17,23 @@ module Rails5
|
|
16
17
|
end
|
17
18
|
|
18
19
|
opts.on("-q", "--quiet", "Run quietly") do |q|
|
19
|
-
@options
|
20
|
+
@options.quiet = q
|
20
21
|
end
|
21
22
|
|
22
23
|
opts.on("-i", "--indent INDENT", "Use specified string for indentation (default is two spaces)") do |indent|
|
23
|
-
@options
|
24
|
+
@options.indent = indent.gsub("\\t", "\t")
|
24
25
|
end
|
25
26
|
|
26
27
|
opts.on("--[no-]hash-spacing", "Always/never add space around hashes ({foo: 'bar'} vs { foo: 'bar' })") do |hash_spacing|
|
27
|
-
@options
|
28
|
+
@options.hash_spacing = hash_spacing
|
29
|
+
end
|
30
|
+
|
31
|
+
opts.on("-s", "--strategy STRATEGY", "Set unknown hash parameters strategy (see README)") do |strategy|
|
32
|
+
@options.strategy = strategy.to_sym
|
33
|
+
end
|
34
|
+
|
35
|
+
opts.on("--warn-if-ambiguous", "Emit warnings when hash parameters are unknowable (see README)") do |warn_if_ambigous|
|
36
|
+
@options.warn_if_ambiguous = warn_if_ambigous
|
28
37
|
end
|
29
38
|
end.parse!
|
30
39
|
|
@@ -39,6 +48,7 @@ module Rails5
|
|
39
48
|
log "Processing: #{file_path}"
|
40
49
|
|
41
50
|
original_content = File.read(file_path)
|
51
|
+
@options.file_path = file_path
|
42
52
|
transformed_content = Rails5::SpecConverter::TextTransformer.new(original_content, @options).transform
|
43
53
|
File.write(file_path, transformed_content)
|
44
54
|
end
|
@@ -46,7 +56,7 @@ module Rails5
|
|
46
56
|
end
|
47
57
|
|
48
58
|
def log(str)
|
49
|
-
return if @options
|
59
|
+
return if @options.quiet?
|
50
60
|
|
51
61
|
puts str
|
52
62
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'parser/current'
|
2
2
|
require 'astrolabe/builder'
|
3
|
+
require 'rails5/spec_converter/text_transformer_options'
|
3
4
|
|
4
5
|
module Rails5
|
5
6
|
module SpecConverter
|
@@ -8,10 +9,8 @@ module Rails5
|
|
8
9
|
ALLOWED_KWARG_KEYS = %i(params session flash method body xhr format)
|
9
10
|
|
10
11
|
class TextTransformer
|
11
|
-
def initialize(content, options =
|
12
|
-
@
|
13
|
-
@hash_spacing = options[:hash_spacing]
|
14
|
-
@quiet = options[:quiet]
|
12
|
+
def initialize(content, options = TextTransformerOptions.new)
|
13
|
+
@options = options
|
15
14
|
@content = content
|
16
15
|
|
17
16
|
@source_buffer = Parser::Source::Buffer.new('(string)')
|
@@ -30,7 +29,9 @@ module Rails5
|
|
30
29
|
next unless args.length > 0
|
31
30
|
next unless target.nil? && HTTP_VERBS.include?(verb)
|
32
31
|
|
33
|
-
if args[0].hash_type? && args[0].children.length
|
32
|
+
if args[0].hash_type? && args[0].children.length == 0
|
33
|
+
wrap_arg(args[0], 'params')
|
34
|
+
elsif args[0].hash_type?
|
34
35
|
next if looks_like_route_definition?(args[0])
|
35
36
|
next if has_kwsplat?(args[0])
|
36
37
|
next if has_key?(args[0], :params)
|
@@ -40,7 +41,8 @@ module Rails5
|
|
40
41
|
original_indent: node.loc.expression.source_line.match(/^(\s*)/)[1]
|
41
42
|
)
|
42
43
|
else
|
43
|
-
|
44
|
+
warn_about_ambiguous_params(node) if @options.warn_about_ambiguous_params?
|
45
|
+
wrap_arg(args[0], 'params') if @options.wrap_ambiguous_params?
|
44
46
|
end
|
45
47
|
|
46
48
|
wrap_arg(args[1], 'headers') if args[1]
|
@@ -144,7 +146,7 @@ module Rails5
|
|
144
146
|
return nil if indent_before_first_pair(hash_node)
|
145
147
|
|
146
148
|
joiner = joiner_between_pairs(hash_node)
|
147
|
-
joiner && joiner.include?("\n") ? @indent : nil
|
149
|
+
joiner && joiner.include?("\n") ? @options.indent : nil
|
148
150
|
end
|
149
151
|
|
150
152
|
def existing_indent(hash_node)
|
@@ -206,8 +208,8 @@ module Rails5
|
|
206
208
|
end
|
207
209
|
|
208
210
|
def determine_curly_sep(hash_node)
|
209
|
-
return ' ' if @hash_spacing == true
|
210
|
-
return '' if @hash_spacing == false
|
211
|
+
return ' ' if @options.hash_spacing == true
|
212
|
+
return '' if @options.hash_spacing == false
|
211
213
|
|
212
214
|
no_space_after_curly?(hash_node) ? '' : ' '
|
213
215
|
end
|
@@ -247,8 +249,14 @@ module Rails5
|
|
247
249
|
@content[node.loc.expression.begin_pos...node.loc.expression.end_pos]
|
248
250
|
end
|
249
251
|
|
252
|
+
def warn_about_ambiguous_params(node)
|
253
|
+
log "Ambiguous params found"
|
254
|
+
log "#{@options.file_path}:#{node.loc.line}" if @options.file_path
|
255
|
+
log "```\n#{node.loc.expression.source}\n```\n\n"
|
256
|
+
end
|
257
|
+
|
250
258
|
def log(str)
|
251
|
-
return if @quiet
|
259
|
+
return if @options.quiet?
|
252
260
|
|
253
261
|
puts str
|
254
262
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class TextTransformerOptions
|
2
|
+
attr_accessor :strategy, :hash_spacing, :indent, :file_path
|
3
|
+
attr_writer :quiet, :warn_if_ambiguous
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@file_path = nil
|
7
|
+
@strategy = :optimistic
|
8
|
+
@quiet = false
|
9
|
+
@indent = ' '
|
10
|
+
@hash_spacing = nil
|
11
|
+
@warn_if_ambiguous = false
|
12
|
+
end
|
13
|
+
|
14
|
+
def wrap_ambiguous_params?
|
15
|
+
@strategy == :optimistic
|
16
|
+
end
|
17
|
+
|
18
|
+
def warn_about_ambiguous_params?
|
19
|
+
@warn_if_ambiguous
|
20
|
+
end
|
21
|
+
|
22
|
+
def quiet?
|
23
|
+
@quiet
|
24
|
+
end
|
25
|
+
end
|
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.12
|
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-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -117,6 +117,7 @@ files:
|
|
117
117
|
- lib/rails5/spec_converter.rb
|
118
118
|
- lib/rails5/spec_converter/cli.rb
|
119
119
|
- lib/rails5/spec_converter/text_transformer.rb
|
120
|
+
- lib/rails5/spec_converter/text_transformer_options.rb
|
120
121
|
- lib/rails5/spec_converter/version.rb
|
121
122
|
- rails5-spec-converter.gemspec
|
122
123
|
homepage: https://github.com/tjgrathwell/rails5-spec-converter
|