ezcater_rubocop 5.2.0 → 6.0.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 +6 -0
- data/README.md +15 -9
- data/conf/rubocop.yml +3 -3
- data/config/default.yml +4 -0
- data/lib/ezcater_rubocop/version.rb +1 -1
- data/lib/ezcater_rubocop.rb +1 -0
- data/lib/rubocop/cop/ezcater/feature_flag_name_valid.rb +92 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e412cd3e88f3c5e18b537a9a81beec0396f8882aba05f3f09c87464510bd9a6
|
4
|
+
data.tar.gz: 8786ebe582591fde680b7846e9be9783d84a402f6066cd22c1f5f379dd468b80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3394769cce8e62507578b3fc55b943536ba79825ed30de348e538030c96129f2f923652682087467ade43c15a0847dce7faa8bcf5d7e6bd19d98d6b810b3fc3a
|
7
|
+
data.tar.gz: 4f79ad7d080b3c8a64e85cb9521226809c9dc1d558fa334cc0146dce879c1f836e8e10766db1aef2af922f82dafa715680f8af3d0c93537912843a9fc926ff2f
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,12 @@ This gem is moving onto its own [Semantic Versioning](https://semver.org/) schem
|
|
6
6
|
|
7
7
|
Prior to v1.0.0 this gem was versioned based on the `MAJOR`.`MINOR` version of RuboCop. The first release of the ezcater_rubocop gem was `v0.49.0`.
|
8
8
|
|
9
|
+
## 6.0.0
|
10
|
+
- Add `FeatureFlagNameValid` cop to validate correct feature flag name format, [adopted from the cop](https://github.com/ezcater/ez-rails/blob/2d9272eb3d2c71dc5ebc2aa01a849cf9cfae3df2/cops/rubocop/cops/feature_flags_flag_name.rb_) in `ez-rails`.
|
11
|
+
|
12
|
+
## 5.2.1
|
13
|
+
- Fix the has the wrong namespace for `RSpec/Capybara/CurrentPathExpectation` and `RSpec/Capybara/VisibilityMatcher` cops, since [they've been extracted](https://github.com/rubocop/rubocop-rspec/blob/master/CHANGELOG.md#2180-2023-01-16) into a separate repo [rubocop-capybara](https://github.com/rubocop/rubocop-capybara).
|
14
|
+
|
9
15
|
## 5.2.0
|
10
16
|
|
11
17
|
- Add an explicit rule for `Style/HashSyntax`, setting `EnforcedShorthandSyntax: either`.
|
data/README.md
CHANGED
@@ -79,20 +79,26 @@ not add cops with `enabled: false` unless you want that cop to always be disable
|
|
79
79
|
|
80
80
|
## Custom Cops
|
81
81
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
82
|
+
* [FeatureFlagActive](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/feature_flag_active.rb) - Enforce the proper arguments are given to `EzcaterFeatureFlag.active?`
|
83
|
+
* [FeatureFlagNameValid](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/feature_flag_name_valid.rb) - Enforce correct flag name format is being used.
|
84
|
+
* [RailsConfiguration](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/rails_configuration.rb) - Enforce use of `Rails.configuration` instead of `Rails.application.config`.
|
85
|
+
* [RequireGqlErrorHelpers](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/require_gql_error_helpers.rb) - Use the helpers provided by `GQLErrors` instead of raising `GraphQL::ExecutionError` directly.
|
86
|
+
* [RspecDotNotSelfDot](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/rspec_dot_not_self_dot.rb) - Enforce ".<class method>" instead of "self.<class method>" and "::<class method>" for example group description.
|
87
|
+
* [RspecMatchOrderedArray](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/rspec_match_ordered_array.rb) - Enforce use of `match_ordered_array` matcher instead of `eq` matcher. This matcher comes from the [ezcater_matchers](https://github.com/ezcater/ezcater_matchers) gem.
|
88
|
+
* [RspecRequireBrowserMock](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/rspec_require_browser_mock.rb) - Enforce use of `mock_ezcater_app`, `mock_chrome_browser` & `mock_custom_browser` helpers instead of mocking `Browser` or `EzBrowser` directly.
|
89
|
+
* [RspecRequireFeatureFlagMock](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/rspec_require_feature_flag_mock.rb) - Enforce use of `mock_feature_flag` helper instead of mocking `FeatureFlag.is_active?` directly.
|
90
|
+
* [RspecRequireHttpStatusMatcher](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/rspec_require_http_status_matcher.rb) - Use the HTTP status code matcher, like `expect(response).to have_http_status :bad_request`, rather than `expect(response.code).to eq 400`
|
91
|
+
* [StyleDig](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/style_dig.rb) - Recommend `dig` for deeply nested access.
|
90
92
|
|
91
93
|
## Development
|
92
94
|
|
93
95
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
94
96
|
|
95
|
-
To install this gem onto your local machine, run `bundle exec rake install`.
|
97
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
98
|
+
|
99
|
+
### Releasing a New Version
|
100
|
+
|
101
|
+
To release a new version, update the version number in `version.rb`, merge your PR to `main`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
96
102
|
|
97
103
|
## Contributing
|
98
104
|
|
data/conf/rubocop.yml
CHANGED
@@ -233,13 +233,13 @@ Rails/Pick:
|
|
233
233
|
Rails/RedundantForeignKey:
|
234
234
|
Enabled: true
|
235
235
|
|
236
|
-
|
236
|
+
Capybara/CurrentPathExpectation:
|
237
237
|
Enabled: true
|
238
238
|
|
239
|
-
|
239
|
+
Capybara/VisibilityMatcher:
|
240
240
|
Enabled: true
|
241
241
|
|
242
|
-
RSpec/Capybara/
|
242
|
+
RSpec/Capybara/FeatureMethods:
|
243
243
|
Enabled: true
|
244
244
|
|
245
245
|
RSpec/EmptyHook:
|
data/config/default.yml
CHANGED
@@ -14,6 +14,10 @@ Ezcater/FeatureFlagActive:
|
|
14
14
|
Description: "Enforce the proper arguments are given to EzcaterFeatureFlag.active?"
|
15
15
|
Enabled: true
|
16
16
|
|
17
|
+
Ezcater/FeatureFlagNameValid:
|
18
|
+
Description: "Enforce correct flag name format is being used."
|
19
|
+
Enabled: true
|
20
|
+
|
17
21
|
Ezcater/RspecDotNotSelfDot:
|
18
22
|
Description: 'Enforce ".<class method>" instead of "self.<class method>" for example group description.'
|
19
23
|
Enabled: true
|
data/lib/ezcater_rubocop.rb
CHANGED
@@ -18,6 +18,7 @@ RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, config)
|
|
18
18
|
|
19
19
|
require "rubocop/cop/ezcater/direct_env_check"
|
20
20
|
require "rubocop/cop/ezcater/feature_flag_active"
|
21
|
+
require "rubocop/cop/ezcater/feature_flag_name_valid"
|
21
22
|
require "rubocop/cop/ezcater/rails_configuration"
|
22
23
|
require "rubocop/cop/ezcater/rails_env"
|
23
24
|
require "rubocop/cop/ezcater/ruby_timeout"
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Ezcater
|
6
|
+
# Match the naming validations in the feature flag service.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # good
|
11
|
+
# EzFF.at_100?("Flag1")
|
12
|
+
# EzFF.active?("Foo::Bar", tracking_id: 1234)
|
13
|
+
# EzFF.at_100?("Foo::Bar::Baz")
|
14
|
+
# MY_FLAG="Foo::Bar"; EzFF.at_100?(MY_FLAG)
|
15
|
+
#
|
16
|
+
# # bad
|
17
|
+
# EzFF.at_100?("Foo:Bar")
|
18
|
+
# EzFF.active?("Foo:::Bar", tracking_id: 1234)
|
19
|
+
# EzFF.at_100?("Foo:Bar:Baz")
|
20
|
+
# EzFF.at_100?("Foo::Bar ")
|
21
|
+
# EzFF.at_100?("Foo::Bar && rm -rf * ")
|
22
|
+
# EzFF.active?("foo::bar", identifiers: ["user:1"])
|
23
|
+
# MY_FLAG="Foo:bar"
|
24
|
+
class FeatureFlagNameValid < Cop
|
25
|
+
WHITESPACE = /\s/.freeze
|
26
|
+
ISOLATED_COLON = /(?<!:):(?!:)/.freeze
|
27
|
+
TRIPLE_COLON = /:::/.freeze
|
28
|
+
INVALID_CHARACTERS = /[^a-zA-Z0-9:]/.freeze
|
29
|
+
TITLECASE_SEGMENT = /"^([A-Z][a-z0-9]*)+$"/.freeze
|
30
|
+
|
31
|
+
WHITESPACE_MSG = "Feature flag names must not contain whitespace."
|
32
|
+
DOUBLE_COLON_MSG = "Feature flag names must use double colons (::) as namespace separators."
|
33
|
+
INVALID_CHARACTERS_MSG = "Feature flag names must only contain alphanumeric characters and colons."
|
34
|
+
TITLECASE_SEGMENT_MSG = "Feature flag names must use titlecase for each segment."
|
35
|
+
|
36
|
+
def_node_matcher :feature_flag_constant_assignment, <<~PATTERN
|
37
|
+
(casgn nil? $_ (str $_))
|
38
|
+
PATTERN
|
39
|
+
|
40
|
+
def_node_matcher :feature_flag_method_call, <<~PATTERN
|
41
|
+
(send
|
42
|
+
(_ _ {:EzFF :EzcaterFeatureFlag}) {:active? | :at_100? | :random_sample_active?} (str $_ ...))
|
43
|
+
PATTERN
|
44
|
+
|
45
|
+
def on_casgn(node)
|
46
|
+
feature_flag_constant_assignment(node) do |const_name, flag_name|
|
47
|
+
if const_name.end_with?("_FF", "_FLAG", "_FLAG_NAME", "_FEATURE_FLAG")
|
48
|
+
errors = find_name_violations(flag_name)
|
49
|
+
add_offense(node, location: :expression, message: errors.join(", ")) if errors.any?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def on_send(node)
|
55
|
+
return unless feature_flag_method_call(node)
|
56
|
+
|
57
|
+
feature_flag_method_call(node) do |flag_name|
|
58
|
+
errors = find_name_violations(flag_name)
|
59
|
+
add_offense(node, location: :expression, message: errors.join(", ")) if errors.any?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def find_name_violations(name)
|
66
|
+
errors = []
|
67
|
+
|
68
|
+
if name.match?(WHITESPACE)
|
69
|
+
errors << WHITESPACE_MSG
|
70
|
+
end
|
71
|
+
|
72
|
+
if name.match?(ISOLATED_COLON) || name.match?(TRIPLE_COLON)
|
73
|
+
errors << DOUBLE_COLON_MSG
|
74
|
+
end
|
75
|
+
|
76
|
+
if name.match?(INVALID_CHARACTERS)
|
77
|
+
errors << INVALID_CHARACTERS_MSG
|
78
|
+
end
|
79
|
+
|
80
|
+
name.split(/:+/).each do |segment|
|
81
|
+
unless segment.match?(TITLECASE_SEGMENT)
|
82
|
+
errors << TITLECASE_SEGMENT_MSG
|
83
|
+
break
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
errors
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ezcater_rubocop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ezCater, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -213,6 +213,7 @@ files:
|
|
213
213
|
- lib/ezcater_rubocop/version.rb
|
214
214
|
- lib/rubocop/cop/ezcater/direct_env_check.rb
|
215
215
|
- lib/rubocop/cop/ezcater/feature_flag_active.rb
|
216
|
+
- lib/rubocop/cop/ezcater/feature_flag_name_valid.rb
|
216
217
|
- lib/rubocop/cop/ezcater/rails_configuration.rb
|
217
218
|
- lib/rubocop/cop/ezcater/rails_env.rb
|
218
219
|
- lib/rubocop/cop/ezcater/rails_top_level_sql_execute.rb
|