danger 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +35 -13
  3. data/lib/danger/ci_source/circle.rb +1 -1
  4. data/lib/danger/ci_source/drone.rb +18 -0
  5. data/lib/danger/ci_source/local_git_repo.rb +11 -2
  6. data/lib/danger/ci_source/semaphore.rb +18 -0
  7. data/lib/danger/commands/init.rb +8 -8
  8. data/lib/danger/commands/local.rb +26 -8
  9. data/lib/danger/commands/new_plugin.rb +0 -8
  10. data/lib/danger/commands/runner.rb +32 -18
  11. data/lib/danger/comment_generators/github.md.erb +1 -1
  12. data/lib/danger/{scm_source → core_ext}/file_list.rb +1 -0
  13. data/lib/danger/core_ext/string.rb +4 -0
  14. data/lib/danger/danger_core/dangerfile.rb +217 -0
  15. data/lib/danger/danger_core/dangerfile_dsl.rb +29 -0
  16. data/lib/danger/{environment_manager.rb → danger_core/environment_manager.rb} +16 -8
  17. data/lib/danger/danger_core/plugins/dangerfile_git_plugin.rb +69 -0
  18. data/lib/danger/danger_core/plugins/dangerfile_github_plugin.rb +68 -0
  19. data/lib/danger/danger_core/plugins/dangerfile_import_plugin.rb +58 -0
  20. data/lib/danger/danger_core/plugins/dangerfile_messaging_plugin.rb +87 -0
  21. data/lib/danger/{standard_error.rb → danger_core/standard_error.rb} +1 -1
  22. data/lib/danger/plugin_support/plugin.rb +31 -0
  23. data/lib/danger/plugin_support/plugin_parser.rb +70 -0
  24. data/lib/danger/{request_sources → request_source}/github.rb +6 -37
  25. data/lib/danger/scm_source/git_repo.rb +2 -25
  26. data/lib/danger/version.rb +1 -1
  27. data/lib/danger.rb +3 -4
  28. metadata +79 -17
  29. data/lib/danger/available_values.rb +0 -28
  30. data/lib/danger/dangerfile.rb +0 -123
  31. data/lib/danger/dangerfile_dsl.rb +0 -159
  32. data/lib/danger/plugin.rb +0 -26
  33. data/lib/danger/plugins/protect_files.rb +0 -34
  34. /data/lib/danger/{circle_api.rb → ci_source/circle_api.rb} +0 -0
  35. /data/lib/danger/{violation.rb → danger_core/violation.rb} +0 -0
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.7.2
4
+ version: 0.8.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-04-13 00:00:00.000000000 Z
12
+ date: 2016-06-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: claide
@@ -166,19 +166,19 @@ dependencies:
166
166
  - !ruby/object:Gem::Version
167
167
  version: '0'
168
168
  - !ruby/object:Gem::Dependency
169
- name: fastlane
169
+ name: pry
170
170
  requirement: !ruby/object:Gem::Requirement
171
171
  requirements:
172
172
  - - ">="
173
173
  - !ruby/object:Gem::Version
174
- version: 1.49.0
174
+ version: '0'
175
175
  type: :development
176
176
  prerelease: false
177
177
  version_requirements: !ruby/object:Gem::Requirement
178
178
  requirements:
179
179
  - - ">="
180
180
  - !ruby/object:Gem::Version
181
- version: 1.49.0
181
+ version: '0'
182
182
  - !ruby/object:Gem::Dependency
183
183
  name: rubocop
184
184
  requirement: !ruby/object:Gem::Requirement
@@ -193,6 +193,62 @@ dependencies:
193
193
  - - "~>"
194
194
  - !ruby/object:Gem::Version
195
195
  version: 0.38.0
196
+ - !ruby/object:Gem::Dependency
197
+ name: yard
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ - !ruby/object:Gem::Dependency
211
+ name: listen
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - '='
215
+ - !ruby/object:Gem::Version
216
+ version: 3.0.7
217
+ type: :development
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - '='
222
+ - !ruby/object:Gem::Version
223
+ version: 3.0.7
224
+ - !ruby/object:Gem::Dependency
225
+ name: guard
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ - !ruby/object:Gem::Dependency
239
+ name: guard-rspec
240
+ requirement: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - ">="
243
+ - !ruby/object:Gem::Version
244
+ version: '0'
245
+ type: :development
246
+ prerelease: false
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - ">="
250
+ - !ruby/object:Gem::Version
251
+ version: '0'
196
252
  description: Create a Dangerfile to introspect your pull request in CI, makes it easy
197
253
  to enforce social conventions like changelogs and tests.
198
254
  email:
@@ -209,33 +265,38 @@ files:
209
265
  - lib/assets/DangerfileTemplate
210
266
  - lib/assets/PluginTemplate.rb.template
211
267
  - lib/danger.rb
212
- - lib/danger/available_values.rb
213
268
  - lib/danger/ci_source/buildkite.rb
214
269
  - lib/danger/ci_source/ci_source.rb
215
270
  - lib/danger/ci_source/circle.rb
271
+ - lib/danger/ci_source/circle_api.rb
272
+ - lib/danger/ci_source/drone.rb
216
273
  - lib/danger/ci_source/jenkins.rb
217
274
  - lib/danger/ci_source/local_git_repo.rb
275
+ - lib/danger/ci_source/semaphore.rb
218
276
  - lib/danger/ci_source/travis.rb
219
277
  - lib/danger/ci_source/xcode_server.rb
220
- - lib/danger/circle_api.rb
221
278
  - lib/danger/commands/init.rb
222
279
  - lib/danger/commands/init_helpers/interviewer.rb
223
280
  - lib/danger/commands/local.rb
224
281
  - lib/danger/commands/new_plugin.rb
225
282
  - lib/danger/commands/runner.rb
226
283
  - lib/danger/comment_generators/github.md.erb
284
+ - lib/danger/core_ext/file_list.rb
227
285
  - lib/danger/core_ext/string.rb
228
- - lib/danger/dangerfile.rb
229
- - lib/danger/dangerfile_dsl.rb
230
- - lib/danger/environment_manager.rb
231
- - lib/danger/plugin.rb
232
- - lib/danger/plugins/protect_files.rb
233
- - lib/danger/request_sources/github.rb
234
- - lib/danger/scm_source/file_list.rb
286
+ - lib/danger/danger_core/dangerfile.rb
287
+ - lib/danger/danger_core/dangerfile_dsl.rb
288
+ - lib/danger/danger_core/environment_manager.rb
289
+ - lib/danger/danger_core/plugins/dangerfile_git_plugin.rb
290
+ - lib/danger/danger_core/plugins/dangerfile_github_plugin.rb
291
+ - lib/danger/danger_core/plugins/dangerfile_import_plugin.rb
292
+ - lib/danger/danger_core/plugins/dangerfile_messaging_plugin.rb
293
+ - lib/danger/danger_core/standard_error.rb
294
+ - lib/danger/danger_core/violation.rb
295
+ - lib/danger/plugin_support/plugin.rb
296
+ - lib/danger/plugin_support/plugin_parser.rb
297
+ - lib/danger/request_source/github.rb
235
298
  - lib/danger/scm_source/git_repo.rb
236
- - lib/danger/standard_error.rb
237
299
  - lib/danger/version.rb
238
- - lib/danger/violation.rb
239
300
  homepage: http://github.com/danger/danger
240
301
  licenses:
241
302
  - MIT
@@ -256,8 +317,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
256
317
  version: '0'
257
318
  requirements: []
258
319
  rubyforge_project:
259
- rubygems_version: 2.6.2
320
+ rubygems_version: 2.2.2
260
321
  signing_key:
261
322
  specification_version: 4
262
323
  summary: Automate your PR etiquette.
263
324
  test_files: []
325
+ has_rdoc:
@@ -1,28 +0,0 @@
1
- module Danger
2
- # Defines all the values that should be available in someone's Dangerfile
3
- class AvailableValues
4
- def self.all
5
- self.scm + self.request_source
6
- end
7
-
8
- def self.scm
9
- [
10
- :lines_of_code,
11
- :modified_files,
12
- :deleted_files,
13
- :added_files,
14
- :deletions,
15
- :insertions
16
- ]
17
- end
18
-
19
- def self.request_source
20
- [
21
- :pr_title,
22
- :pr_body,
23
- :pr_author,
24
- :pr_labels
25
- ]
26
- end
27
- end
28
- end
@@ -1,123 +0,0 @@
1
- # So much was ripped direct from CocoaPods-Core - thanks!
2
-
3
- require 'danger/dangerfile_dsl'
4
- require 'danger/standard_error'
5
-
6
- module Danger
7
- class Dangerfile
8
- include Danger::Dangerfile::DSL
9
-
10
- attr_accessor :env, :warnings, :errors, :messages, :markdowns, :verbose
11
-
12
- # @return [Pathname] the path where the Dangerfile was loaded from. It is nil
13
- # if the Dangerfile was generated programmatically.
14
- #
15
- attr_accessor :defined_in_file
16
-
17
- # @return [String] a string useful to represent the Dangerfile in a message
18
- # presented to the user.
19
- #
20
- def to_s
21
- 'Dangerfile'
22
- end
23
-
24
- # Iterates through the DSL's attributes, and table's the output
25
- def print_known_info
26
- rows = []
27
-
28
- AvailableValues.all.each do |key|
29
- value = self.send(key)
30
- value = value.scan(/.{,80}/).to_a.each(&:strip!).join("\n") if key == :pr_body
31
-
32
- # So that we either have one value per row
33
- # or we have [] for an empty array
34
- value = value.join("\n") if value.kind_of?(Array) && value.count > 0
35
-
36
- rows << [key.to_s, value]
37
- end
38
-
39
- rows << ["---", "---"]
40
- rows << ["SCM", env.scm.class]
41
- rows << ["Source", env.ci_source.class]
42
- rows << ["Requests", env.request_source.class]
43
- rows << ["Base Commit", env.meta_info_for_base]
44
- rows << ["Head Commit", env.meta_info_for_head]
45
-
46
- params = {}
47
- params[:rows] = rows.each { |current| current[0] = current[0].yellow }
48
- params[:title] = "Danger v#{Danger::VERSION}\nDSL Attributes".green
49
-
50
- puts ""
51
- puts Terminal::Table.new(params)
52
- puts ""
53
- end
54
-
55
- # Parses the file at a path, optionally takes the content of the file for DI
56
- #
57
- def parse(path, contents = nil)
58
- print_known_info if verbose
59
-
60
- contents ||= File.open(path, 'r:utf-8', &:read)
61
-
62
- # Work around for Rubinius incomplete encoding in 1.9 mode
63
- if contents.respond_to?(:encoding) && contents.encoding.name != 'UTF-8'
64
- contents.encode!('UTF-8')
65
- end
66
-
67
- if contents.tr!('“”‘’‛', %(""'''))
68
- # Changes have been made
69
- puts "Your #{path.basename} has had smart quotes sanitised. " \
70
- 'To avoid issues in the future, you should not use ' \
71
- 'TextEdit for editing it. If you are not using TextEdit, ' \
72
- 'you should turn off smart quotes in your editor of choice.'.red
73
- end
74
-
75
- if contents.include?("puts")
76
- puts "You used `puts` in your Dangerfile. To print out text to GitHub use `message` instead"
77
- end
78
-
79
- self.defined_in_file = path
80
- instance_eval do
81
- # rubocop:disable Lint/RescueException
82
- begin
83
- # rubocop:disable Eval
84
- eval(contents, nil, path.to_s)
85
- # rubocop:enable Eval
86
- rescue Exception => e
87
- message = "Invalid `#{path.basename}` file: #{e.message}"
88
- raise DSLError.new(message, path, e.backtrace, contents)
89
- end
90
- # rubocop:enable Lint/RescueException
91
- end
92
- end
93
-
94
- def print_results
95
- return if (self.errors + self.warnings + self.messages + self.markdowns).count == 0
96
-
97
- puts ""
98
- puts "danger results:"
99
- [:errors, :warnings, :messages].each do |current|
100
- params = {}
101
- params[:rows] = self.send(current).collect { |a| [a.message] }
102
- next unless params[:rows].count > 0
103
- params[:title] = case current
104
- when :errors
105
- current.to_s.capitalize.red
106
- when :warnings
107
- current.to_s.capitalize.yellow
108
- else
109
- current.to_s.capitalize
110
- end
111
-
112
- puts ""
113
- puts Terminal::Table.new(params)
114
- puts ""
115
- end
116
-
117
- puts "Markdown: ".green if self.markdowns.count > 0
118
- self.markdowns.each do |current_markdown|
119
- puts current_markdown
120
- end
121
- end
122
- end
123
- end
@@ -1,159 +0,0 @@
1
- require 'danger/violation'
2
-
3
- module Danger
4
- class Dangerfile
5
- module DSL
6
- # @!group Enviroment
7
- # @return [EnvironmentManager] Provides access to the raw Travis/Circle/Buildkite/GitHub
8
- # objects, which you can use to pull out extra bits of information. _Warning_
9
- # the api of these objects is **not** considered a part of the Dangerfile public
10
- # API, and is viable to change occasionally on the whims of developers.
11
-
12
- attr_reader :env
13
-
14
- def initialize
15
- self.warnings = []
16
- self.errors = []
17
- self.messages = []
18
- self.markdowns = []
19
-
20
- load_default_plugins
21
- end
22
-
23
- def import(path)
24
- raise "`import` requires a string" unless path.kind_of?(String)
25
- path += ".rb" unless path.end_with?(".rb")
26
-
27
- if path.start_with?("http")
28
- import_url(path)
29
- else
30
- import_local(path)
31
- end
32
- end
33
-
34
- # Download a remote plugin and use it locally
35
- #
36
- # @param [String] url
37
- # https URL to the Ruby file to use
38
- def import_url(url)
39
- raise "URL is not https, for security reasons `danger` only supports encrypted requests" unless url.start_with?("https://")
40
-
41
- require 'tmpdir'
42
- require 'faraday'
43
- require 'faraday_middleware'
44
-
45
- @http_client ||= Faraday.new do |b|
46
- b.use FaradayMiddleware::FollowRedirects
47
- b.adapter :net_http
48
- end
49
- content = @http_client.get(url)
50
-
51
- Dir.mktmpdir do |dir|
52
- path = File.join(dir, "temporary_remote_action.rb")
53
- File.write(path, content.body)
54
- import_local(path)
55
- end
56
- end
57
-
58
- # Import one or more local plugins
59
- #
60
- # @param [String] path
61
- # The path to the file to import
62
- # Can also be a pattern (./**/*plugin.rb)
63
- def import_local(path)
64
- Dir[path].each do |file|
65
- require File.expand_path(file) # without the expand_path it would fail if the path doesn't start with ./
66
- end
67
- end
68
-
69
- def should_ignore_violation(message)
70
- env.request_source.ignored_violations.include? message
71
- end
72
-
73
- # Declares a CI blocking error
74
- #
75
- # @param [String] message
76
- # The message to present to the user
77
- # @param [Boolean] sticky
78
- # Whether the message should be kept after it was fixed
79
- def fail(message, sticky: true)
80
- return if should_ignore_violation(message)
81
- self.errors << Violation.new(message, sticky)
82
- puts "Raising error '#{message}'"
83
- end
84
-
85
- # Specifies a problem, but not critical
86
- #
87
- # @param [String] message
88
- # The message to present to the user
89
- # @param [Boolean] sticky
90
- # Whether the message should be kept after it was fixed
91
- def warn(message, sticky: true)
92
- return if should_ignore_violation(message)
93
- self.warnings << Violation.new(message, sticky)
94
- puts "Printing warning '#{message}'"
95
- end
96
-
97
- # Print out a generate message on the PR
98
- #
99
- # @param [String] message
100
- # The message to present to the user
101
- # @param [Boolean] sticky
102
- # Whether the message should be kept after it was fixed
103
- def message(message, sticky: true)
104
- self.messages << Violation.new(message, sticky)
105
- puts "Printing message '#{message}'"
106
- end
107
-
108
- # Print markdown to below the table
109
- #
110
- # @param [String] message
111
- # The markdown based message to be printed below the table
112
- def markdown(message)
113
- self.markdowns << message
114
- puts "Printing markdown #{message}"
115
- end
116
-
117
- # When an undefined method is called, we check to see if it's something
118
- # that either the `scm` or the `request_source` can handle.
119
- # This opens us up to letting those object extend themselves naturally.
120
- # This will also look for plugins
121
- def method_missing(method_sym, *arguments, &_block)
122
- # SCM Source
123
- if AvailableValues.scm.include?(method_sym)
124
- return env.scm.send(method_sym)
125
- end
126
-
127
- # Request Source
128
- if AvailableValues.request_source.include?(method_sym)
129
- return env.request_source.send(method_sym)
130
- end
131
-
132
- # Plugins
133
- class_name = method_sym.to_s.danger_class
134
- if Danger::Dangerfile::DSL.const_defined?(class_name)
135
- plugin_ref = Danger::Dangerfile::DSL.const_get(class_name)
136
- if plugin_ref < Plugin
137
- plugin_ref.new(self).run(*arguments)
138
- else
139
- raise "'#{method_sym}' is not a valid danger plugin".red
140
- end
141
- else
142
- raise "Unknown method '#{method_sym}', please check out the documentation for available plugins".red
143
- end
144
- end
145
-
146
- private
147
-
148
- def load_default_plugins
149
- Dir["./lib/danger/plugins/*.rb"].each do |file|
150
- require File.expand_path(file)
151
- end
152
-
153
- Dir["./danger_plugins/*.rb"].each do |file|
154
- require File.expand_path(file)
155
- end
156
- end
157
- end
158
- end
159
- end
data/lib/danger/plugin.rb DELETED
@@ -1,26 +0,0 @@
1
- module Danger
2
- class Dangerfile
3
- module DSL
4
- class Plugin
5
- def initialize(dsl)
6
- @dsl = dsl
7
- end
8
-
9
- # Since we have a reference to the DSL containing all the information
10
- # We need to redirect the self calls to the DSL
11
- def method_missing(method_sym, *arguments, &_block)
12
- return @dsl.send(method_sym, *arguments) if @dsl.respond_to?(method_sym)
13
- return @dsl.method_missing(method_sym, *arguments)
14
- end
15
-
16
- def run
17
- raise "run method must be implemented"
18
- end
19
-
20
- def self.description
21
- "Add plugin description here"
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,34 +0,0 @@
1
- module Danger
2
- class Dangerfile
3
- module DSL
4
- class ProtectFiles < Plugin
5
- def run(path: nil, message: nil, fail_build: true)
6
- raise "You have to provide a message" if message.to_s.length == 0
7
- raise "You have to provide a path" if path.to_s.length == 0
8
-
9
- broken_rule = false
10
-
11
- Dir.glob(path) do |current|
12
- broken_rule = true if self.env.scm.modified_files.include?(current)
13
- end
14
-
15
- return unless broken_rule
16
-
17
- if fail_build
18
- @dsl.errors << message
19
- else
20
- @dsl.warnings << message
21
- end
22
- end
23
-
24
- def self.description
25
- [
26
- "Protect a file from being changed. This can",
27
- "be used in combination with some kind of",
28
- "permission check if a user is inside the org"
29
- ].join(" ")
30
- end
31
- end
32
- end
33
- end
34
- end