harpoon 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/harpoon.gemspec +8 -7
- data/lib/harpoon/auth.rb +12 -6
- data/lib/harpoon/client.rb +3 -3
- data/lib/harpoon/service.rb +1 -0
- data/lib/harpoon/services/bitballoon.rb +104 -0
- data/lib/harpoon/services/s3.rb +48 -21
- data/lib/harpoon.rb +1 -0
- data/test/test_logger.rb +19 -0
- data/test/test_service_base.rb +6 -0
- metadata +59 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 785a0b17a5308ada400cdcdcbb89add7f665446d
|
4
|
+
data.tar.gz: b752390ed81dca7ab9c8d4391c2beb1e628a1651
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38b0d89349672d7067ae295ba17df1f0f2260bb7daad15dc9c2a5e4d7dbdadaab5a2854ae1857e5e1f5948d057aee3991abffd1a0e46853368d813724ff238ca
|
7
|
+
data.tar.gz: 87d9b4359c0ba94fbeed1810700d3fcef3846bf9b7a1c6d10166e6e9061a98537472238babf11f1319f3990a4f20d590d2706085ce5f1404e8e20de2ed04d3d0
|
data/harpoon.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'harpoon'
|
3
|
-
s.version = '0.0.
|
3
|
+
s.version = '0.0.5'
|
4
4
|
s.date = '2014-08-20'
|
5
5
|
s.summary = "A single page app deployer for amazon s3"
|
6
6
|
s.description = "Deploy small server-less webapps to amazon s3, including buckets, dns and permissions"
|
@@ -9,11 +9,12 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.licenses = ["MIT"]
|
10
10
|
s.files = `git ls-files -z`.split("\x0")
|
11
11
|
s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.
|
16
|
-
s.
|
17
|
-
s.
|
12
|
+
s.add_runtime_dependency 'thor', '~> 0.19', '>= 0.19.1'
|
13
|
+
s.add_runtime_dependency 'netrc', '~> 0.7', '>= 0.7.7'
|
14
|
+
s.add_runtime_dependency 'aws-sdk', '~> 1.51', '>= 1.51.0'
|
15
|
+
s.add_runtime_dependency 'bitballoon', '~> 0.2', '>= 0.2.5'
|
16
|
+
s.add_runtime_dependency 'public_suffix', '~> 1.4', '>= 1.4.5'
|
17
|
+
s.add_runtime_dependency 'colorize', '~> 0.7', '>= 0.7.3'
|
18
|
+
s.add_runtime_dependency 'activesupport', '~> 4.1', '>= 4.1.5'
|
18
19
|
s.homepage = 'http://www.getharpoon.com'
|
19
20
|
end
|
data/lib/harpoon/auth.rb
CHANGED
@@ -37,13 +37,19 @@ module Harpoon
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
def get_or_ask(key, mes1 =
|
40
|
+
def get_or_ask(key, mes1 = nil, mes2 = nil)
|
41
41
|
values = get(key)
|
42
42
|
return values if values
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
val1 = nil
|
44
|
+
val2 = nil
|
45
|
+
if mes1
|
46
|
+
puts "Enter your #{mes1}:"
|
47
|
+
val1 = $stdin.gets.to_s.strip
|
48
|
+
end
|
49
|
+
if mes2
|
50
|
+
puts "Enter your #{mes2}:"
|
51
|
+
val2 = $stdin.gets.to_s.strip
|
52
|
+
end
|
47
53
|
set(key, val1, val2)
|
48
54
|
return [val1, val2]
|
49
55
|
end
|
@@ -52,7 +58,7 @@ module Harpoon
|
|
52
58
|
|
53
59
|
#netrc doesn't like nil values
|
54
60
|
def netrc_nil(value = nil)
|
55
|
-
if value
|
61
|
+
if value && value != ""
|
56
62
|
if value == "nothing-here"
|
57
63
|
return nil
|
58
64
|
else
|
data/lib/harpoon/client.rb
CHANGED
@@ -42,10 +42,10 @@ module Harpoon
|
|
42
42
|
runner.list
|
43
43
|
end
|
44
44
|
|
45
|
-
desc "rollback", "Rollback to previous release"
|
46
|
-
def rollback
|
45
|
+
desc "rollback VERSION", "Rollback to previous release"
|
46
|
+
def rollback(version)
|
47
47
|
runner = Harpoon::Runner.new(options)
|
48
|
-
runner.rollback
|
48
|
+
runner.rollback(version)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
data/lib/harpoon/service.rb
CHANGED
@@ -0,0 +1,104 @@
|
|
1
|
+
require "bitballoon"
|
2
|
+
module Harpoon
|
3
|
+
module Services
|
4
|
+
class Bitballoon
|
5
|
+
include Harpoon::Service
|
6
|
+
|
7
|
+
auth :secret, "Access Token"
|
8
|
+
|
9
|
+
def setup
|
10
|
+
#setup for future deploys
|
11
|
+
if site
|
12
|
+
@logger.pass "Site already configured"
|
13
|
+
else
|
14
|
+
bitballoon.sites.create(:name => @config.name)
|
15
|
+
@logger.pass "Site configured as #{@config.name}"
|
16
|
+
end
|
17
|
+
if @options.primary_domain
|
18
|
+
site.update(custom_domain: @options.primary_domain)
|
19
|
+
@logger.pass "Custom Domain configured"
|
20
|
+
end
|
21
|
+
@logger.suggest "You should run `harpoon doctor` to confirm setup"
|
22
|
+
end
|
23
|
+
|
24
|
+
def deploy
|
25
|
+
#deploy new code
|
26
|
+
if site
|
27
|
+
if @config.directory
|
28
|
+
@logger.info "Deploying #{@config.directory}"
|
29
|
+
deploy = site.deploys.create(dir: @config.directory)
|
30
|
+
site.wait_for_ready
|
31
|
+
@logger.pass "Deployed."
|
32
|
+
else
|
33
|
+
@logger.fatal "We don't know what to deploy!"
|
34
|
+
end
|
35
|
+
else
|
36
|
+
@logger.fatal "Uh oh, please run `harpoon doctor`"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def list
|
41
|
+
#list available rollbacks
|
42
|
+
if site
|
43
|
+
@logger.info "The following rollbacks are available"
|
44
|
+
site.deploys.each_with_index do |deploy, index|
|
45
|
+
@logger.info "#{index} - #{deploy.created_at}"
|
46
|
+
end
|
47
|
+
@logger.info "To Rollback, type `harpoon rollback {{deploy-number}}`"
|
48
|
+
else
|
49
|
+
@logger.fatal "Uh oh, please run `harpoon doctor`"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def rollback(version)
|
54
|
+
#rollback to {{version}}
|
55
|
+
deploy = site.deploys.all[version.to_i]
|
56
|
+
if deploy
|
57
|
+
@logger.info "Publishing version #{deploy.id} created at #{deploy.created_at}"
|
58
|
+
deploy.publish
|
59
|
+
@logger.pass "Published."
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def doctor
|
64
|
+
#check to see if we're ready for a deploy
|
65
|
+
if site
|
66
|
+
@logger.pass "Site configured with BitBalloon"
|
67
|
+
else
|
68
|
+
@logger.fail "Site not configured"
|
69
|
+
@logger.suggest "Run `harpoon setup`"
|
70
|
+
exit
|
71
|
+
end
|
72
|
+
|
73
|
+
if @config[:primary_domain]
|
74
|
+
if site.custom_domain == @config[:primary_domain]
|
75
|
+
@logger.pass "Custom domain configured"
|
76
|
+
else
|
77
|
+
@logger.fail "Custom domain not setup"
|
78
|
+
@logger.suggest "Run `harpoon setup`"
|
79
|
+
exit
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
@logger.suggest "Make sure you have your DNS settings configured"
|
84
|
+
@logger.suggest "Learn more at https://www.bitballoon.com/docs/custom_domains/"
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def bitballoon
|
90
|
+
@bitballoon ||= ::BitBalloon::Client.new(:access_token => @auth[:secret])
|
91
|
+
end
|
92
|
+
|
93
|
+
def site
|
94
|
+
return @site if defined? @site
|
95
|
+
bitballoon.sites.each do |s|
|
96
|
+
return @site = s if s.name == @config.name
|
97
|
+
end
|
98
|
+
@logger.fatal "Site could not be found"
|
99
|
+
@logger.suggest "Try running `harpoon doctor`"
|
100
|
+
return nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/lib/harpoon/services/s3.rb
CHANGED
@@ -34,7 +34,7 @@ module Harpoon
|
|
34
34
|
bucket.policy = policy
|
35
35
|
|
36
36
|
|
37
|
-
history = setup_bucket(
|
37
|
+
history = setup_bucket(rollback_bucket_name(@options.primary_domain))
|
38
38
|
@logger.info "Created rollback bucket"
|
39
39
|
|
40
40
|
setup_dns_alias(@options.primary_domain, bucket)
|
@@ -43,7 +43,6 @@ module Harpoon
|
|
43
43
|
if @options.forwarded_domain
|
44
44
|
#we also want to forward some domains
|
45
45
|
#make sure we have an array
|
46
|
-
#TODO : Move all of this nonsense to the config object, it should be validating this stuff
|
47
46
|
forwarded = @options.forwarded_domain.is_a?(Array) ? @options.forwarded_domain : [@options.forwarded_domain]
|
48
47
|
forwarded.each do |f|
|
49
48
|
bucket = setup_bucket(f)
|
@@ -61,28 +60,33 @@ module Harpoon
|
|
61
60
|
|
62
61
|
def deploy
|
63
62
|
raise Harpoon::Errors::InvalidConfiguration, "Missing list of files" unless @options.files && @options.directory && @options.primary_domain
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
63
|
+
if primary_bucket
|
64
|
+
move_existing_to_history!
|
65
|
+
@logger.info "Copying new release to s3"
|
66
|
+
@options.files.each do |f|
|
67
|
+
@logger.debug "Path: #{f}"
|
68
|
+
relative_path = Pathname.new(f).relative_path_from(Pathname.new(@options.directory)).to_s
|
69
|
+
@logger.debug "s3 key: #{relative_path}"
|
70
|
+
primary_bucket.objects[relative_path].write(Pathname.new(f))
|
71
|
+
end
|
72
|
+
@logger.info "...done"
|
73
|
+
else
|
74
|
+
raise Harpoon::Errors::MissingSetup, "Required s3 buckets are not created. Run harpoon doctor to test."
|
73
75
|
end
|
74
|
-
@logger.info "...done"
|
75
76
|
end
|
76
77
|
|
77
78
|
def list
|
78
79
|
@logger.info "The following rollbacks are available:"
|
79
|
-
if
|
80
|
-
tree =
|
80
|
+
if rollback_bucket
|
81
|
+
tree = rollback_bucket.as_tree
|
81
82
|
rollbacks = tree.children.collect {|i| i.prefix.gsub(/\/$/, "").to_i }
|
82
83
|
rollbacks.sort!.reverse!
|
83
84
|
rollbacks.each_with_index do |r, index|
|
84
85
|
@logger.info Time.at(r).strftime("#{index + 1} - %F %r")
|
85
86
|
end
|
87
|
+
else
|
88
|
+
@logger.warn "Rollback bucket not yet created"
|
89
|
+
@logger.suggest "Run harpoon setup to create one"
|
86
90
|
end
|
87
91
|
end
|
88
92
|
|
@@ -142,10 +146,15 @@ module Harpoon
|
|
142
146
|
@logger.info "...done"
|
143
147
|
end
|
144
148
|
|
145
|
-
def rollback
|
149
|
+
def rollback(version)
|
146
150
|
@logger.info "Not yet implemented!"
|
147
151
|
@logger.info "Your rollbacks ARE safe on s3 #{rollback_bucket(@options.primary_domain)}"
|
148
|
-
|
152
|
+
if rollback_bucket && primary_bucket
|
153
|
+
@logger.debug "Rollback bucket found, ensuring version exists"
|
154
|
+
else
|
155
|
+
@logger.warn "Buckets not yet configured"
|
156
|
+
@logger.suggest "Setup a primary domain in your configuration and run harpoon setup"
|
157
|
+
end
|
149
158
|
end
|
150
159
|
|
151
160
|
private
|
@@ -235,10 +244,6 @@ module Harpoon
|
|
235
244
|
@logger.suggest "=============================="
|
236
245
|
end
|
237
246
|
|
238
|
-
def rollback_bucket(domain)
|
239
|
-
"#{domain}-history"
|
240
|
-
end
|
241
|
-
|
242
247
|
def move_existing_to_history!
|
243
248
|
raise Harpoon::Errors::InvalidConfiguration, "Must have a primary domain defined" unless @options.primary_domain
|
244
249
|
@logger.info "Moving existing deploy to history"
|
@@ -257,9 +262,31 @@ module Harpoon
|
|
257
262
|
end
|
258
263
|
@logger.debug "Moved to history, deleting files from current bucket"
|
259
264
|
#delete the current objects
|
260
|
-
|
265
|
+
bucket.objects.delete_all
|
261
266
|
@logger.debug "Files deleted"
|
262
267
|
end
|
268
|
+
|
269
|
+
def primary_bucket
|
270
|
+
return @primary_bucket if defined? @primary_bucket
|
271
|
+
if @options.primary_domain && s3.buckets[@options.primary_domain].exists?
|
272
|
+
return @primary_bucket = s3.buckets[@options.primary_domain]
|
273
|
+
else
|
274
|
+
return false
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
def rollback_bucket
|
279
|
+
return @rollback_bucket if defined? @rollback_bucket
|
280
|
+
if @options.primary_domain && s3.buckets[rollback_bucket_name(@options.primary_domain)].exists?
|
281
|
+
return @rollback_bucket = s3.buckets[rollback_bucket_name(@options.primary_domain)]
|
282
|
+
else
|
283
|
+
return false
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
def rollback_bucket_name(domain)
|
288
|
+
"#{domain}-history"
|
289
|
+
end
|
263
290
|
end
|
264
291
|
end
|
265
292
|
end
|
data/lib/harpoon.rb
CHANGED
data/test/test_logger.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
describe "Logger" do
|
4
|
+
before do
|
5
|
+
@logger = Harpoon::Logger.new(STDOUT)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "Should understand how to record a pass" do
|
9
|
+
assert defined?(@logger.pass), "Should have a pass method"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "Should understand how to record a fail" do
|
13
|
+
assert defined?(@logger.fail), "Should have a fail method"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "Should understand how to record a suggestion" do
|
17
|
+
assert defined?(@logger.suggest), "Should have a suggest method"
|
18
|
+
end
|
19
|
+
end
|
data/test/test_service_base.rb
CHANGED
@@ -27,6 +27,7 @@ describe "Service Base" do
|
|
27
27
|
@mock_auth = MiniTest::Mock.new
|
28
28
|
@mock_logger = MiniTest::Mock.new
|
29
29
|
d = {
|
30
|
+
name: "test-app",
|
30
31
|
hosting: :test,
|
31
32
|
hosting_options: {default_option: "one", new_option: true, default_option_required: true}
|
32
33
|
}
|
@@ -49,6 +50,11 @@ describe "Service Base" do
|
|
49
50
|
assert_equal true, @service.instance_eval {@options.new_option}
|
50
51
|
end
|
51
52
|
|
53
|
+
it "Should give us access to the root config object" do
|
54
|
+
@service = Harpoon::Services::TestBase.new(@mock_options, @mock_auth, @mock_logger)
|
55
|
+
assert_equal "test-app", @service.instance_eval {@config.name}
|
56
|
+
end
|
57
|
+
|
52
58
|
it "Should raise an error if required options aren't included" do
|
53
59
|
@mock_options = Harpoon::Config.new({hosting: :test})
|
54
60
|
assert_raises Harpoon::Errors::InvalidConfiguration do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: harpoon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Quinn
|
@@ -15,6 +15,9 @@ dependencies:
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.19'
|
20
|
+
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
22
|
version: 0.19.1
|
20
23
|
type: :runtime
|
@@ -22,6 +25,9 @@ dependencies:
|
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
24
27
|
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0.19'
|
30
|
+
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
32
|
version: 0.19.1
|
27
33
|
- !ruby/object:Gem::Dependency
|
@@ -29,6 +35,9 @@ dependencies:
|
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
37
|
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.7'
|
40
|
+
- - ">="
|
32
41
|
- !ruby/object:Gem::Version
|
33
42
|
version: 0.7.7
|
34
43
|
type: :runtime
|
@@ -36,6 +45,9 @@ dependencies:
|
|
36
45
|
version_requirements: !ruby/object:Gem::Requirement
|
37
46
|
requirements:
|
38
47
|
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.7'
|
50
|
+
- - ">="
|
39
51
|
- !ruby/object:Gem::Version
|
40
52
|
version: 0.7.7
|
41
53
|
- !ruby/object:Gem::Dependency
|
@@ -43,6 +55,9 @@ dependencies:
|
|
43
55
|
requirement: !ruby/object:Gem::Requirement
|
44
56
|
requirements:
|
45
57
|
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '1.51'
|
60
|
+
- - ">="
|
46
61
|
- !ruby/object:Gem::Version
|
47
62
|
version: 1.51.0
|
48
63
|
type: :runtime
|
@@ -50,13 +65,39 @@ dependencies:
|
|
50
65
|
version_requirements: !ruby/object:Gem::Requirement
|
51
66
|
requirements:
|
52
67
|
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.51'
|
70
|
+
- - ">="
|
53
71
|
- !ruby/object:Gem::Version
|
54
72
|
version: 1.51.0
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: bitballoon
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0.2'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.2.5
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.2'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 0.2.5
|
55
93
|
- !ruby/object:Gem::Dependency
|
56
94
|
name: public_suffix
|
57
95
|
requirement: !ruby/object:Gem::Requirement
|
58
96
|
requirements:
|
59
97
|
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '1.4'
|
100
|
+
- - ">="
|
60
101
|
- !ruby/object:Gem::Version
|
61
102
|
version: 1.4.5
|
62
103
|
type: :runtime
|
@@ -64,6 +105,9 @@ dependencies:
|
|
64
105
|
version_requirements: !ruby/object:Gem::Requirement
|
65
106
|
requirements:
|
66
107
|
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.4'
|
110
|
+
- - ">="
|
67
111
|
- !ruby/object:Gem::Version
|
68
112
|
version: 1.4.5
|
69
113
|
- !ruby/object:Gem::Dependency
|
@@ -71,6 +115,9 @@ dependencies:
|
|
71
115
|
requirement: !ruby/object:Gem::Requirement
|
72
116
|
requirements:
|
73
117
|
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0.7'
|
120
|
+
- - ">="
|
74
121
|
- !ruby/object:Gem::Version
|
75
122
|
version: 0.7.3
|
76
123
|
type: :runtime
|
@@ -78,6 +125,9 @@ dependencies:
|
|
78
125
|
version_requirements: !ruby/object:Gem::Requirement
|
79
126
|
requirements:
|
80
127
|
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0.7'
|
130
|
+
- - ">="
|
81
131
|
- !ruby/object:Gem::Version
|
82
132
|
version: 0.7.3
|
83
133
|
- !ruby/object:Gem::Dependency
|
@@ -85,6 +135,9 @@ dependencies:
|
|
85
135
|
requirement: !ruby/object:Gem::Requirement
|
86
136
|
requirements:
|
87
137
|
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '4.1'
|
140
|
+
- - ">="
|
88
141
|
- !ruby/object:Gem::Version
|
89
142
|
version: 4.1.5
|
90
143
|
type: :runtime
|
@@ -92,6 +145,9 @@ dependencies:
|
|
92
145
|
version_requirements: !ruby/object:Gem::Requirement
|
93
146
|
requirements:
|
94
147
|
- - "~>"
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '4.1'
|
150
|
+
- - ">="
|
95
151
|
- !ruby/object:Gem::Version
|
96
152
|
version: 4.1.5
|
97
153
|
description: Deploy small server-less webapps to amazon s3, including buckets, dns
|
@@ -117,6 +173,7 @@ files:
|
|
117
173
|
- lib/harpoon/logger.rb
|
118
174
|
- lib/harpoon/runner.rb
|
119
175
|
- lib/harpoon/service.rb
|
176
|
+
- lib/harpoon/services/bitballoon.rb
|
120
177
|
- lib/harpoon/services/s3.rb
|
121
178
|
- lib/harpoon/services/test.rb
|
122
179
|
- lib/harpoon/templates/harpoon.json
|
@@ -133,6 +190,7 @@ files:
|
|
133
190
|
- test/test_directory/unnested_files/nested/test2.txt
|
134
191
|
- test/test_directory/unnested_files/test.txt
|
135
192
|
- test/test_hosting.rb
|
193
|
+
- test/test_logger.rb
|
136
194
|
- test/test_runner.rb
|
137
195
|
- test/test_service_base.rb
|
138
196
|
- test/test_services.rb
|