danger-changelog 0.6.0 → 0.6.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +10 -0
- data/.rubocop_todo.yml +1 -39
- data/.travis.yml +1 -1
- data/CHANGELOG.md +6 -0
- data/Dangerfile +1 -0
- data/Gemfile +14 -0
- data/LICENSE.txt +1 -1
- data/README.md +19 -2
- data/danger-changelog.gemspec +0 -11
- data/lib/changelog/changelog_file.rb +5 -3
- data/lib/changelog/changelog_line/changelog_entry_line.rb +31 -1
- data/lib/changelog/changelog_line/changelog_line.rb +2 -0
- data/lib/changelog/changelog_line/changelog_line_parser.rb +2 -2
- data/lib/changelog/config.rb +4 -2
- data/lib/changelog/gem_version.rb +1 -1
- data/lib/changelog/parsers.rb +1 -0
- data/lib/changelog/parsers/base.rb +2 -2
- data/lib/changelog/parsers/intridea_format.rb +2 -1
- data/lib/changelog/parsers/keep_a_changelog.rb +2 -2
- data/lib/changelog/parsers/validation_result.rb +31 -0
- data/lib/changelog/plugin.rb +10 -9
- data/spec/changelog_spec.rb +88 -254
- data/spec/config_spec.rb +11 -3
- data/spec/{changelog_entry_line_spec.rb → intridea/changelog_entry_line_spec.rb} +1 -1
- data/spec/intridea/changelog_file_spec.rb +120 -0
- data/spec/{changelog_header_line_spec.rb → intridea/changelog_header_line_spec.rb} +1 -1
- data/spec/{changelog_line_parser_spec.rb → intridea/changelog_line_parser_spec.rb} +1 -1
- data/spec/{changelog_placeholder_line_spec.rb → intridea/changelog_placeholder_line_spec.rb} +5 -3
- data/spec/intridea/changelog_spec.rb +150 -0
- data/spec/{fixtures/changelogs → intridea/fixtures}/customized.md +0 -0
- data/spec/{fixtures/changelogs → intridea/fixtures}/dates.md +0 -0
- data/spec/intridea/fixtures/extra_trailing_space.md +3 -0
- data/spec/{fixtures/changelogs → intridea/fixtures}/imbalanced.md +0 -0
- data/spec/{fixtures/changelogs → intridea/fixtures}/lines.md +0 -0
- data/spec/{fixtures/changelogs → intridea/fixtures}/minimal.md +0 -0
- data/spec/{fixtures/changelogs → intridea/fixtures}/missing_your_contribution_here.md +0 -0
- data/spec/{fixtures/changelogs → intridea/fixtures}/semver.md +0 -0
- data/spec/keep_a_changelog/changelog_spec.rb +84 -0
- data/spec/{fixtures/changelogs/keep_a_changelog.md → keep_a_changelog/fixtures/complete.md} +0 -0
- data/spec/keep_a_changelog/fixtures/invalid_line.md +23 -0
- data/spec/keep_a_changelog/fixtures/lines_with_links.md +14 -0
- data/spec/keep_a_changelog/fixtures/missing_a_version_header.md +20 -0
- data/spec/plugin_spec.rb +10 -0
- metadata +43 -168
- data/spec/changelog_file_spec.rb +0 -110
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11af2b5d7acdef3916a5d3804da6d6b3cb0b881132e5cf3fadabd562823987a5
|
4
|
+
data.tar.gz: 4dd589ec527ba8cc88326749593652e296ee908b982674a3402f7b521d74dfb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2ea9affac3dda11f80eb7622c2e405efc0508f257e6afac328312a7ab238df755975c285b73e23c9d1cd77bdf7487f02b581d0b161c329473f99dfbb8bdece7
|
7
|
+
data.tar.gz: 927698782c171ac595a8fde12380ac7cbe8097d18018060d3821304b0ab0dd2d26baba9af561c8b275cc8423d1f53ba75b4deba072d2f21a5245a5a5689c9d8a
|
data/.rubocop.yml
CHANGED
@@ -14,4 +14,14 @@ Metrics:
|
|
14
14
|
Metrics/LineLength:
|
15
15
|
Max: 256
|
16
16
|
|
17
|
+
Style/FrozenStringLiteralComment:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
Naming/PredicateName:
|
21
|
+
Enabled: true
|
22
|
+
NameWhitelist:
|
23
|
+
- is_a?
|
24
|
+
- have_you_updated_changelog?
|
25
|
+
- is_changelog_format_correct?
|
26
|
+
|
17
27
|
inherit_from: .rubocop_todo.yml
|
data/.rubocop_todo.yml
CHANGED
@@ -1,45 +1,7 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
3
|
+
# on 2020-05-08 17:23:39 -0400 using RuboCop version 0.73.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
|
-
|
9
|
-
# Offense count: 2
|
10
|
-
# Cop supports --auto-correct.
|
11
|
-
# Configuration parameters: EnforcedStyle.
|
12
|
-
# SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent
|
13
|
-
Layout/IndentHeredoc:
|
14
|
-
Exclude:
|
15
|
-
- 'lib/changelog/plugin.rb'
|
16
|
-
|
17
|
-
# Offense count: 1
|
18
|
-
# Configuration parameters: ContextCreatingMethods, MethodCreatingMethods.
|
19
|
-
Lint/UselessAccessModifier:
|
20
|
-
Exclude:
|
21
|
-
- 'lib/changelog/changelog_line/changelog_line_parser.rb'
|
22
|
-
|
23
|
-
# Offense count: 2
|
24
|
-
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist, MethodDefinitionMacros.
|
25
|
-
# NamePrefix: is_, has_, have_
|
26
|
-
# NamePrefixBlacklist: is_, has_, have_
|
27
|
-
# NameWhitelist: is_a?
|
28
|
-
# MethodDefinitionMacros: define_method, define_singleton_method
|
29
|
-
Naming/PredicateName:
|
30
|
-
Exclude:
|
31
|
-
- 'spec/**/*'
|
32
|
-
- 'lib/changelog/plugin.rb'
|
33
|
-
|
34
|
-
# Offense count: 1
|
35
|
-
Style/DoubleNegation:
|
36
|
-
Exclude:
|
37
|
-
- 'lib/changelog/changelog_file.rb'
|
38
|
-
|
39
|
-
# Offense count: 1
|
40
|
-
# Cop supports --auto-correct.
|
41
|
-
# Configuration parameters: EnforcedStyle.
|
42
|
-
# SupportedStyles: module_function, extend_self
|
43
|
-
Style/ModuleFunction:
|
44
|
-
Exclude:
|
45
|
-
- 'lib/changelog/config.rb'
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
## Changelog
|
2
2
|
|
3
|
+
### 0.6.1 (2020/05/08)
|
4
|
+
|
5
|
+
* [#33](https://github.com/dblock/danger-changelog/issues/33): Attempt to point out known problems in Intridea format - [@dblock](https://github.com/dblock).
|
6
|
+
* [#51](https://github.com/dblock/danger-changelog/pull/51): Allow markdown links in keep-a-changelog lines - [@dblock](https://github.com/dblock).
|
7
|
+
* [#50](https://github.com/dblock/danger-changelog/pull/50): Added TOC to README - [@dblock](https://github.com/dblock).
|
8
|
+
|
3
9
|
### 0.6.0 (2019/07/28)
|
4
10
|
|
5
11
|
* [#47](https://github.com/dblock/danger-changelog/pull/47): Configure `Config#placeholder_line` at plugin level - [@dblock](https://github.com/dblock).
|
data/Dangerfile
CHANGED
data/Gemfile
CHANGED
@@ -1,3 +1,17 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gemspec
|
4
|
+
|
5
|
+
group :development, :test do
|
6
|
+
gem 'activesupport'
|
7
|
+
gem 'bundler'
|
8
|
+
gem 'danger-toc', '~> 0.2.0'
|
9
|
+
gem 'guard', '~> 2.14'
|
10
|
+
gem 'guard-rspec', '~> 4.7'
|
11
|
+
gem 'listen', '3.0.7'
|
12
|
+
gem 'pry'
|
13
|
+
gem 'rake', '~> 10.0'
|
14
|
+
gem 'rspec', '~> 3.4'
|
15
|
+
gem 'rubocop', '~> 0.73.0'
|
16
|
+
gem 'yard', '~> 0.9.11'
|
17
|
+
end
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# Danger-Changelog
|
2
2
|
|
3
3
|
A plugin for [danger.systems](http://danger.systems) that obsessive-compulsively lints your project’s `CHANGELOG.md`.
|
4
4
|
It can make sure, for example, that changes are attributed properly, have a valid version number, a date in the ISO8601 format, balanced parenthesis and brackets, and that they’re always terminated with a period.
|
@@ -6,6 +6,23 @@ It can make sure, for example, that changes are attributed properly, have a vali
|
|
6
6
|
[](https://badge.fury.io/rb/danger-changelog)
|
7
7
|
[](https://travis-ci.org/dblock/danger-changelog)
|
8
8
|
|
9
|
+
# Table of Contents
|
10
|
+
|
11
|
+
- [What’s a correctly formatted CHANGELOG file?](#whats-a-correctly-formatted-changelog-file)
|
12
|
+
- [Installation](#installation)
|
13
|
+
- [Usage](#usage)
|
14
|
+
- [Configuration](#configuration)
|
15
|
+
- [changelog.filename](#changelogfilename)
|
16
|
+
- [changelog.format](#changelogformat)
|
17
|
+
- [changelog.placeholder_line](#changelogplaceholder_line)
|
18
|
+
- [changelog.ignore_files](#changelogignore_files)
|
19
|
+
- [Checks](#checks)
|
20
|
+
- [changelog.check!](#changelogcheck)
|
21
|
+
- [changelog.have_you_updated_changelog?](#changeloghave_you_updated_changelog)
|
22
|
+
- [changelog.is_changelog_format_correct?](#changelogis_changelog_format_correct)
|
23
|
+
- [Contributing](#contributing)
|
24
|
+
- [Copyright](#copyright)
|
25
|
+
|
9
26
|
## What's a correctly formatted CHANGELOG file?
|
10
27
|
|
11
28
|
By design, `danger-changelog` is quite strict with what it allows as a valid changelog file, using the [Intridea style](doc/intridea.md), [used by this library itself](CHANGELOG.md). It also supports the [Keep a Changelog](doc/keep_a_changelog.md) format.
|
@@ -90,6 +107,6 @@ See [CONTRIBUTING](CONTRIBUTING.md).
|
|
90
107
|
|
91
108
|
## Copyright
|
92
109
|
|
93
|
-
Copyright (c) Daniel Doubrovkine, 2016
|
110
|
+
Copyright (c) Daniel Doubrovkine, 2016-2019
|
94
111
|
|
95
112
|
MIT License, see [LICENSE](LICENSE.txt) for details.
|
data/danger-changelog.gemspec
CHANGED
@@ -18,15 +18,4 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ['lib']
|
19
19
|
|
20
20
|
spec.add_runtime_dependency 'danger-plugin-api', '~> 1.0'
|
21
|
-
|
22
|
-
spec.add_development_dependency 'activesupport'
|
23
|
-
spec.add_development_dependency 'bundler'
|
24
|
-
spec.add_development_dependency 'guard', '~> 2.14'
|
25
|
-
spec.add_development_dependency 'guard-rspec', '~> 4.7'
|
26
|
-
spec.add_development_dependency 'listen', '3.0.7'
|
27
|
-
spec.add_development_dependency 'pry'
|
28
|
-
spec.add_development_dependency 'rake', '~> 10.0'
|
29
|
-
spec.add_development_dependency 'rspec', '~> 3.4'
|
30
|
-
spec.add_development_dependency 'rubocop', '~> 0.61.1'
|
31
|
-
spec.add_development_dependency 'yard', '~> 0.9.11'
|
32
21
|
end
|
@@ -14,8 +14,10 @@ module Danger
|
|
14
14
|
parser.add_listener(self)
|
15
15
|
end
|
16
16
|
|
17
|
-
def add_bad_line(line)
|
18
|
-
|
17
|
+
def add_bad_line(line, detail = nil)
|
18
|
+
return unless line || detail
|
19
|
+
|
20
|
+
@bad_lines << [line, detail].compact
|
19
21
|
end
|
20
22
|
|
21
23
|
def add_global_failure(message)
|
@@ -38,7 +40,7 @@ module Danger
|
|
38
40
|
end
|
39
41
|
|
40
42
|
def exists?
|
41
|
-
|
43
|
+
@exists
|
42
44
|
end
|
43
45
|
|
44
46
|
def bad?
|
@@ -5,10 +5,26 @@ module Danger
|
|
5
5
|
# A CHANGELOG.md line represents the change entry.
|
6
6
|
class ChangelogEntryLine < ChangelogLine
|
7
7
|
def valid?
|
8
|
-
return
|
8
|
+
return validation_result.valid? if validation_result
|
9
|
+
|
10
|
+
@validation_result = Parsers::ValidationResult.new
|
11
|
+
|
12
|
+
validation_result.error! 'too many parenthesis' unless balanced?(line)
|
13
|
+
return false if validation_result.invalid?
|
14
|
+
|
9
15
|
return true if line =~ %r{^\*\s[\`[:upper:]].*[^.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$}
|
10
16
|
return true if line =~ %r{^\*\s\[\#\d+\]\(https:\/\/github\.com\/.*\d+\)\: [\`[:upper:]].*[^.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$}
|
11
17
|
|
18
|
+
validation_result.error! 'does not start with a star' unless ChangelogEntryLine.starts_with_star?(line)
|
19
|
+
validation_result.error! 'does not include a pull request link' unless ChangelogEntryLine.with_pr_link?(line)
|
20
|
+
validation_result.error! 'does not have a description' unless ChangelogEntryLine.with_changelog_description?(line)
|
21
|
+
validation_result.error! 'does not include an author link' unless ChangelogEntryLine.with_author_link?(line)
|
22
|
+
validation_result.error! 'has an extra trailing space' if ChangelogEntryLine.ends_with_space?(line)
|
23
|
+
validation_result.error! 'is missing a period at the end of the line' unless ChangelogEntryLine.ends_with_period?(line)
|
24
|
+
validation_result.error! 'has an extra period or comma at the end of the description' if
|
25
|
+
line =~ %r{^\*\s[\`[:upper:]].*[.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$} ||
|
26
|
+
line =~ %r{^\*\s\[\#\d+\]\(https:\/\/github\.com\/.*\d+\)\: [\`[:upper:]].*[.,] \- \[\@[\w\d\-\_]+\]\(https:\/\/github\.com\/.*[\w\d\-\_]+\).$}
|
27
|
+
|
12
28
|
false
|
13
29
|
end
|
14
30
|
|
@@ -40,6 +56,20 @@ module Danger
|
|
40
56
|
false
|
41
57
|
end
|
42
58
|
|
59
|
+
# checks whether line ends with a space
|
60
|
+
def self.ends_with_space?(line)
|
61
|
+
return true if line =~ /[[:blank:]]\n$/
|
62
|
+
|
63
|
+
false
|
64
|
+
end
|
65
|
+
|
66
|
+
# checks whether line ends with a period
|
67
|
+
def self.ends_with_period?(line)
|
68
|
+
return true if line =~ /\.\n$/
|
69
|
+
|
70
|
+
false
|
71
|
+
end
|
72
|
+
|
43
73
|
# checks whether line contains a MARKDOWN link to a PR
|
44
74
|
def self.with_pr_link?(line)
|
45
75
|
return true if line =~ %r{\[\#\d+\]\(http[s]?:\/\/github\.com\/.*\d+[\/]?\)}
|
@@ -16,12 +16,12 @@ module Danger
|
|
16
16
|
changelog_line_class.new(line)
|
17
17
|
end
|
18
18
|
|
19
|
-
private_class_method
|
20
|
-
|
21
19
|
def self.available_changelog_lines
|
22
20
|
# Order is important
|
23
21
|
[ChangelogPlaceholderLine, ChangelogEntryLine, ChangelogHeaderLine]
|
24
22
|
end
|
23
|
+
|
24
|
+
private_class_method :available_changelog_lines
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
data/lib/changelog/config.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Danger
|
2
2
|
module Changelog
|
3
3
|
module Config
|
4
|
-
|
4
|
+
module_function
|
5
5
|
|
6
6
|
ATTRIBUTES = %i[
|
7
7
|
placeholder_line
|
@@ -14,7 +14,9 @@ module Danger
|
|
14
14
|
|
15
15
|
DELEGATORS = ATTRIBUTES + ACCESSORS
|
16
16
|
|
17
|
-
|
17
|
+
class << self
|
18
|
+
attr_accessor(*Config::ATTRIBUTES)
|
19
|
+
end
|
18
20
|
|
19
21
|
def placeholder_line=(value)
|
20
22
|
if value
|
data/lib/changelog/parsers.rb
CHANGED
@@ -14,8 +14,8 @@ module Danger
|
|
14
14
|
|
15
15
|
private
|
16
16
|
|
17
|
-
def notify_of_bad_line(message)
|
18
|
-
listeners.each { |changelog| changelog.add_bad_line(message) }
|
17
|
+
def notify_of_bad_line(message, detail = nil)
|
18
|
+
listeners.each { |changelog| changelog.add_bad_line(message, detail) }
|
19
19
|
end
|
20
20
|
|
21
21
|
def notify_of_global_failure(message)
|
@@ -18,7 +18,8 @@ module Danger
|
|
18
18
|
changelog_line = ChangelogLineParser.parse(line)
|
19
19
|
|
20
20
|
if changelog_line.nil? || changelog_line.invalid?
|
21
|
-
|
21
|
+
detail = changelog_line.validation_result.to_s if changelog_line.validation_result&.invalid?
|
22
|
+
notify_of_bad_line line, detail
|
22
23
|
next
|
23
24
|
end
|
24
25
|
|
@@ -16,7 +16,7 @@ module Danger
|
|
16
16
|
notify_of_global_failure(
|
17
17
|
'The changelog is missing the version header for the Keep A ' \
|
18
18
|
'Changelog format. See <https://keepachangelog.com> to see ' \
|
19
|
-
'the format of the header'
|
19
|
+
'the format of the header.'
|
20
20
|
)
|
21
21
|
end
|
22
22
|
|
@@ -42,7 +42,7 @@ module Danger
|
|
42
42
|
lines.each do |line|
|
43
43
|
line = line.chomp
|
44
44
|
|
45
|
-
if
|
45
|
+
if /^##?[^#]/.match?(line)
|
46
46
|
blocks << block.dup unless block.empty?
|
47
47
|
block.clear
|
48
48
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Danger
|
2
|
+
module Changelog
|
3
|
+
module Parsers
|
4
|
+
class ValidationResult
|
5
|
+
def initialize
|
6
|
+
@errors = []
|
7
|
+
end
|
8
|
+
|
9
|
+
attr_reader :errors
|
10
|
+
|
11
|
+
def valid?
|
12
|
+
errors.empty?
|
13
|
+
end
|
14
|
+
|
15
|
+
def invalid?
|
16
|
+
!valid?
|
17
|
+
end
|
18
|
+
|
19
|
+
def error!(message)
|
20
|
+
errors << message
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
return nil if valid?
|
25
|
+
|
26
|
+
errors.join(', ')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/changelog/plugin.rb
CHANGED
@@ -75,15 +75,16 @@ module Danger
|
|
75
75
|
if changelog_file.exists?
|
76
76
|
changelog_file.parse
|
77
77
|
changelog_file.bad_lines.each do |line|
|
78
|
-
markdown
|
79
|
-
```markdown
|
80
|
-
#{line}
|
78
|
+
markdown <<~MARKDOWN
|
79
|
+
```markdown
|
80
|
+
#{line.map(&:strip).join("\n")}
|
81
|
+
```
|
81
82
|
MARKDOWN
|
82
83
|
end
|
83
84
|
messaging.fail(parser.bad_line_message(filename), sticky: false) if changelog_file.bad_lines?
|
84
85
|
|
85
86
|
changelog_file.global_failures.each do |failure|
|
86
|
-
messaging.fail(failure,
|
87
|
+
messaging.fail(failure, sticky: false)
|
87
88
|
end
|
88
89
|
|
89
90
|
changelog_file.good?
|
@@ -96,12 +97,12 @@ module Danger
|
|
96
97
|
private
|
97
98
|
|
98
99
|
def warn_update_changelog
|
99
|
-
markdown
|
100
|
-
Here's an example of a #{filename} entry:
|
100
|
+
markdown <<~MARKDOWN
|
101
|
+
Here's an example of a #{filename} entry:
|
101
102
|
|
102
|
-
```markdown
|
103
|
-
#{Danger::Changelog::ChangelogEntryLine.example(github)}
|
104
|
-
```
|
103
|
+
```markdown
|
104
|
+
#{Danger::Changelog::ChangelogEntryLine.example(github)}
|
105
|
+
```
|
105
106
|
MARKDOWN
|
106
107
|
warn "Unless you're refactoring existing code or improving documentation, please update #{filename}.", sticky: false
|
107
108
|
end
|
data/spec/changelog_spec.rb
CHANGED
@@ -1,312 +1,146 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Danger::Changelog do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
describe '
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
it 'placeholder_line' do
|
19
|
-
expect(changelog.placeholder_line).to eq "* Your contribution here.\n"
|
20
|
-
end
|
4
|
+
let(:dangerfile) { testing_dangerfile }
|
5
|
+
let(:changelog) { dangerfile.changelog }
|
6
|
+
let(:status_report) { changelog.status_report }
|
7
|
+
|
8
|
+
describe 'in a PR' do
|
9
|
+
before do
|
10
|
+
changelog.env.request_source.pr_json = {
|
11
|
+
'number' => 123,
|
12
|
+
'title' => 'being dangerous',
|
13
|
+
'html_url' => 'https://github.com/dblock/danger-changelog/pull/123',
|
14
|
+
'user' => {
|
15
|
+
'login' => 'dblock'
|
16
|
+
}
|
17
|
+
}
|
21
18
|
end
|
22
19
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
changelog.env.request_source.pr_json = {
|
27
|
-
'number' => 123,
|
28
|
-
'title' => 'being dangerous',
|
29
|
-
'html_url' => 'https://github.com/dblock/danger-changelog/pull/123',
|
30
|
-
'user' => {
|
31
|
-
'login' => 'dblock'
|
32
|
-
}
|
33
|
-
}
|
20
|
+
context 'check!' do
|
21
|
+
subject do
|
22
|
+
changelog.check!
|
34
23
|
end
|
35
24
|
|
36
|
-
context '
|
37
|
-
|
38
|
-
changelog.
|
25
|
+
context 'without CHANGELOG changes' do
|
26
|
+
before do
|
27
|
+
allow(changelog.git).to receive(:modified_files).and_return(['some-file.txt'])
|
28
|
+
allow(changelog.git).to receive(:added_files).and_return(['some-file.txt'])
|
39
29
|
end
|
40
30
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
it 'complains when no CHANGELOG can be found' do
|
49
|
-
expect(subject).to be false
|
50
|
-
expect(status_report[:errors]).to eq []
|
51
|
-
expect(status_report[:warnings]).to eq ["Unless you're refactoring existing code or improving documentation, please update #{filename}."]
|
52
|
-
expect(status_report[:markdowns].map(&:message)).to eq ["Here's an example of a #{filename} entry:\n\n```markdown\n* [#123](https://github.com/dblock/danger-changelog/pull/123): Being dangerous - [@dblock](https://github.com/dblock).\n```\n"]
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context 'with a README.md' do
|
57
|
-
before do
|
58
|
-
allow(changelog.git).to receive(:modified_files).and_return(['README.md'])
|
59
|
-
allow(changelog.git).to receive(:added_files).and_return([])
|
60
|
-
end
|
61
|
-
it 'has no complaints' do
|
62
|
-
expect(subject).to be true
|
63
|
-
expect(status_report[:errors]).to eq []
|
64
|
-
expect(status_report[:warnings]).to eq []
|
65
|
-
expect(status_report[:markdowns]).to eq []
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context 'with files being ignored' do
|
70
|
-
context 'name' do
|
71
|
-
before do
|
72
|
-
changelog.ignore_files = ['WHATEVER.md']
|
73
|
-
allow(changelog.git).to receive(:modified_files).and_return(['WHATEVER.md'])
|
74
|
-
allow(changelog.git).to receive(:added_files).and_return([])
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'has no complaints' do
|
78
|
-
expect(subject).to be true
|
79
|
-
expect(status_report[:errors]).to eq []
|
80
|
-
expect(status_report[:warnings]).to eq []
|
81
|
-
expect(status_report[:markdowns]).to eq []
|
82
|
-
end
|
83
|
-
end
|
84
|
-
context 'mixed' do
|
85
|
-
before do
|
86
|
-
changelog.ignore_files = ['WHATEVER.md', /\.txt$/]
|
87
|
-
allow(changelog.git).to receive(:modified_files).and_return(['WHATEVER.md'])
|
88
|
-
allow(changelog.git).to receive(:added_files).and_return(['one.txt', 'two.txt'])
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'has no complaints' do
|
92
|
-
expect(subject).to be true
|
93
|
-
expect(status_report[:errors]).to eq []
|
94
|
-
expect(status_report[:warnings]).to eq []
|
95
|
-
expect(status_report[:markdowns]).to eq []
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
31
|
+
it 'complains when no CHANGELOG can be found' do
|
32
|
+
expect(subject).to be false
|
33
|
+
expect(status_report[:errors]).to eq []
|
34
|
+
expect(status_report[:warnings]).to eq ["Unless you're refactoring existing code or improving documentation, please update CHANGELOG.md."]
|
35
|
+
expect(status_report[:markdowns].map(&:message)).to eq ["Here's an example of a CHANGELOG.md entry:\n\n```markdown\n* [#123](https://github.com/dblock/danger-changelog/pull/123): Being dangerous - [@dblock](https://github.com/dblock).\n```\n"]
|
99
36
|
end
|
37
|
+
end
|
100
38
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
it 'has no complaints' do
|
108
|
-
expect(subject).to be true
|
109
|
-
expect(status_report[:errors]).to eq []
|
110
|
-
expect(status_report[:warnings]).to eq []
|
111
|
-
expect(status_report[:markdowns]).to eq []
|
112
|
-
end
|
39
|
+
context 'with CHANGELOG changes' do
|
40
|
+
before do
|
41
|
+
allow(changelog.git).to receive(:modified_files).and_return([changelog.filename])
|
42
|
+
allow(changelog.git).to receive(:added_files).and_return([])
|
113
43
|
end
|
114
44
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
it 'has no complaints' do
|
122
|
-
expect(subject).to be true
|
123
|
-
expect(status_report[:errors]).to eq []
|
124
|
-
expect(status_report[:warnings]).to eq []
|
125
|
-
expect(status_report[:markdowns]).to eq []
|
126
|
-
end
|
45
|
+
it 'has no complaints' do
|
46
|
+
expect(subject).to be true
|
47
|
+
expect(status_report[:errors]).to eq []
|
48
|
+
expect(status_report[:warnings]).to eq []
|
49
|
+
expect(status_report[:markdowns]).to eq []
|
127
50
|
end
|
128
51
|
end
|
52
|
+
end
|
129
53
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
end
|
54
|
+
context 'have_you_updated_changelog?' do
|
55
|
+
subject do
|
56
|
+
changelog.have_you_updated_changelog?
|
57
|
+
end
|
135
58
|
|
136
|
-
|
137
|
-
|
138
|
-
|
59
|
+
context 'without CHANGELOG changes' do
|
60
|
+
context 'when something was modified' do
|
61
|
+
before do
|
62
|
+
allow(changelog.git).to receive(:modified_files).and_return(['some-file.txt'])
|
63
|
+
allow(changelog.git).to receive(:added_files).and_return(['another-file.txt'])
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'complains when no CHANGELOG can be found' do
|
139
67
|
expect(subject).to be false
|
140
|
-
expect(status_report[:errors]).to eq [
|
68
|
+
expect(status_report[:errors]).to eq []
|
69
|
+
expect(status_report[:warnings]).to eq ["Unless you're refactoring existing code or improving documentation, please update #{changelog.filename}."]
|
70
|
+
expect(status_report[:markdowns].map(&:message)).to eq ["Here's an example of a #{changelog.filename} entry:\n\n```markdown\n* [#123](https://github.com/dblock/danger-changelog/pull/123): Being dangerous - [@dblock](https://github.com/dblock).\n```\n"]
|
141
71
|
end
|
142
72
|
end
|
143
73
|
|
144
|
-
context 'with
|
74
|
+
context 'with a README.md' do
|
145
75
|
before do
|
146
|
-
allow(changelog.git).to receive(:modified_files).and_return([
|
76
|
+
allow(changelog.git).to receive(:modified_files).and_return(['README.md'])
|
147
77
|
allow(changelog.git).to receive(:added_files).and_return([])
|
148
78
|
end
|
149
|
-
|
150
79
|
it 'has no complaints' do
|
151
80
|
expect(subject).to be true
|
152
81
|
expect(status_report[:errors]).to eq []
|
153
82
|
expect(status_report[:warnings]).to eq []
|
154
83
|
expect(status_report[:markdowns]).to eq []
|
155
84
|
end
|
85
|
+
end
|
156
86
|
|
157
|
-
|
87
|
+
context 'with files being ignored' do
|
88
|
+
context 'name' do
|
158
89
|
before do
|
159
|
-
changelog.
|
90
|
+
changelog.ignore_files = ['WHATEVER.md']
|
91
|
+
allow(changelog.git).to receive(:modified_files).and_return(['WHATEVER.md'])
|
92
|
+
allow(changelog.git).to receive(:added_files).and_return([])
|
160
93
|
end
|
161
94
|
|
162
|
-
|
163
|
-
it 'is ok' do
|
95
|
+
it 'has no complaints' do
|
164
96
|
expect(subject).to be true
|
165
97
|
expect(status_report[:errors]).to eq []
|
166
98
|
expect(status_report[:warnings]).to eq []
|
167
99
|
expect(status_report[:markdowns]).to eq []
|
168
100
|
end
|
169
101
|
end
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
before do
|
176
|
-
changelog.placeholder_line = "* Nothing yet.\n"
|
177
|
-
end
|
178
|
-
|
179
|
-
it 'complains' do
|
180
|
-
expect(subject).to be false
|
181
|
-
expect(status_report[:errors]).to eq ["Please put back the `* Nothing yet.` line into #{filename}."]
|
182
|
-
expect(status_report[:warnings]).to eq []
|
183
|
-
expect(status_report[:markdowns]).to eq []
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
context 'when placeholder line is default' do
|
188
|
-
it 'complains' do
|
189
|
-
expect(subject).to be false
|
190
|
-
expect(status_report[:errors]).to eq ["Please put back the `* Your contribution here.` line into #{filename}."]
|
191
|
-
expect(status_report[:warnings]).to eq []
|
192
|
-
expect(status_report[:markdowns]).to eq []
|
193
|
-
end
|
102
|
+
context 'mixed' do
|
103
|
+
before do
|
104
|
+
changelog.ignore_files = ['WHATEVER.md', /\.txt$/]
|
105
|
+
allow(changelog.git).to receive(:modified_files).and_return(['WHATEVER.md'])
|
106
|
+
allow(changelog.git).to receive(:added_files).and_return(['one.txt', 'two.txt'])
|
194
107
|
end
|
195
108
|
|
196
|
-
|
197
|
-
before do
|
198
|
-
changelog.placeholder_line = nil
|
199
|
-
end
|
200
|
-
|
201
|
-
it 'is ok' do
|
202
|
-
expect(subject).to be true
|
203
|
-
expect(status_report[:errors]).to eq []
|
204
|
-
expect(status_report[:warnings]).to eq []
|
205
|
-
expect(status_report[:markdowns]).to eq []
|
206
|
-
end
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
context 'minimal example' do
|
211
|
-
let(:filename) { File.expand_path('fixtures/changelogs/minimal.md', __dir__) }
|
212
|
-
it 'is ok' do
|
109
|
+
it 'has no complaints' do
|
213
110
|
expect(subject).to be true
|
214
111
|
expect(status_report[:errors]).to eq []
|
215
112
|
expect(status_report[:warnings]).to eq []
|
216
113
|
expect(status_report[:markdowns]).to eq []
|
217
114
|
end
|
218
|
-
|
219
|
-
context 'when placeholder line is nil' do
|
220
|
-
before do
|
221
|
-
changelog.placeholder_line = nil
|
222
|
-
end
|
223
|
-
|
224
|
-
it 'complains' do
|
225
|
-
expect(subject).to be false
|
226
|
-
expect(status_report[:errors]).to eq ["One of the lines below found in #{filename} doesn't match the [expected format](https://github.com/dblock/danger-changelog/blob/master/README.md#whats-a-correctly-formatted-changelog-file). Please make it look like the other lines, pay attention to version numbers, periods, spaces and date formats."]
|
227
|
-
expect(status_report[:warnings]).to eq []
|
228
|
-
expect(status_report[:markdowns].map(&:message)).to eq [
|
229
|
-
"```markdown\n* Your contribution here.\n```\n"
|
230
|
-
]
|
231
|
-
end
|
232
|
-
end
|
233
|
-
end
|
234
|
-
|
235
|
-
context 'with bad lines' do
|
236
|
-
let(:filename) { File.expand_path('fixtures/changelogs/lines.md', __dir__) }
|
237
|
-
it 'complains' do
|
238
|
-
expect(subject).to be false
|
239
|
-
expect(status_report[:errors]).to eq ["One of the lines below found in #{filename} doesn't match the [expected format](https://github.com/dblock/danger-changelog/blob/master/README.md#whats-a-correctly-formatted-changelog-file). Please make it look like the other lines, pay attention to version numbers, periods, spaces and date formats."]
|
240
|
-
expect(status_report[:warnings]).to eq []
|
241
|
-
expect(status_report[:markdowns].map(&:message)).to eq [
|
242
|
-
"```markdown\nMissing star - [@dblock](https://github.com/dblock).\n```\n",
|
243
|
-
"```markdown\n* [#1](https://github.com/dblock/danger-changelog/pull/1) - Not a colon - [@dblock](https://github.com/dblock).\n```\n",
|
244
|
-
"```markdown\n* [#1](https://github.com/dblock/danger-changelog/pull/1): No final period - [@dblock](https://github.com/dblock)\n```\n",
|
245
|
-
"```markdown\n# [#1](https://github.com/dblock/danger-changelog/pull/1): Hash instead of star - [@dblock](https://github.com/dblock).\n```\n",
|
246
|
-
"```markdown\n* [#1](https://github.com/dblock/danger-changelog/pull/1): Extra period. - [@dblock](https://github.com/dblock).\n```\n",
|
247
|
-
"```markdown\n* [#1](https://github.com/dblock/danger-changelog/pull/1): Unbalanced ( - [@dblock](https://github.com/dblock).\n```\n",
|
248
|
-
"```markdown\n* [#1](https://github.com/dblock/danger-changelog/pull/1): Unbalanced ] - [@dblock](https://github.com/dblock).\n```\n"
|
249
|
-
]
|
250
|
-
end
|
251
115
|
end
|
252
116
|
end
|
253
117
|
end
|
254
|
-
end
|
255
|
-
end
|
256
|
-
|
257
|
-
describe 'with the Keep a Changelog format' do
|
258
|
-
let(:filename) { File.expand_path('fixtures/changelogs/keep_a_changelog.md', __dir__) }
|
259
|
-
let(:dangerfile) { testing_dangerfile }
|
260
|
-
let(:changelog) do
|
261
|
-
dangerfile.changelog.format = :keep_a_changelog
|
262
|
-
dangerfile.changelog.filename = filename
|
263
|
-
dangerfile.changelog
|
264
|
-
end
|
265
|
-
let(:status_report) { changelog.status_report }
|
266
|
-
|
267
|
-
describe 'in a PR' do
|
268
|
-
before do
|
269
|
-
changelog.env.request_source.pr_json = {
|
270
|
-
'number' => 123,
|
271
|
-
'title' => 'being dangerous',
|
272
|
-
'html_url' => 'https://github.com/dblock/danger-changelog/pull/123',
|
273
|
-
'user' => {
|
274
|
-
'login' => 'dblock'
|
275
|
-
}
|
276
|
-
}
|
277
|
-
end
|
278
118
|
|
279
|
-
context '
|
280
|
-
|
281
|
-
changelog.
|
119
|
+
context 'with a new CHANGELOG' do
|
120
|
+
before do
|
121
|
+
allow(changelog.git).to receive(:modified_files).and_return([])
|
122
|
+
allow(changelog.git).to receive(:added_files).and_return([changelog.filename])
|
282
123
|
end
|
283
124
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
it 'complains when no CHANGELOG can be found' do
|
291
|
-
expect(subject).to be false
|
292
|
-
expect(status_report[:errors]).to eq []
|
293
|
-
expect(status_report[:warnings]).to eq ["Unless you're refactoring existing code or improving documentation, please update #{filename}."]
|
294
|
-
expect(status_report[:markdowns].map(&:message)).to eq ["Here's an example of a #{filename} entry:\n\n```markdown\n* [#123](https://github.com/dblock/danger-changelog/pull/123): Being dangerous - [@dblock](https://github.com/dblock).\n```\n"]
|
295
|
-
end
|
125
|
+
it 'has no complaints' do
|
126
|
+
expect(subject).to be true
|
127
|
+
expect(status_report[:errors]).to eq []
|
128
|
+
expect(status_report[:warnings]).to eq []
|
129
|
+
expect(status_report[:markdowns]).to eq []
|
296
130
|
end
|
131
|
+
end
|
297
132
|
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
133
|
+
context 'with CHANGELOG changes' do
|
134
|
+
before do
|
135
|
+
allow(changelog.git).to receive(:modified_files).and_return([changelog.filename])
|
136
|
+
allow(changelog.git).to receive(:added_files).and_return([])
|
137
|
+
end
|
303
138
|
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
end
|
139
|
+
it 'has no complaints' do
|
140
|
+
expect(subject).to be true
|
141
|
+
expect(status_report[:errors]).to eq []
|
142
|
+
expect(status_report[:warnings]).to eq []
|
143
|
+
expect(status_report[:markdowns]).to eq []
|
310
144
|
end
|
311
145
|
end
|
312
146
|
end
|