danger-changelog 0.2.0 → 0.2.1

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
  SHA1:
3
- metadata.gz: 9d4fe77b8ef69e2c21ec85e896c0fcdb147360ee
4
- data.tar.gz: 3fb652c91f7e792e0c5b9c66386ced70052fd9d5
3
+ metadata.gz: 62a09a0c16544a38bdb2f23068ddb753f1a24703
4
+ data.tar.gz: 077e72cdb5c66ce5d29643b032e06ba438547a16
5
5
  SHA512:
6
- metadata.gz: e6d4bdd5279313f49fd325e74995e0dc38495685cd71fb39bdfe4b70de98a25a7c0038ea37d1ca4737c8ee6818551f1d8bca06069f5d092e7405afaf30d99227
7
- data.tar.gz: 429d0875a41ad68e6dfcc289ac9c98031f6c0104f49ac1e2238798e9e554284641a2d4b9f31cc35c480f6af133c81edf6bdf28686dba378b7ac11c7b81d704f2
6
+ metadata.gz: 414bd4bb565ccf6600026349257d196535085eaa323720684c829096a1ee212bb4ca85c929f7260ddf040154dc5535aee90a9da9399b8a66cde9d4bd14d333f6
7
+ data.tar.gz: 434139ee0112b04ff2696113f71750f116010a7d29b70b72ae0217399fb063b659f2f2156300e2cd1c8abf8170bd7becaa3c97bf2919e993d2a301fa0a717085
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## Changelog
2
2
 
3
+ ### 0.2.1 (12/04/2016)
4
+
5
+ * [#17](https://github.com/dblock/danger-changelog/pull/17): Fix: handle CHANGELOG lines that mistakenly start with a symbol other than * - [@antondomashnev](https://github.com/antondomashnev).
6
+ * [#19](https://github.com/dblock/danger-changelog/pull/19): Added: RELEASING.md document to formalize the process - [@antondomashnev](https://github.com/antondomashnev).
7
+ * [#20](https://github.com/dblock/danger-changelog/pull/20): Fix: flag extra period and column in CHANGELOG - [@antondomashnev](https://github.com/antondomashnev).
8
+
3
9
  ### 0.2.0 (11/21/2016)
4
10
 
5
11
  * [#13](https://github.com/dblock/danger-changelog/pull/13): Fix: suggested CHANGELOG entry may not be of correct format - [@dblock](https://github.com/dblock).
data/RELEASING.md ADDED
@@ -0,0 +1,67 @@
1
+ # Releasing Danger-Changelog
2
+
3
+ There're no hard rules about when to release danger-changelog. Release bug fixes frequently, features not so frequently and breaking API changes rarely.
4
+
5
+ ### Release
6
+
7
+ Install bundle, run tests, check that all tests succeed locally.
8
+
9
+ ```
10
+ bundle install
11
+ rake
12
+ ```
13
+
14
+ Check that the last build succeeded in [Travis CI](https://travis-ci.org/dblock/danger-changelog) for all supported platforms.
15
+
16
+ Increment the version, modify [lib/changelog/gem_version.rb](lib/changelog/gem_version.rb).
17
+
18
+ Following the [Semantic Versioning](http://semver.org/):
19
+ * Increment the third number if the release has bug fixes and/or very minor features with backward compatibility, only (eg. change `0.2.1` to `0.2.2`).
20
+ * Increment the second number if the release contains major features or breaking API changes (eg. change `0.2.1` to `0.3.0`).
21
+
22
+ Create a new version and mark it as Next in [CHANGELOG.md](CHANGELOG.md).
23
+
24
+ ```
25
+ ### 0.2.2 (12/03/2016)
26
+ ```
27
+
28
+ Remove the line with "* Your contribution here.", since there will be no more contributions to this release.
29
+
30
+ Commit your changes.
31
+
32
+ ```
33
+ git add CHANGELOG.md lib/changelog/gem_version.rb
34
+ git commit -m "Preparing for release 0.2.2."
35
+ git push origin master
36
+ ```
37
+
38
+ Release.
39
+
40
+ ```
41
+ $ rake release
42
+
43
+ danger-changelog 0.2.2 built to pkg/danger-changelog-0.2.2.gem.
44
+ Tagged v0.2.2.
45
+ Pushed git commits and tags.
46
+ Pushed danger-changelog 0.2.2 to rubygems.org.
47
+ ```
48
+
49
+ ### Prepare for the Next Version
50
+
51
+ Add the next release to [CHANGELOG.md](CHANGELOG.md).
52
+
53
+ ```
54
+ ### 0.2.3 (Next)
55
+
56
+ * Your contribution here.
57
+ ```
58
+
59
+ Increment the third version number in [lib/changelog/gem_version.rb](lib/changelog/gem_version.rb).
60
+
61
+ Commit your changes.
62
+
63
+ ```
64
+ git add CHANGELOG.md lib/slack/version.rb
65
+ git commit -m "Preparing for next development iteration, 0.2.3."
66
+ git push origin master
67
+ ```
@@ -38,15 +38,20 @@ module Danger
38
38
  @your_contribution_here = false
39
39
  @bad_lines = []
40
40
  File.open(filename).each_line do |line|
41
- # ignore lines that aren't changes
42
- next unless line[0] == '*'
41
+ next if line.strip.empty?
42
+
43
+ changelog_line = ChangelogLineParser.parse(line)
44
+
45
+ if changelog_line.nil? || changelog_line.invalid?
46
+ @bad_lines << line
47
+ next
48
+ end
49
+
43
50
  # notice your contribution here
44
- if line == "* Your contribution here.\n"
51
+ if changelog_line.is_a?(ChangelogPlaceholderLine)
45
52
  @your_contribution_here = true
46
53
  next
47
54
  end
48
- next if Danger::Changelog::ChangelogLine.valid?(line)
49
- @bad_lines << line
50
55
  end
51
56
  end
52
57
  end
@@ -0,0 +1,59 @@
1
+ require 'changelog/changelog_line/changelog_line'
2
+
3
+ module Danger
4
+ module Changelog
5
+ # A CHANGELOG.md line represents the change entry.
6
+ class ChangelogEntryLine < ChangelogLine
7
+ def valid?
8
+ return true if line =~ %r{^\*\s[\`[:upper:]].*[^.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$}
9
+ return true if line =~ %r{^\*\s\[\#\d+\]\(https:\/\/github\.com\/.*\d+\)\: [\`[:upper:]].*[^.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$}
10
+ false
11
+ end
12
+
13
+ def self.validates_as_changelog_line?(line)
14
+ matched_rules_count = 0
15
+ matched_rules_count += 1 if starts_with_star?(line)
16
+ matched_rules_count += 1 if with_pr_link?(line)
17
+ matched_rules_count += 1 if with_changelog_description?(line)
18
+ matched_rules_count += 1 if with_author_link?(line)
19
+ matched_rules_count >= 2
20
+ end
21
+
22
+ # provide an example of a CHANGELOG line based on a commit message
23
+ def self.example(github)
24
+ pr_number = github.pr_json['number']
25
+ pr_url = github.pr_json['html_url']
26
+ pr_title = github.pr_title
27
+ .sub(/[?.!,;]?$/, '')
28
+ .capitalize
29
+ pr_author = github.pr_author
30
+ pr_author_url = "https://github.com/#{github.pr_author}"
31
+ "* [##{pr_number}](#{pr_url}): #{pr_title} - [@#{pr_author}](#{pr_author_url})."
32
+ end
33
+
34
+ # checks whether line starts with *
35
+ def self.starts_with_star?(line)
36
+ return true if line =~ /^\*\s/
37
+ false
38
+ end
39
+
40
+ # checks whether line contains a MARKDOWN link to a PR
41
+ def self.with_pr_link?(line)
42
+ return true if line =~ %r{\[\#\d+\]\(http[s]?:\/\/github\.com\/.*\d+[\/]?\)}
43
+ false
44
+ end
45
+
46
+ # checks whether line contains a capitalized Text, treated as a description
47
+ def self.with_changelog_description?(line)
48
+ return true if line =~ /[\`[:upper:]].*/
49
+ false
50
+ end
51
+
52
+ # checks whether line contains a MARKDOWN link to an author
53
+ def self.with_author_link?(line)
54
+ return true if line =~ %r{\[\@[\w\d\-\_]+\]\(http[s]?:\/\/github\.com\/.*[\w\d\-\_]+[\/]?\)}
55
+ false
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,15 @@
1
+ module Danger
2
+ module Changelog
3
+ # A CHANGELOG.md line represents the version header.
4
+ class ChangelogHeaderLine < ChangelogLine
5
+ def valid?
6
+ ChangelogHeaderLine.validates_as_changelog_line?(line)
7
+ end
8
+
9
+ def self.validates_as_changelog_line?(line)
10
+ return true if line =~ /^\#{1,4}\s.+/
11
+ false
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,27 @@
1
+ module Danger
2
+ module Changelog
3
+ # An abstract CHANGELOG.md line.
4
+ class ChangelogLine
5
+ attr_accessor :line
6
+
7
+ def initialize(line)
8
+ self.line = line
9
+ end
10
+
11
+ # Match the line with the validation rules
12
+ def valid?
13
+ raise 'ChangelogLine subclass must implement the valid? method'
14
+ end
15
+
16
+ # Match the line with the validation rules opposite to valid?
17
+ def invalid?
18
+ !valid?
19
+ end
20
+
21
+ # Match the given line if it potentially represents the specific changelog line
22
+ def self.validates_as_changelog_line?(_line)
23
+ abort "You need to include a function for #{self} for validates_as_changelog_line?"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ require 'changelog/changelog_line/changelog_entry_line'
2
+ require 'changelog/changelog_line/changelog_header_line'
3
+ require 'changelog/changelog_line/changelog_placeholder_line'
4
+
5
+ module Danger
6
+ module Changelog
7
+ # A parser of the CHANGELOG.md lines
8
+ class ChangelogLineParser
9
+ # Returns an instance of Changelog::ChangelogLine class based on the given line
10
+ def self.parse(line)
11
+ changelog_line_class = available_changelog_lines.find do |changelog_line|
12
+ changelog_line.validates_as_changelog_line?(line)
13
+ end
14
+ return nil unless changelog_line_class
15
+ changelog_line_class.new(line)
16
+ end
17
+
18
+ private_class_method
19
+
20
+ def self.available_changelog_lines
21
+ # Order is important
22
+ [ChangelogPlaceholderLine, ChangelogEntryLine, ChangelogHeaderLine]
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ module Danger
2
+ module Changelog
3
+ # A CHANGELOG.md line represents the "Your contribution here".
4
+ class ChangelogPlaceholderLine < ChangelogLine
5
+ def valid?
6
+ ChangelogPlaceholderLine.validates_as_changelog_line?(line)
7
+ end
8
+
9
+ def self.validates_as_changelog_line?(line)
10
+ return true if line == "* Your contribution here.\n"
11
+ false
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module Changelog
2
- VERSION = '0.2.0'.freeze
2
+ VERSION = '0.2.1'.freeze
3
3
  end
@@ -48,7 +48,7 @@ module Danger
48
48
  Here's an example of a #{filename} entry:
49
49
 
50
50
  ```markdown
51
- #{Danger::Changelog::ChangelogLine.example(github)}
51
+ #{Danger::Changelog::ChangelogEntryLine.example(github)}
52
52
  ```
53
53
  MARKDOWN
54
54
  warn "Unless you're refactoring existing code, please update #{filename}.", sticky: false
data/lib/danger_plugin.rb CHANGED
@@ -1,3 +1,7 @@
1
- require 'changelog/changelog_line'
1
+ require 'changelog/changelog_line/changelog_entry_line'
2
+ require 'changelog/changelog_line/changelog_header_line'
3
+ require 'changelog/changelog_line/changelog_line_parser'
4
+ require 'changelog/changelog_line/changelog_placeholder_line'
5
+ require 'changelog/changelog_line/changelog_line'
2
6
  require 'changelog/changelog_file'
3
7
  require 'changelog/plugin'
@@ -0,0 +1,168 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe Danger::Changelog::ChangelogEntryLine do
4
+ context 'changelog line' do
5
+ it 'validates as changelog line' do
6
+ expect(described_class.validates_as_changelog_line?('* Valid without PR link - [@dblock](https://github.com/dblock).')).to be true
7
+ expect(described_class.validates_as_changelog_line?('* [#1](https://github.com/dblock/danger-changelog/pull/1): Valid with PR link - [@dblock](https://github.com/dblock).')).to be true
8
+ expect(described_class.validates_as_changelog_line?('Missing star - [@dblock](https://github.com/dblock).')).to be true
9
+ expect(described_class.validates_as_changelog_line?('* [#1](https://github.com/dblock/danger-changelog/pull/1) - Not a colon - [@dblock](https://github.com/dblock).')).to be true
10
+ expect(described_class.validates_as_changelog_line?('* [#1](https://github.com/dblock/danger-changelog/pull/1): No dash [@dblock](https://github.com/dblock).')).to be true
11
+ expect(described_class.validates_as_changelog_line?('* [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)')).to be true
12
+ expect(described_class.validates_as_changelog_line?('* [#1](https://github.com/dblock/danger-changelog/pull/1): No name.')).to be true
13
+ expect(described_class.validates_as_changelog_line?('* [#1](https://github.com/dblock/danger-changelog/pull/1): No https in github - [@dblock](http://github.com/dblock).')).to be true
14
+ expect(described_class.validates_as_changelog_line?('* [#1](https://github.com/dblock/danger-changelog/pull/1): Extra trailing slash - [@dblock](https://github.com/dblock/).')).to be true
15
+ expect(described_class.validates_as_changelog_line?('# [#1](https://github.com/dblock/danger-changelog/pull/1): Hash instead of star - [@dblock](https://github.com/dblock).')).to be true
16
+ end
17
+
18
+ it 'doesnt validate as changelog line' do
19
+ expect(described_class.validates_as_changelog_line?('Missing star, PR and author link.')).to be false
20
+ expect(described_class.validates_as_changelog_line?('* ')).to be false
21
+ expect(described_class.validates_as_changelog_line?('[@dblock](https://github.com/dblock).')).to be false
22
+ expect(described_class.validates_as_changelog_line?(' - [@dblock](https://github.com/dblock).')).to be false
23
+ expect(described_class.validates_as_changelog_line?('[#1](https://github.com/dblock/danger-changelog/pull/1).')).to be false
24
+ expect(described_class.validates_as_changelog_line?('[#1](https://github.com/dblock/danger-changelog/pull/1): ')).to be false
25
+ end
26
+ end
27
+
28
+ context 'changelog entry line' do
29
+ context 'when without PR link' do
30
+ subject { Danger::Changelog::ChangelogEntryLine.new('* Valid without PR link - [@antondomashnev](https://github.com/antondomashnev).') }
31
+
32
+ it 'is valid' do
33
+ expect(subject.valid?).to be true
34
+ end
35
+ end
36
+
37
+ context 'when with PR link' do
38
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): Valid with PR link - [@dblock](https://github.com/dblock).') }
39
+
40
+ it 'is valid' do
41
+ expect(subject.valid?).to be true
42
+ end
43
+ end
44
+
45
+ context 'when missing star' do
46
+ subject { Danger::Changelog::ChangelogEntryLine.new('Missing star - [@dblock](https://github.com/dblock).') }
47
+
48
+ it 'is invalid' do
49
+ expect(subject.invalid?).to be true
50
+ end
51
+ end
52
+
53
+ context 'when not a colon' do
54
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1) - Not a colon - [@dblock](https://github.com/dblock).') }
55
+
56
+ it 'is invalid' do
57
+ expect(subject.invalid?).to be true
58
+ end
59
+ end
60
+
61
+ context 'when no dash' do
62
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): No dash [@dblock](https://github.com/dblock).') }
63
+
64
+ it 'is invalid' do
65
+ expect(subject.invalid?).to be true
66
+ end
67
+ end
68
+
69
+ context 'when no final period' do
70
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)') }
71
+
72
+ it 'is invalid' do
73
+ expect(subject.invalid?).to be true
74
+ end
75
+ end
76
+
77
+ context 'when no name' do
78
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): No name.') }
79
+
80
+ it 'is invalid' do
81
+ expect(subject.invalid?).to be true
82
+ end
83
+ end
84
+
85
+ context 'when no https in GitHub' do
86
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): No https in github - [@dblock](http://github.com/dblock).') }
87
+
88
+ it 'is invalid' do
89
+ expect(subject.invalid?).to be true
90
+ end
91
+ end
92
+
93
+ context 'when extra trailing slash' do
94
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): Extra trailing slash - [@dblock](https://github.com/dblock/).') }
95
+
96
+ it 'is invalid' do
97
+ expect(subject.invalid?).to be true
98
+ end
99
+ end
100
+
101
+ context 'when extra period' do
102
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): Extra period. - [@dblock](https://github.com/dblock).') }
103
+
104
+ it 'is invalid' do
105
+ expect(subject.invalid?).to be true
106
+ end
107
+ end
108
+
109
+ context 'when extra colon' do
110
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): Extra colon, - [@dblock](https://github.com/dblock).') }
111
+
112
+ it 'is invalid' do
113
+ expect(subject.invalid?).to be true
114
+ end
115
+ end
116
+
117
+ context 'when extra hash' do
118
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): With # - [@dblock](https://github.com/dblock).') }
119
+
120
+ it 'is valid' do
121
+ expect(subject.valid?).to be true
122
+ end
123
+ end
124
+
125
+ context 'when with question mark' do
126
+ subject { Danger::Changelog::ChangelogEntryLine.new('* [#1](https://github.com/dblock/danger-changelog/pull/1): With ? - [@dblock](https://github.com/dblock).') }
127
+
128
+ it 'is valid' do
129
+ expect(subject.valid?).to be true
130
+ end
131
+ end
132
+
133
+ context 'when hash instead of star' do
134
+ subject { Danger::Changelog::ChangelogEntryLine.new('# [#1](https://github.com/dblock/danger-changelog/pull/1): Hash instead of star - [@dblock](https://github.com/dblock).') }
135
+
136
+ it 'is invalid' do
137
+ expect(subject.invalid?).to be true
138
+ end
139
+ end
140
+ end
141
+
142
+ context 'example' do
143
+ let(:github) do
144
+ double(Danger::RequestSources::GitHub,
145
+ pr_json: { 'number' => 123, 'html_url' => 'https://github.com/dblock/danger-changelog/pull/123' },
146
+ pr_author: 'dblock',
147
+ pr_title: pr_title)
148
+ end
149
+ context 'no transformation required' do
150
+ let(:pr_title) { 'Test' }
151
+ it 'uses title as is' do
152
+ expect(described_class.example(github)).to eq '* [#123](https://github.com/dblock/danger-changelog/pull/123): Test - [@dblock](https://github.com/dblock).'
153
+ end
154
+ end
155
+ context 'with lowercase title' do
156
+ let(:pr_title) { 'test' }
157
+ it 'capitalizes it' do
158
+ expect(described_class.example(github)).to eq '* [#123](https://github.com/dblock/danger-changelog/pull/123): Test - [@dblock](https://github.com/dblock).'
159
+ end
160
+ end
161
+ context 'with a trailing period' do
162
+ let(:pr_title) { 'Test.' }
163
+ it 'removes it' do
164
+ expect(described_class.example(github)).to eq '* [#123](https://github.com/dblock/danger-changelog/pull/123): Test - [@dblock](https://github.com/dblock).'
165
+ end
166
+ end
167
+ end
168
+ end
@@ -42,13 +42,16 @@ describe Danger::Changelog::ChangelogFile do
42
42
  end
43
43
  context 'with bad lines' do
44
44
  let(:filename) { File.expand_path('../fixtures/changelogs/with_bad_lines.md', __FILE__) }
45
- it 'is not valid' do
45
+ it 'is invalid' do
46
46
  expect(subject.bad_lines?).to be true
47
47
  end
48
48
  it 'reports all bad lines' do
49
49
  expect(subject.bad_lines).to eq [
50
+ "Missing star - [@dblock](https://github.com/dblock).\n",
50
51
  "* [#1](https://github.com/dblock/danger-changelog/pull/1) - Not a colon - [@dblock](https://github.com/dblock).\n",
51
- "* [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)\n"
52
+ "* [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)\n",
53
+ "# [#1](https://github.com/dblock/danger-changelog/pull/1): Hash instead of star - [@dblock](https://github.com/dblock).\n",
54
+ "* [#1](https://github.com/dblock/danger-changelog/pull/1): Extra period. - [@dblock](https://github.com/dblock).\n"
52
55
  ]
53
56
  end
54
57
  it 'has your contribution here' do
@@ -0,0 +1,104 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe Danger::Changelog::ChangelogHeaderLine do
4
+ context 'changelog line' do
5
+ it 'validates as changelog line' do
6
+ expect(described_class.validates_as_changelog_line?('# 1.0.1')).to be true
7
+ expect(described_class.validates_as_changelog_line?('## Version 1.0.1')).to be true
8
+ expect(described_class.validates_as_changelog_line?('### Lollypop')).to be true
9
+ expect(described_class.validates_as_changelog_line?('#### Four hashes is too much')).to be true
10
+ end
11
+
12
+ it 'doesnt validate as changelog line' do
13
+ expect(described_class.validates_as_changelog_line?('* Star is invalid.')).to be false
14
+ expect(described_class.validates_as_changelog_line?('It requires a hash symbol')).to be false
15
+ expect(described_class.validates_as_changelog_line?('1.1.1')).to be false
16
+ expect(described_class.validates_as_changelog_line?('Version 2.0.1')).to be false
17
+ expect(described_class.validates_as_changelog_line?('#')).to be false
18
+ expect(described_class.validates_as_changelog_line?('## ')).to be false
19
+ expect(described_class.validates_as_changelog_line?('##### I can not validate five')).to be false
20
+ end
21
+ end
22
+
23
+ context 'changelog header line' do
24
+ context 'when one hash symbol' do
25
+ subject { Danger::Changelog::ChangelogHeaderLine.new('# 1.0.1') }
26
+
27
+ it 'is valid' do
28
+ expect(subject.valid?).to be true
29
+ end
30
+ end
31
+
32
+ context 'when two hash symbols' do
33
+ subject { Danger::Changelog::ChangelogHeaderLine.new('## Version 1.0.1') }
34
+
35
+ it 'is valid' do
36
+ expect(subject.valid?).to be true
37
+ end
38
+ end
39
+
40
+ context 'when three hash symbols' do
41
+ subject { Danger::Changelog::ChangelogHeaderLine.new('### Lollypop') }
42
+
43
+ it 'is valid' do
44
+ expect(subject.valid?).to be true
45
+ end
46
+ end
47
+
48
+ context 'when four hash symbols' do
49
+ subject { Danger::Changelog::ChangelogHeaderLine.new('#### Four hashes is too much') }
50
+
51
+ it 'is valid' do
52
+ expect(subject.valid?).to be true
53
+ end
54
+ end
55
+
56
+ context 'when no hash symbol' do
57
+ subject { Danger::Changelog::ChangelogHeaderLine.new('* Star is invalid.') }
58
+
59
+ it 'is invalid' do
60
+ expect(subject.invalid?).to be true
61
+ end
62
+ end
63
+
64
+ context 'when star instead of hash symbol' do
65
+ subject { Danger::Changelog::ChangelogHeaderLine.new('* Star is invalid.') }
66
+
67
+ it 'is invalid' do
68
+ expect(subject.invalid?).to be true
69
+ end
70
+ end
71
+
72
+ context 'when no hash symbol' do
73
+ subject { Danger::Changelog::ChangelogHeaderLine.new('It requires hash symbol.') }
74
+
75
+ it 'is invalid' do
76
+ expect(subject.invalid?).to be true
77
+ end
78
+ end
79
+
80
+ context 'when hash symbol without space' do
81
+ subject { Danger::Changelog::ChangelogHeaderLine.new('###Lollypop') }
82
+
83
+ it 'is invalid' do
84
+ expect(subject.invalid?).to be true
85
+ end
86
+ end
87
+
88
+ context 'when hash symbol without header title' do
89
+ subject { Danger::Changelog::ChangelogHeaderLine.new('### ') }
90
+
91
+ it 'is invalid' do
92
+ expect(subject.invalid?).to be true
93
+ end
94
+ end
95
+
96
+ context 'when five hash symbols' do
97
+ subject { Danger::Changelog::ChangelogHeaderLine.new('##### Tooooo much') }
98
+
99
+ it 'is invalid' do
100
+ expect(subject.invalid?).to be true
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,57 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe Danger::Changelog::ChangelogLineParser do
4
+ context 'parse' do
5
+ context 'changelog entry line' do
6
+ context 'when valid' do
7
+ let(:line) { '* [#123](https://github.com/dblock/danger-changelog/pull/123): Test - [@dblock](https://github.com/dblock).' }
8
+ it 'returns ChangelogEntryLine' do
9
+ expect(described_class.parse(line)).to be_a(Danger::Changelog::ChangelogEntryLine)
10
+ end
11
+ end
12
+
13
+ context 'when invalid' do
14
+ it 'returns ChangelogEntryLine' do
15
+ expect(described_class.parse('Missing star - [@dblock](https://github.com/dblock).')).to be_a(Danger::Changelog::ChangelogEntryLine)
16
+ expect(described_class.parse('* [#1](https://github.com/dblock/danger-changelog/pull/1) - Not a colon - [@dblock](https://github.com/dblock).')).to be_a(Danger::Changelog::ChangelogEntryLine)
17
+ expect(described_class.parse('* [#1](https://github.com/dblock/danger-changelog/pull/1): No dash [@dblock](https://github.com/dblock).')).to be_a(Danger::Changelog::ChangelogEntryLine)
18
+ expect(described_class.parse('* [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)')).to be_a(Danger::Changelog::ChangelogEntryLine)
19
+ expect(described_class.parse('* [#1](https://github.com/dblock/danger-changelog/pull/1): No name.')).to be_a(Danger::Changelog::ChangelogEntryLine)
20
+ expect(described_class.parse('* [#1](https://github.com/dblock/danger-changelog/pull/1): No https in github - [@dblock](http://github.com/dblock).')).to be_a(Danger::Changelog::ChangelogEntryLine)
21
+ expect(described_class.parse('* [#1](https://github.com/dblock/danger-changelog/pull/1): Extra trailing slash - [@dblock](https://github.com/dblock/).')).to be_a(Danger::Changelog::ChangelogEntryLine)
22
+ expect(described_class.parse('# [#1](https://github.com/dblock/danger-changelog/pull/1): Hash instead of star - [@dblock](https://github.com/dblock).')).to be_a(Danger::Changelog::ChangelogEntryLine)
23
+ end
24
+ end
25
+ end
26
+
27
+ context 'changelog your contribution here line' do
28
+ let(:line) { "* Your contribution here.\n" }
29
+ it 'returns ChangelogPlaceholderLine' do
30
+ expect(described_class.parse(line)).to be_a(Danger::Changelog::ChangelogPlaceholderLine)
31
+ end
32
+ end
33
+
34
+ context 'changelog header line' do
35
+ context 'when one hash' do
36
+ let(:line) { '# Version 1.1.1' }
37
+ it 'returns ChangelogHeaderLine' do
38
+ expect(described_class.parse(line)).to be_a(Danger::Changelog::ChangelogHeaderLine)
39
+ end
40
+ end
41
+
42
+ context 'when two hashes' do
43
+ let(:line) { '## Version 1.1.1' }
44
+ it 'returns ChangelogHeaderLine' do
45
+ expect(described_class.parse(line)).to be_a(Danger::Changelog::ChangelogHeaderLine)
46
+ end
47
+ end
48
+
49
+ context 'when three hashes' do
50
+ let(:line) { '### Version 1.1.1' }
51
+ it 'returns ChangelogHeaderLine' do
52
+ expect(described_class.parse(line)).to be_a(Danger::Changelog::ChangelogHeaderLine)
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,58 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe Danger::Changelog::ChangelogPlaceholderLine do
4
+ context 'changelog line' do
5
+ it 'validates as changelog line' do
6
+ expect(described_class.validates_as_changelog_line?("* Your contribution here.\n")).to be true
7
+ end
8
+
9
+ it 'doesnt validate as changelog line' do
10
+ expect(described_class.validates_as_changelog_line?('* Your contribution here.')).to be false
11
+ expect(described_class.validates_as_changelog_line?("* Your contribution here\n")).to be false
12
+ expect(described_class.validates_as_changelog_line?("* Put your contribution here.\n")).to be false
13
+ expect(described_class.validates_as_changelog_line?("Your contribution here.\n")).to be false
14
+ end
15
+
16
+ context 'changelog placeholder line' do
17
+ context 'when exactly expected string' do
18
+ subject { Danger::Changelog::ChangelogPlaceholderLine.new("* Your contribution here.\n") }
19
+
20
+ it 'is valid' do
21
+ expect(subject.valid?).to be true
22
+ end
23
+ end
24
+
25
+ context 'when without new line' do
26
+ subject { Danger::Changelog::ChangelogPlaceholderLine.new('* Your contribution here.') }
27
+
28
+ it 'is invalid' do
29
+ expect(subject.invalid?).to be true
30
+ end
31
+ end
32
+
33
+ context 'when no final period' do
34
+ subject { Danger::Changelog::ChangelogPlaceholderLine.new("* Your contribution here\n") }
35
+
36
+ it 'is invalid' do
37
+ expect(subject.invalid?).to be true
38
+ end
39
+ end
40
+
41
+ context 'when text doesnt match' do
42
+ subject { Danger::Changelog::ChangelogPlaceholderLine.new("* Put your contribution here.\n") }
43
+
44
+ it 'is invalid' do
45
+ expect(subject.invalid?).to be true
46
+ end
47
+ end
48
+
49
+ context 'when there is not star' do
50
+ subject { Danger::Changelog::ChangelogPlaceholderLine.new("Your contribution here.\n") }
51
+
52
+ it 'is invalid' do
53
+ expect(subject.invalid?).to be true
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -128,8 +128,11 @@ describe Danger::Changelog do
128
128
  expect(status_report[:errors]).to eq ["One of the lines below found in #{filename} doesn't match the expected format. Please make it look like the other lines, pay attention to periods and spaces."]
129
129
  expect(status_report[:warnings]).to eq []
130
130
  expect(status_report[:markdowns].map(&:message)).to eq [
131
+ "```markdown\nMissing star - [@dblock](https://github.com/dblock).\n```\n",
131
132
  "```markdown\n* [#1](https://github.com/dblock/danger-changelog/pull/1) - Not a colon - [@dblock](https://github.com/dblock).\n```\n",
132
- "```markdown\n* [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)\n```\n"
133
+ "```markdown\n* [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)\n```\n",
134
+ "```markdown\n# [#1](https://github.com/dblock/danger-changelog/pull/1): Hash instead of star - [@dblock](https://github.com/dblock).\n```\n",
135
+ "```markdown\n* [#1](https://github.com/dblock/danger-changelog/pull/1): Extra period. - [@dblock](https://github.com/dblock).\n```\n"
133
136
  ]
134
137
  end
135
138
  end
@@ -3,4 +3,6 @@
3
3
  Missing star - [@dblock](https://github.com/dblock).
4
4
  * [#1](https://github.com/dblock/danger-changelog/pull/1) - Not a colon - [@dblock](https://github.com/dblock).
5
5
  * [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)
6
+ # [#1](https://github.com/dblock/danger-changelog/pull/1): Hash instead of star - [@dblock](https://github.com/dblock).
7
+ * [#1](https://github.com/dblock/danger-changelog/pull/1): Extra period. - [@dblock](https://github.com/dblock).
6
8
  * Your contribution here.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger-changelog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - dblock
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-22 00:00:00.000000000 Z
11
+ date: 2016-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: danger-plugin-api
@@ -169,18 +169,26 @@ files:
169
169
  - Guardfile
170
170
  - LICENSE.txt
171
171
  - README.md
172
+ - RELEASING.md
172
173
  - Rakefile
173
174
  - danger-changelog.gemspec
174
175
  - images/have_you_updated_changelog.png
175
176
  - images/is_changelog_format_correct.png
176
177
  - lib/changelog/changelog_file.rb
177
- - lib/changelog/changelog_line.rb
178
+ - lib/changelog/changelog_line/changelog_entry_line.rb
179
+ - lib/changelog/changelog_line/changelog_header_line.rb
180
+ - lib/changelog/changelog_line/changelog_line.rb
181
+ - lib/changelog/changelog_line/changelog_line_parser.rb
182
+ - lib/changelog/changelog_line/changelog_placeholder_line.rb
178
183
  - lib/changelog/gem_version.rb
179
184
  - lib/changelog/plugin.rb
180
185
  - lib/danger_changelog.rb
181
186
  - lib/danger_plugin.rb
187
+ - spec/changelog_entry_line_spec.rb
182
188
  - spec/changelog_file_spec.rb
183
- - spec/changelog_line_spec.rb
189
+ - spec/changelog_header_line_spec.rb
190
+ - spec/changelog_line_parser_spec.rb
191
+ - spec/changelog_placeholder_line_spec.rb
184
192
  - spec/changelog_spec.rb
185
193
  - spec/fixtures/changelogs/minimal.md
186
194
  - spec/fixtures/changelogs/missing_your_contribution_here.md
@@ -206,13 +214,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
214
  version: '0'
207
215
  requirements: []
208
216
  rubyforge_project:
209
- rubygems_version: 2.6.7
217
+ rubygems_version: 2.5.1
210
218
  signing_key:
211
219
  specification_version: 4
212
220
  summary: A danger.systems plugin that is OCD about your CHANGELOG.
213
221
  test_files:
222
+ - spec/changelog_entry_line_spec.rb
214
223
  - spec/changelog_file_spec.rb
215
- - spec/changelog_line_spec.rb
224
+ - spec/changelog_header_line_spec.rb
225
+ - spec/changelog_line_parser_spec.rb
226
+ - spec/changelog_placeholder_line_spec.rb
216
227
  - spec/changelog_spec.rb
217
228
  - spec/fixtures/changelogs/minimal.md
218
229
  - spec/fixtures/changelogs/missing_your_contribution_here.md
@@ -1,25 +0,0 @@
1
- module Danger
2
- module Changelog
3
- # A CHANGELOG.md file reader.
4
- module ChangelogLine
5
- # match the PR format, with or without PR number
6
- def self.valid?(line)
7
- return true if line =~ %r{^\*\s[\`[:upper:]].* \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\)\.$}
8
- return true if line =~ %r{^\*\s\[\#\d+\]\(https:\/\/github\.com\/.*\d+\)\: [\`[:upper:]].* \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\)\.$}
9
- false
10
- end
11
-
12
- # provide an example of a CHANGELOG line based on a commit message
13
- def self.example(github)
14
- pr_number = github.pr_json['number']
15
- pr_url = github.pr_json['html_url']
16
- pr_title = github.pr_title
17
- .sub(/[?.!,;]?$/, '')
18
- .capitalize
19
- pr_author = github.pr_author
20
- pr_author_url = "https://github.com/#{github.pr_author}"
21
- "* [##{pr_number}](#{pr_url}): #{pr_title} - [@#{pr_author}](#{pr_author_url})."
22
- end
23
- end
24
- end
25
- end
@@ -1,45 +0,0 @@
1
- require File.expand_path('../spec_helper', __FILE__)
2
-
3
- describe Danger::Changelog::ChangelogLine do
4
- context 'lines' do
5
- it 'valid lines' do
6
- expect(subject.valid?('* Reticluated spline - [@dblock](https://github.com/dblock).')).to be true
7
- expect(subject.valid?('* [#1](https://github.com/dblock/danger-changelog/pull/1): Reticluated spline - [@dblock](https://github.com/dblock).')).to be true
8
- end
9
- it 'invalid lines' do
10
- expect(subject.valid?('Missing star - [@dblock](https://github.com/dblock).')).to be false
11
- expect(subject.valid?('* [#1](https://github.com/dblock/danger-changelog/pull/1) - Not a colon - [@dblock](https://github.com/dblock).')).to be false
12
- expect(subject.valid?('* [#1](https://github.com/dblock/danger-changelog/pull/1): No dash [@dblock](https://github.com/dblock).')).to be false
13
- expect(subject.valid?('* [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)')).to be false
14
- expect(subject.valid?('* [#1](https://github.com/dblock/danger-changelog/pull/1): No name.')).to be false
15
- expect(subject.valid?('* [#1](https://github.com/dblock/danger-changelog/pull/1): No https in github - [@dblock](http://github.com/dblock).')).to be false
16
- expect(subject.valid?('* [#1](https://github.com/dblock/danger-changelog/pull/1): Extra trailing slash - [@dblock](https://github.com/dblock/).')).to be false
17
- end
18
- end
19
- context 'example' do
20
- let(:github) do
21
- double(Danger::RequestSources::GitHub,
22
- pr_json: { 'number' => 123, 'html_url' => 'https://github.com/dblock/danger-changelog/pull/123' },
23
- pr_author: 'dblock',
24
- pr_title: pr_title)
25
- end
26
- context 'no transformation required' do
27
- let(:pr_title) { 'Test' }
28
- it 'uses title as is' do
29
- expect(subject.example(github)).to eq '* [#123](https://github.com/dblock/danger-changelog/pull/123): Test - [@dblock](https://github.com/dblock).'
30
- end
31
- end
32
- context 'with lowercase title' do
33
- let(:pr_title) { 'test' }
34
- it 'capitalizes it' do
35
- expect(subject.example(github)).to eq '* [#123](https://github.com/dblock/danger-changelog/pull/123): Test - [@dblock](https://github.com/dblock).'
36
- end
37
- end
38
- context 'with a trailing period' do
39
- let(:pr_title) { 'Test.' }
40
- it 'removes it' do
41
- expect(subject.example(github)).to eq '* [#123](https://github.com/dblock/danger-changelog/pull/123): Test - [@dblock](https://github.com/dblock).'
42
- end
43
- end
44
- end
45
- end