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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d802b49e1f9a3ff4cfe473c8b642b1b0d6fc48fb283fb7eb11da28896bc42091
4
- data.tar.gz: 249b847953b3b3a5a118e46a7018b6683f588d73555bfdf5ed399e6022ccd2e0
3
+ metadata.gz: 8e412cd3e88f3c5e18b537a9a81beec0396f8882aba05f3f09c87464510bd9a6
4
+ data.tar.gz: 8786ebe582591fde680b7846e9be9783d84a402f6066cd22c1f5f379dd468b80
5
5
  SHA512:
6
- metadata.gz: c9f105d31cceed61063a5a5f43ee52d14c122664c1f53a71fa73481222b06b3769010473c344e6884a4a065581d2c1fbc5ab1682c43308670c40e75da0c569ed
7
- data.tar.gz: 66a67817b96392aecfaaa5d2a9172b48e83b173866c374a0f6c31bb062c23b4efaaba3efd4059dd1bc41a4636efb91d9bdcfb034a84805ab1f8191b13652cac1
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
- 1. [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`.
83
- 1. [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.
84
- 1. [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.
85
- 1. [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.
86
- 1. [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.
87
- 1. [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.
88
- 1. [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`
89
- 1. [StyleDig](https://github.com/ezcater/ezcater_rubocop/blob/main/lib/rubocop/cop/ezcater/style_dig.rb) - Recommend `dig` for deeply nested access.
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`. To release a new version, update the version number in `version.rb`, 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).
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
- RSpec/Capybara/CurrentPathExpectation:
236
+ Capybara/CurrentPathExpectation:
237
237
  Enabled: true
238
238
 
239
- RSpec/Capybara/FeatureMethods:
239
+ Capybara/VisibilityMatcher:
240
240
  Enabled: true
241
241
 
242
- RSpec/Capybara/VisibilityMatcher:
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EzcaterRubocop
4
- VERSION = "5.2.0"
4
+ VERSION = "6.0.0"
5
5
  end
@@ -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: 5.2.0
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-02-02 00:00:00.000000000 Z
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