boxt_rubocop 0.0.46 → 1.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: aa5d1260e94c7453988486a997b27b365683b5d3d7882790a16ed1e2f01379dd
4
- data.tar.gz: 16d46fc9f195a2202aee79dfa07843646becc222b5f149708cda9c7bed7be360
3
+ metadata.gz: 341e8b143a6ca39495d4ecb8f4ac3b4abb9e2035407202d8692fafd01ea32f2b
4
+ data.tar.gz: 41f53ec76d4e3f54adde9d56aaf4b04bc07c67cf35a0174f01479bbaa2473094
5
5
  SHA512:
6
- metadata.gz: 44f9204e8bc18bf304f0fd1ac76838a112ee77deed65352cde3a621abc15b61a7a7480e84cb41616cd28e3f0b7859ed04a1179207153f98d6a362965e560ddd8
7
- data.tar.gz: '085b6047775c0413aefbf1fba1d118bb9ac063ac2e9d0c91915d04462700c2d0b374a974b4e1b4ce8c12b60801531cd813087a824af0e348efcd28fd58faba28'
6
+ metadata.gz: d5b071c38cc59d28d142aef6b24869a1d1e3a2dfbb02d1ab65faa3a7ad6eeed31b7bea037f600cdd3a6a7dc89b91f5816cd1abd9548920b94e3c13a7773a0aeb
7
+ data.tar.gz: 433ef4aced8b97690fb92a2a2346d40c944ad56caaf8304f547d40900f731ba8edb625055bc2e0d49e8ae96af73354e1604a063c2b390c3f4b778cd67e131bf7
data/README.md CHANGED
@@ -28,16 +28,37 @@ bundle
28
28
 
29
29
  ## Usage
30
30
 
31
- Add a `.rubocop.yml` file to the root of your project with the following settings:
31
+ Put this into your .rubocop.yml.
32
+
33
+ ```yml
34
+ require:
35
+ - boxt_rubocop
36
+ ```
37
+
38
+ To enable additional configuration for `rubocop-rails` and `rubocop-rspec`, add the following to your .rubocop.yml:
32
39
 
33
40
  ```yml
34
41
  inherit_gem:
35
42
  boxt_rubocop:
36
- - default.yml # use default cops
37
43
  - rails.yml # use Rails cops - see Additional Extensions/Cops
38
44
  - rspec.yml # use rspec cops - see Additional Extensions/Cops
39
45
  ```
40
46
 
47
+ ## Creating new custom cops
48
+
49
+ Use the rake task new_cop to generate a cop template:
50
+
51
+ ```sh
52
+ $ bundle exec rake 'new_cop[Boxt/Name]'
53
+ [create] lib/rubocop/cop/boxt/name.rb
54
+ [create] spec/rubocop/cop/boxt/name_spec.rb
55
+ [modify] lib/rubocop/cop/boxt_cops.rb - `require_relative 'boxt/name'` was injected.
56
+ [modify] A configuration for the cop is added into config/default.yml.
57
+
58
+ ```
59
+
60
+ Documentation on creating a new cop can be found [here](https://docs.rubocop.org/rubocop/1.56/development.html#create-a-new-cop).
61
+
41
62
  ### NewCops
42
63
 
43
64
  `NewCops` is enabled by default.
data/Rakefile CHANGED
@@ -1,12 +1,30 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bundler/gem_tasks"
4
- require "rake/testtask"
5
4
  require "rspec/core/rake_task"
6
5
 
7
- RSpec::Core::RakeTask.new(:spec) do |t|
8
- t.pattern = Dir.glob("spec/**/*_spec.rb")
9
- end
10
-
11
6
  desc "Map rake test to rake spec"
12
7
  task test: :spec
8
+
9
+ RSpec::Core::RakeTask.new(:spec) do |spec|
10
+ spec.pattern = FileList["spec/**/*_spec.rb"]
11
+ end
12
+
13
+ desc "Generate a new cop with a template"
14
+ task :new_cop, [:cop] => :environment do |_task, args|
15
+ require "rubocop"
16
+
17
+ cop_name = args.fetch(:cop) do
18
+ warn "usage: bundle exec rake 'new_cop[Boxt/Name]'"
19
+ exit!
20
+ end
21
+
22
+ generator = RuboCop::Cop::Generator.new(cop_name)
23
+
24
+ generator.write_source
25
+ generator.write_spec
26
+ generator.inject_require(root_file_path: "lib/rubocop/cop/boxt_cops.rb")
27
+ generator.inject_config(config_file_path: "config/default.yml")
28
+
29
+ puts generator.todo
30
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.46
1
+ 1.0.0
data/lib/boxt_rubocop.rb CHANGED
@@ -1,15 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "boxt_rubocop/version"
4
-
5
- module BoxtRubocop
6
- module_function
7
-
8
- ##
9
- # Provide a root path helper for the gem root dir
10
- #
11
- # Returns Pathname
12
- def root
13
- Pathname.new(File.dirname(__dir__))
14
- end
15
- end
3
+ require "rubocop"
4
+
5
+ require_relative "rubocop/boxt"
6
+ require_relative "rubocop/boxt/version"
7
+ require_relative "rubocop/boxt/inject"
8
+
9
+ RuboCop::Boxt::Inject.defaults!
10
+
11
+ require_relative "rubocop/cop/boxt_cops"
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ # The original code is from https://github.com/rubocop/rubocop-rspec/blob/master/lib/rubocop/rspec/inject.rb
4
+ # See https://github.com/rubocop/rubocop-rspec/blob/master/MIT-LICENSE.md
5
+ module RuboCop
6
+ module Boxt
7
+ # Because RuboCop doesn't yet support plugins, we have to monkey patch in a
8
+ # bit of our configuration.
9
+ module Inject
10
+ def self.defaults!
11
+ path = CONFIG_DEFAULT.to_s
12
+ hash = ConfigLoader.send(:load_yaml_configuration, path)
13
+ config = Config.new(hash, path).tap(&:make_excludes_absolute)
14
+ Rails.logger.debug { "configuration from #{path}" } if ConfigLoader.debug?
15
+ config = ConfigLoader.merge_with_default(config, path)
16
+ ConfigLoader.instance_variable_set(:@default_configuration, config)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Boxt
5
+ VERSION = File.read(File.join(File.dirname(__FILE__), "../../../VERSION")).split("\n").first
6
+ end
7
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "boxt/version"
4
+
5
+ module RuboCop
6
+ module Boxt
7
+ class Error < StandardError; end
8
+ PROJECT_ROOT = Pathname.new(__dir__).parent.parent.expand_path.freeze
9
+ CONFIG_DEFAULT = PROJECT_ROOT.join("config", "default.yml").freeze
10
+ CONFIG = YAML.safe_load(CONFIG_DEFAULT.read).freeze
11
+
12
+ private_constant(:CONFIG_DEFAULT, :PROJECT_ROOT)
13
+ end
14
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Boxt
6
+ # Clients expect to interface with our API using kebab-case.
7
+ #
8
+ # This cop ensures that our API paths are formatted using the correct case.
9
+ #
10
+ # Underscores are acceptable in path variables (e.g. "/path/:path_id/update")
11
+ #
12
+ # API style guide: https://github.com/boxt/boxt-docs/blob/main/coding-styles/api.md#camel-cased-endpoints
13
+ #
14
+ # @example
15
+ # # bad
16
+ # post "/admin/orders/:order_id/contact_details/update"
17
+ # get "/installation_days"
18
+ # namespace "password_resets"
19
+ # namespace :password_resets
20
+ #
21
+ # # good
22
+ # post "/admin/orders/:order_id/contact-details/update"
23
+ # get "/installation-days"
24
+ # namespace "password-resets"
25
+ #
26
+ class ApiPathFormat < Base
27
+ def_node_matcher :path_defining_method_with_string_path, <<~PATTERN
28
+ (send nil? {:post | :get | :namespace} (:str $_))
29
+ PATTERN
30
+
31
+ def_node_matcher :namespace_with_symbol, <<~PATTERN
32
+ (send nil? :namespace (:sym $_))
33
+ PATTERN
34
+
35
+ MSG = "Use kebab-case for the API path"
36
+
37
+ def on_send(node)
38
+ path_defining_method_with_string_path(node) do |path|
39
+ add_offense(node) if path_name_does_not_follow_kebab_case?(path)
40
+ end
41
+
42
+ namespace_with_symbol(node) do |path|
43
+ add_offense(node) if path.to_s.include?("_")
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def path_name_does_not_follow_kebab_case?(path)
50
+ path.split("/").any? { |split| !split.start_with?(":") && split.include?("_") }
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "boxt/api_path_format"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: boxt_rubocop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.46
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boxt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-09-19 00:00:00.000000000 Z
11
+ date: 2023-10-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -105,9 +105,12 @@ files:
105
105
  - README.md
106
106
  - Rakefile
107
107
  - VERSION
108
- - default.yml
109
108
  - lib/boxt_rubocop.rb
110
- - lib/boxt_rubocop/version.rb
109
+ - lib/rubocop/boxt.rb
110
+ - lib/rubocop/boxt/inject.rb
111
+ - lib/rubocop/boxt/version.rb
112
+ - lib/rubocop/cop/boxt/api_path_format.rb
113
+ - lib/rubocop/cop/boxt_cops.rb
111
114
  - rails.yml
112
115
  - rspec.yml
113
116
  homepage: https://github.com/boxt/boxt_rubocop
data/default.yml DELETED
@@ -1,60 +0,0 @@
1
- AllCops:
2
- Exclude:
3
- - "**/*/schema.rb"
4
- - Gemfile.lock
5
- - node_modules/**/*
6
- - tmp/**/*
7
- - vendor/**/*
8
- NewCops: enable
9
-
10
- Layout/ClassStructure:
11
- Enabled: true
12
-
13
- Layout/LineLength:
14
- Exclude:
15
- - config/routes.rb
16
- - config/routes/*
17
- Max: 120
18
-
19
- Metrics/AbcSize:
20
- Exclude:
21
- - db/migrate/**/*
22
-
23
- Metrics/BlockLength:
24
- CountAsOne: ["array", "hash"]
25
- Exclude:
26
- - "*.gemspec"
27
- - Gemfile
28
- - config/environments/*
29
- - config/routes.rb
30
- - config/routes/*
31
- - db/migrate/**/*
32
- - lib/tasks/**/*
33
- - spec/**/*
34
- - test/**/*
35
-
36
- Metrics/ClassLength:
37
- CountAsOne: ["array", "hash"]
38
- Exclude:
39
- - db/migrate/**/*
40
- - spec/**/*
41
- - test/**/*
42
-
43
- Metrics/MethodLength:
44
- CountAsOne: ["array", "heredoc", "hash"]
45
- Exclude:
46
- - db/migrate/**/*
47
- - spec/**/*
48
- - test/**/*
49
-
50
- Metrics/ModuleLength:
51
- CountAsOne: ["array", "hash"]
52
-
53
- Style/Documentation:
54
- Enabled: false
55
-
56
- Style/DoubleNegation:
57
- Enabled: false
58
-
59
- Style/StringLiterals:
60
- EnforcedStyle: double_quotes
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module BoxtRubocop
4
- VERSION = File.read("VERSION").split("\n").first
5
- end