danger 0.1.1 → 0.2.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 +4 -4
- data/README.md +2 -2
- data/lib/danger/ci_source/circle.rb +4 -2
- data/lib/danger/comment_generators/github.md.erb +11 -29
- data/lib/danger/environment_manager.rb +2 -1
- data/lib/danger/request_sources/github.rb +50 -23
- data/lib/danger/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a534e4b3084cff5f94432c123204a9fac9a4859
|
4
|
+
data.tar.gz: dc850675fbd49a0059842c2c5af8fff5c3dbb110
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29f4abd20107421d94ff5b0159aceedd2aeb35b940ec11c2deab97c255b5bab22e80c42e1c01954cab01bd8a36ecb3492a5c79c101af10b0f46733fad2a2ccd4
|
7
|
+
data.tar.gz: c2840f76f6961a600a9a2b98b7603ee3fa0fbfaf83f43dbee57f0f7c5fa20f603849429d34a9a12baa9f9ad593765f7793651fc6febcb4754609156cca8ec328
|
data/README.md
CHANGED
@@ -55,12 +55,12 @@ You can then create a `Dangerfile` like the following:
|
|
55
55
|
# Easy checks
|
56
56
|
warn("PR is classed as Work in Progress") if pr_title.include? "[WIP]"
|
57
57
|
|
58
|
-
if lines_of_code > 50 && files_modified.include?
|
58
|
+
if lines_of_code > 50 && files_modified.include?("CHANGELOG.yml") == false
|
59
59
|
fail("No CHANGELOG changes made")
|
60
60
|
end
|
61
61
|
|
62
62
|
# Stop skipping some manual testing
|
63
|
-
if lines_of_code > 50 && pr_title.include?
|
63
|
+
if lines_of_code > 50 && pr_title.include?("📱") == false
|
64
64
|
fail("Needs testing on a Phone if change is non-trivial")
|
65
65
|
end
|
66
66
|
|
@@ -5,12 +5,14 @@ module Danger
|
|
5
5
|
module CISource
|
6
6
|
class CircleCI < CI
|
7
7
|
def self.validates?(env)
|
8
|
-
return !env["CIRCLE_BUILD_NUM"].nil? &&
|
8
|
+
return !env["CIRCLE_BUILD_NUM"].nil? &&
|
9
|
+
!env["CI_PULL_REQUEST"].nil? &&
|
10
|
+
URI.parse(env["CI_PULL_REQUEST"]).path.split("/").count == 5
|
9
11
|
end
|
10
12
|
|
11
13
|
def initialize(env)
|
12
14
|
paths = URI.parse(env["CI_PULL_REQUEST"]).path.split("/")
|
13
|
-
#
|
15
|
+
# The first one is an extra slash, ignore it
|
14
16
|
self.repo_slug = paths[1] + "/" + paths[2]
|
15
17
|
self.pull_request_id = paths[4]
|
16
18
|
end
|
@@ -1,32 +1,14 @@
|
|
1
|
-
<%
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
<%
|
6
|
-
|
7
|
-
|
1
|
+
<% @tables.each do |table| %>
|
2
|
+
<% if table[:content].any? %>
|
3
|
+
| <%= table[:content].count %> <%= table[:name] %><%= "s" unless table[:content].count == 1 %>
|
4
|
+
------------- | ------------
|
5
|
+
<% table[:content].each do |message| -%>
|
6
|
+
:<%= table[:emoji] %>: | <%= message %>
|
7
|
+
<% end %>
|
8
|
+
|
9
|
+
<% end %>
|
8
10
|
<% end %>
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
------------- | ------------ <% @warnings.each do |warning| %>
|
13
|
-
:warning: | <%= warning %><% end %>
|
14
|
-
<% else %>
|
15
|
-
:white_check_mark: | No warnings found
|
16
|
-
------------- | ------------
|
17
|
-
<% end %>
|
18
|
-
|
19
|
-
<% if @messages.count > 0 %>
|
20
|
-
| <%= @messages.count %> Message<%= "s" unless @messages.count == 1 %>
|
21
|
-
------------- | ------------ <% @messages.each do |message| %>
|
22
|
-
:book: | <%= message %><% end %>
|
23
|
-
<% end %>
|
24
|
-
|
25
|
-
<p align="right">
|
26
|
-
Generated by
|
27
|
-
<a href="https://github.com/KrauseFx/danger">danger</a>
|
28
|
-
on
|
29
|
-
<i><%= Time.now.strftime("%Y-%m-%d") %></i>
|
12
|
+
<p align="right" meta="generated_by_danger">
|
13
|
+
Generated by :no_entry_sign: <a href="https://github.com/KrauseFx/danger/">danger</a>
|
30
14
|
</p>
|
31
|
-
|
32
|
-
<% "" # the reason why we have the each in the same line is because we don't want a new line in the markdown file %>
|
@@ -23,7 +23,8 @@ module Danger
|
|
23
23
|
|
24
24
|
raise "Could not find a CI source".red unless self.ci_source
|
25
25
|
|
26
|
-
|
26
|
+
# only GitHub for now, open for PRs adding more!
|
27
|
+
self.request_source = GitHub.new(self.ci_source, ENV)
|
27
28
|
end
|
28
29
|
|
29
30
|
def fill_environment_vars
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'rest'
|
2
3
|
require 'json'
|
3
4
|
require 'base64'
|
@@ -5,14 +6,15 @@ require 'octokit'
|
|
5
6
|
|
6
7
|
module Danger
|
7
8
|
class GitHub
|
8
|
-
attr_accessor :ci_source, :pr_json
|
9
|
+
attr_accessor :ci_source, :pr_json, :environment
|
9
10
|
|
10
|
-
def initialize(ci_source)
|
11
|
+
def initialize(ci_source, environment)
|
11
12
|
self.ci_source = ci_source
|
13
|
+
self.environment = environment
|
12
14
|
end
|
13
15
|
|
14
16
|
def client
|
15
|
-
token =
|
17
|
+
token = @environment["DANGER_GITHUB_API_TOKEN"]
|
16
18
|
raise "No API given, please provide one using `DANGER_GITHUB_API_TOKEN`" unless token
|
17
19
|
|
18
20
|
@client ||= Octokit::Client.new(
|
@@ -42,56 +44,81 @@ module Danger
|
|
42
44
|
|
43
45
|
# Sending data to GitHub
|
44
46
|
def update_pull_request!(warnings: nil, errors: nil, messages: nil)
|
45
|
-
|
46
|
-
body = generate_comment(warnings: warnings, errors: errors, messages: messages)
|
47
|
-
result = client.add_comment(ci_source.repo_slug, ci_source.pull_request_id, body)
|
48
|
-
delete_old_comment!(except: result[:id])
|
47
|
+
comment_result = {}
|
49
48
|
|
50
|
-
|
49
|
+
if (warnings + errors + messages).empty?
|
50
|
+
# Just remove the comment, if there's nothing to say.
|
51
|
+
delete_old_comments!
|
52
|
+
else
|
53
|
+
body = generate_comment(warnings: warnings, errors: errors, messages: messages)
|
54
|
+
comment_result = client.add_comment(ci_source.repo_slug, ci_source.pull_request_id, body)
|
55
|
+
delete_old_comments!(except: comment_result[:id])
|
56
|
+
end
|
57
|
+
|
58
|
+
# Now, set the pull request status.
|
59
|
+
# Note: this can terminate the entire process.
|
51
60
|
submit_pull_request_status!(warnings: warnings,
|
52
61
|
errors: errors,
|
53
|
-
details_url:
|
62
|
+
details_url: comment_result['html_url'])
|
54
63
|
end
|
55
64
|
|
56
65
|
def submit_pull_request_status!(warnings: nil, errors: nil, details_url: nil)
|
57
66
|
status = (errors.count == 0 ? 'success' : 'failure')
|
67
|
+
message = generate_github_description(warnings: warnings, errors: errors)
|
58
68
|
client.create_status(ci_source.repo_slug, latest_pr_commit_ref, status, {
|
59
|
-
description:
|
69
|
+
description: message,
|
60
70
|
context: "KrauseFx/danger",
|
61
71
|
target_url: details_url
|
62
72
|
})
|
73
|
+
rescue
|
74
|
+
# This usually means the user has no commit access to this repo
|
75
|
+
# That's always the case for open source projects where you can only
|
76
|
+
# use a read-only GitHub account
|
77
|
+
if errors.count > 0
|
78
|
+
# We need to fail the actual build here
|
79
|
+
abort("\nDanger has failed this build. \nFound #{errors.count} error(s) and I don't have write access to the PR set a PR status.")
|
80
|
+
else
|
81
|
+
puts message
|
82
|
+
end
|
63
83
|
end
|
64
84
|
|
65
85
|
# Get rid of the previously posted comment, to only have the latest one
|
66
|
-
def
|
86
|
+
def delete_old_comments!(except: nil)
|
67
87
|
issues = client.issue_comments(ci_source.repo_slug, ci_source.pull_request_id)
|
68
88
|
issues.each do |issue|
|
69
|
-
next unless issue[:body].
|
89
|
+
next unless issue[:body].include?("generated_by_danger")
|
70
90
|
next if issue[:id] == except
|
71
91
|
client.delete_comment(ci_source.repo_slug, issue[:id])
|
72
92
|
end
|
73
93
|
end
|
74
94
|
|
75
95
|
def generate_github_description(warnings: nil, errors: nil)
|
76
|
-
if errors.
|
77
|
-
"
|
78
|
-
|
79
|
-
"
|
96
|
+
if errors.empty? && warnings.empty?
|
97
|
+
compliment = ["Well done.", "Congrats.", "Woo!",
|
98
|
+
"Yay.", "Jolly good show.", "Good on 'ya.", "Nice work."]
|
99
|
+
return "All green. #{compliment.sample}"
|
80
100
|
else
|
81
|
-
|
101
|
+
message = "⚠ "
|
102
|
+
message += "#{errors.count} Error#{errors.count == 1 ? '' : 's'}. " unless errors.empty?
|
103
|
+
message += "#{warnings.count} Warning#{warnings.count == 1 ? '' : 's'}. " unless warnings.empty?
|
104
|
+
message += "Don't worry, everything is fixable."
|
105
|
+
return message
|
82
106
|
end
|
83
107
|
end
|
84
108
|
|
85
109
|
def generate_comment(warnings: nil, errors: nil, messages: nil)
|
86
110
|
require 'erb'
|
87
111
|
|
88
|
-
@warnings = warnings
|
89
|
-
@errors = errors
|
90
|
-
@messages = messages
|
91
|
-
|
92
112
|
md_template = File.join(Danger.gem_path, "lib/danger/comment_generators/github.md.erb")
|
93
|
-
|
94
|
-
|
113
|
+
|
114
|
+
# erb: http://www.rrn.dk/rubys-erb-templating-system
|
115
|
+
# for the extra args: http://stackoverflow.com/questions/4632879/erb-template-removing-the-trailing-line
|
116
|
+
@tables = [
|
117
|
+
{ name: "Error", emoji: "no_entry_sign", content: errors },
|
118
|
+
{ name: "Warning", emoji: "warning", content: warnings },
|
119
|
+
{ name: "Message", emoji: "book", content: messages }
|
120
|
+
]
|
121
|
+
return ERB.new(File.read(md_template), 0, "-").result(binding)
|
95
122
|
end
|
96
123
|
end
|
97
124
|
end
|
data/lib/danger/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: danger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Orta Therox
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-01-
|
12
|
+
date: 2016-01-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: claide
|
@@ -215,8 +215,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
215
215
|
version: '0'
|
216
216
|
requirements: []
|
217
217
|
rubyforge_project:
|
218
|
-
rubygems_version: 2.4.
|
218
|
+
rubygems_version: 2.4.0
|
219
219
|
signing_key:
|
220
220
|
specification_version: 4
|
221
221
|
summary: Ensure your pull request is up to standard with a nice DSL
|
222
222
|
test_files: []
|
223
|
+
has_rdoc:
|