chandler 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +5 -0
- data/.travis.yml +7 -2
- data/CHANGELOG.md +6 -1
- data/Dangerfile +54 -0
- data/README.md +16 -1
- data/chandler.gemspec +1 -0
- data/lib/chandler/cli/parser.rb +4 -1
- data/lib/chandler/configuration.rb +0 -17
- data/lib/chandler/github.rb +13 -20
- data/lib/chandler/github/client.rb +42 -0
- data/lib/chandler/github/errors.rb +34 -0
- data/lib/chandler/github/remote.rb +37 -0
- data/lib/chandler/tasks.rb +1 -0
- data/lib/chandler/version.rb +1 -1
- metadata +21 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ca571dcd740acdf7ea4863eb43a0de361344213
|
4
|
+
data.tar.gz: cce37a9c6b223a77c740f913eed635feb0d47b2d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 730d4f1e2e19824164be7a03dc91e32676dbec33f2968cb24de5fb47ea0575bfe1dae43ae9cbaefd29e1ffea1e4e025ae28274c695896daff2608e4c314be049
|
7
|
+
data.tar.gz: 547e330cff56d6fe05a07e70f9c0133ff9e73f2825ca34771821b92717bc68386a66ef5d0da5d3ce8b1288c6543d12dd8d1ed7c0d4dcb47d916731e330d6295d
|
data/.rubocop.yml
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
AllCops:
|
2
2
|
TargetRubyVersion: 2.1
|
3
|
+
DisplayCopNames: true
|
4
|
+
DisplayStyleGuide: true
|
3
5
|
Exclude:
|
4
6
|
- "*.gemspec"
|
5
7
|
|
@@ -15,6 +17,9 @@ Metrics/ClassLength:
|
|
15
17
|
Exclude:
|
16
18
|
- "test/**/*"
|
17
19
|
|
20
|
+
Performance/Casecmp:
|
21
|
+
Enabled: false
|
22
|
+
|
18
23
|
Style/BarePercentLiterals:
|
19
24
|
EnforcedStyle: percent_q
|
20
25
|
|
data/.travis.yml
CHANGED
@@ -2,5 +2,10 @@ language: ruby
|
|
2
2
|
rvm:
|
3
3
|
- 2.1
|
4
4
|
- 2.2
|
5
|
-
- 2.3.
|
6
|
-
before_install: gem install bundler -v 1.
|
5
|
+
- 2.3.1
|
6
|
+
before_install: gem install bundler -v 1.13.1
|
7
|
+
matrix:
|
8
|
+
include:
|
9
|
+
# Run Danger only once, on 2.3.1
|
10
|
+
- rvm: 2.3.1
|
11
|
+
before_script: bundle exec danger
|
data/CHANGELOG.md
CHANGED
@@ -8,6 +8,10 @@ chandler is in a pre-1.0 state. This means that its APIs and behavior are subjec
|
|
8
8
|
|
9
9
|
* Your contribution here!
|
10
10
|
|
11
|
+
## [0.6.0][] (2016-11-09)
|
12
|
+
|
13
|
+
* [#19](https://github.com/mattbrictson/chandler/pull/19): Add GitHub Enterprise support - [@mattbrictson](https://github.com/mattbrictson)
|
14
|
+
|
11
15
|
## [0.5.0][] (2016-10-07)
|
12
16
|
|
13
17
|
* Adds support for using `CHANDLER_GITHUB_API_TOKEN` to authenticate your API requests - Orta
|
@@ -46,7 +50,8 @@ chandler is in a pre-1.0 state. This means that its APIs and behavior are subjec
|
|
46
50
|
* Initial release
|
47
51
|
|
48
52
|
[Semver]: http://semver.org
|
49
|
-
[Unreleased]: https://github.com/mattbrictson/chandler/compare/v0.
|
53
|
+
[Unreleased]: https://github.com/mattbrictson/chandler/compare/v0.6.0...HEAD
|
54
|
+
[0.6.0]: https://github.com/mattbrictson/chandler/compare/v0.5.0...v0.6.0
|
50
55
|
[0.5.0]: https://github.com/mattbrictson/chandler/compare/v0.4.0...v0.5.0
|
51
56
|
[0.4.0]: https://github.com/mattbrictson/chandler/compare/v0.3.1...v0.4.0
|
52
57
|
[0.3.1]: https://github.com/mattbrictson/chandler/compare/v0.3.0...v0.3.1
|
data/Dangerfile
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# Adapted from https://github.com/ruby-grape/danger/blob/master/Dangerfile
|
2
|
+
# Q: What is a Dangerfile, anyway? A: See http://danger.systems/
|
3
|
+
|
4
|
+
# ------------------------------------------------------------------------------
|
5
|
+
# Additional pull request data
|
6
|
+
# ------------------------------------------------------------------------------
|
7
|
+
project_name = github.pr_json["base"]["repo"]["name"]
|
8
|
+
pr_number = github.pr_json["number"]
|
9
|
+
pr_url = github.pr_json["_links"]["html"]["href"]
|
10
|
+
|
11
|
+
# ------------------------------------------------------------------------------
|
12
|
+
# What changed?
|
13
|
+
# ------------------------------------------------------------------------------
|
14
|
+
has_lib_changes = !git.modified_files.grep(/^lib/).empty?
|
15
|
+
has_test_changes = !git.modified_files.grep(/^test/).empty?
|
16
|
+
has_changelog_changes = git.modified_files.include?("CHANGELOG.md")
|
17
|
+
|
18
|
+
# ------------------------------------------------------------------------------
|
19
|
+
# You've made changes to lib, but didn't write any tests?
|
20
|
+
# ------------------------------------------------------------------------------
|
21
|
+
if has_lib_changes && !has_test_changes
|
22
|
+
warn("There are code changes, but no corresponding tests. "\
|
23
|
+
"Please include tests if this PR introduces any modifications in "\
|
24
|
+
"#{project_name}'s behavior.",
|
25
|
+
:sticky => false)
|
26
|
+
end
|
27
|
+
|
28
|
+
# ------------------------------------------------------------------------------
|
29
|
+
# Have you updated CHANGELOG.md?
|
30
|
+
# ------------------------------------------------------------------------------
|
31
|
+
if !has_changelog_changes && has_lib_changes
|
32
|
+
markdown <<-MARKDOWN
|
33
|
+
Here's an example of a CHANGELOG.md entry (place it immediately under the `* Your contribution here!` line):
|
34
|
+
|
35
|
+
```markdown
|
36
|
+
* [##{pr_number}](#{pr_url}): #{github.pr_title} - [@#{github.pr_author}](https://github.com/#{github.pr_author})
|
37
|
+
```
|
38
|
+
MARKDOWN
|
39
|
+
warn("Please update CHANGELOG.md with a description of your changes. "\
|
40
|
+
"If this PR is not a user-facing change (e.g. just refactoring), "\
|
41
|
+
"you can disregard this.", :sticky => false)
|
42
|
+
end
|
43
|
+
|
44
|
+
# ------------------------------------------------------------------------------
|
45
|
+
# Did you remove the CHANGELOG's "Your contribution here!" line?
|
46
|
+
# ------------------------------------------------------------------------------
|
47
|
+
if has_changelog_changes
|
48
|
+
unless IO.read("CHANGELOG.md") =~ /^\* Your contribution here/i
|
49
|
+
fail(
|
50
|
+
"Please put the `* Your contribution here!` line back into CHANGELOG.md.",
|
51
|
+
:sticky => false
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ gem install chandler
|
|
38
38
|
|
39
39
|
### 2. Configure .netrc or set ENV vars
|
40
40
|
|
41
|
-
In order to access the GitHub API on your behalf, you must provide chandler with your GitHub credentials.
|
41
|
+
In order to access the GitHub API on your behalf, you must provide chandler with your GitHub credentials.
|
42
42
|
|
43
43
|
Do this by creating a `~/.netrc` file with your GitHub username and password, like this:
|
44
44
|
|
@@ -80,6 +80,21 @@ Other command-line options:
|
|
80
80
|
* `--changelog=History.md` – location of the CHANGELOG (defaults to `CHANGELOG.md`)
|
81
81
|
* `--tag-prefix=myapp-` – specify Git version tags are in the format `myapp-1.0.0` instead of `1.0.0`
|
82
82
|
|
83
|
+
## GitHub Enterprise
|
84
|
+
|
85
|
+
Chandler supports GitHub Enterprise as well as public GitHub repositories. It will make an educated guess as to where your GitHub Enterprise installation is located based on the `origin` git remote. You can also specify your GitHub Enterprise repository using the `--github` option like this:
|
86
|
+
|
87
|
+
```
|
88
|
+
--github=git@github.mycompany.com:organization/project.git
|
89
|
+
```
|
90
|
+
|
91
|
+
Or like this:
|
92
|
+
|
93
|
+
```
|
94
|
+
--github=https://github.mycompany.com/organization/project
|
95
|
+
```
|
96
|
+
|
97
|
+
To authenticate, Chandler relies on your `~/.netrc`, as explained above. Replace `api.github.com` with the hostname of your GitHub Enterprise installation (`github.mycompany.com` in the example).
|
83
98
|
|
84
99
|
## Rakefile integration
|
85
100
|
|
data/chandler.gemspec
CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
|
|
25
25
|
|
26
26
|
spec.add_development_dependency "bundler", "~> 1.10"
|
27
27
|
spec.add_development_dependency "coveralls"
|
28
|
+
spec.add_development_dependency "danger"
|
28
29
|
spec.add_development_dependency "rake", "~> 10.0"
|
29
30
|
spec.add_development_dependency "minitest"
|
30
31
|
spec.add_development_dependency "minitest-reporters"
|
data/lib/chandler/cli/parser.rb
CHANGED
@@ -30,7 +30,10 @@ module Chandler
|
|
30
30
|
@args = unprocessed.compact
|
31
31
|
end
|
32
32
|
|
33
|
-
|
33
|
+
# rubocop:disable Metrics/AbcSize
|
34
|
+
# rubocop:disable Metrics/MethodLength
|
35
|
+
# rubocop:disable Metrics/BlockLength
|
36
|
+
def option_parser
|
34
37
|
OptionParser.new do |opts|
|
35
38
|
opts.banner = "Usage: chandler push [tag] [options]"
|
36
39
|
opts.separator("")
|
@@ -23,23 +23,6 @@ module Chandler
|
|
23
23
|
@git ||= Chandler::Git.new(:path => git_path, :tag_mapper => tag_mapper)
|
24
24
|
end
|
25
25
|
|
26
|
-
def octokit
|
27
|
-
@octokit ||= Octokit::Client.new(octokit_options)
|
28
|
-
end
|
29
|
-
|
30
|
-
def octokit_options
|
31
|
-
chandler_token_key = "CHANDLER_GITHUB_API_TOKEN"
|
32
|
-
if environment[chandler_token_key]
|
33
|
-
{ :access_token => environment[chandler_token_key] }
|
34
|
-
else
|
35
|
-
{ :netrc => true }
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def environment
|
40
|
-
@environment ||= ENV
|
41
|
-
end
|
42
|
-
|
43
26
|
def github
|
44
27
|
@github ||= Chandler::GitHub.new(
|
45
28
|
:repository => github_repository,
|
data/lib/chandler/github.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
require "
|
1
|
+
require "chandler/github/client"
|
2
|
+
require "chandler/github/errors"
|
3
|
+
require "chandler/github/remote"
|
2
4
|
|
3
5
|
module Chandler
|
4
6
|
# A facade for performing GitHub API operations on a given GitHub repository
|
@@ -7,12 +9,11 @@ module Chandler
|
|
7
9
|
# is available in the host environment at "CHANDLER_GITHUB_API_TOKEN""
|
8
10
|
#
|
9
11
|
class GitHub
|
10
|
-
MissingCredentials = Class.new(StandardError)
|
11
|
-
|
12
12
|
attr_reader :repository, :config
|
13
13
|
|
14
14
|
def initialize(repository:, config:)
|
15
|
-
@repository =
|
15
|
+
@repository = repository
|
16
|
+
@remote = Remote.parse(repository)
|
16
17
|
@config = config
|
17
18
|
end
|
18
19
|
|
@@ -23,16 +24,16 @@ module Chandler
|
|
23
24
|
return update_release(release, title, description) if release
|
24
25
|
|
25
26
|
create_release(tag, title, description)
|
27
|
+
rescue Octokit::NotFound
|
28
|
+
raise InvalidRepository, repository
|
26
29
|
end
|
27
30
|
|
28
31
|
private
|
29
32
|
|
30
|
-
|
31
|
-
repo[%r{(git@github.com:|://github.com/)(.*)\.git}, 2] || repo
|
32
|
-
end
|
33
|
+
attr_reader :remote
|
33
34
|
|
34
35
|
def existing_release(tag)
|
35
|
-
release = client.release_for_tag(repository, tag)
|
36
|
+
release = client.release_for_tag(remote.repository, tag)
|
36
37
|
release.id.nil? ? nil : release
|
37
38
|
rescue Octokit::NotFound
|
38
39
|
nil
|
@@ -48,21 +49,13 @@ module Chandler
|
|
48
49
|
end
|
49
50
|
|
50
51
|
def create_release(tag, title, desc)
|
51
|
-
client.create_release(
|
52
|
+
client.create_release(
|
53
|
+
remote.repository, tag, :name => title, :body => desc
|
54
|
+
)
|
52
55
|
end
|
53
56
|
|
54
57
|
def client
|
55
|
-
@client ||=
|
56
|
-
octokit = config.octokit
|
57
|
-
octokit.login ? octokit : fail_missing_credentials
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def fail_missing_credentials
|
62
|
-
message = "Couldn’t load GitHub credentials from ~/.netrc.\n"
|
63
|
-
message << "For .netrc instructions, see: "
|
64
|
-
message << "https://github.com/octokit/octokit.rb#using-a-netrc-file"
|
65
|
-
raise MissingCredentials, message
|
58
|
+
@client ||= Client.new(:host => remote.host).tap(&:login!)
|
66
59
|
end
|
67
60
|
end
|
68
61
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "chandler/github/errors"
|
2
|
+
require "delegate"
|
3
|
+
require "octokit"
|
4
|
+
require "uri"
|
5
|
+
|
6
|
+
module Chandler
|
7
|
+
class GitHub
|
8
|
+
# A thin wrapper around Octokit::Client that adds support for automatic
|
9
|
+
# GitHub Enterprise, .netrc, and ENV token-based authentication.
|
10
|
+
#
|
11
|
+
class Client < SimpleDelegator
|
12
|
+
def initialize(host: "github.com",
|
13
|
+
environment: ENV,
|
14
|
+
octokit_client: Octokit::Client)
|
15
|
+
options = {}
|
16
|
+
options.merge!(detect_auth_option(environment))
|
17
|
+
options.merge!(detect_enterprise_endpoint(host))
|
18
|
+
super(octokit_client.new(options))
|
19
|
+
end
|
20
|
+
|
21
|
+
def login!
|
22
|
+
return if login
|
23
|
+
raise netrc ? NetrcAuthenticationFailure : TokenAuthenticationFailure
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def detect_auth_option(env)
|
29
|
+
if (token = env["CHANDLER_GITHUB_API_TOKEN"])
|
30
|
+
{ :access_token => token }
|
31
|
+
else
|
32
|
+
{ :netrc => true }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def detect_enterprise_endpoint(host)
|
37
|
+
return {} if host.downcase == "github.com"
|
38
|
+
{ :api_endpoint => "https://#{host}/api/v3/" }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Chandler
|
2
|
+
class GitHub
|
3
|
+
Error = Class.new(StandardError)
|
4
|
+
|
5
|
+
class InvalidRepository < Error
|
6
|
+
def initialize(repository)
|
7
|
+
@repository = repository
|
8
|
+
end
|
9
|
+
|
10
|
+
def message
|
11
|
+
"Failed to find GitHub repository: #{@repository}.\n"\
|
12
|
+
"Verify you have permission to access it. Use the --github option to "\
|
13
|
+
"specify a different repository."
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class NetrcAuthenticationFailure < Error
|
18
|
+
def message
|
19
|
+
"GitHub authentication failed.\n"\
|
20
|
+
"Check that ~/.netrc is properly configured.\n"\
|
21
|
+
"For instructions, see: "\
|
22
|
+
"https://github.com/octokit/octokit.rb#using-a-netrc-file"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class TokenAuthenticationFailure < Error
|
27
|
+
def message
|
28
|
+
"GitHub authentication failed.\n"\
|
29
|
+
"Check that the CHANDLER_GITHUB_API_TOKEN environment variable "\
|
30
|
+
"is correct."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "uri"
|
2
|
+
|
3
|
+
module Chandler
|
4
|
+
class GitHub
|
5
|
+
# Assuming a git remote points to a public GitHub or a GitHub Enterprise
|
6
|
+
# repository, this class parses the remote to obtain the host and repository
|
7
|
+
# path. Supports SSH and HTTPS style git remotes.
|
8
|
+
#
|
9
|
+
# This class also handles parsing values passed into the `--github` command
|
10
|
+
# line option, which may be a public GitHub repository name, like
|
11
|
+
# "mattbrictson/chandler".
|
12
|
+
#
|
13
|
+
class Remote
|
14
|
+
def self.parse(url)
|
15
|
+
if (match = url.match(/@([^:]+):(.+)$/))
|
16
|
+
new(match[1], match[2])
|
17
|
+
else
|
18
|
+
parsed_uri = URI(url)
|
19
|
+
host = parsed_uri.host || "github.com"
|
20
|
+
path = parsed_uri.path.sub(%r{^/+}, "")
|
21
|
+
new(host, path)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
attr_reader :host, :path
|
26
|
+
|
27
|
+
def initialize(host, path)
|
28
|
+
@host = host.downcase
|
29
|
+
@path = path
|
30
|
+
end
|
31
|
+
|
32
|
+
def repository
|
33
|
+
path.sub(/\.git$/, "")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/chandler/tasks.rb
CHANGED
data/lib/chandler/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chandler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Brictson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: netrc
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: danger
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +164,7 @@ files:
|
|
150
164
|
- CHANGELOG.md
|
151
165
|
- CODE_OF_CONDUCT.md
|
152
166
|
- CONTRIBUTING.md
|
167
|
+
- Dangerfile
|
153
168
|
- Gemfile
|
154
169
|
- Guardfile
|
155
170
|
- LICENSE.txt
|
@@ -168,6 +183,9 @@ files:
|
|
168
183
|
- lib/chandler/configuration.rb
|
169
184
|
- lib/chandler/git.rb
|
170
185
|
- lib/chandler/github.rb
|
186
|
+
- lib/chandler/github/client.rb
|
187
|
+
- lib/chandler/github/errors.rb
|
188
|
+
- lib/chandler/github/remote.rb
|
171
189
|
- lib/chandler/logger.rb
|
172
190
|
- lib/chandler/logging.rb
|
173
191
|
- lib/chandler/refinements/color.rb
|
@@ -194,7 +212,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
212
|
version: '0'
|
195
213
|
requirements: []
|
196
214
|
rubyforge_project:
|
197
|
-
rubygems_version: 2.
|
215
|
+
rubygems_version: 2.6.8
|
198
216
|
signing_key:
|
199
217
|
specification_version: 4
|
200
218
|
summary: Syncs CHANGELOG entries to GitHub's release notes
|