Class: Danger::DangerfileVSTSPlugin

Inherits:
Plugin
  • Object
show all
Defined in:
lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb

Overview

Handles interacting with VSTS inside a Dangerfile. Provides a few functions which wrap ‘pr_json` and also through a few standard functions to simplify your code.

Examples:

Warn when a PR is classed as work in progress


warn "PR is classed as Work in Progress" if vsts.pr_title.include? "[WIP]"

Declare a PR to be simple to avoid specific Danger rules


declared_trivial = (vsts.pr_title + vsts.pr_body).include?("#trivial")

Ensure there is a summary for a PR


failure "Please provide a summary in the Pull Request description" if vsts.pr_body.length < 5

Only accept PRs to the develop branch


failure "Please re-submit this PR to develop, we may have already fixed your issue." if vsts.branch_for_base != "develop"

Highlight when a celebrity makes a pull request


message "Welcome, Danger." if vsts.pr_author == "dangermcshane"

Ensure that all PRs have an assignee


warn "This PR does not have any assignees yet." unless vsts.pr_json["reviewers"].length == 0

Send a message with links to a collection of specific files


if git.modified_files.include? "config/*.js"
  config_files = git.modified_files.select { |path| path.include? "config/" }
  message "This PR changes #{ vsts.markdown_link(config_files) }"
end

Highlight with a clickable link if a Package.json is changed


warn "#{vsts.markdown_link("Package.json")} was edited." if git.modified_files.include? "Package.json"

Note an issue with a particular line on a file using the #L syntax, e.g. ‘#L23`


linter_json = `my_linter lint "file"`
results = JSON.parse linter_json
unless results.empty?
  file, line, warning = result.first
  warn "#{vsts.markdown_link("#{file}#L#{line}")} has linter issue: #{warning}."
end

See Also:

  • danger/danger

VSTS Misc collapse

PR Metadata collapse

PR Commit Metadata collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Plugin

all_plugins, clear_external_plugins, inherited, #method_missing

Constructor Details

#initialize(dangerfile) ⇒ DangerfileVSTSPlugin

Returns a new instance of DangerfileVSTSPlugin.



70
71
72
73
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 70

def initialize(dangerfile)
  super(dangerfile)
  @source = dangerfile.env.request_source
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Danger::Plugin

Class Method Details

.instance_nameString

The instance name used in the Dangerfile

Returns:



66
67
68
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 66

def self.instance_name
  "vsts"
end

.new(dangerfile) ⇒ Object

So that this init can fail.



57
58
59
60
61
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 57

def self.new(dangerfile)
  return nil if dangerfile.env.request_source.class != Danger::RequestSources::VSTS

  super
end

Instance Method Details

#base_commitString

The base commit to which the PR is going to be merged as a parent.

Returns:



139
140
141
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 139

def base_commit
  @source.pr_json[:lastMergeTargetCommit][:commitId].to_s
end

#branch_for_baseString

The branch to which the PR is going to be merged into.

Returns:



112
113
114
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 112

def branch_for_base
  branch_name(:targetRefName)
end

#branch_for_headString

The branch to which the PR is going to be merged from.

Returns:



131
132
133
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 131

def branch_for_head
  branch_name(:sourceRefName)
end

#head_commitString

The head commit to which the PR is requesting to be merged from.

Returns:



147
148
149
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 147

def head_commit
  @source.pr_json[:lastMergeSourceCommit][:commitId].to_s
end

Returns a list of Markdown links for a file, or files in the head repository. It returns a string of multiple links if passed an array.

Parameters:

  • paths (String or Array<String>)

    A list of strings to convert to Markdown links

  • full_path (Bool) (defaults to: true)

    Shows the full path as the link’s text, defaults to ‘true`.

Returns:



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 161

def markdown_link(paths, full_path: true)
  paths = [paths] unless paths.kind_of?(Array)
  commit = head_commit
  repo = pr_json[:repository][:remoteUrl].to_s

  paths = paths.map do |path|
    path, line = path.split("#L")
    url_path = path.start_with?("/") ? path : "/#{path}"
    text = full_path ? path : File.basename(path)
    url_path.gsub!(" ", "%20")
    line_ref = line ? "&line=#{line}" : ""
    create_markdown_link("#{repo}/commit/#{commit}?path=#{url_path}&_a=contents#{line_ref}", text)
  end

  return paths.first if paths.count < 2

  paths.first(paths.count - 1).join(", ") + " & " + paths.last
end

#pr_authorString

The username of the author of the Pull Request.

Returns:



104
105
106
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 104

def pr_author
  @source.pr_json[:createdBy][:displayName].to_s
end

#pr_descriptionString Also known as: pr_body

The body text of the Pull Request.

Returns:



95
96
97
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 95

def pr_description
  @source.pr_json[:description].to_s
end

#pr_jsonHash

The hash that represents the PR’s JSON. For an example of what this looks like see the [Danger Fixture’d one](raw.githubusercontent.com/danger/danger/master/spec/fixtures/vsts_api/pr_response.json).

Returns:

  • (Hash)


79
80
81
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 79

def pr_json
  @source.pr_json
end

A href that represents the current PR

Returns:



120
121
122
123
124
125
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 120

def pr_link
  repo_path = @source.pr_json[:repository][:remoteUrl].to_s
  pull_request_id = @source.pr_json[:pullRequestId].to_s

  "#{repo_path}/pullRequest/#{pull_request_id}"
end

#pr_titleString

The title of the Pull Request.

Returns:



87
88
89
# File 'lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb', line 87

def pr_title
  @source.pr_json[:title].to_s
end