rubocop-rails 2.4.1

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.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.md +92 -0
  4. data/bin/setup +7 -0
  5. data/config/default.yml +510 -0
  6. data/lib/rubocop-rails.rb +12 -0
  7. data/lib/rubocop/cop/mixin/target_rails_version.rb +16 -0
  8. data/lib/rubocop/cop/rails/action_filter.rb +111 -0
  9. data/lib/rubocop/cop/rails/active_record_aliases.rb +48 -0
  10. data/lib/rubocop/cop/rails/active_record_override.rb +82 -0
  11. data/lib/rubocop/cop/rails/active_support_aliases.rb +69 -0
  12. data/lib/rubocop/cop/rails/application_controller.rb +36 -0
  13. data/lib/rubocop/cop/rails/application_job.rb +40 -0
  14. data/lib/rubocop/cop/rails/application_mailer.rb +40 -0
  15. data/lib/rubocop/cop/rails/application_record.rb +40 -0
  16. data/lib/rubocop/cop/rails/assert_not.rb +44 -0
  17. data/lib/rubocop/cop/rails/belongs_to.rb +102 -0
  18. data/lib/rubocop/cop/rails/blank.rb +164 -0
  19. data/lib/rubocop/cop/rails/bulk_change_table.rb +293 -0
  20. data/lib/rubocop/cop/rails/create_table_with_timestamps.rb +91 -0
  21. data/lib/rubocop/cop/rails/date.rb +161 -0
  22. data/lib/rubocop/cop/rails/delegate.rb +132 -0
  23. data/lib/rubocop/cop/rails/delegate_allow_blank.rb +37 -0
  24. data/lib/rubocop/cop/rails/dynamic_find_by.rb +91 -0
  25. data/lib/rubocop/cop/rails/enum_hash.rb +75 -0
  26. data/lib/rubocop/cop/rails/enum_uniqueness.rb +65 -0
  27. data/lib/rubocop/cop/rails/environment_comparison.rb +68 -0
  28. data/lib/rubocop/cop/rails/exit.rb +67 -0
  29. data/lib/rubocop/cop/rails/file_path.rb +108 -0
  30. data/lib/rubocop/cop/rails/find_by.rb +55 -0
  31. data/lib/rubocop/cop/rails/find_each.rb +51 -0
  32. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +25 -0
  33. data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +106 -0
  34. data/lib/rubocop/cop/rails/helper_instance_variable.rb +39 -0
  35. data/lib/rubocop/cop/rails/http_positional_arguments.rb +117 -0
  36. data/lib/rubocop/cop/rails/http_status.rb +160 -0
  37. data/lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb +94 -0
  38. data/lib/rubocop/cop/rails/inverse_of.rb +246 -0
  39. data/lib/rubocop/cop/rails/lexically_scoped_action_filter.rb +175 -0
  40. data/lib/rubocop/cop/rails/link_to_blank.rb +98 -0
  41. data/lib/rubocop/cop/rails/not_null_column.rb +67 -0
  42. data/lib/rubocop/cop/rails/output.rb +49 -0
  43. data/lib/rubocop/cop/rails/output_safety.rb +99 -0
  44. data/lib/rubocop/cop/rails/pluralization_grammar.rb +107 -0
  45. data/lib/rubocop/cop/rails/presence.rb +148 -0
  46. data/lib/rubocop/cop/rails/present.rb +153 -0
  47. data/lib/rubocop/cop/rails/rake_environment.rb +91 -0
  48. data/lib/rubocop/cop/rails/read_write_attribute.rb +74 -0
  49. data/lib/rubocop/cop/rails/redundant_allow_nil.rb +111 -0
  50. data/lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb +136 -0
  51. data/lib/rubocop/cop/rails/reflection_class_name.rb +37 -0
  52. data/lib/rubocop/cop/rails/refute_methods.rb +76 -0
  53. data/lib/rubocop/cop/rails/relative_date_constant.rb +102 -0
  54. data/lib/rubocop/cop/rails/request_referer.rb +56 -0
  55. data/lib/rubocop/cop/rails/reversible_migration.rb +284 -0
  56. data/lib/rubocop/cop/rails/safe_navigation.rb +85 -0
  57. data/lib/rubocop/cop/rails/safe_navigation_with_blank.rb +48 -0
  58. data/lib/rubocop/cop/rails/save_bang.rb +331 -0
  59. data/lib/rubocop/cop/rails/scope_args.rb +29 -0
  60. data/lib/rubocop/cop/rails/skips_model_validations.rb +87 -0
  61. data/lib/rubocop/cop/rails/time_zone.rb +249 -0
  62. data/lib/rubocop/cop/rails/uniq_before_pluck.rb +105 -0
  63. data/lib/rubocop/cop/rails/unknown_env.rb +84 -0
  64. data/lib/rubocop/cop/rails/validation.rb +147 -0
  65. data/lib/rubocop/cop/rails_cops.rb +61 -0
  66. data/lib/rubocop/rails.rb +12 -0
  67. data/lib/rubocop/rails/inject.rb +18 -0
  68. data/lib/rubocop/rails/version.rb +10 -0
  69. metadata +148 -0
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop checks that environments called with `Rails.env` predicates
7
+ # exist.
8
+ #
9
+ # @example
10
+ # # bad
11
+ # Rails.env.proudction?
12
+ # Rails.env == 'proudction'
13
+ #
14
+ # # good
15
+ # Rails.env.production?
16
+ # Rails.env == 'production'
17
+ class UnknownEnv < Cop
18
+ include NameSimilarity
19
+
20
+ MSG = 'Unknown environment `%<name>s`.'
21
+ MSG_SIMILAR = 'Unknown environment `%<name>s`. ' \
22
+ 'Did you mean `%<similar>s`?'
23
+
24
+ def_node_matcher :rails_env?, <<~PATTERN
25
+ (send
26
+ {(const nil? :Rails) (const (cbase) :Rails)}
27
+ :env)
28
+ PATTERN
29
+
30
+ def_node_matcher :unknown_environment_predicate?, <<~PATTERN
31
+ (send #rails_env? $#unknown_env_predicate?)
32
+ PATTERN
33
+
34
+ def_node_matcher :unknown_environment_equal?, <<~PATTERN
35
+ {
36
+ (send #rails_env? {:== :===} $(str #unknown_env_name?))
37
+ (send $(str #unknown_env_name?) {:== :===} #rails_env?)
38
+ }
39
+ PATTERN
40
+
41
+ def on_send(node)
42
+ unknown_environment_predicate?(node) do |name|
43
+ add_offense(node, location: :selector, message: message(name))
44
+ end
45
+
46
+ unknown_environment_equal?(node) do |str_node|
47
+ name = str_node.value
48
+ add_offense(str_node, message: message(name))
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def collect_variable_like_names(_scope)
55
+ environments
56
+ end
57
+
58
+ def message(name)
59
+ name = name.to_s.chomp('?')
60
+ similar = find_similar_name(name, [])
61
+ if similar
62
+ format(MSG_SIMILAR, name: name, similar: similar)
63
+ else
64
+ format(MSG, name: name)
65
+ end
66
+ end
67
+
68
+ def unknown_env_predicate?(name)
69
+ name = name.to_s
70
+ name.end_with?('?') &&
71
+ !environments.include?(name[0..-2])
72
+ end
73
+
74
+ def unknown_env_name?(name)
75
+ !environments.include?(name)
76
+ end
77
+
78
+ def environments
79
+ cop_config['Environments']
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Rails
6
+ # This cop checks for the use of old-style attribute validation macros.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # validates_acceptance_of :foo
11
+ # validates_confirmation_of :foo
12
+ # validates_exclusion_of :foo
13
+ # validates_format_of :foo
14
+ # validates_inclusion_of :foo
15
+ # validates_length_of :foo
16
+ # validates_numericality_of :foo
17
+ # validates_presence_of :foo
18
+ # validates_absence_of :foo
19
+ # validates_size_of :foo
20
+ # validates_uniqueness_of :foo
21
+ #
22
+ # # good
23
+ # validates :foo, acceptance: true
24
+ # validates :foo, confirmation: true
25
+ # validates :foo, exclusion: true
26
+ # validates :foo, format: true
27
+ # validates :foo, inclusion: true
28
+ # validates :foo, length: true
29
+ # validates :foo, numericality: true
30
+ # validates :foo, presence: true
31
+ # validates :foo, absence: true
32
+ # validates :foo, size: true
33
+ # validates :foo, uniqueness: true
34
+ #
35
+ class Validation < Cop
36
+ MSG = 'Prefer the new style validations `%<prefer>s` over ' \
37
+ '`%<current>s`.'
38
+
39
+ TYPES = %w[
40
+ acceptance
41
+ confirmation
42
+ exclusion
43
+ format
44
+ inclusion
45
+ length
46
+ numericality
47
+ presence
48
+ absence
49
+ size
50
+ uniqueness
51
+ ].freeze
52
+
53
+ DENYLIST = TYPES.map { |p| "validates_#{p}_of".to_sym }.freeze
54
+ ALLOWLIST = TYPES.map { |p| "validates :column, #{p}: value" }.freeze
55
+
56
+ def on_send(node)
57
+ return unless !node.receiver && DENYLIST.include?(node.method_name)
58
+
59
+ add_offense(node, location: :selector)
60
+ end
61
+
62
+ def autocorrect(node)
63
+ last_argument = node.arguments.last
64
+ return if !last_argument.literal? && !last_argument.splat_type? &&
65
+ !frozen_array_argument?(last_argument)
66
+
67
+ lambda do |corrector|
68
+ corrector.replace(node.loc.selector, 'validates')
69
+ correct_validate_type(corrector, node)
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def message(node)
76
+ format(MSG, prefer: preferred_method(node.method_name),
77
+ current: node.method_name)
78
+ end
79
+
80
+ def preferred_method(method)
81
+ ALLOWLIST[DENYLIST.index(method.to_sym)]
82
+ end
83
+
84
+ def correct_validate_type(corrector, node)
85
+ last_argument = node.last_argument
86
+
87
+ if last_argument.hash_type?
88
+ correct_validate_type_for_hash(corrector, node, last_argument)
89
+ elsif last_argument.array_type?
90
+ loc = last_argument.loc
91
+
92
+ correct_validate_type_for_array(corrector, node, last_argument, loc)
93
+ elsif frozen_array_argument?(last_argument)
94
+ arguments = node.last_argument.receiver
95
+ loc = arguments.parent.loc
96
+
97
+ correct_validate_type_for_array(corrector, node, arguments, loc)
98
+ else
99
+ range = last_argument.source_range
100
+
101
+ corrector.insert_after(range, ", #{validate_type(node)}: true")
102
+ end
103
+ end
104
+
105
+ def correct_validate_type_for_hash(corrector, node, arguments)
106
+ corrector.replace(
107
+ arguments.loc.expression,
108
+ "#{validate_type(node)}: #{braced_options(arguments)}"
109
+ )
110
+ end
111
+
112
+ def correct_validate_type_for_array(corrector, node, arguments, loc)
113
+ attributes = []
114
+
115
+ arguments.each_child_node do |child_node|
116
+ attributes << if arguments.percent_literal?
117
+ ":#{child_node.source}"
118
+ else
119
+ child_node.source
120
+ end
121
+ end
122
+
123
+ corrector.replace(
124
+ loc.expression,
125
+ "#{attributes.join(', ')}, #{validate_type(node)}: true"
126
+ )
127
+ end
128
+
129
+ def validate_type(node)
130
+ node.method_name.to_s.split('_')[1]
131
+ end
132
+
133
+ def frozen_array_argument?(argument)
134
+ argument.send_type? && argument.method?(:freeze)
135
+ end
136
+
137
+ def braced_options(options)
138
+ if options.braces?
139
+ options.source
140
+ else
141
+ "{ #{options.source} }"
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'mixin/target_rails_version'
4
+
5
+ require_relative 'rails/action_filter'
6
+ require_relative 'rails/active_record_aliases'
7
+ require_relative 'rails/active_record_override'
8
+ require_relative 'rails/active_support_aliases'
9
+ require_relative 'rails/application_controller'
10
+ require_relative 'rails/application_job'
11
+ require_relative 'rails/application_mailer'
12
+ require_relative 'rails/application_record'
13
+ require_relative 'rails/assert_not'
14
+ require_relative 'rails/belongs_to'
15
+ require_relative 'rails/blank'
16
+ require_relative 'rails/bulk_change_table'
17
+ require_relative 'rails/create_table_with_timestamps'
18
+ require_relative 'rails/date'
19
+ require_relative 'rails/delegate'
20
+ require_relative 'rails/delegate_allow_blank'
21
+ require_relative 'rails/dynamic_find_by'
22
+ require_relative 'rails/enum_hash'
23
+ require_relative 'rails/enum_uniqueness'
24
+ require_relative 'rails/environment_comparison'
25
+ require_relative 'rails/exit'
26
+ require_relative 'rails/file_path'
27
+ require_relative 'rails/find_by'
28
+ require_relative 'rails/find_each'
29
+ require_relative 'rails/has_and_belongs_to_many'
30
+ require_relative 'rails/has_many_or_has_one_dependent'
31
+ require_relative 'rails/helper_instance_variable'
32
+ require_relative 'rails/http_positional_arguments'
33
+ require_relative 'rails/http_status'
34
+ require_relative 'rails/ignored_skip_action_filter_option'
35
+ require_relative 'rails/inverse_of'
36
+ require_relative 'rails/lexically_scoped_action_filter'
37
+ require_relative 'rails/link_to_blank'
38
+ require_relative 'rails/not_null_column'
39
+ require_relative 'rails/output'
40
+ require_relative 'rails/output_safety'
41
+ require_relative 'rails/pluralization_grammar'
42
+ require_relative 'rails/presence'
43
+ require_relative 'rails/present'
44
+ require_relative 'rails/rake_environment'
45
+ require_relative 'rails/read_write_attribute'
46
+ require_relative 'rails/redundant_allow_nil'
47
+ require_relative 'rails/redundant_receiver_in_with_options'
48
+ require_relative 'rails/reflection_class_name'
49
+ require_relative 'rails/refute_methods'
50
+ require_relative 'rails/relative_date_constant'
51
+ require_relative 'rails/request_referer'
52
+ require_relative 'rails/reversible_migration'
53
+ require_relative 'rails/safe_navigation'
54
+ require_relative 'rails/safe_navigation_with_blank'
55
+ require_relative 'rails/save_bang'
56
+ require_relative 'rails/scope_args'
57
+ require_relative 'rails/skips_model_validations'
58
+ require_relative 'rails/time_zone'
59
+ require_relative 'rails/uniq_before_pluck'
60
+ require_relative 'rails/unknown_env'
61
+ require_relative 'rails/validation'
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ # RuboCop Rails project namespace
5
+ module Rails
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
+ end
12
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Rails
5
+ # Because RuboCop doesn't yet support plugins, we have to monkey patch in a
6
+ # bit of our configuration.
7
+ module Inject
8
+ def self.defaults!
9
+ path = CONFIG_DEFAULT.to_s
10
+ hash = ConfigLoader.send(:load_yaml_configuration, path)
11
+ config = Config.new(hash, path)
12
+ puts "configuration from #{path}" if ConfigLoader.debug?
13
+ config = ConfigLoader.merge_with_default(config, path, unset_nil: false)
14
+ ConfigLoader.instance_variable_set(:@default_configuration, config)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Rails
5
+ # This module holds the RuboCop Rails version information.
6
+ module Version
7
+ STRING = '2.4.1'
8
+ end
9
+ end
10
+ end
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubocop-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.4.1
5
+ platform: ruby
6
+ authors:
7
+ - Bozhidar Batsov
8
+ - Jonas Arvidsson
9
+ - Yuji Nakayama
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2019-12-25 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rack
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '1.1'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '1.1'
29
+ - !ruby/object:Gem::Dependency
30
+ name: rubocop
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: 0.72.0
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 0.72.0
43
+ description: |
44
+ Automatic Rails code style checking tool.
45
+ A RuboCop extension focused on enforcing Rails best practices and coding conventions.
46
+ email: rubocop@googlegroups.com
47
+ executables: []
48
+ extensions: []
49
+ extra_rdoc_files:
50
+ - LICENSE.txt
51
+ - README.md
52
+ files:
53
+ - LICENSE.txt
54
+ - README.md
55
+ - bin/setup
56
+ - config/default.yml
57
+ - lib/rubocop-rails.rb
58
+ - lib/rubocop/cop/mixin/target_rails_version.rb
59
+ - lib/rubocop/cop/rails/action_filter.rb
60
+ - lib/rubocop/cop/rails/active_record_aliases.rb
61
+ - lib/rubocop/cop/rails/active_record_override.rb
62
+ - lib/rubocop/cop/rails/active_support_aliases.rb
63
+ - lib/rubocop/cop/rails/application_controller.rb
64
+ - lib/rubocop/cop/rails/application_job.rb
65
+ - lib/rubocop/cop/rails/application_mailer.rb
66
+ - lib/rubocop/cop/rails/application_record.rb
67
+ - lib/rubocop/cop/rails/assert_not.rb
68
+ - lib/rubocop/cop/rails/belongs_to.rb
69
+ - lib/rubocop/cop/rails/blank.rb
70
+ - lib/rubocop/cop/rails/bulk_change_table.rb
71
+ - lib/rubocop/cop/rails/create_table_with_timestamps.rb
72
+ - lib/rubocop/cop/rails/date.rb
73
+ - lib/rubocop/cop/rails/delegate.rb
74
+ - lib/rubocop/cop/rails/delegate_allow_blank.rb
75
+ - lib/rubocop/cop/rails/dynamic_find_by.rb
76
+ - lib/rubocop/cop/rails/enum_hash.rb
77
+ - lib/rubocop/cop/rails/enum_uniqueness.rb
78
+ - lib/rubocop/cop/rails/environment_comparison.rb
79
+ - lib/rubocop/cop/rails/exit.rb
80
+ - lib/rubocop/cop/rails/file_path.rb
81
+ - lib/rubocop/cop/rails/find_by.rb
82
+ - lib/rubocop/cop/rails/find_each.rb
83
+ - lib/rubocop/cop/rails/has_and_belongs_to_many.rb
84
+ - lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb
85
+ - lib/rubocop/cop/rails/helper_instance_variable.rb
86
+ - lib/rubocop/cop/rails/http_positional_arguments.rb
87
+ - lib/rubocop/cop/rails/http_status.rb
88
+ - lib/rubocop/cop/rails/ignored_skip_action_filter_option.rb
89
+ - lib/rubocop/cop/rails/inverse_of.rb
90
+ - lib/rubocop/cop/rails/lexically_scoped_action_filter.rb
91
+ - lib/rubocop/cop/rails/link_to_blank.rb
92
+ - lib/rubocop/cop/rails/not_null_column.rb
93
+ - lib/rubocop/cop/rails/output.rb
94
+ - lib/rubocop/cop/rails/output_safety.rb
95
+ - lib/rubocop/cop/rails/pluralization_grammar.rb
96
+ - lib/rubocop/cop/rails/presence.rb
97
+ - lib/rubocop/cop/rails/present.rb
98
+ - lib/rubocop/cop/rails/rake_environment.rb
99
+ - lib/rubocop/cop/rails/read_write_attribute.rb
100
+ - lib/rubocop/cop/rails/redundant_allow_nil.rb
101
+ - lib/rubocop/cop/rails/redundant_receiver_in_with_options.rb
102
+ - lib/rubocop/cop/rails/reflection_class_name.rb
103
+ - lib/rubocop/cop/rails/refute_methods.rb
104
+ - lib/rubocop/cop/rails/relative_date_constant.rb
105
+ - lib/rubocop/cop/rails/request_referer.rb
106
+ - lib/rubocop/cop/rails/reversible_migration.rb
107
+ - lib/rubocop/cop/rails/safe_navigation.rb
108
+ - lib/rubocop/cop/rails/safe_navigation_with_blank.rb
109
+ - lib/rubocop/cop/rails/save_bang.rb
110
+ - lib/rubocop/cop/rails/scope_args.rb
111
+ - lib/rubocop/cop/rails/skips_model_validations.rb
112
+ - lib/rubocop/cop/rails/time_zone.rb
113
+ - lib/rubocop/cop/rails/uniq_before_pluck.rb
114
+ - lib/rubocop/cop/rails/unknown_env.rb
115
+ - lib/rubocop/cop/rails/validation.rb
116
+ - lib/rubocop/cop/rails_cops.rb
117
+ - lib/rubocop/rails.rb
118
+ - lib/rubocop/rails/inject.rb
119
+ - lib/rubocop/rails/version.rb
120
+ homepage: https://github.com/rubocop-hq/rubocop-rails
121
+ licenses:
122
+ - MIT
123
+ metadata:
124
+ homepage_uri: https://docs.rubocop.org/projects/rails
125
+ changelog_uri: https://github.com/rubocop-hq/rubocop-rails/blob/master/CHANGELOG.md
126
+ source_code_uri: https://github.com/rubocop-hq/rubocop-rails/
127
+ documentation_uri: https://docs.rubocop.org/projects/rails
128
+ bug_tracker_uri: https://github.com/rubocop-hq/rubocop-rails/issues
129
+ post_install_message:
130
+ rdoc_options: []
131
+ require_paths:
132
+ - lib
133
+ required_ruby_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 2.3.0
138
+ required_rubygems_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubygems_version: 3.1.2
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: Automatic Rails code style checking tool.
148
+ test_files: []