rubocop-twirp 0.0.1 → 0.1.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/CHANGELOG.md +4 -0
- data/Gemfile.lock +2 -12
- data/README.md +23 -9
- data/config/default.yml +11 -0
- data/lib/rubocop/cop/twirp/client_response.rb +30 -0
- data/lib/rubocop/cop/twirp/deprecated_arguments.rb +1 -4
- data/lib/rubocop/cop/twirp/rspec_be_a.rb +54 -0
- data/lib/rubocop/twirp/version.rb +1 -1
- data/lib/rubocop/twirp.rb +24 -1
- data/rubocop-twirp.gemspec +0 -1
- metadata +4 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34f94e78595b7dc92e5de467fa5529b39bc3427ddf7e9e8120c794ec2fa44a0e
|
4
|
+
data.tar.gz: 2dd8f977b38beebbee179240e1ab08396258769418c2ecc079b1deeaed097d58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 823f2a6a00ad57d192e85cbd32a08342c7cc50fc09fa577a46dff75604f1ffc8fabc1f0acbdceec3ec813d0c3a838cfe0acd6448dc13c00308bca994aa00a85e
|
7
|
+
data.tar.gz: 5e70efaf01bc212da38adc36ab77f767b3a652bfa0748dc21afb6c01d3ff369f73a613eab89a0f45a51ebbc0f7d89e50456cec62c64667ca559af426c3bdeeb9
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
rubocop-twirp (0.0
|
4
|
+
rubocop-twirp (0.1.0)
|
5
5
|
rubocop (>= 1)
|
6
|
-
twirp (>= 1)
|
7
6
|
|
8
7
|
GEM
|
9
8
|
remote: https://rubygems.org/
|
@@ -12,11 +11,6 @@ GEM
|
|
12
11
|
byebug (11.1.3)
|
13
12
|
diff-lcs (1.5.0)
|
14
13
|
docile (1.4.0)
|
15
|
-
faraday (2.7.4)
|
16
|
-
faraday-net_http (>= 2.0, < 3.1)
|
17
|
-
ruby2_keywords (>= 0.0.4)
|
18
|
-
faraday-net_http (3.0.2)
|
19
|
-
google-protobuf (3.22.0-x86_64-darwin)
|
20
14
|
json (2.6.3)
|
21
15
|
parallel (1.22.1)
|
22
16
|
parser (3.2.1.0)
|
@@ -51,20 +45,16 @@ GEM
|
|
51
45
|
rubocop-ast (1.26.0)
|
52
46
|
parser (>= 3.2.1.0)
|
53
47
|
ruby-progressbar (1.11.0)
|
54
|
-
ruby2_keywords (0.0.5)
|
55
48
|
simplecov (0.22.0)
|
56
49
|
docile (~> 1.1)
|
57
50
|
simplecov-html (~> 0.11)
|
58
51
|
simplecov_json_formatter (~> 0.1)
|
59
52
|
simplecov-html (0.12.3)
|
60
53
|
simplecov_json_formatter (0.1.4)
|
61
|
-
twirp (1.10.0)
|
62
|
-
faraday (< 3)
|
63
|
-
google-protobuf (~> 3.0, >= 3.7.0)
|
64
54
|
unicode-display_width (2.4.2)
|
65
55
|
|
66
56
|
PLATFORMS
|
67
|
-
|
57
|
+
ruby
|
68
58
|
|
69
59
|
DEPENDENCIES
|
70
60
|
byebug
|
data/README.md
CHANGED
@@ -3,29 +3,37 @@ rubocop-twirp
|
|
3
3
|

|
4
4
|
[](https://codecov.io/gh/dpep/rubocop-twirp)
|
5
5
|
|
6
|
-
|
6
|
+
Improve your Twirp code with [RuboCop](https://github.com/bbatsov/rubocop)
|
7
7
|
|
8
|
-
[RuboCop](https://github.com/bbatsov/rubocop)
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
```ruby
|
9
|
+
## Install
|
10
|
+
```
|
13
11
|
gem install rubocop-twirp
|
12
|
+
```
|
14
13
|
|
15
|
-
|
14
|
+
Add to your Gemfile
|
15
|
+
```ruby
|
16
16
|
gem "rubocop-twirp", require: false
|
17
17
|
```
|
18
18
|
|
19
|
-
Add
|
19
|
+
Add to .rubocop.yml
|
20
20
|
```
|
21
21
|
require: rubocop-twirp
|
22
22
|
```
|
23
23
|
|
24
|
-
|
24
|
+
## Use
|
25
|
+
Scan and fix issues
|
25
26
|
```
|
26
|
-
rubocop -r rubocop-twirp --only Twirp
|
27
|
+
rubocop -r rubocop-twirp --only Twirp -A
|
27
28
|
```
|
28
29
|
|
30
|
+
|
31
|
+
Fix `Twirp::ClientResp` breaking change introduced in [Twirp v1.10](https://github.com/github/twirp-ruby/commit/4614a5fe004ca408c48ddfc813c80f3ad7bcb586). (Cop disabled by default)
|
32
|
+
```
|
33
|
+
rubocop -r rubocop-twirp --only Twirp/DeprecatedArguments -A
|
34
|
+
```
|
35
|
+
|
36
|
+
|
29
37
|
----
|
30
38
|
## Contributing
|
31
39
|
|
@@ -37,3 +45,9 @@ Yes please :)
|
|
37
45
|
1. Commit your changes (`git commit -am 'awesome new feature'`)
|
38
46
|
1. Push your branch (`git push origin my-feature`)
|
39
47
|
1. Create a Pull Request
|
48
|
+
|
49
|
+
|
50
|
+
### Resources
|
51
|
+
- https://docs.rubocop.org/rubocop/1.46/development.html
|
52
|
+
- https://github.com/rubocop/rubocop-ast/blob/master/docs/modules/ROOT/pages/node_pattern.adoc
|
53
|
+
- https://github.com/rubocop/rubocop-performance
|
data/config/default.yml
CHANGED
@@ -1,7 +1,18 @@
|
|
1
1
|
Twirp:
|
2
2
|
Enabled: true
|
3
3
|
|
4
|
+
Twirp/ClientResponse:
|
5
|
+
Description: 'Use webmock-twirp to stub client responses'
|
6
|
+
Enabled: true
|
7
|
+
VersionAdded: '0.1'
|
8
|
+
|
4
9
|
Twirp/DeprecatedArguments:
|
5
10
|
Description: 'Use keyword args for `Twirp::ClientResp.new`'
|
11
|
+
Enabled: false
|
12
|
+
VersionAdded: '0.1'
|
13
|
+
Severity: error
|
14
|
+
|
15
|
+
Twirp/RSpecBeA:
|
16
|
+
Description: 'Use rspec-twirp to simplify specs'
|
6
17
|
Enabled: true
|
7
18
|
VersionAdded: '0.1'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module RuboCop
|
2
|
+
module Cop
|
3
|
+
module Twirp
|
4
|
+
# Use webmock-twirp to stub Twirp client responses
|
5
|
+
# https://github.com/dpep/webmock-twirp
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# # bad
|
9
|
+
# allow(MyTwirpClient).to receive(:my_rpc).and_return(Twirp::ClientResp.new(...))
|
10
|
+
#
|
11
|
+
# # good
|
12
|
+
# stub_twirp_request(MyTwirpClient, :my_rpc).to_return(...)
|
13
|
+
#
|
14
|
+
class ClientResponse < Base
|
15
|
+
RESTRICT_ON_SEND = [:new].freeze
|
16
|
+
MSG = "Avoid constructing Twirp client responses manually. Use `stub_twirp_request` from `webmock-twirp` (https://github.com/dpep/webmock-twirp)".freeze
|
17
|
+
|
18
|
+
def_node_matcher :client_response?, <<~PATTERN
|
19
|
+
(send (const (const _ :Twirp) :ClientResp) :new ...)
|
20
|
+
PATTERN
|
21
|
+
|
22
|
+
def on_send(node)
|
23
|
+
client_response?(node) do
|
24
|
+
add_offense(node.loc.expression, message: MSG)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -16,7 +16,7 @@ module RuboCop
|
|
16
16
|
POSITIONAL_ARGS = [:data, :error].freeze
|
17
17
|
|
18
18
|
def_node_matcher :pos_args?, <<~PATTERN
|
19
|
-
(send (const (const
|
19
|
+
(send (const (const _ :Twirp) :ClientResp) :new $!hash_type?+)
|
20
20
|
PATTERN
|
21
21
|
|
22
22
|
|
@@ -27,9 +27,6 @@ module RuboCop
|
|
27
27
|
"`%<class_name>s.%<method_name>s(%<kwargs>s)`"
|
28
28
|
|
29
29
|
def on_send(node)
|
30
|
-
# kwargs were introduced in Twirp v1.10
|
31
|
-
return unless Gem::Version.new(::Twirp::VERSION) >= Gem::Version.new("1.10")
|
32
|
-
|
33
30
|
return unless pos_args?(node)
|
34
31
|
|
35
32
|
kwargs = POSITIONAL_ARGS.map.with_index do |arg, index|
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module RuboCop
|
2
|
+
module Cop
|
3
|
+
module Twirp
|
4
|
+
# Use rspec-twirp to simplify specs
|
5
|
+
# https://github.com/dpep/rspec-twirp
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# # bad
|
9
|
+
# expect(...).to be_a(Twirp::ClientResp)
|
10
|
+
# expect(...).to be_a(Twirp::Error)
|
11
|
+
#
|
12
|
+
# # good
|
13
|
+
# expect(...).to be_a_twirp_response
|
14
|
+
# expect(...).to be_a_twirp_error
|
15
|
+
#
|
16
|
+
class RSpecBeA < Base
|
17
|
+
RESTRICT_ON_SEND = [:be_a].freeze
|
18
|
+
TWIRP_RESPONSE_MSG = "Use `be_a_twirp_response` from `rspec-twirp` (https://github.com/dpep/rspec-twirp)".freeze
|
19
|
+
TWIRP_ERROR_MSG = "Use `be_a_twirp_error` from `rspec-twirp` (https://github.com/dpep/rspec-twirp)".freeze
|
20
|
+
|
21
|
+
def_node_matcher :twirp_type?, <<~PATTERN
|
22
|
+
(send _ :be_a (const (const _ :Twirp) ${:ClientResp :Error}))
|
23
|
+
PATTERN
|
24
|
+
|
25
|
+
include RangeHelp
|
26
|
+
extend AutoCorrector
|
27
|
+
|
28
|
+
def on_send(node)
|
29
|
+
twirp_type?(node) do |type|
|
30
|
+
case type
|
31
|
+
when :ClientResp
|
32
|
+
msg = TWIRP_RESPONSE_MSG
|
33
|
+
replacement = "be_a_twirp_response"
|
34
|
+
when :Error
|
35
|
+
msg = TWIRP_ERROR_MSG
|
36
|
+
replacement = "be_a_twirp_error"
|
37
|
+
else
|
38
|
+
return
|
39
|
+
end
|
40
|
+
|
41
|
+
range = range_between(
|
42
|
+
node.loc.selector.begin_pos,
|
43
|
+
node.loc.end.end_pos,
|
44
|
+
)
|
45
|
+
|
46
|
+
add_offense(range, message: msg) do |corrector|
|
47
|
+
corrector.replace(range, replacement)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/rubocop/twirp.rb
CHANGED
@@ -1,6 +1,29 @@
|
|
1
1
|
require "rubocop"
|
2
2
|
require "rubocop/twirp/version"
|
3
|
-
|
3
|
+
|
4
|
+
module RuboCop
|
5
|
+
module Twirp
|
6
|
+
PROJECT_ROOT = Pathname.new(__dir__).parent.parent.expand_path.freeze
|
7
|
+
CONFIG_DEFAULT = PROJECT_ROOT.join("config", "default.yml").freeze
|
8
|
+
CONFIG = YAML.safe_load(CONFIG_DEFAULT.read).freeze
|
9
|
+
|
10
|
+
private_constant(:CONFIG_DEFAULT, :PROJECT_ROOT)
|
11
|
+
|
12
|
+
# RuboCop doesn't support plugins yet, so monkey patch config
|
13
|
+
module Inject
|
14
|
+
def self.defaults!
|
15
|
+
path = CONFIG_DEFAULT.to_s
|
16
|
+
hash = ConfigLoader.send(:load_yaml_configuration, path)
|
17
|
+
config = Config.new(hash, path).tap(&:make_excludes_absolute)
|
18
|
+
puts "configuration from #{path}" if ConfigLoader.debug?
|
19
|
+
config = ConfigLoader.merge_with_default(config, path)
|
20
|
+
ConfigLoader.instance_variable_set(:@default_configuration, config)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
RuboCop::Twirp::Inject.defaults!
|
4
27
|
|
5
28
|
# load cops
|
6
29
|
Dir["./cop/twirp/**/*.rb", base: __dir__].each { |f| require_relative f }
|
data/rubocop-twirp.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubocop-twirp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Pepper
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02-
|
11
|
+
date: 2023-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: twirp
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1'
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '1'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: byebug
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -93,7 +79,9 @@ files:
|
|
93
79
|
- README.md
|
94
80
|
- config/default.yml
|
95
81
|
- lib/rubocop-twirp.rb
|
82
|
+
- lib/rubocop/cop/twirp/client_response.rb
|
96
83
|
- lib/rubocop/cop/twirp/deprecated_arguments.rb
|
84
|
+
- lib/rubocop/cop/twirp/rspec_be_a.rb
|
97
85
|
- lib/rubocop/twirp.rb
|
98
86
|
- lib/rubocop/twirp/version.rb
|
99
87
|
- rubocop-twirp.gemspec
|