heroku_hatchet 3.1.1 → 4.0.0
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 +4 -4
- data/CHANGELOG.md +5 -0
- data/bin/hatchet +10 -2
- data/lib/hatchet.rb +1 -0
- data/lib/hatchet/api_rate_limit.rb +40 -0
- data/lib/hatchet/app.rb +22 -16
- data/lib/hatchet/reaper.rb +4 -4
- data/lib/hatchet/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb7387bbf480ee1443a1985b8bfd3681e6126605786c0ee102be9a691cd37f01
|
4
|
+
data.tar.gz: 59876cc8324d6397434dbb03492a6d1231023c343aa6a70a61502cc5d8059fdc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 95998e8ab947245d1ebc799fd6bf54b377bffda5e4b63f608aa2663e55e278d71d307754a6d2a623e66e8ff07dcbd04d1b30f4d3ab666b5b1e9856b78f22e645
|
7
|
+
data.tar.gz: 7554ca9897c18aa4022526a5e9deba8f05475797f57b5635dc51658797c92390556ea12fcdc66bad6567cbf8a3fb3ab72ae1408d41345bba95fe0d904f2851df
|
data/CHANGELOG.md
CHANGED
data/bin/hatchet
CHANGED
@@ -22,9 +22,11 @@ class HatchetCLI < Thor
|
|
22
22
|
warn_dot_ignore!
|
23
23
|
lock_hash = load_lockfile
|
24
24
|
puts "Installing repos for hatchet"
|
25
|
+
|
26
|
+
missing_commit = false
|
25
27
|
dirs.map do |directory, git_repo|
|
26
28
|
Threaded.later do
|
27
|
-
commit = lock_hash
|
29
|
+
commit = lock_hash[directory]
|
28
30
|
directory = File.expand_path(directory)
|
29
31
|
if Dir[directory].present?
|
30
32
|
puts "== pulling '#{git_repo}' into '#{directory}'\n"
|
@@ -33,9 +35,15 @@ class HatchetCLI < Thor
|
|
33
35
|
puts "== cloning '#{git_repo}' into '#{directory}'\n"
|
34
36
|
clone(directory, git_repo)
|
35
37
|
end
|
36
|
-
|
38
|
+
if commit
|
39
|
+
checkout_commit(directory, commit)
|
40
|
+
else
|
41
|
+
missing_commit = true
|
42
|
+
end
|
37
43
|
end
|
38
44
|
end.map(&:join)
|
45
|
+
|
46
|
+
self.lock if missing_commit
|
39
47
|
end
|
40
48
|
|
41
49
|
def load_lockfile
|
data/lib/hatchet.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
# Wraps platform-api and adds API rate limits
|
2
|
+
#
|
3
|
+
# Instead of:
|
4
|
+
#
|
5
|
+
# platform_api.pipeline.create(name: @name)
|
6
|
+
#
|
7
|
+
# Use:
|
8
|
+
#
|
9
|
+
# api_rate_limit = ApiRateLimit.new(platform_api)
|
10
|
+
# api_rate_limit.call.pipeline.create(name: @name)
|
11
|
+
#
|
12
|
+
class ApiRateLimit
|
13
|
+
def initialize(platform_api)
|
14
|
+
@platform_api = platform_api
|
15
|
+
@capacity = 1
|
16
|
+
@called = 0
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
# Sleeps for progressively longer when api rate limit capacity
|
21
|
+
# is lower.
|
22
|
+
#
|
23
|
+
# Unfortunatley `@platform_api.rate_limit` is an extra API
|
24
|
+
# call, so by checking our limit, we also are using our limit 😬
|
25
|
+
# to partially mitigate this, only check capacity every 5
|
26
|
+
# api calls, or if the
|
27
|
+
def call
|
28
|
+
@called += 1
|
29
|
+
|
30
|
+
if @called > 5 || @capacity < 1000
|
31
|
+
@called = 0
|
32
|
+
@capacity = @platform_api.rate_limit.info["remaining"]
|
33
|
+
end
|
34
|
+
|
35
|
+
sleep_time = (60/@capacity) if @capacity > 0.1 # no divide by zero
|
36
|
+
sleep(sleep_time || 60)
|
37
|
+
|
38
|
+
return @platform_api
|
39
|
+
end
|
40
|
+
end
|
data/lib/hatchet/app.rb
CHANGED
@@ -31,7 +31,7 @@ module Hatchet
|
|
31
31
|
@labs = ([] << options[:labs]).flatten.compact
|
32
32
|
@buildpacks = options[:buildpack] || options[:buildpacks] || options[:buildpack_url] || self.class.default_buildpack
|
33
33
|
@buildpacks = Array(@buildpacks)
|
34
|
-
@reaper = Reaper.new(
|
34
|
+
@reaper = Reaper.new(api_rate_limit: api_rate_limit)
|
35
35
|
end
|
36
36
|
|
37
37
|
def self.default_buildpack
|
@@ -54,13 +54,13 @@ module Hatchet
|
|
54
54
|
def set_config(options = {})
|
55
55
|
options.each do |key, value|
|
56
56
|
# heroku.put_config_vars(name, key => value)
|
57
|
-
|
57
|
+
api_rate_limit.call.config_var.update(name, key => value)
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
61
|
def get_config
|
62
62
|
# heroku.get_config_vars(name).body
|
63
|
-
|
63
|
+
api_rate_limit.call.config_var.info_for_app(name)
|
64
64
|
end
|
65
65
|
|
66
66
|
def lab_is_installed?(lab)
|
@@ -69,7 +69,7 @@ module Hatchet
|
|
69
69
|
|
70
70
|
def get_labs
|
71
71
|
# heroku.get_features(name).body
|
72
|
-
|
72
|
+
api_rate_limit.call.app_feature.list(name)
|
73
73
|
end
|
74
74
|
|
75
75
|
def set_labs!
|
@@ -78,13 +78,13 @@ module Hatchet
|
|
78
78
|
|
79
79
|
def set_lab(lab)
|
80
80
|
# heroku.post_feature(lab, name)
|
81
|
-
|
81
|
+
api_rate_limit.call.app_feature.update(name, lab, enabled: true)
|
82
82
|
end
|
83
83
|
|
84
84
|
def add_database(plan_name = 'heroku-postgresql:dev', match_val = "HEROKU_POSTGRESQL_[A-Z]+_URL")
|
85
85
|
Hatchet::RETRIES.times.retry do
|
86
86
|
# heroku.post_addon(name, plan_name)
|
87
|
-
|
87
|
+
api_rate_limit.call.addon.create(name, plan: plan_name )
|
88
88
|
_, value = get_config.detect {|k, v| k.match(/#{match_val}/) }
|
89
89
|
set_config('DATABASE_URL' => value)
|
90
90
|
end
|
@@ -120,7 +120,7 @@ module Hatchet
|
|
120
120
|
|
121
121
|
def deployed?
|
122
122
|
# !heroku.get_ps(name).body.detect {|ps| ps["process"].include?("web") }.nil?
|
123
|
-
|
123
|
+
api_rate_limit.call.formation.list(name).detect {|ps| ps["type"] == "web"}
|
124
124
|
end
|
125
125
|
|
126
126
|
def create_app
|
@@ -129,7 +129,7 @@ module Hatchet
|
|
129
129
|
# heroku.post_app({ name: name, stack: stack }.delete_if {|k,v| v.nil? })
|
130
130
|
hash = { name: name, stack: stack }
|
131
131
|
hash.delete_if { |k,v| v.nil? }
|
132
|
-
|
132
|
+
api_rate_limit.call.app.create(hash)
|
133
133
|
rescue
|
134
134
|
@reaper.cycle
|
135
135
|
raise e
|
@@ -139,7 +139,7 @@ module Hatchet
|
|
139
139
|
|
140
140
|
def update_stack(stack_name)
|
141
141
|
@stack = stack_name
|
142
|
-
|
142
|
+
api_rate_limit.call.app.update(name, build_stack: @stack)
|
143
143
|
end
|
144
144
|
|
145
145
|
# creates a new heroku app via the API
|
@@ -150,7 +150,7 @@ module Hatchet
|
|
150
150
|
set_labs!
|
151
151
|
# heroku.put_config_vars(name, 'BUILDPACK_URL' => @buildpack)
|
152
152
|
buildpack_list = @buildpacks.map {|pack| { buildpack: pack }}
|
153
|
-
|
153
|
+
api_rate_limit.call.buildpack_installation.update(name, updates: buildpack_list)
|
154
154
|
@app_is_setup = true
|
155
155
|
self
|
156
156
|
end
|
@@ -186,7 +186,7 @@ module Hatchet
|
|
186
186
|
in_directory do
|
187
187
|
self.setup!
|
188
188
|
self.push_with_retry!
|
189
|
-
block.call(self,
|
189
|
+
block.call(self, api_rate_limit.call, output) if block_given?
|
190
190
|
end
|
191
191
|
ensure
|
192
192
|
self.teardown!
|
@@ -255,7 +255,7 @@ module Hatchet
|
|
255
255
|
end
|
256
256
|
|
257
257
|
def create_pipeline
|
258
|
-
|
258
|
+
api_rate_limit.call.pipeline.create(name: @name)
|
259
259
|
end
|
260
260
|
|
261
261
|
def source_get_url
|
@@ -265,7 +265,7 @@ module Hatchet
|
|
265
265
|
|
266
266
|
def create_source
|
267
267
|
@create_source ||= begin
|
268
|
-
result =
|
268
|
+
result = api_rate_limit.call.source.create
|
269
269
|
@source_get_url = result["source_blob"]["get_url"]
|
270
270
|
@source_put_url = result["source_blob"]["put_url"]
|
271
271
|
@source_put_url
|
@@ -273,12 +273,18 @@ module Hatchet
|
|
273
273
|
end
|
274
274
|
|
275
275
|
def delete_pipeline(pipeline_id)
|
276
|
-
|
276
|
+
api_rate_limit.call.pipeline.delete(pipeline_id)
|
277
277
|
end
|
278
278
|
|
279
279
|
def platform_api
|
280
|
-
|
281
|
-
|
280
|
+
puts "Deprecated: use `api_rate_limit.call` instead of platform_api"
|
281
|
+
api_rate_limit
|
282
|
+
return @platform_api
|
283
|
+
end
|
284
|
+
|
285
|
+
def api_rate_limit
|
286
|
+
@platform_api ||= PlatformAPI.connect_oauth(api_key, cache: Moneta.new(:Null))
|
287
|
+
@api_rate_limit ||= ApiRateLimit.new(@platform_api)
|
282
288
|
end
|
283
289
|
|
284
290
|
private
|
data/lib/hatchet/reaper.rb
CHANGED
@@ -11,14 +11,14 @@ module Hatchet
|
|
11
11
|
attr_accessor :apps
|
12
12
|
|
13
13
|
|
14
|
-
def initialize(
|
15
|
-
@
|
14
|
+
def initialize(api_rate_limit: , regex: DEFAULT_REGEX)
|
15
|
+
@api_rate_limit = api_rate_limit
|
16
16
|
@regex = regex
|
17
17
|
end
|
18
18
|
|
19
19
|
# Ascending order, oldest is last
|
20
20
|
def get_apps
|
21
|
-
apps = @
|
21
|
+
apps = @api_rate_limit.call.app.list.sort_by { |app| DateTime.parse(app["created_at"]) }.reverse
|
22
22
|
@app_count = apps.count
|
23
23
|
@hatchet_apps = apps.select {|app| app["name"].match(@regex) }
|
24
24
|
end
|
@@ -63,7 +63,7 @@ module Hatchet
|
|
63
63
|
def destroy_by_id(name:, id:, details: "")
|
64
64
|
@message = "Destroying #{name.inspect}: #{id}. #{details}"
|
65
65
|
puts @message
|
66
|
-
@
|
66
|
+
@api_rate_limit.call.app.delete(id)
|
67
67
|
end
|
68
68
|
|
69
69
|
private
|
data/lib/hatchet/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: heroku_hatchet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Schneeman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: platform-api
|
@@ -199,6 +199,7 @@ files:
|
|
199
199
|
- hatchet.lock
|
200
200
|
- lib/hatchet.rb
|
201
201
|
- lib/hatchet/anvil_app.rb
|
202
|
+
- lib/hatchet/api_rate_limit.rb
|
202
203
|
- lib/hatchet/app.rb
|
203
204
|
- lib/hatchet/config.rb
|
204
205
|
- lib/hatchet/git_app.rb
|