rubocop-discourse 2.4.2 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a72b547f01dafa6cb189e9bfa4478817b6235ae725707b36e4b7f692351c3707
4
- data.tar.gz: 2bfc96ac97e72886e781ddf5bc94f38c04a6f7ce45946dea2823f35d8db8e798
3
+ metadata.gz: 3a1dd5d5b8d79de5bcda354a31c6f993460f11875065c64edd9f7cc3cce71bff
4
+ data.tar.gz: 175c1f83d9300537bac93184d5e8bf5d21cffc8196e996d59cc9298f69d8bdb5
5
5
  SHA512:
6
- metadata.gz: cbcd4c1f22751539ee6a1c9550a08170d91f92b26e7098362bcf3039f0d3658b5df789c72b947e857fa38ba7523ca53b5061feff1b9bd6135940db61ce6baef6
7
- data.tar.gz: 1f1d6460703cf74e03ce57ac50deed273f7a1a0f2df3d8a1ab9d6a9d0ec18aa53be63ad442c79dd08cfbf664811ea79caa02ae65127b23ae78a14c1c8721d71f
6
+ metadata.gz: ada5c637849f829f0d8d0247b86fbec1a1cc9182d06b6385f6ac13f081f9782a7d9cd38d8a3dd30c2bf121f834171a9f28933deaee4ab8a53a022aa3af5d06fc
7
+ data.tar.gz: ab731fee843a5a8ef9821c613751906457672eb11bed54ec0aae3856588b723a77c03aa26f258a3c1e19c25b1edac4d198ae8ffbfd3e4bbaf397d4e2f1332c8f
@@ -5,9 +5,7 @@ on:
5
5
  push:
6
6
  branches:
7
7
  - master
8
- tags:
9
- - v*
10
-
8
+ - main
11
9
  jobs:
12
10
  build:
13
11
  runs-on: ubuntu-latest
@@ -33,7 +31,7 @@ jobs:
33
31
  run: bundle exec rspec spec
34
32
 
35
33
  publish:
36
- if: contains(github.ref, 'refs/tags/v')
34
+ if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master')
37
35
  needs: build
38
36
  runs-on: ubuntu-latest
39
37
 
@@ -41,6 +39,8 @@ jobs:
41
39
  - uses: actions/checkout@v2
42
40
 
43
41
  - name: Release Gem
44
- uses: discourse/publish-rubygems-action@main
42
+ uses: discourse/publish-rubygems-action@v2
45
43
  env:
46
- RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
44
+ RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
45
+ GIT_EMAIL: team@discourse.org
46
+ GIT_NAME: discoursebot
data/config/default.yml CHANGED
@@ -50,3 +50,15 @@ Discourse/NoMockingJobs:
50
50
  Patterns:
51
51
  - _spec.rb
52
52
  - "(?:^|/)spec/"
53
+
54
+ Discourse/OnlyTopLevelMultisiteSpecs:
55
+ Enabled: true
56
+ Patterns:
57
+ - _spec.rb
58
+ - "(?:^|/)spec/"
59
+
60
+ Discourse/NoMixingMultisiteAndStandardSpecs:
61
+ Enabled: true
62
+ Patterns:
63
+ - _spec.rb
64
+ - "(?:^|/)spec/"
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Discourse
6
+ # Use `type: :multisite` only on a top-level `describe`.
7
+ # Mixing multisite and standard specs can lead to errors,
8
+ # e.g. when using `fab!` helper.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # describe "x" do
13
+ # end
14
+ #
15
+ # describe "x", type: :multisite do
16
+ # end
17
+ #
18
+ # # good
19
+ # # x_spec.rb
20
+ # describe "x" do
21
+ # end
22
+ #
23
+ # # x_multisite_spec.rb
24
+ # describe "x", type: :multisite do
25
+ # end
26
+ class NoMixingMultisiteAndStandardSpecs < Cop
27
+ MSG = "Do not mix multisite and standard specs. Consider moving multisite describes to a separate file."
28
+
29
+ def initialize(config = nil, options = nil)
30
+ super
31
+ @describes = nil
32
+ end
33
+
34
+ def on_block(node)
35
+ return if !top_level?(node)
36
+ return if !describe?(node.children.first)
37
+
38
+ type = !!multisite_describe?(node.children.first)
39
+
40
+ if !@describes.nil? && @describes != type
41
+ add_offense(node, message: MSG)
42
+ else
43
+ @describes = type
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def_node_matcher :describe?, <<~MATCHER
50
+ (send
51
+ {nil? (const nil? :RSpec)}
52
+ {:describe :context :it}
53
+ ...
54
+ )
55
+ MATCHER
56
+
57
+ def_node_matcher :multisite_describe?, <<~MATCHER
58
+ (send
59
+ {nil? (const nil? :RSpec)}
60
+ {:describe :context :it}
61
+ _
62
+ (hash (pair (sym :type) (sym :multisite)) ...)
63
+ )
64
+ MATCHER
65
+
66
+ def top_level?(node)
67
+ if node.parent&.begin_type?
68
+ node.parent.root?
69
+ else
70
+ node.root?
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Discourse
6
+ # Use `type: :multisite` only on a top-level `describe`.
7
+ # Mixing multisite and standard specs can lead to errors,
8
+ # e.g. when using `fab!` helper.
9
+ #
10
+ # @example
11
+ # # bad
12
+ # describe "something" do
13
+ # describe "x", type: :multisite do
14
+ # end
15
+ #
16
+ # it "does X", type: :multisite do
17
+ # end
18
+ # end
19
+ #
20
+ # # good
21
+ # describe "something", type: :multisite do
22
+ # describe "x" do
23
+ # end
24
+ #
25
+ # it "does X" do
26
+ # end
27
+ # end
28
+ class OnlyTopLevelMultisiteSpecs < Cop
29
+ MSG = "Use `type: :multisite` only on a top-level `describe`"
30
+
31
+ def on_block(node)
32
+ return if top_level?(node)
33
+ return if !multisite_describe?(node.children.first)
34
+
35
+ add_offense(node, message: MSG)
36
+ end
37
+
38
+ private
39
+
40
+ def_node_matcher :multisite_describe?, <<~MATCHER
41
+ (send
42
+ {nil? (const nil? :RSpec)}
43
+ {:describe :context :it}
44
+ _
45
+ (hash (pair (sym :type) (sym :multisite)) ...)
46
+ )
47
+ MATCHER
48
+
49
+ def top_level?(node)
50
+ if node.parent&.begin_type?
51
+ node.parent.root?
52
+ else
53
+ node.root?
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
data/rubocop-core.yml CHANGED
@@ -1,3 +1,9 @@
1
+ Security:
2
+ Enabled: true
3
+
4
+ Security/IoMethods:
5
+ Enabled: true
6
+
1
7
  # Prefer &&/|| over and/or.
2
8
  Style/AndOr:
3
9
  Enabled: true
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "rubocop-discourse"
5
- s.version = "2.4.2"
5
+ s.version = "2.5.0"
6
6
  s.summary = "Custom rubocop cops used by Discourse"
7
7
  s.authors = ["David Taylor"]
8
8
  s.license = "MIT"
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe RuboCop::Cop::Discourse::NoMixingMultisiteAndStandardSpecs, :config do
6
+ subject(:cop) { described_class.new(config) }
7
+
8
+ let(:config) do
9
+ RuboCop::Config.new
10
+ end
11
+
12
+ it "raises an offense if there are multisite and standard top-level describes" do
13
+ inspect_source(<<~RUBY)
14
+ RSpec.describe "test" do
15
+ end
16
+
17
+ describe "test2", type: :multisite do
18
+ end
19
+ RUBY
20
+
21
+ expect(cop.offenses.first.message).to eq(described_class::MSG)
22
+ end
23
+
24
+ it "raises an offense if there are multiple multisite and standard top-level describes" do
25
+ inspect_source(<<~RUBY)
26
+ describe "test", type: :multisite do
27
+ end
28
+
29
+ describe "test2", type: :multisite do
30
+ end
31
+
32
+ describe "test2" do
33
+ end
34
+ RUBY
35
+
36
+ expect(cop.offenses.first.message).to eq(described_class::MSG)
37
+ end
38
+
39
+ it "does not raise an offense if there are only multisite describes" do
40
+ inspect_source(<<~RUBY)
41
+ require "foo"
42
+
43
+ describe "test", type: :multisite do
44
+ describe "inner-test" do
45
+ it "test" do
46
+ end
47
+ end
48
+ end
49
+
50
+ RSpec.describe "test2", type: :multisite do
51
+ end
52
+ RUBY
53
+
54
+ expect(cop.offenses).to eq([])
55
+ end
56
+
57
+ it "does not raise an offense if there are only standard describes" do
58
+ inspect_source(<<~RUBY)
59
+ require "rails_helper"
60
+
61
+ describe "test" do
62
+ end
63
+
64
+ describe "test2" do
65
+ RSpec.describe "inner-test" do
66
+ end
67
+ end
68
+ RUBY
69
+
70
+ expect(cop.offenses).to eq([])
71
+ end
72
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ describe RuboCop::Cop::Discourse::OnlyTopLevelMultisiteSpecs, :config do
6
+ subject(:cop) { described_class.new(config) }
7
+
8
+ let(:config) do
9
+ RuboCop::Config.new
10
+ end
11
+
12
+ it "raises an offense if multisite config option is used in a sub-describe" do
13
+ inspect_source(<<~RUBY)
14
+ describe "test" do
15
+ describe "sub-test", type: :multisite do
16
+ end
17
+ end
18
+ RUBY
19
+
20
+ expect(cop.offenses.first.message).to eq(described_class::MSG)
21
+ end
22
+
23
+ it "raises an offense if multisite config option is used in a sub-describe (RSpec const version)" do
24
+ inspect_source(<<~RUBY)
25
+ RSpec.describe "test" do
26
+ RSpec.describe "sub-test", type: :multisite do
27
+ end
28
+ end
29
+ RUBY
30
+
31
+ expect(cop.offenses.first.message).to eq(described_class::MSG)
32
+ end
33
+
34
+ it "raises an offense if multisite config option is used in an example" do
35
+ inspect_source(<<~RUBY)
36
+ describe "test" do
37
+ it "acts as an example" do
38
+ end
39
+
40
+ it "does a thing", type: :multisite do
41
+ end
42
+ end
43
+ RUBY
44
+
45
+ expect(cop.offenses.first.message).to eq(described_class::MSG)
46
+ end
47
+
48
+ it "raises an offense if multisite config option is used in a context" do
49
+ inspect_source(<<~RUBY)
50
+ describe "test" do
51
+ context "special circumstances", type: :multisite do
52
+ end
53
+ end
54
+ RUBY
55
+
56
+ expect(cop.offenses.first.message).to eq(described_class::MSG)
57
+ end
58
+
59
+ it "does not raise an offense if multisite config option is used on top-level describe" do
60
+ inspect_source(<<~RUBY)
61
+ describe "test", type: :multisite do
62
+ describe "sub-test" do
63
+ end
64
+ end
65
+ RUBY
66
+
67
+ expect(cop.offenses).to eq([])
68
+ end
69
+
70
+ it "does not raise an offense if multisite config option is used on top-level describe (RSpec const version)" do
71
+ inspect_source(<<~RUBY)
72
+ require "rails_helper"
73
+
74
+ RSpec.describe "test", type: :multisite do
75
+ describe "sub-test" do
76
+ end
77
+ end
78
+ RUBY
79
+
80
+ expect(cop.offenses).to eq([])
81
+ end
82
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-discourse
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.2
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Taylor
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-07 00:00:00.000000000 Z
11
+ date: 2021-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -86,11 +86,13 @@ files:
86
86
  - lib/rubocop/cop/discourse/no_chdir.rb
87
87
  - lib/rubocop/cop/discourse/no_direct_multisite_manipulation.rb
88
88
  - lib/rubocop/cop/discourse/no_json_parse_response.rb
89
+ - lib/rubocop/cop/discourse/no_mixing_multisite_and_standard_specs.rb
89
90
  - lib/rubocop/cop/discourse/no_mocking_jobs.rb
90
91
  - lib/rubocop/cop/discourse/no_nokogiri_html_fragment.rb
91
92
  - lib/rubocop/cop/discourse/no_reset_column_information_in_migrations.rb
92
93
  - lib/rubocop/cop/discourse/no_time_new_without_args.rb
93
94
  - lib/rubocop/cop/discourse/no_uri_escape_encode.rb
95
+ - lib/rubocop/cop/discourse/only_top_level_multisite_specs.rb
94
96
  - lib/rubocop/cop/discourse/time_eq_matcher.rb
95
97
  - lib/rubocop/cop/discourse_cops.rb
96
98
  - lib/rubocop/discourse.rb
@@ -99,8 +101,10 @@ files:
99
101
  - rubocop-discourse.gemspec
100
102
  - rubocop-rspec.yml
101
103
  - spec/lib/rubocop/cop/no_add_reference_active_record_migrations_spec.rb
104
+ - spec/lib/rubocop/cop/no_mixing_multisite_and_standard_specs_spec.rb
102
105
  - spec/lib/rubocop/cop/no_mocking_jobs_enqueue_spec.rb
103
106
  - spec/lib/rubocop/cop/no_reset_column_information_migrations_spec.rb
107
+ - spec/lib/rubocop/cop/only_top_level_multisite_specs_spec.rb
104
108
  - spec/spec_helper.rb
105
109
  homepage: https://github.com/discourse/rubocop-discourse
106
110
  licenses:
@@ -121,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
125
  - !ruby/object:Gem::Version
122
126
  version: '0'
123
127
  requirements: []
124
- rubygems_version: 3.0.3
128
+ rubygems_version: 3.1.6
125
129
  signing_key:
126
130
  specification_version: 4
127
131
  summary: Custom rubocop cops used by Discourse