danger-samsao 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.env.example +1 -0
- data/.gitignore +5 -0
- data/.rubocop.yml +28 -0
- data/.travis.yml +12 -0
- data/CHANGELOG.md +25 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +136 -0
- data/Guardfile +21 -0
- data/LICENSE.txt +22 -0
- data/README.md +230 -0
- data/Rakefile +22 -0
- data/bitrise.wrapper.yml +51 -0
- data/bitrise.yml +70 -0
- data/danger-samsao.gemspec +33 -0
- data/lib/danger_plugin.rb +1 -0
- data/lib/danger_samsao.rb +1 -0
- data/lib/samsao/actions.rb +53 -0
- data/lib/samsao/config.rb +21 -0
- data/lib/samsao/gem_version.rb +3 -0
- data/lib/samsao/helpers.rb +79 -0
- data/lib/samsao/plugin.rb +28 -0
- data/lib/samsao/regexp.rb +29 -0
- data/spec/matchers/have_error.rb +25 -0
- data/spec/matchers/have_no_error.rb +14 -0
- data/spec/matchers/have_no_warning.rb +14 -0
- data/spec/matchers/have_warning.rb +25 -0
- data/spec/samsao_branch_helper_spec.rb +66 -0
- data/spec/samsao_branching_model_spec.rb +41 -0
- data/spec/samsao_changelog_modified_spec.rb +48 -0
- data/spec/samsao_changelog_updated_spec.rb +87 -0
- data/spec/samsao_config_spec.rb +30 -0
- data/spec/samsao_feature_single_commit_spec.rb +42 -0
- data/spec/samsao_has_app_changes_spec.rb +102 -0
- data/spec/samsao_merge_commit_detected_spec.rb +81 -0
- data/spec/samsao_regexp_spec.rb +35 -0
- data/spec/samsao_spec.rb +9 -0
- data/spec/samsao_trivial_change_spec.rb +57 -0
- data/spec/samsao_work_in_progress_pr_spec.rb +50 -0
- data/spec/spec_helper.rb +56 -0
- metadata +240 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
|
3
|
+
RSpec::Matchers.define :have_no_warning do
|
4
|
+
match do |actual|
|
5
|
+
actual.status_report[:warnings].empty?
|
6
|
+
end
|
7
|
+
|
8
|
+
failure_message do |actual|
|
9
|
+
message = "expected that #{Danger} would have no warning but found '#{actual.status_report[:warnings].size}'"
|
10
|
+
actual.status_report[:warnings].each do |warning|
|
11
|
+
message += "\n * #{warning}"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
|
3
|
+
RSpec::Matchers.define :have_warning do |expected|
|
4
|
+
match do |actual|
|
5
|
+
actual.status_report[:warnings].any? do |warning|
|
6
|
+
expected.is_a?(Regexp) ? warning =~ matcher : warning.start_with?(expected)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
failure_message do |actual|
|
11
|
+
message = "expected that #{Danger} would have warning '#{expected}'"
|
12
|
+
|
13
|
+
warnings = actual.status_report[:warnings]
|
14
|
+
if warnings.empty?
|
15
|
+
message += ' but there is none'
|
16
|
+
return message
|
17
|
+
end
|
18
|
+
|
19
|
+
actual.status_report[:warnings].each do |warning|
|
20
|
+
message += "\n * #{warning}"
|
21
|
+
end
|
22
|
+
|
23
|
+
message
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
describe Danger::DangerSamsao do
|
5
|
+
describe 'with Dangerfile' do
|
6
|
+
before do
|
7
|
+
@dangerfile = testing_dangerfile
|
8
|
+
@plugin = @dangerfile.samsao
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'branch helpers' do
|
12
|
+
it 'supports feature_branch? correctly' do
|
13
|
+
data_set = [
|
14
|
+
{ branch: 'feature/a', expected: true },
|
15
|
+
{ branch: 'fix/a', expected: false },
|
16
|
+
{ branch: 'random', expected: false },
|
17
|
+
]
|
18
|
+
|
19
|
+
data_set.each do |data|
|
20
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return(data[:branch])
|
21
|
+
expect(@plugin.feature_branch?).to be(data[:expected])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'supports fix_branch? correctly' do
|
26
|
+
data_set = [
|
27
|
+
{ branch: 'feature/a', expected: false },
|
28
|
+
{ branch: 'fix/a', expected: true },
|
29
|
+
{ branch: 'random', expected: false },
|
30
|
+
]
|
31
|
+
|
32
|
+
data_set.each do |data|
|
33
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return(data[:branch])
|
34
|
+
expect(@plugin.fix_branch?).to be(data[:expected])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'supports release_branch? correctly' do
|
39
|
+
data_set = [
|
40
|
+
{ branch: 'release/a', expected: true },
|
41
|
+
{ branch: 'fix/a', expected: false },
|
42
|
+
{ branch: 'random', expected: false },
|
43
|
+
]
|
44
|
+
|
45
|
+
data_set.each do |data|
|
46
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return(data[:branch])
|
47
|
+
expect(@plugin.release_branch?).to be(data[:expected])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'supports trivial_branch? correctly' do
|
52
|
+
data_set = [
|
53
|
+
{ branch: 'trivial/a', expected: true },
|
54
|
+
{ branch: 'fix/a', expected: false },
|
55
|
+
{ branch: 'random', expected: false },
|
56
|
+
]
|
57
|
+
|
58
|
+
data_set.each do |data|
|
59
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return(data[:branch])
|
60
|
+
expect(@plugin.trivial_branch?).to be(data[:expected])
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
describe Danger::DangerSamsao do
|
5
|
+
describe 'with Dangerfile' do
|
6
|
+
before do
|
7
|
+
@dangerfile = testing_dangerfile
|
8
|
+
@plugin = @dangerfile.samsao
|
9
|
+
@wrong_branching_model = 'Your branch should be prefixed with feature/, fix/, trivial/ or release/!'
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'branching model' do
|
13
|
+
['fix', 'feature', 'release', 'trivial'].each do |branch_prefix|
|
14
|
+
it "continues on #{branch_prefix}/ prefix" do
|
15
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return("#{branch_prefix}/something")
|
16
|
+
|
17
|
+
@plugin.fail_when_wrong_branching_model
|
18
|
+
|
19
|
+
expect(@dangerfile).to have_no_error
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'fails on wrong prefix' do
|
24
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('wrong/12')
|
25
|
+
|
26
|
+
@plugin.fail_when_wrong_branching_model
|
27
|
+
|
28
|
+
expect(@dangerfile).to have_error(@wrong_branching_model)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'fails on good prefix but wrong format' do
|
32
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('feature_12')
|
33
|
+
|
34
|
+
@plugin.fail_when_wrong_branching_model
|
35
|
+
|
36
|
+
expect(@dangerfile).to have_error(@wrong_branching_model)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
describe Danger::DangerSamsao do
|
5
|
+
describe 'with Dangerfile' do
|
6
|
+
before do
|
7
|
+
@dangerfile = testing_dangerfile
|
8
|
+
@plugin = @dangerfile.samsao
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'changelog updated' do
|
12
|
+
it 'returns true when modified with single entry' do
|
13
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['CHANGELOG.md'])
|
14
|
+
|
15
|
+
expect(@plugin.changelog_modified?('CHANGELOG.md')).to be(true)
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns true when modified with multiple entries' do
|
19
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['CHANGELOG.yml'])
|
20
|
+
|
21
|
+
expect(@plugin.changelog_modified?('CHANGELOG.md', 'CHANGELOG.yml')).to be(true)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'returns true when modified with multiple entries and multiple matches' do
|
25
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['CHANGELOG.yml', 'CHANGELOG.md'])
|
26
|
+
|
27
|
+
expect(@plugin.changelog_modified?('CHANGELOG.md', 'CHANGELOG.yml')).to be(true)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns false when not matching file' do
|
31
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['CHANGELOG.yml'])
|
32
|
+
|
33
|
+
expect(@plugin.changelog_modified?('CHANGELOG.md')).to be(false)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'uses plugin config changelogs when no arguments passed' do
|
37
|
+
@plugin.config do
|
38
|
+
changelogs 'CHANGELOG.md', 'CHANGELOG.yml'
|
39
|
+
end
|
40
|
+
|
41
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['CHANGELOG.yml'])
|
42
|
+
|
43
|
+
expect(@plugin.changelog_modified?).to be(true)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
describe Danger::DangerSamsao do
|
5
|
+
describe 'with Dangerfile' do
|
6
|
+
before do
|
7
|
+
@dangerfile = testing_dangerfile
|
8
|
+
@plugin = @dangerfile.samsao
|
9
|
+
@changelog_needs_update = 'You did a fix or a feature without updating CHANGELOG file!'
|
10
|
+
|
11
|
+
allow(@plugin.github).to receive(:pr_title).and_return('Something')
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'changelog updated' do
|
15
|
+
it 'continues on non-feature & non-fix branch' do
|
16
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('trivial/a')
|
17
|
+
|
18
|
+
@plugin.fail_when_changelog_update_missing
|
19
|
+
|
20
|
+
expect(@dangerfile).to have_no_error
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'continues on feature branch and CHANGELOG updated' do
|
24
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('feature/a')
|
25
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['CHANGELOG.md'])
|
26
|
+
|
27
|
+
@plugin.fail_when_changelog_update_missing
|
28
|
+
|
29
|
+
expect(@dangerfile).to have_no_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'continues on fix branch and CHANGELOG updated' do
|
33
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('fix/a')
|
34
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['CHANGELOG.md'])
|
35
|
+
|
36
|
+
@plugin.fail_when_changelog_update_missing
|
37
|
+
|
38
|
+
expect(@dangerfile).to have_no_error
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'accepts customized changelogs path' do
|
42
|
+
@plugin.config do
|
43
|
+
changelogs 'CHANGELOG.yml'
|
44
|
+
end
|
45
|
+
|
46
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('fix/a')
|
47
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['CHANGELOG.yml'])
|
48
|
+
|
49
|
+
@plugin.fail_when_changelog_update_missing
|
50
|
+
|
51
|
+
expect(@dangerfile).to have_no_error
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'accepts multiple changelog paths' do
|
55
|
+
@plugin.config do
|
56
|
+
changelogs 'CHANGELOG.yml', 'web/CHANGELOG.md'
|
57
|
+
end
|
58
|
+
|
59
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('fix/a')
|
60
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['web/CHANGELOG.md'])
|
61
|
+
|
62
|
+
@plugin.fail_when_changelog_update_missing
|
63
|
+
|
64
|
+
expect(@dangerfile).to have_no_error
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'continues on trivial_change and CHANGELOG not updated' do
|
68
|
+
allow(@plugin).to receive(:trivial_change?).and_return(true)
|
69
|
+
allow(@plugin.git).to receive(:modified_files).and_return([])
|
70
|
+
|
71
|
+
@plugin.fail_when_changelog_update_missing
|
72
|
+
|
73
|
+
expect(@dangerfile).to have_no_error
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'fails on feature branch and CHANGELOG not updated' do
|
77
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('feature/a')
|
78
|
+
allow(@plugin.git).to receive(:modified_files).and_return([])
|
79
|
+
|
80
|
+
@plugin.fail_when_changelog_update_missing
|
81
|
+
|
82
|
+
expect(@dangerfile).to have_error(@changelog_needs_update)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
describe Danger::DangerSamsao do
|
5
|
+
describe 'with Dangerfile' do
|
6
|
+
before do
|
7
|
+
@dangerfile = testing_dangerfile
|
8
|
+
@plugin = @dangerfile.samsao
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'samsao_config' do
|
12
|
+
it 'can configure single source' do
|
13
|
+
@plugin.config do
|
14
|
+
sources 'app/src'
|
15
|
+
end
|
16
|
+
|
17
|
+
expect(@plugin.config.sources).to eq(['app/src'])
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'can configure multiple sources' do
|
21
|
+
@plugin.config do
|
22
|
+
sources 'app/src', 'lib/src'
|
23
|
+
end
|
24
|
+
|
25
|
+
expect(@plugin.config.sources).to eq(['app/src', 'lib/src'])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
describe Danger::DangerSamsao do
|
5
|
+
describe 'with Dangerfile' do
|
6
|
+
before do
|
7
|
+
@dangerfile = testing_dangerfile
|
8
|
+
@plugin = @dangerfile.samsao
|
9
|
+
@must_have_single_commit = 'Your feature branch should have a single commit but found 2, squash them together!'
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'feature branch commits' do
|
13
|
+
it 'continues on feature branch and one commit' do
|
14
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('feature/a')
|
15
|
+
allow(@plugin.git).to receive(:commits).and_return(['sha1'])
|
16
|
+
|
17
|
+
@plugin.fail_when_non_single_commit_feature
|
18
|
+
|
19
|
+
expect(@dangerfile).to have_no_error
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'continues on non-feature branch and multiple commits' do
|
23
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('fix/a')
|
24
|
+
allow(@plugin.git).to receive(:commits).and_return(['sha1', 'sha2'])
|
25
|
+
|
26
|
+
@plugin.fail_when_non_single_commit_feature
|
27
|
+
|
28
|
+
expect(@dangerfile).to have_no_error
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'fails on feature branch and multiple commits' do
|
32
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('feature/a')
|
33
|
+
allow(@plugin.git).to receive(:commits).and_return(['sha1', 'sha2'])
|
34
|
+
|
35
|
+
@plugin.fail_when_non_single_commit_feature
|
36
|
+
|
37
|
+
expect(@dangerfile).to have_error(@must_have_single_commit)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
module Danger
|
4
|
+
describe Danger::DangerSamsao do
|
5
|
+
describe 'with Dangerfile' do
|
6
|
+
before do
|
7
|
+
@dangerfile = testing_dangerfile
|
8
|
+
@plugin = @dangerfile.samsao
|
9
|
+
|
10
|
+
allow(@plugin.github).to receive(:branch_for_head).and_return('something')
|
11
|
+
allow(@plugin.github).to receive(:pr_title).and_return('Something')
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'has_app_changes?' do
|
15
|
+
it 'returns true when single source has changed' do
|
16
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['src/a.txt'])
|
17
|
+
|
18
|
+
expect(@plugin.has_app_changes?('src/')).to be(true)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'returns true when single nested source has changed' do
|
22
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['src/a/b/c.txt'])
|
23
|
+
|
24
|
+
expect(@plugin.has_app_changes?('src/')).to be(true)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'returns true when single source has changed with multiple sources defined' do
|
28
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['common/src/c.txt'])
|
29
|
+
|
30
|
+
expect(@plugin.has_app_changes?('common/src/', 'web/src')).to be(true)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'returns true when single nested source has changed with multiple sources defined' do
|
34
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['web/src/a/b/c.txt'])
|
35
|
+
|
36
|
+
expect(@plugin.has_app_changes?('common/src/', 'web/src')).to be(true)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns true when multiple nested source has changed' do
|
40
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['c.txt', 'src/a/c.txt'])
|
41
|
+
|
42
|
+
expect(@plugin.has_app_changes?('src')).to be(true)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'returns true when multiple nested source has changed with multiple sources' do
|
46
|
+
allow(@plugin.git).to receive(:modified_files).and_return([
|
47
|
+
'c.txt',
|
48
|
+
'common/src/a/c.txt',
|
49
|
+
'web/src/a/c.txt',
|
50
|
+
])
|
51
|
+
|
52
|
+
expect(@plugin.has_app_changes?('common/src', 'web/src')).to be(true)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'returns false when source is in the middle of a modified file' do
|
56
|
+
allow(@plugin.git).to receive(:modified_files).and_return([
|
57
|
+
'a/src/c.txt',
|
58
|
+
'a/src.txt',
|
59
|
+
])
|
60
|
+
|
61
|
+
expect(@plugin.has_app_changes?('src')).to be(false)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'returns false when no source has changed' do
|
65
|
+
allow(@plugin.git).to receive(:modified_files).and_return([
|
66
|
+
'c.txt',
|
67
|
+
'common/a/c.txt',
|
68
|
+
'web/a/c.txt',
|
69
|
+
])
|
70
|
+
|
71
|
+
expect(@plugin.has_app_changes?('src')).to be(false)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'returns false when no source has changed with multiple sources' do
|
75
|
+
allow(@plugin.git).to receive(:modified_files).and_return([
|
76
|
+
'c.txt',
|
77
|
+
'common/a/c.txt',
|
78
|
+
'web/a/c.txt',
|
79
|
+
])
|
80
|
+
|
81
|
+
expect(@plugin.has_app_changes?('common/src', 'web/src')).to be(false)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'supports regexp source' do
|
85
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['ab/1.txt'])
|
86
|
+
|
87
|
+
expect(@plugin.has_app_changes?(%r{[abc]+/[123]\.txt})).to be(true)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'uses plugin config sources when no arguments passed' do
|
91
|
+
@plugin.config do
|
92
|
+
sources %r{[abc]+/[123]\.txt}
|
93
|
+
end
|
94
|
+
|
95
|
+
allow(@plugin.git).to receive(:modified_files).and_return(['ab/1.txt'])
|
96
|
+
|
97
|
+
expect(@plugin.has_app_changes?).to be(true)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|