rubocop-airbnb 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 +7 -0
- data/CHANGELOG.md +2 -0
- data/Gemfile +7 -0
- data/LICENSE.md +9 -0
- data/README.md +68 -0
- data/config/default.yml +39 -0
- data/config/rubocop-airbnb.yml +96 -0
- data/config/rubocop-bundler.yml +8 -0
- data/config/rubocop-gemspec.yml +9 -0
- data/config/rubocop-layout.yml +514 -0
- data/config/rubocop-lint.yml +315 -0
- data/config/rubocop-metrics.yml +47 -0
- data/config/rubocop-naming.yml +68 -0
- data/config/rubocop-performance.yml +143 -0
- data/config/rubocop-rails.yml +193 -0
- data/config/rubocop-rspec.yml +281 -0
- data/config/rubocop-security.yml +13 -0
- data/config/rubocop-style.yml +953 -0
- data/lib/rubocop-airbnb.rb +11 -0
- data/lib/rubocop/airbnb.rb +16 -0
- data/lib/rubocop/airbnb/inflections.rb +14 -0
- data/lib/rubocop/airbnb/inject.rb +20 -0
- data/lib/rubocop/airbnb/rails_autoloading.rb +55 -0
- data/lib/rubocop/airbnb/version.rb +8 -0
- data/lib/rubocop/cop/airbnb/class_name.rb +47 -0
- data/lib/rubocop/cop/airbnb/class_or_module_declared_in_wrong_file.rb +138 -0
- data/lib/rubocop/cop/airbnb/const_assigned_in_wrong_file.rb +74 -0
- data/lib/rubocop/cop/airbnb/continuation_slash.rb +25 -0
- data/lib/rubocop/cop/airbnb/default_scope.rb +20 -0
- data/lib/rubocop/cop/airbnb/factory_attr_references_class.rb +74 -0
- data/lib/rubocop/cop/airbnb/factory_class_use_string.rb +39 -0
- data/lib/rubocop/cop/airbnb/mass_assignment_accessible_modifier.rb +18 -0
- data/lib/rubocop/cop/airbnb/module_method_in_wrong_file.rb +104 -0
- data/lib/rubocop/cop/airbnb/no_timeout.rb +19 -0
- data/lib/rubocop/cop/airbnb/opt_arg_parameters.rb +38 -0
- data/lib/rubocop/cop/airbnb/phrase_bundle_keys.rb +67 -0
- data/lib/rubocop/cop/airbnb/risky_activerecord_invocation.rb +63 -0
- data/lib/rubocop/cop/airbnb/rspec_describe_or_context_under_namespace.rb +114 -0
- data/lib/rubocop/cop/airbnb/rspec_environment_modification.rb +58 -0
- data/lib/rubocop/cop/airbnb/simple_modifier_conditional.rb +23 -0
- data/lib/rubocop/cop/airbnb/spec_constant_assignment.rb +55 -0
- data/lib/rubocop/cop/airbnb/unsafe_yaml_marshal.rb +47 -0
- data/rubocop-airbnb.gemspec +32 -0
- data/spec/rubocop/cop/airbnb/class_name_spec.rb +78 -0
- data/spec/rubocop/cop/airbnb/class_or_module_declared_in_wrong_file_spec.rb +174 -0
- data/spec/rubocop/cop/airbnb/const_assigned_in_wrong_file_spec.rb +178 -0
- data/spec/rubocop/cop/airbnb/continuation_slash_spec.rb +162 -0
- data/spec/rubocop/cop/airbnb/default_scope_spec.rb +38 -0
- data/spec/rubocop/cop/airbnb/factory_attr_references_class_spec.rb +160 -0
- data/spec/rubocop/cop/airbnb/factory_class_use_string_spec.rb +26 -0
- data/spec/rubocop/cop/airbnb/mass_assignment_accessible_modifier_spec.rb +28 -0
- data/spec/rubocop/cop/airbnb/module_method_in_wrong_file_spec.rb +181 -0
- data/spec/rubocop/cop/airbnb/no_timeout_spec.rb +30 -0
- data/spec/rubocop/cop/airbnb/opt_arg_parameter_spec.rb +103 -0
- data/spec/rubocop/cop/airbnb/phrase_bundle_keys_spec.rb +74 -0
- data/spec/rubocop/cop/airbnb/risky_activerecord_invocation_spec.rb +54 -0
- data/spec/rubocop/cop/airbnb/rspec_describe_or_context_under_namespace_spec.rb +284 -0
- data/spec/rubocop/cop/airbnb/rspec_environment_modification_spec.rb +64 -0
- data/spec/rubocop/cop/airbnb/simple_modifier_conditional_spec.rb +122 -0
- data/spec/rubocop/cop/airbnb/spec_constant_assignment_spec.rb +80 -0
- data/spec/rubocop/cop/airbnb/unsafe_yaml_marshal_spec.rb +50 -0
- data/spec/spec_helper.rb +35 -0
- metadata +150 -0
@@ -0,0 +1,80 @@
|
|
1
|
+
describe RuboCop::Cop::Airbnb::SpecConstantAssignment do
|
2
|
+
subject(:cop) { described_class.new }
|
3
|
+
|
4
|
+
it 'rejects constant definition inside of a describe block' do
|
5
|
+
source = [
|
6
|
+
'describe Someclass do',
|
7
|
+
' CONSTANT = 5',
|
8
|
+
'end',
|
9
|
+
].join("\n")
|
10
|
+
|
11
|
+
inspect_source(source)
|
12
|
+
expect(cop.offenses.size).to eq(1)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'allows constant defined inside of a module' do
|
16
|
+
source = [
|
17
|
+
'module Someclass',
|
18
|
+
' CONSTANT = 5',
|
19
|
+
'end',
|
20
|
+
].join("\n")
|
21
|
+
|
22
|
+
inspect_source(source)
|
23
|
+
expect(cop.offenses).to be_empty
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'allows constant defined in global space' do
|
27
|
+
source = [
|
28
|
+
'CONSTANT = 5',
|
29
|
+
].join("\n")
|
30
|
+
|
31
|
+
inspect_source(source)
|
32
|
+
expect(cop.offenses.size).to eq(1)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'rejects constant assignment inside a before block' do
|
36
|
+
source = [
|
37
|
+
'describe Someclass do',
|
38
|
+
' before { CONSTANT = 5 }',
|
39
|
+
'end',
|
40
|
+
].join("\n")
|
41
|
+
|
42
|
+
inspect_source(source)
|
43
|
+
expect(cop.offenses.size).to eq(1)
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'rejects namespaced constant assignment inside a before block' do
|
47
|
+
source = [
|
48
|
+
'describe Someclass do',
|
49
|
+
' before { MyModule::CONSTANT = 5 }',
|
50
|
+
'end',
|
51
|
+
].join("\n")
|
52
|
+
|
53
|
+
inspect_source(source)
|
54
|
+
expect(cop.offenses.size).to eq(1)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'rejects constant assignment inside it block' do
|
58
|
+
source = [
|
59
|
+
'describe Someclass do',
|
60
|
+
' it "tests stuff" do',
|
61
|
+
' CONSTANT = 5',
|
62
|
+
' end',
|
63
|
+
'end',
|
64
|
+
].join("\n")
|
65
|
+
|
66
|
+
inspect_source(source)
|
67
|
+
expect(cop.offenses.size).to eq(1)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'allows let statements that do not assign constants' do
|
71
|
+
source = [
|
72
|
+
'describe Someclass do',
|
73
|
+
' let(:constant) { 5 }',
|
74
|
+
'end',
|
75
|
+
].join("\n")
|
76
|
+
|
77
|
+
inspect_source(source)
|
78
|
+
expect(cop.offenses).to be_empty
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
describe RuboCop::Cop::Airbnb::UnsafeYamlMarshal do
|
2
|
+
subject(:cop) { described_class.new }
|
3
|
+
|
4
|
+
context 'send' do
|
5
|
+
it 'rejects YAML.load' do
|
6
|
+
source = [
|
7
|
+
'def some_method(a)',
|
8
|
+
' YAML.load(a)',
|
9
|
+
'end',
|
10
|
+
].join("\n")
|
11
|
+
inspect_source(source)
|
12
|
+
expect(cop.offenses.size).to eql(1)
|
13
|
+
expect(cop.offenses.first.message).to match(/`safe_load`, `parse`, `parse_file`/)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'rejects Psych.load' do
|
17
|
+
source = [
|
18
|
+
'def some_method(a)',
|
19
|
+
' Psych.load(a)',
|
20
|
+
'end',
|
21
|
+
].join("\n")
|
22
|
+
inspect_source(source)
|
23
|
+
expect(cop.offenses.size).to eql(1)
|
24
|
+
expect(cop.offenses.first.message).to match(/`safe_load`, `parse`, `parse_file`/)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'accepts YAML.safe_load' do
|
28
|
+
source = [
|
29
|
+
'def some_method(a)',
|
30
|
+
' YAML.safe_load(a)',
|
31
|
+
'end',
|
32
|
+
].join("\n")
|
33
|
+
inspect_source(source)
|
34
|
+
expect(cop.offenses.size).to eql(0)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'rejects on Marshal.load' do
|
38
|
+
source = [
|
39
|
+
'def some_method(a)',
|
40
|
+
' Marshal.load(a)',
|
41
|
+
'end',
|
42
|
+
].join("\n")
|
43
|
+
inspect_source(source)
|
44
|
+
expect(cop.offenses.size).to eql(1)
|
45
|
+
expect(cop.offenses.first.message).to match(
|
46
|
+
/`Marshal.load` on untrusted input can lead to remote code execution/
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rubocop'
|
2
|
+
require 'rubocop/rspec/support'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
module SpecHelper
|
6
|
+
ROOT = Pathname.new(__FILE__).parent.freeze
|
7
|
+
end
|
8
|
+
|
9
|
+
# Load in Rubocop cops
|
10
|
+
require File.expand_path('lib/rubocop-airbnb')
|
11
|
+
|
12
|
+
spec_helper_glob = File.expand_path('{support,shared}/*.rb', SpecHelper::ROOT)
|
13
|
+
Dir.glob(spec_helper_glob).map(&method(:require))
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.order = :random
|
17
|
+
|
18
|
+
# Define spec metadata for all rspec cop spec files
|
19
|
+
cop_specs = 'spec/rubocop/cop/rspec/'
|
20
|
+
config.define_derived_metadata(file_path: /\b#{cop_specs}/) do |metadata|
|
21
|
+
# Attach metadata that signals the specified code is for an RSpec only cop
|
22
|
+
metadata[:rspec_cop] = true
|
23
|
+
end
|
24
|
+
|
25
|
+
config.expect_with :rspec do |expectations|
|
26
|
+
expectations.syntax = :expect # Disable `should`
|
27
|
+
end
|
28
|
+
|
29
|
+
config.mock_with :rspec do |mocks|
|
30
|
+
mocks.syntax = :expect # Disable `should_receive` and `stub`
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
35
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
metadata
ADDED
@@ -0,0 +1,150 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rubocop-airbnb
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Airbnb Engineering
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-03-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rubocop
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.52.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.52.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rubocop-rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.22.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.22.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.5'
|
55
|
+
description: |2
|
56
|
+
A plugin for RuboCop code style enforcing & linting tool. It includes Rubocop configuration
|
57
|
+
used at Airbnb and a few custom rules that have cause internal issues at Airbnb but are not
|
58
|
+
supported by core Rubocop.
|
59
|
+
email:
|
60
|
+
- rubocop@airbnb.com
|
61
|
+
executables: []
|
62
|
+
extensions: []
|
63
|
+
extra_rdoc_files: []
|
64
|
+
files:
|
65
|
+
- CHANGELOG.md
|
66
|
+
- Gemfile
|
67
|
+
- LICENSE.md
|
68
|
+
- README.md
|
69
|
+
- config/default.yml
|
70
|
+
- config/rubocop-airbnb.yml
|
71
|
+
- config/rubocop-bundler.yml
|
72
|
+
- config/rubocop-gemspec.yml
|
73
|
+
- config/rubocop-layout.yml
|
74
|
+
- config/rubocop-lint.yml
|
75
|
+
- config/rubocop-metrics.yml
|
76
|
+
- config/rubocop-naming.yml
|
77
|
+
- config/rubocop-performance.yml
|
78
|
+
- config/rubocop-rails.yml
|
79
|
+
- config/rubocop-rspec.yml
|
80
|
+
- config/rubocop-security.yml
|
81
|
+
- config/rubocop-style.yml
|
82
|
+
- lib/rubocop-airbnb.rb
|
83
|
+
- lib/rubocop/airbnb.rb
|
84
|
+
- lib/rubocop/airbnb/inflections.rb
|
85
|
+
- lib/rubocop/airbnb/inject.rb
|
86
|
+
- lib/rubocop/airbnb/rails_autoloading.rb
|
87
|
+
- lib/rubocop/airbnb/version.rb
|
88
|
+
- lib/rubocop/cop/airbnb/class_name.rb
|
89
|
+
- lib/rubocop/cop/airbnb/class_or_module_declared_in_wrong_file.rb
|
90
|
+
- lib/rubocop/cop/airbnb/const_assigned_in_wrong_file.rb
|
91
|
+
- lib/rubocop/cop/airbnb/continuation_slash.rb
|
92
|
+
- lib/rubocop/cop/airbnb/default_scope.rb
|
93
|
+
- lib/rubocop/cop/airbnb/factory_attr_references_class.rb
|
94
|
+
- lib/rubocop/cop/airbnb/factory_class_use_string.rb
|
95
|
+
- lib/rubocop/cop/airbnb/mass_assignment_accessible_modifier.rb
|
96
|
+
- lib/rubocop/cop/airbnb/module_method_in_wrong_file.rb
|
97
|
+
- lib/rubocop/cop/airbnb/no_timeout.rb
|
98
|
+
- lib/rubocop/cop/airbnb/opt_arg_parameters.rb
|
99
|
+
- lib/rubocop/cop/airbnb/phrase_bundle_keys.rb
|
100
|
+
- lib/rubocop/cop/airbnb/risky_activerecord_invocation.rb
|
101
|
+
- lib/rubocop/cop/airbnb/rspec_describe_or_context_under_namespace.rb
|
102
|
+
- lib/rubocop/cop/airbnb/rspec_environment_modification.rb
|
103
|
+
- lib/rubocop/cop/airbnb/simple_modifier_conditional.rb
|
104
|
+
- lib/rubocop/cop/airbnb/spec_constant_assignment.rb
|
105
|
+
- lib/rubocop/cop/airbnb/unsafe_yaml_marshal.rb
|
106
|
+
- rubocop-airbnb.gemspec
|
107
|
+
- spec/rubocop/cop/airbnb/class_name_spec.rb
|
108
|
+
- spec/rubocop/cop/airbnb/class_or_module_declared_in_wrong_file_spec.rb
|
109
|
+
- spec/rubocop/cop/airbnb/const_assigned_in_wrong_file_spec.rb
|
110
|
+
- spec/rubocop/cop/airbnb/continuation_slash_spec.rb
|
111
|
+
- spec/rubocop/cop/airbnb/default_scope_spec.rb
|
112
|
+
- spec/rubocop/cop/airbnb/factory_attr_references_class_spec.rb
|
113
|
+
- spec/rubocop/cop/airbnb/factory_class_use_string_spec.rb
|
114
|
+
- spec/rubocop/cop/airbnb/mass_assignment_accessible_modifier_spec.rb
|
115
|
+
- spec/rubocop/cop/airbnb/module_method_in_wrong_file_spec.rb
|
116
|
+
- spec/rubocop/cop/airbnb/no_timeout_spec.rb
|
117
|
+
- spec/rubocop/cop/airbnb/opt_arg_parameter_spec.rb
|
118
|
+
- spec/rubocop/cop/airbnb/phrase_bundle_keys_spec.rb
|
119
|
+
- spec/rubocop/cop/airbnb/risky_activerecord_invocation_spec.rb
|
120
|
+
- spec/rubocop/cop/airbnb/rspec_describe_or_context_under_namespace_spec.rb
|
121
|
+
- spec/rubocop/cop/airbnb/rspec_environment_modification_spec.rb
|
122
|
+
- spec/rubocop/cop/airbnb/simple_modifier_conditional_spec.rb
|
123
|
+
- spec/rubocop/cop/airbnb/spec_constant_assignment_spec.rb
|
124
|
+
- spec/rubocop/cop/airbnb/unsafe_yaml_marshal_spec.rb
|
125
|
+
- spec/spec_helper.rb
|
126
|
+
homepage: https://github.com/airbnb/ruby
|
127
|
+
licenses:
|
128
|
+
- MIT
|
129
|
+
metadata: {}
|
130
|
+
post_install_message:
|
131
|
+
rdoc_options: []
|
132
|
+
require_paths:
|
133
|
+
- lib
|
134
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '2.1'
|
139
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
requirements:
|
141
|
+
- - ">="
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
requirements: []
|
145
|
+
rubyforge_project:
|
146
|
+
rubygems_version: 2.4.5.1
|
147
|
+
signing_key:
|
148
|
+
specification_version: 4
|
149
|
+
summary: Custom code style checking for Airbnb.
|
150
|
+
test_files: []
|