rails5_xhr_update 0.1.0 → 0.2.0
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/CHANGES.md +14 -0
- data/README.md +30 -5
- data/bin/rails5_xhr_update +1 -1
- data/lib/rails5_xhr_update.rb +2 -108
- data/lib/rails5_xhr_update/cli.rb +51 -0
- data/lib/rails5_xhr_update/version.rb +2 -3
- data/lib/rails5_xhr_update/xhr_to_rails5.rb +73 -0
- metadata +13 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d19181a6108a0532b5961af8d091c75f83bbd8d0
|
4
|
+
data.tar.gz: de4de5565dd2ea26ed3b43a55d0781bd1e596c47
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f4a132a262a96259c36343b7bcda68066340124d48ccd4047bade8c7988f459c7b25ae4be71d8fcac107c33c721d4640de4ffcb0e0af2b4461d4f3e3c91e35d
|
7
|
+
data.tar.gz: 8cd00a5be4ac82e7dcbb96e5ef39f7b7feb66dd3f1c6118aeac1c7116aad266096d9106f9638e4f25e77f08e9e13afce59b476f4de768c38e7d391e99b5128fd
|
data/CHANGES.md
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# Change Log
|
2
|
+
|
3
|
+
## 0.2.0 (2018/05/25)
|
4
|
+
|
5
|
+
__Added__
|
6
|
+
|
7
|
+
* Filenames can be provided via STDIN when not provided on the command line.
|
8
|
+
|
9
|
+
## 0.1.0 (2018/05/24)
|
10
|
+
|
11
|
+
__Added__
|
12
|
+
|
13
|
+
* Initial version of rails5_xhr_update with `--write` option and takes
|
14
|
+
filenames as command line arguments.
|
data/README.md
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
# rails5_xhr_update
|
2
2
|
|
3
|
-
rails5_xhr_update is a program that can be used to help convert from the
|
3
|
+
rails5_xhr_update is a program that can be used to help convert from the Rails
|
4
|
+
4 xhr test syntax, like the following:
|
4
5
|
|
5
6
|
```ruby
|
6
|
-
xhr :get, :
|
7
|
+
xhr :get, images_path, limit: 10, sort: 'new'
|
7
8
|
```
|
8
9
|
|
9
|
-
|
10
|
+
to the equivalent Rails 5 syntax:
|
10
11
|
|
11
12
|
```ruby
|
12
|
-
get :
|
13
|
+
get images_path, params: { limit: 10, sort: 'new' }, xhr: true
|
13
14
|
```
|
14
15
|
|
15
16
|
## Installation
|
@@ -33,5 +34,29 @@ output to STDOUT.
|
|
33
34
|
Consider running the following to find files with potential issues:
|
34
35
|
|
35
36
|
```sh
|
36
|
-
git grep -l "xhr :" |
|
37
|
+
git grep -l "xhr :" | rails5_xhr_update --write
|
37
38
|
```
|
39
|
+
|
40
|
+
|
41
|
+
## See Also
|
42
|
+
|
43
|
+
### Handling non-XHR cases
|
44
|
+
|
45
|
+
As part of the upgrade to Rails 5 one also needs to use keyword arguments for
|
46
|
+
`params` and `headers` when calling these *request* test methods. Fortunately,
|
47
|
+
[rubocop](https://github.com/bbatsov/rubocop) can help handle that conversion:
|
48
|
+
|
49
|
+
|
50
|
+
```sh
|
51
|
+
rubocop -a --only Rails/HttpPositionalArguments PATH
|
52
|
+
```
|
53
|
+
|
54
|
+
### Supporting Rails 5 syntax in Rails 4
|
55
|
+
|
56
|
+
Finally, with your project, it might be difficult to do all this conversion
|
57
|
+
work at once. You might instead, prefer to remain on Rails 4, but be forward
|
58
|
+
compatible with Rails 5. And you might want to output a `DeprecationWarning`,
|
59
|
+
or even raise an exception when attempting to use the older syntax. To help
|
60
|
+
with that please see our
|
61
|
+
[rails-forward_compatible_controller_tests](https://github.com/appfolio/rails-forward_compatible_controller_tests)
|
62
|
+
gem.
|
data/bin/rails5_xhr_update
CHANGED
data/lib/rails5_xhr_update.rb
CHANGED
@@ -1,110 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require '
|
4
|
-
require '
|
5
|
-
|
6
|
-
# Provide the Rails5XhrUpdate module including its command-line tool.
|
7
|
-
module Rails5XhrUpdate
|
8
|
-
AST_TRUE = Parser::AST::Node.new(:true) # rubocop:disable Lint/BooleanSymbol)
|
9
|
-
|
10
|
-
# Provide the entry point to this program.
|
11
|
-
class Cli
|
12
|
-
def output(source, path)
|
13
|
-
if @options[:write]
|
14
|
-
File.open(path, 'w') do |file|
|
15
|
-
file.write(source)
|
16
|
-
end
|
17
|
-
else
|
18
|
-
puts source
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def parse_options
|
23
|
-
@options = {}
|
24
|
-
OptionParser.new do |config|
|
25
|
-
config.banner = 'Usage: rails5_update.rb [options] FILE...'
|
26
|
-
config.on('-w', '--write', 'Write changes back to files') do |write|
|
27
|
-
@options[:write] = write
|
28
|
-
end
|
29
|
-
end.parse!
|
30
|
-
end
|
31
|
-
|
32
|
-
def run
|
33
|
-
parse_options
|
34
|
-
ARGV.each do |path|
|
35
|
-
buffer = Parser::Source::Buffer.new(path)
|
36
|
-
buffer.read
|
37
|
-
new_source = XHRToRails5.new.rewrite(
|
38
|
-
buffer, Parser::CurrentRuby.new.parse(buffer)
|
39
|
-
)
|
40
|
-
output(new_source, path)
|
41
|
-
end
|
42
|
-
0
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Convert uses of the xhr method to use the rails 5 syntax.
|
47
|
-
#
|
48
|
-
# For example prior to rails 5 one might write:
|
49
|
-
#
|
50
|
-
# xhr :get, images_path, limit: 10, sort: 'new'
|
51
|
-
#
|
52
|
-
# This class will convert that into:
|
53
|
-
#
|
54
|
-
# get images_path, params: { limit: 10, sort: 'new' }, xhr: true
|
55
|
-
#
|
56
|
-
# Conversion of xhr methods using headers is also supported:
|
57
|
-
#
|
58
|
-
# xhr :get, root_path {}, { Accept: => 'application/json' }
|
59
|
-
#
|
60
|
-
# This class will convert the above into:
|
61
|
-
#
|
62
|
-
# get root_path, headers: { Accept: => 'application/json' }, xhr: true
|
63
|
-
class XHRToRails5 < Parser::TreeRewriter
|
64
|
-
def on_send(node)
|
65
|
-
return if node.children[1] != :xhr
|
66
|
-
arguments = extract_and_validate_arguments(node)
|
67
|
-
children = initial_children(node) + add_xhr_node(*arguments)
|
68
|
-
replace(node.loc.expression, ast_to_string(node.updated(nil, children)))
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
def add_xhr_node(params, headers = nil)
|
74
|
-
children = []
|
75
|
-
children << ast_pair(:headers, headers) unless headers.nil?
|
76
|
-
children << ast_pair(:params, params) unless params.children.empty?
|
77
|
-
children << ast_pair(:xhr, AST_TRUE)
|
78
|
-
[Parser::AST::Node.new(:hash, children)]
|
79
|
-
end
|
80
|
-
|
81
|
-
def extract_and_validate_arguments(node)
|
82
|
-
arguments = node.children[4..-1]
|
83
|
-
raise Exception, 'should this happen?' if new_syntax?(arguments)
|
84
|
-
raise Exception "Unhandled:\n\n #{arguments}" if arguments.size > 2
|
85
|
-
arguments
|
86
|
-
end
|
87
|
-
|
88
|
-
def initial_children(node)
|
89
|
-
http_method = node.children[2].children[0]
|
90
|
-
http_path = node.children[3]
|
91
|
-
[nil, http_method, http_path]
|
92
|
-
end
|
93
|
-
|
94
|
-
def new_syntax?(arguments)
|
95
|
-
return false if arguments.size != 1
|
96
|
-
first_key = arguments[0].children[0].children[0].children[0]
|
97
|
-
%i[params headers].include?(first_key)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def ast_pair(name, data)
|
102
|
-
Parser::AST::Node.new(:pair, [Parser::AST::Node.new(:sym, [name]), data])
|
103
|
-
end
|
104
|
-
|
105
|
-
def ast_to_string(ast)
|
106
|
-
string = Unparser.unparse(ast)[0..-2]
|
107
|
-
string[string.index('(')] = ' '
|
108
|
-
string
|
109
|
-
end
|
110
|
-
end
|
3
|
+
require 'rails5_xhr_update/cli'
|
4
|
+
require 'rails5_xhr_update/xhr_to_rails5'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
|
5
|
+
module Rails5XHRUpdate
|
6
|
+
# Provide the entry point to this program.
|
7
|
+
class Cli
|
8
|
+
def run
|
9
|
+
parse_options
|
10
|
+
filenames.each do |path|
|
11
|
+
buffer = Parser::Source::Buffer.new(path)
|
12
|
+
buffer.read
|
13
|
+
new_source = XHRToRails5.new.rewrite(
|
14
|
+
buffer, Parser::CurrentRuby.new.parse(buffer)
|
15
|
+
)
|
16
|
+
output(new_source, path)
|
17
|
+
end
|
18
|
+
0
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def filenames
|
24
|
+
ARGV.empty? ? STDIN.read.split("\n") : ARGV
|
25
|
+
end
|
26
|
+
|
27
|
+
def output(source, path)
|
28
|
+
if @options[:write]
|
29
|
+
File.open(path, 'w') do |file|
|
30
|
+
file.write(source)
|
31
|
+
end
|
32
|
+
else
|
33
|
+
puts source
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def parse_options
|
38
|
+
@options = {}
|
39
|
+
OptionParser.new do |config|
|
40
|
+
config.banner = <<~USAGE
|
41
|
+
Usage: rails5_update.rb [options] FILE...
|
42
|
+
|
43
|
+
Files can also be provided via stdin when not provided as a command line argument.
|
44
|
+
USAGE
|
45
|
+
config.on('-w', '--write', 'Write changes back to files') do |write|
|
46
|
+
@options[:write] = write
|
47
|
+
end
|
48
|
+
end.parse!
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'unparser'
|
4
|
+
|
5
|
+
# Provide the XHRToRails5 class.
|
6
|
+
module Rails5XHRUpdate
|
7
|
+
AST_TRUE = Parser::AST::Node.new(:true) # rubocop:disable Lint/BooleanSymbol)
|
8
|
+
|
9
|
+
# Convert uses of the xhr method to use the rails 5 syntax.
|
10
|
+
#
|
11
|
+
# For example prior to rails 5 one might write:
|
12
|
+
#
|
13
|
+
# xhr :get, images_path, limit: 10, sort: 'new'
|
14
|
+
#
|
15
|
+
# This class will convert that into:
|
16
|
+
#
|
17
|
+
# get images_path, params: { limit: 10, sort: 'new' }, xhr: true
|
18
|
+
#
|
19
|
+
# Conversion of xhr methods using headers is also supported:
|
20
|
+
#
|
21
|
+
# xhr :get, root_path {}, { Accept: => 'application/json' }
|
22
|
+
#
|
23
|
+
# This class will convert the above into:
|
24
|
+
#
|
25
|
+
# get root_path, headers: { Accept: => 'application/json' }, xhr: true
|
26
|
+
class XHRToRails5 < Parser::TreeRewriter
|
27
|
+
def on_send(node)
|
28
|
+
return if node.children[1] != :xhr
|
29
|
+
arguments = extract_and_validate_arguments(node)
|
30
|
+
children = initial_children(node) + add_xhr_node(*arguments)
|
31
|
+
replace(node.loc.expression, ast_to_string(node.updated(nil, children)))
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def add_xhr_node(params, headers = nil)
|
37
|
+
children = []
|
38
|
+
children << ast_pair(:headers, headers) unless headers.nil?
|
39
|
+
children << ast_pair(:params, params) unless params.children.empty?
|
40
|
+
children << ast_pair(:xhr, AST_TRUE)
|
41
|
+
[Parser::AST::Node.new(:hash, children)]
|
42
|
+
end
|
43
|
+
|
44
|
+
def extract_and_validate_arguments(node)
|
45
|
+
arguments = node.children[4..-1]
|
46
|
+
raise Exception, 'should this happen?' if new_syntax?(arguments)
|
47
|
+
raise Exception "Unhandled:\n\n #{arguments}" if arguments.size > 2
|
48
|
+
arguments
|
49
|
+
end
|
50
|
+
|
51
|
+
def initial_children(node)
|
52
|
+
http_method = node.children[2].children[0]
|
53
|
+
http_path = node.children[3]
|
54
|
+
[nil, http_method, http_path]
|
55
|
+
end
|
56
|
+
|
57
|
+
def new_syntax?(arguments)
|
58
|
+
return false if arguments.size != 1
|
59
|
+
first_key = arguments[0].children[0].children[0].children[0]
|
60
|
+
%i[params headers].include?(first_key)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def ast_pair(name, data)
|
65
|
+
Parser::AST::Node.new(:pair, [Parser::AST::Node.new(:sym, [name]), data])
|
66
|
+
end
|
67
|
+
|
68
|
+
def ast_to_string(ast)
|
69
|
+
string = Unparser.unparse(ast)[0..-2]
|
70
|
+
string[string.index('(')] = ' '
|
71
|
+
string
|
72
|
+
end
|
73
|
+
end
|
metadata
CHANGED
@@ -1,47 +1,50 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails5_xhr_update
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryce Boe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: unparser
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
19
|
+
version: '0.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
26
|
+
version: '0.2'
|
27
27
|
description: |
|
28
28
|
rails5_xhr_update is a program that can be used to help convert from the
|
29
|
-
``xhr :get, :action`` test syntax used in rails prior to Rails 5, to the
|
30
|
-
5 syntax: ``get :action, xhr: true``.
|
29
|
+
``xhr :get, :action`` test syntax used in rails prior to Rails 5, to the
|
30
|
+
Rails 5 syntax: ``get :action, xhr: true``.
|
31
31
|
email: bryce.boe@appfolio.com
|
32
32
|
executables:
|
33
33
|
- rails5_xhr_update
|
34
34
|
extensions: []
|
35
35
|
extra_rdoc_files: []
|
36
36
|
files:
|
37
|
+
- CHANGES.md
|
37
38
|
- LICENSE.txt
|
38
39
|
- README.md
|
39
40
|
- bin/rails5_xhr_update
|
40
41
|
- lib/rails5_xhr_update.rb
|
42
|
+
- lib/rails5_xhr_update/cli.rb
|
41
43
|
- lib/rails5_xhr_update/version.rb
|
44
|
+
- lib/rails5_xhr_update/xhr_to_rails5.rb
|
42
45
|
homepage: https://github.com/appfolio/rails5_xhr_update
|
43
46
|
licenses:
|
44
|
-
-
|
47
|
+
- BSD-2-Clause
|
45
48
|
metadata: {}
|
46
49
|
post_install_message:
|
47
50
|
rdoc_options: []
|
@@ -62,5 +65,5 @@ rubyforge_project:
|
|
62
65
|
rubygems_version: 2.6.13
|
63
66
|
signing_key:
|
64
67
|
specification_version: 4
|
65
|
-
summary:
|
68
|
+
summary: Update Rails 4 xhr test method calls to rails 5 syntax.
|
66
69
|
test_files: []
|