escobar 0.1.0 → 0.1.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: 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: