rubocop-cask 0.7.0 → 0.8.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
  SHA1:
3
- metadata.gz: dbc20c10c904e85b5435cb66eb293b5755f99a3f
4
- data.tar.gz: 18e221eef63f6bcf2aa5f528da5a737f94bfb80c
3
+ metadata.gz: 20c70b535a7f7a0aade9f2fb33eec5a52c6ed63c
4
+ data.tar.gz: 67f22d2efeaa1e20df95f9737c50234d7c929501
5
5
  SHA512:
6
- metadata.gz: c523902a6c35dc1c39ac5255922a02bab5b7a2977f1c976797abde9a2129e431421cec877f4358caea60a9000af2d77a72ca376f5a029058507fc52bbbcc1136
7
- data.tar.gz: 9e10a050c4c8ed8967d131d62e78925bd24e3ea0f7cfd0f72d00bceac32f4aab910a61cb04eecb42125a797bd709ca0f3edcffb24d4edf8ea43dd3fed61c2456
6
+ metadata.gz: 34d53b4881babc3d66f6cabc6da513f9cf04fa46651ff6ef0e2e9ac3221abaec1145c1dbfa2c5820c46da891db63b1bb1a35be3a7629c8d3855034517671b412
7
+ data.tar.gz: d65f6a09b2ed8aaa99755a8f5a8bed5e117fa85ac0af9be6e494b13e77bca39add26b21b74e36dc6b89d8264a0aeb87d10708ed014a47aec502011385c81b540
data/config/default.yml CHANGED
@@ -6,6 +6,10 @@ Cask/NoDslVersion:
6
6
  Description: 'Do not use the deprecated DSL version syntax in your cask header.'
7
7
  Enabled: true
8
8
 
9
+ Cask/HomepageMatchesUrl:
10
+ Description: 'Ensure that the homepage and url match, otherwise add a comment. More info at https://github.com/caskroom/homebrew-cask/blob/master/doc/cask_language_reference/stanzas/url.md#when-url-and-homepage-hostnames-differ-add-a-comment'
11
+ Enabled: true
12
+
9
13
  Cask/StanzaGrouping:
10
14
  Description: 'Ensure that cask stanzas are grouped correctly. More info at https://github.com/caskroom/homebrew-cask/blob/master/CONTRIBUTING.md#stanza-order'
11
15
  Enabled: true
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module Cask
5
5
  # Version information for the Cask RuboCop plugin.
6
6
  module Version
7
- STRING = '0.7.0'
7
+ STRING = '0.8.0'.freeze
8
8
 
9
9
  def self.gem_version
10
10
  Gem::Version.new(STRING)
@@ -0,0 +1,112 @@
1
+ require 'forwardable'
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module Cask
6
+ # This cop checks that a cask's homepage matches the download url,
7
+ # or if it doesn't, checks if a comment in the form
8
+ # `# example.com was verified as official when first introduced to the cask`
9
+ # is present.
10
+ class HomepageMatchesUrl < Cop
11
+ extend Forwardable
12
+ include CaskHelp
13
+
14
+ MSG_NO_MATCH = '`%s` does not match `%s`'.freeze
15
+
16
+ MSG_MISSING = '`%s` does not match `%s`, a comment in the form of ' \
17
+ '`# example.com was verified as official when first ' \
18
+ 'introduced to the cask` has to be added above the ' \
19
+ '`url` stanza'.freeze
20
+
21
+ MSG_UNNECESSARY = '`%s` matches `%s`, the comment above the `url` ' \
22
+ 'stanza is unnecessary'.freeze
23
+
24
+ def on_cask(cask_block)
25
+ @cask_block = cask_block
26
+ add_offenses
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :cask_block
32
+ def_delegators :cask_block, :cask_node, :toplevel_stanzas,
33
+ :sorted_toplevel_stanzas
34
+
35
+ def add_offenses
36
+ toplevel_stanzas.select(&:url?).each do |url|
37
+ if url_match_homepage?(url)
38
+ next unless comment?(url)
39
+ add_offense_unnecessary_comment(url)
40
+ elsif !comment?(url)
41
+ add_offense_missing_comment(url)
42
+ elsif !comment_matches_url?(url)
43
+ add_offense_no_match(url)
44
+ end
45
+ end
46
+ end
47
+
48
+ def add_offense_missing_comment(stanza)
49
+ range = stanza.source_range
50
+ add_offense(range, range, format(MSG_MISSING, url(stanza), homepage))
51
+ end
52
+
53
+ def add_offense_unnecessary_comment(stanza)
54
+ comment = comment(stanza).loc.expression
55
+ add_offense(comment,
56
+ comment,
57
+ format(MSG_UNNECESSARY, url(stanza), homepage))
58
+ end
59
+
60
+ def add_offense_no_match(stanza)
61
+ comment = comment(stanza).loc.expression
62
+ add_offense(comment,
63
+ comment,
64
+ format(MSG_NO_MATCH, url_from_comment(stanza), url(stanza)))
65
+ end
66
+
67
+ def comment?(stanza)
68
+ !stanza.comments.empty?
69
+ end
70
+
71
+ def comment(stanza)
72
+ stanza.comments.last
73
+ end
74
+
75
+ def url_from_comment(stanza)
76
+ comment(stanza).text
77
+ .sub(/.*# ([^ ]*) was verified as official when first introduced to the cask$/, '\1')
78
+ end
79
+
80
+ def comment_matches_url?(stanza)
81
+ url(stanza).include?(url_from_comment(stanza))
82
+ end
83
+
84
+ def strip_http(url)
85
+ url.sub(%r{^.*://(?=www\.)?}, '')
86
+ end
87
+
88
+ def extract_stanza(stanza)
89
+ stanza.source
90
+ .sub(/#{stanza.stanza_name} \'(.*)\'/, '\1')
91
+ .sub(/#{stanza.stanza_name} \"(.*)\"/, '\1')
92
+ end
93
+
94
+ def domain(url)
95
+ strip_http(url).gsub(%r{^([^/]+).*}, '\1')
96
+ end
97
+
98
+ def url_match_homepage?(url)
99
+ url(url).include?(homepage)
100
+ end
101
+
102
+ def url(stanza)
103
+ domain(extract_stanza(stanza))
104
+ end
105
+
106
+ def homepage
107
+ url(toplevel_stanzas.find(&:homepage?))
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -19,7 +19,7 @@ module RuboCop
19
19
  extend Forwardable
20
20
  include CaskHelp
21
21
 
22
- MESSAGE = 'Use `%s` instead of `%s`'
22
+ MESSAGE = 'Use `%s` instead of `%s`'.freeze
23
23
 
24
24
  def on_cask(cask_block)
25
25
  @cask_header = cask_block.header
@@ -11,10 +11,10 @@ module RuboCop
11
11
  include CaskHelp
12
12
 
13
13
  MISSING_LINE_MSG = 'stanza groups should be separated by a single ' \
14
- 'empty line'
14
+ 'empty line'.freeze
15
15
 
16
16
  EXTRA_LINE_MSG = 'stanzas within the same group should have no lines ' \
17
- 'between them'
17
+ 'between them'.freeze
18
18
 
19
19
  def on_cask(cask_block)
20
20
  @cask_block = cask_block
@@ -10,7 +10,7 @@ module RuboCop
10
10
  extend Forwardable
11
11
  include CaskHelp
12
12
 
13
- MESSAGE = '`%s` stanza out of order'
13
+ MESSAGE = '`%s` stanza out of order'.freeze
14
14
 
15
15
  def on_cask(cask_block)
16
16
  @cask_block = cask_block
data/lib/rubocop-cask.rb CHANGED
@@ -12,6 +12,7 @@ require 'rubocop/cask/inject'
12
12
  RuboCop::Cask::Inject.defaults!
13
13
 
14
14
  require 'rubocop/cop/cask/mixin/cask_help'
15
+ require 'rubocop/cop/cask/homepage_matches_url'
15
16
  require 'rubocop/cop/cask/no_dsl_version'
16
17
  require 'rubocop/cop/cask/stanza_order'
17
18
  require 'rubocop/cop/cask/stanza_grouping'
@@ -0,0 +1,118 @@
1
+ describe RuboCop::Cop::Cask::HomepageMatchesUrl do
2
+ include CopSharedExamples
3
+
4
+ subject(:cop) { described_class.new }
5
+ let(:missing_line_msg) do
6
+ 'stanza groups should be separated by a single empty line'
7
+ end
8
+ let(:extra_line_msg) do
9
+ 'stanzas within the same group should have no lines between them'
10
+ end
11
+
12
+ context 'when the url matches the homepage' do
13
+ context 'and there is no comment' do
14
+ let(:source) do
15
+ <<-CASK.undent
16
+ cask 'foo' do
17
+ url 'https://foo.example.com/foo.zip'
18
+ homepage 'https://foo.example.com'
19
+ end
20
+ CASK
21
+ end
22
+
23
+ include_examples 'does not report any offenses'
24
+ end
25
+
26
+ context 'but there is a comment' do
27
+ let(:source) do
28
+ <<-CASK.undent
29
+ cask 'foo' do
30
+ # foo.example.com was verified as official when first introduced to the cask
31
+ url 'https://foo.example.com/foo.zip'
32
+ homepage 'https://foo.example.com'
33
+ end
34
+ CASK
35
+ end
36
+ let(:expected_offenses) do
37
+ [{
38
+ message: '`foo.example.com` matches `foo.example.com`, ' \
39
+ 'the comment above the `url` stanza is unnecessary',
40
+ severity: :convention,
41
+ line: 2,
42
+ column: 2,
43
+ source: '# foo.example.com was verified as official when ' \
44
+ 'first introduced to the cask'
45
+ }]
46
+ end
47
+
48
+ include_examples 'reports offenses'
49
+ end
50
+ end
51
+
52
+ context 'when the url does not match the homepage' do
53
+ context 'and there is a comment' do
54
+ context 'which matches the url' do
55
+ let(:source) do
56
+ <<-CASK.undent
57
+ cask 'foo' do
58
+ # example.com was verified as official when first introduced to the cask
59
+ url 'https://example.com/foo.zip'
60
+ homepage 'https://foo.example.com'
61
+ end
62
+ CASK
63
+ end
64
+
65
+ include_examples 'does not report any offenses'
66
+ end
67
+
68
+ context 'which does not match the url' do
69
+ let(:source) do
70
+ <<-CASK.undent
71
+ cask 'foo' do
72
+ # example.org was verified as official when first introduced to the cask
73
+ url 'https://example.com/foo.zip'
74
+ homepage 'https://foo.example.com'
75
+ end
76
+ CASK
77
+ end
78
+ let(:expected_offenses) do
79
+ [{
80
+ message: '`example.org` does not match `example.com`',
81
+ severity: :convention,
82
+ line: 2,
83
+ column: 2,
84
+ source: '# example.org was verified as official when ' \
85
+ 'first introduced to the cask'
86
+ }]
87
+ end
88
+
89
+ include_examples 'reports offenses'
90
+ end
91
+ end
92
+
93
+ context 'but the comment is missing' do
94
+ let(:source) do
95
+ <<-CASK.undent
96
+ cask 'foo' do
97
+ url 'https://example.com/foo.zip'
98
+ homepage 'https://foo.example.com'
99
+ end
100
+ CASK
101
+ end
102
+ let(:expected_offenses) do
103
+ [{
104
+ message: '`example.com` does not match `foo.example.com`, a ' \
105
+ 'comment in the form of `# example.com was verified as ' \
106
+ 'official when first introduced to the cask` has to be ' \
107
+ 'added above the `url` stanza',
108
+ severity: :convention,
109
+ line: 2,
110
+ column: 2,
111
+ source: "url 'https://example.com/foo.zip'"
112
+ }]
113
+ end
114
+
115
+ include_examples 'reports offenses'
116
+ end
117
+ end
118
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-cask
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Hagins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-30 00:00:00.000000000 Z
11
+ date: 2016-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -61,11 +61,13 @@ files:
61
61
  - lib/rubocop/cask/extend/string.rb
62
62
  - lib/rubocop/cask/inject.rb
63
63
  - lib/rubocop/cask/version.rb
64
+ - lib/rubocop/cop/cask/homepage_matches_url.rb
64
65
  - lib/rubocop/cop/cask/mixin/cask_help.rb
65
66
  - lib/rubocop/cop/cask/no_dsl_version.rb
66
67
  - lib/rubocop/cop/cask/stanza_grouping.rb
67
68
  - lib/rubocop/cop/cask/stanza_order.rb
68
69
  - spec/project_spec.rb
70
+ - spec/rubocop/cop/cask/homepage_matches_url_spec.rb
69
71
  - spec/rubocop/cop/cask/no_dsl_version_spec.rb
70
72
  - spec/rubocop/cop/cask/stanza_grouping_spec.rb
71
73
  - spec/rubocop/cop/cask/stanza_order_spec.rb
@@ -97,6 +99,7 @@ specification_version: 4
97
99
  summary: Code style checking for Homebrew-Cask files
98
100
  test_files:
99
101
  - spec/project_spec.rb
102
+ - spec/rubocop/cop/cask/homepage_matches_url_spec.rb
100
103
  - spec/rubocop/cop/cask/no_dsl_version_spec.rb
101
104
  - spec/rubocop/cop/cask/stanza_grouping_spec.rb
102
105
  - spec/rubocop/cop/cask/stanza_order_spec.rb