escobar 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5d4c8b96a21452c34086e1a222dd0fcefd18f3fe
4
- data.tar.gz: 398b822d6c11e52dec31491bdf9f7214bc083dfb
3
+ metadata.gz: 9e1e4a6792723ce5b679672f36a2e62f1d94b94a
4
+ data.tar.gz: 5121cb555396519f823790a52d785dca9d35ecfe
5
5
  SHA512:
6
- metadata.gz: 7d6c73f24d7037a35685bae7497d963700c8c2402eb710dcb4a9f266ef749a65c15e9637c0e3c515ef5ac24a6b696a09e9e45c08fb1595c1bc68a47df28767e7
7
- data.tar.gz: 4983a769c5883ec7e5903da1c04deb248ae728d58f36199b398c8bdda8d5990033d131e4a6aae0431501631a6fb98b158480154d0ea5de21eeb70a5a804fb8f8
6
+ metadata.gz: ea78c3f9a67ce9b1298d9b1690dae42dd4a52d54fefd63d7b5d32dfc4eaa0d8f4003d5fef26d3469c8fd1af37dbd0dbc5b79f7cff4777a0387ad8b50cfa8f2cf
7
+ data.tar.gz: 8307ea8d1abc282843e0f91ca47226a101642e92cf9acf535b26377d7e402689bb50eed28884e3f2496da845e8fe98a3218968ff808f6c6615b29afcb718eb72
data/.gitignore CHANGED
@@ -7,3 +7,6 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ *.gem
11
+ tmp/.netrc
12
+ .irb.history
data/.travis.yml CHANGED
@@ -2,3 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 2.3.0
4
4
  before_install: gem install bundler -v 1.11.2
5
+ script: bundle exec bin/cibuild
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Escobar
1
+ # Escobar [![Build Status](https://travis-ci.org/atmos/escobar.svg?branch=master)](https://travis-ci.org/atmos/escobar)
2
2
 
3
3
  Escobar is an attempt to combine Heroku Pipelines with GitHub Deployments API.
4
4
 
data/bin/console CHANGED
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "bundler/setup"
4
4
  require "escobar"
5
+ require "pry"
5
6
 
6
7
  # You can add fixtures and/or initialization code here to make experimenting
7
8
  # with your gem easier. You can also use a different console, if you like.
@@ -11,4 +12,9 @@ require "escobar"
11
12
  # Pry.start
12
13
 
13
14
  require "irb"
15
+ require "irb/completion"
16
+ require 'irb/ext/save-history'
17
+
18
+ IRB.conf[:SAVE_HISTORY] = 100
19
+ IRB.conf[:HISTORY_FILE] = "#{File.expand_path("../..", __FILE__)}/.irb.history"
14
20
  IRB.start
data/escobar.gemspec CHANGED
@@ -23,10 +23,15 @@ Gem::Specification.new do |spec|
23
23
  spec.require_paths = ["lib"]
24
24
 
25
25
  spec.add_dependency "faraday", "~> 0.9.2"
26
+ spec.add_dependency "netrc", "~> 0.11"
27
+ spec.add_dependency "octokit", "~> 4.3.0"
26
28
 
27
29
  spec.add_development_dependency "bundler", "~> 1.11"
28
30
  spec.add_development_dependency "guard-rspec", "~> 4.6.2"
31
+ spec.add_development_dependency "pry"
29
32
  spec.add_development_dependency "rake", "~> 10.0"
30
33
  spec.add_development_dependency "rspec", "~> 3.5.0.beta2"
31
34
  spec.add_development_dependency "rubocop", "~> 0.38"
35
+ spec.add_development_dependency "uuid", "~> 2.3"
36
+ spec.add_development_dependency "webmock", "~> 1.24"
32
37
  end
@@ -1,5 +1,28 @@
1
1
  module Escobar
2
2
  # Top-level client for heroku
3
3
  class Client
4
+ def self.from_environment
5
+ new(Escobar.github_api_token, Escobar.heroku_api_token)
6
+ end
7
+
8
+ attr_reader :github, :heroku
9
+ def initialize(github_token, heroku_token)
10
+ @github = Escobar::GitHub.new(github_token)
11
+ @heroku = Escobar::Heroku::Client.new(heroku_token)
12
+ end
13
+
14
+ def [](key)
15
+ pipelines.find { |pipeline| pipeline.name == key }
16
+ end
17
+
18
+ def app_names
19
+ pipelines.map(&:name)
20
+ end
21
+
22
+ def pipelines
23
+ @pipelines ||= heroku.get("/pipelines").map do |pipe|
24
+ Escobar::Heroku::Pipeline.new(heroku, pipe["id"], pipe["name"])
25
+ end
26
+ end
4
27
  end
5
28
  end
@@ -0,0 +1,13 @@
1
+ module Escobar
2
+ # Top-level class for interacting with GitHub API
3
+ class GitHub
4
+ attr_reader :client
5
+ def initialize(token)
6
+ @client = Octokit::Client.new(access_token: token)
7
+ end
8
+
9
+ def whoami
10
+ client.get("/user")
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,75 @@
1
+ module Escobar
2
+ # Top-level class for interacting with Heroku API
3
+ module Heroku
4
+ # Top-level client for interacting with Heroku API
5
+ class Client
6
+ attr_reader :client, :token
7
+ def initialize(token)
8
+ @token = token
9
+ end
10
+
11
+ # mask password
12
+ def inspect
13
+ inspected = super
14
+ inspected = inspected.gsub! @token, "*******" if @token
15
+ inspected
16
+ end
17
+
18
+ def get(path, version = 3)
19
+ response = client.get do |request|
20
+ request.url path
21
+ request.headers["Accept"] = heroku_accept_header(version)
22
+ request.headers["Accept-Encoding"] = ""
23
+ request.headers["Content-Type"] = "application/json"
24
+ request.headers["Authorization"] = "Bearer #{token}"
25
+ end
26
+
27
+ JSON.parse(response.body)
28
+ rescue StandardError
29
+ response && response.body
30
+ end
31
+
32
+ def get_range(path, range, version = 3)
33
+ response = client.get do |request|
34
+ request.url path
35
+ request.headers["Accept"] = heroku_accept_header(version)
36
+ request.headers["Accept-Encoding"] = ""
37
+ request.headers["Content-Type"] = "application/json"
38
+ request.headers["Authorization"] = "Bearer #{token}"
39
+ request.headers["Range"] = range
40
+ end
41
+
42
+ JSON.parse(response.body)
43
+ rescue StandardError
44
+ response && response.body
45
+ end
46
+
47
+ def post(path, body)
48
+ response = client.post do |request|
49
+ request.url path
50
+ request.headers["Accept"] = heroku_accept_header(3)
51
+ request.headers["Accept-Encoding"] = ""
52
+ request.headers["Content-Type"] = "application/json"
53
+ if token
54
+ request.headers["Authorization"] = "Bearer #{token}"
55
+ end
56
+ request.body = body.to_json
57
+ end
58
+
59
+ JSON.parse(response.body)
60
+ rescue StandardError
61
+ response && response.body
62
+ end
63
+
64
+ private
65
+
66
+ def heroku_accept_header(version)
67
+ "application/vnd.heroku+json; version=#{version}"
68
+ end
69
+
70
+ def client
71
+ @client ||= Faraday.new(url: "https://api.heroku.com")
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,14 @@
1
+ module Escobar
2
+ module Heroku
3
+ # Class representing a deployable environment
4
+ class Coupling
5
+ attr_reader :app, :client, :id, :name
6
+ def initialize(client, coupling)
7
+ @id = coupling["id"]
8
+ @app = coupling["app"]["id"]
9
+ @name = coupling["stage"]
10
+ @client = client
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,30 @@
1
+ module Escobar
2
+ module Heroku
3
+ # Class reperesenting a Heroku Pipeline
4
+ class Pipeline
5
+ attr_reader :client, :id, :name
6
+ def initialize(client, id, name)
7
+ @id = id
8
+ @name = name
9
+ @client = client
10
+ end
11
+
12
+ def environments
13
+ @environments ||= couplings.each_with_object({}) do |sum, part|
14
+ sum[part.name] = part
15
+ sum
16
+ end
17
+ end
18
+
19
+ def couplings
20
+ @couplings ||= couplings!
21
+ end
22
+
23
+ def couplings!
24
+ client.get("/pipelines/#{id}/pipeline-couplings").map do |coupling|
25
+ Escobar::Heroku::Coupling.new(client, coupling)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,3 @@
1
1
  module Escobar
2
- VERSION = "0.1.0".freeze
2
+ VERSION = "0.1.1".freeze
3
3
  end
data/lib/escobar.rb CHANGED
@@ -1,8 +1,52 @@
1
+ require "netrc"
1
2
  require "faraday"
3
+ require "octokit"
4
+ require "json"
2
5
  require "escobar/version"
3
6
 
4
7
  # Top-level module for Escobar code
5
8
  module Escobar
9
+ def self.netrc
10
+ @netrc ||= begin
11
+ if env_netrc
12
+ env_netrc
13
+ else
14
+ home_netrc
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.env_netrc
20
+ @env_netrc ||= begin
21
+ if ENV["NETRC"]
22
+ Netrc.read("#{ENV['NETRC']}/.netrc")
23
+ end
24
+ rescue Errno::ENOTDIR
25
+ nil
26
+ end
27
+ end
28
+
29
+ def self.home_netrc
30
+ @home_netrc ||= begin
31
+ if ENV["HOME"]
32
+ Netrc.read("#{ENV['HOME']}/.netrc")
33
+ end
34
+ rescue Errno::ENOTDIR
35
+ nil
36
+ end
37
+ end
38
+
39
+ def self.heroku_api_token
40
+ netrc["api.heroku.com"]["password"]
41
+ end
42
+
43
+ def self.github_api_token
44
+ netrc["api.github.com"]["password"]
45
+ end
6
46
  end
7
47
 
8
48
  require_relative "./escobar/client"
49
+ require_relative "./escobar/github"
50
+ require_relative "./escobar/heroku/client"
51
+ require_relative "./escobar/heroku/coupling"
52
+ require_relative "./escobar/heroku/pipeline"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: escobar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Corey Donohoe
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.9.2
27
+ - !ruby/object:Gem::Dependency
28
+ name: netrc
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.11'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: octokit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 4.3.0
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 4.3.0
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: bundler
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +80,20 @@ dependencies:
52
80
  - - "~>"
53
81
  - !ruby/object:Gem::Version
54
82
  version: 4.6.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
55
97
  - !ruby/object:Gem::Dependency
56
98
  name: rake
57
99
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +136,34 @@ dependencies:
94
136
  - - "~>"
95
137
  - !ruby/object:Gem::Version
96
138
  version: '0.38'
139
+ - !ruby/object:Gem::Dependency
140
+ name: uuid
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '2.3'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '2.3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: webmock
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.24'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.24'
97
167
  description: Heroku pipelines and GitHub Deployments
98
168
  email:
99
169
  - atmos@atmos.org
@@ -117,6 +187,10 @@ files:
117
187
  - escobar.gemspec
118
188
  - lib/escobar.rb
119
189
  - lib/escobar/client.rb
190
+ - lib/escobar/github.rb
191
+ - lib/escobar/heroku/client.rb
192
+ - lib/escobar/heroku/coupling.rb
193
+ - lib/escobar/heroku/pipeline.rb
120
194
  - lib/escobar/version.rb
121
195
  homepage: https://github.com/atmos/escobar
122
196
  licenses: