danger 0.9.0 → 0.9.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: 730a6b52e123cb69852704e92867526da77dcaa3
4
- data.tar.gz: c48c217b428923652f446788107c0d140074e967
3
+ metadata.gz: e02bc78c88ffbdd9d2c7c7b4abd87939c2a76837
4
+ data.tar.gz: 173e0a2993c408b5b6e53c379239e97228839bc3
5
5
  SHA512:
6
- metadata.gz: e722f6688e5a65281c751a762fb3f8df5342080a404b15b7ca62c7ec6dcf3ff501dafc4a9f9881c75a5661ca5b64f3aec4309a3dcdcd693a607d24d241c970c9
7
- data.tar.gz: 4a205ad49112adbb1980182cabebecb6c79eabdab0da89f70cabd7a58b2cd669c304e9dafa26b107aab6924f09f7700203bdaeac7a0d5a0026bf27ebbe97b5aa
6
+ metadata.gz: 001cd98d2bd528920fd6aafffea0aca00b41672e32e52588ba30f1eb2e9614cd246bf066f7ced68bbe6ec289f90e0c03774ea8e6d075de1ced383f20909a8854
7
+ data.tar.gz: 65669c564bcae4590b3bc384b5d3a96c16b74404e48d4489eaef4cc6d17a8a53270db8e5cfa3969579c3bac5176b47187de777f31012b92dcc52b660a5b59591
@@ -28,7 +28,7 @@ module Danger
28
28
  github_host = env["DANGER_GITHUB_HOST"] || "github.com"
29
29
 
30
30
  # get the remote URL
31
- remote = run_git "remote show origin -n | grep \"Fetch URL\" | cut -d ':' -f 2-"
31
+ remote = run_git("remote show origin -n").lines.grep(/Fetch URL/)[0].split(": ", 2)[1]
32
32
  if remote
33
33
  remote_url_matches = remote.match(%r{#{Regexp.escape github_host}(:|/)(?<repo_slug>.+/.+?)(?:\.git)?$})
34
34
  if !remote_url_matches.nil? and remote_url_matches["repo_slug"]
@@ -40,10 +40,10 @@ module Danger
40
40
 
41
41
  specific_pr = env["LOCAL_GIT_PR_ID"]
42
42
  pr_ref = specific_pr ? "##{specific_pr}" : ""
43
- pr_command = "log --merges --oneline | grep \"Merge pull request #{pr_ref}\" | head -n 1"
43
+ pr_command = "log --merges --oneline"
44
44
 
45
45
  # get the most recent PR merge
46
- pr_merge = run_git pr_command.strip
46
+ pr_merge = run_git(pr_command.strip).lines.grep(Regexp.new("Merge pull request " + pr_ref))[0]
47
47
 
48
48
  if pr_merge.to_s.empty?
49
49
  if specific_pr
@@ -0,0 +1,40 @@
1
+ require "danger/plugin_support/plugin_parser"
2
+ require "danger/plugin_support/plugin_file_resolver"
3
+
4
+ module Danger
5
+ class PluginJSON < CLAide::Command::Plugins
6
+ self.summary = "Prints the JSON documentation representing a plugin"
7
+ self.command = "json"
8
+
9
+ attr_accessor :cork
10
+
11
+ def initialize(argv)
12
+ @refs = argv.arguments! unless argv.arguments.empty?
13
+ @cork = Cork::Board.new(silent: argv.option("silent", false),
14
+ verbose: argv.option("verbose", false))
15
+ super
16
+ end
17
+
18
+ self.summary = "Lint plugins from files, gems or the current folder. Outputs JSON array representation of Plugins on success."
19
+
20
+ self.description = <<-DESC
21
+ Converts a collection of file paths of Danger plugins into a JSON format.
22
+ Note: Before 1.0, it will also parse the represented JSON to validate whether http://danger.systems would
23
+ show the plugin on the website.
24
+ DESC
25
+
26
+ self.arguments = [
27
+ CLAide::Argument.new("Paths, Gems or Nothing", false, true)
28
+ ]
29
+
30
+ def run
31
+ file_resolver = PluginFileResolver.new(@refs)
32
+ paths = file_resolver.resolve_to_paths
33
+
34
+ parser = PluginParser.new(paths)
35
+ parser.parse
36
+ json = parser.to_json_string
37
+ cork.puts json
38
+ end
39
+ end
40
+ end
@@ -1,5 +1,6 @@
1
1
  require "danger/plugin_support/plugin_parser"
2
2
  require "danger/plugin_support/plugin_file_resolver"
3
+ require "danger/plugin_support/plugin_linter"
3
4
 
4
5
  module Danger
5
6
  class PluginLint < CLAide::Command::Plugins
@@ -34,7 +35,12 @@ module Danger
34
35
  parser = PluginParser.new(paths)
35
36
  parser.parse
36
37
  json = parser.to_json
37
- cork.puts json
38
+
39
+ linter = PluginLinter.new(json)
40
+ linter.lint
41
+ linter.print_summary(cork)
42
+
43
+ exit(1) if linter.failed?
38
44
  end
39
45
  end
40
46
  end
@@ -13,6 +13,7 @@ module Danger
13
13
  "https://github.com/danger/danger-plugin-template")
14
14
 
15
15
  require "danger/commands/plugins/plugin_lint"
16
+ require "danger/commands/plugins/plugin_json"
16
17
  require "danger/commands/plugins/plugin_readme"
17
18
 
18
19
  self.summary = "Run the Dangerfile."
@@ -0,0 +1,154 @@
1
+ module Danger
2
+ class PluginLinter
3
+ # An internal class that is used to represent a rule for the linter.
4
+ class Rule
5
+ attr_accessor :modifier, :description, :title, :function, :ref, :metadata, :type
6
+
7
+ def initialize(modifier, ref, title, description, function)
8
+ @modifier = modifier
9
+ @title = title
10
+ @description = description
11
+ @function = function
12
+ @ref = ref
13
+ end
14
+
15
+ def object_applied_to
16
+ metadata[:name].to_s.bold + " (" + type + ")"
17
+ end
18
+ end
19
+
20
+ attr_accessor :json, :warnings, :errors
21
+
22
+ def initialize(json)
23
+ @json = json
24
+ @warnings = []
25
+ @errors = []
26
+ end
27
+
28
+ # Lints the current JSON, looking at:
29
+ # * Class rules
30
+ # * Method rules
31
+ # * Attribute rules
32
+ #
33
+ def lint
34
+ json.each do |plugin|
35
+ apply_rules(plugin, "class", class_rules)
36
+
37
+ plugin[:methods].each do |method|
38
+ apply_rules(method, "method", method_rules)
39
+ end
40
+
41
+ plugin[:attributes].each do |method_hash|
42
+ method_name = method_hash.keys.first
43
+ method = method_hash[method_name]
44
+
45
+ value = method[:write] || method[:read]
46
+ apply_rules(value, "attribute", method_rules)
47
+ end
48
+ end
49
+ end
50
+
51
+ # Did the linter pass/fail?
52
+ #
53
+ def failed?
54
+ errors.empty? == false
55
+ end
56
+
57
+ # Prints a summary of the errors and warnings.
58
+ #
59
+ def print_summary(ui)
60
+ # Print whether it passed/failed at the top
61
+ if failed?
62
+ ui.notice "Passed\n"
63
+ else
64
+ ui.puts "\n[!] Failed\n".red
65
+ end
66
+
67
+ # A generic proc to handle the similarities between
68
+ # erros and warnings.
69
+ do_rules = proc do |name, rules|
70
+ unless rules.empty?
71
+ ui.section(name.bold) do
72
+ rules.each do |rule|
73
+ title = rule.title.bold + " - #{rule.object_applied_to}"
74
+ ui.labeled(title, [rule.description, link(rule.ref)])
75
+ ui.puts ""
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ # Run the rules
82
+ do_rules.call("Errors".red, errors)
83
+ do_rules.call("Warnings".yellow, warnings)
84
+ end
85
+
86
+ private
87
+
88
+ # Rules that apply to a class
89
+ #
90
+ def class_rules
91
+ [
92
+ Rule.new(:error, 4..6, "Description Markdown", "Above your class you need documentation that covers the scope, and the usage of your plugin.", proc do |json|
93
+ json[:body_md] && json[:body_md].empty?
94
+ end),
95
+ Rule.new(:warning, 30, "Tags", "This plugin does not include `@tags tag1, tag2` and thus will be harder to find in search.", proc do |json|
96
+ json[:tags] && json[:tags].empty?
97
+ end),
98
+ Rule.new(:warning, 29, "References", "Ideally, you have a reference implementation of your plugin that you can show to people, add `@see org/repo` to have the site auto link it.", proc do |json|
99
+ json[:see] && json[:see].empty?
100
+ end),
101
+ Rule.new(:error, 8..27, "Examples", "You should include some examples of common use-cases for your plugin.", proc do |json|
102
+ json[:example_code] && json[:example_code].empty?
103
+ end)
104
+ ]
105
+ end
106
+
107
+ # Rules that apply to individual methods, and attributes
108
+ #
109
+ def method_rules
110
+ [
111
+ Rule.new(:error, 40..41, "Description", "You should include a description for your method.", proc do |json|
112
+ json[:body_md] && json[:body_md].empty?
113
+ end),
114
+ Rule.new(:warning, 43..45, "Params", "If the function has no useful return value, use ` @return [void]`.", proc do |json|
115
+ json[:param_couplets] && json[:param_couplets].flat_map(&:values).include?(nil)
116
+ end),
117
+ Rule.new(:warning, 46, "Return Type", "If the function has no useful return value, use ` @return [void]` - this will be ignored by documentation generators.", proc do |json|
118
+ json[:return] && json[:return].empty?
119
+ end)
120
+ ]
121
+ end
122
+
123
+ # Generates a link to see an example of said rule
124
+ #
125
+ def link(ref)
126
+ if ref.kind_of? Range
127
+ "@see - " + "https://github.com/dbgrandi/danger-prose/blob/v2.0.0/lib/danger_plugin.rb#L#{ref.min}#-L#{ref.max}".blue
128
+ elsif ref.kind_of? Fixnum
129
+ "@see - " + "https://github.com/dbgrandi/danger-prose/blob/v2.0.0/lib/danger_plugin.rb#L#{ref}".blue
130
+ else
131
+ "@see - " + "https://github.com/dbgrandi/danger-prose/blob/v2.0.0/lib/danger_plugin.rb".blue
132
+ end
133
+ end
134
+
135
+ # Runs the rule, if it fails then additional metadata
136
+ # is added to the rule (for printing later) and it's
137
+ # added to either `warnings` or `errors`.
138
+ #
139
+ def apply_rules(json, type, rules)
140
+ rules.each do |rule|
141
+ next unless rule.function.call(json)
142
+ rule.metadata = json
143
+ rule.type = type
144
+
145
+ case rule.modifier
146
+ when :warning
147
+ warnings << rule
148
+ when :error
149
+ errors << rule
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -68,7 +68,12 @@ module Danger
68
68
 
69
69
  def to_json
70
70
  plugins = plugins_from_classes(classes_in_file)
71
- to_dict(plugins).to_json
71
+ to_h(plugins)
72
+ end
73
+
74
+ def to_json_string
75
+ plugins = plugins_from_classes(classes_in_file)
76
+ to_h(plugins).to_json
72
77
  end
73
78
 
74
79
  # rubocop:disable Metrics/AbcSize
@@ -140,7 +145,7 @@ module Danger
140
145
  }
141
146
  end
142
147
 
143
- def to_dict(classes)
148
+ def to_h(classes)
144
149
  classes.map do |klass|
145
150
  # Adds the class being parsed into the ruby runtime, so that we can access it's instance_name
146
151
  require klass.file
@@ -21,7 +21,7 @@ module Danger
21
21
  end
22
22
 
23
23
  def origins
24
- exec "remote show origin -n | grep \"Fetch URL\" | cut -d ':' -f 2-"
24
+ exec("remote show origin -n").lines.grep(/Fetch URL/)[0].split(": ", 2)[1]
25
25
  end
26
26
  end
27
27
  end
@@ -1,4 +1,4 @@
1
1
  module Danger
2
- VERSION = "0.9.0".freeze
2
+ VERSION = "0.9.1".freeze
3
3
  DESCRIPTION = "Automate your PR etiquette.".freeze
4
4
  end
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.9.0
4
+ version: 0.9.1
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-07-12 00:00:00.000000000 Z
12
+ date: 2016-07-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: claide
@@ -322,6 +322,7 @@ files:
322
322
  - lib/danger/commands/init.rb
323
323
  - lib/danger/commands/init_helpers/interviewer.rb
324
324
  - lib/danger/commands/local.rb
325
+ - lib/danger/commands/plugins/plugin_json.rb
325
326
  - lib/danger/commands/plugins/plugin_lint.rb
326
327
  - lib/danger/commands/plugins/plugin_readme.rb
327
328
  - lib/danger/commands/runner.rb
@@ -339,6 +340,7 @@ files:
339
340
  - lib/danger/danger_core/violation.rb
340
341
  - lib/danger/plugin_support/plugin.rb
341
342
  - lib/danger/plugin_support/plugin_file_resolver.rb
343
+ - lib/danger/plugin_support/plugin_linter.rb
342
344
  - lib/danger/plugin_support/plugin_parser.rb
343
345
  - lib/danger/plugin_support/templates/readme_table.html.erb
344
346
  - lib/danger/request_source/github.rb