cap_reserve 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.
- data/README.md +13 -4
- data/cap_reserve.gemspec +3 -3
- data/lib/cap_reserve.rb +43 -17
- metadata +63 -36
data/README.md
CHANGED
@@ -19,13 +19,13 @@ You must have a [maitre_d](https://github.com/winton/maitre_d) server running fi
|
|
19
19
|
|
20
20
|
require 'cap_reserve'
|
21
21
|
|
22
|
-
task :
|
22
|
+
task :reserve do
|
23
23
|
ENV['RESERVE_ENV'] = 'staging'
|
24
24
|
ENV['RESERVE_URL'] = 'http://localhost:3000'
|
25
|
-
|
25
|
+
maitre_d
|
26
26
|
end
|
27
27
|
|
28
|
-
before "deploy", "
|
28
|
+
before "deploy", "reserve"
|
29
29
|
|
30
30
|
Use It
|
31
31
|
------
|
@@ -38,15 +38,24 @@ Force the deploy even if reserved:
|
|
38
38
|
|
39
39
|
cap deploy FORCE=1
|
40
40
|
|
41
|
+
Destroy the reservation:
|
42
|
+
|
43
|
+
cap deploy DESTROY=1
|
44
|
+
|
45
|
+
You can also reserve without deploying:
|
46
|
+
|
47
|
+
cap reserve RESERVE=10
|
48
|
+
|
41
49
|
How it Works
|
42
50
|
------------
|
43
51
|
|
44
52
|
The `reserve` cap task looks for the following `ENV` variables:
|
45
53
|
|
54
|
+
ENV['DESTROY'] # Destroy reservation
|
46
55
|
ENV['FORCE'] # Force deploy
|
47
56
|
ENV['RESERVE'] # Minutes to reserve environment
|
48
57
|
ENV['RESERVE_ENV'] # Name of deploy environment
|
49
58
|
ENV['RESERVE_URL'] # URL to your maitre_d server
|
50
59
|
ENV['USER'] # Name of user
|
51
60
|
|
52
|
-
In the example above, we use the `setup_reserve` cap task to set up
|
61
|
+
In the example above, we use the `setup_reserve` cap task to set up the `RESERVE_ENV` and `RESERVE_URL` variables.
|
data/cap_reserve.gemspec
CHANGED
@@ -6,7 +6,7 @@ $:.unshift lib unless $:.include?(lib)
|
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "cap_reserve"
|
9
|
-
s.version = '0.1.
|
9
|
+
s.version = '0.1.1'
|
10
10
|
s.platform = Gem::Platform::RUBY
|
11
11
|
s.authors = [ "Winton Welsh" ]
|
12
12
|
s.email = [ "mail@wintoni.us" ]
|
@@ -20,6 +20,6 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.test_files = `cd #{root} && git ls-files -- {features,test,spec}/*`.split("\n")
|
21
21
|
|
22
22
|
s.add_development_dependency "rspec", "~> 1.0"
|
23
|
-
|
24
|
-
s.add_dependency "
|
23
|
+
|
24
|
+
s.add_dependency "yajl-ruby", "= 1.0.0"
|
25
25
|
end
|
data/lib/cap_reserve.rb
CHANGED
@@ -1,45 +1,71 @@
|
|
1
|
-
gem
|
2
|
-
|
1
|
+
gem 'yajl-ruby', '= 1.0.0'
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
require 'uri'
|
5
|
+
require 'yajl'
|
3
6
|
|
4
7
|
$:.unshift File.dirname(__FILE__)
|
5
8
|
|
6
9
|
Capistrano::Configuration.instance(:must_exist).load do
|
7
10
|
|
8
11
|
desc "Reserve environment using RESERVE=minutes"
|
9
|
-
task :
|
10
|
-
env, user, time, force, url =
|
11
|
-
ENV['RESERVE_ENV'], ENV['USER'], ENV['RESERVE'], ENV['FORCE'], ENV['RESERVE_URL']
|
12
|
+
task :maitre_d do
|
13
|
+
env, user, time, force, url, destroy =
|
14
|
+
ENV['RESERVE_ENV'], ENV['USER'], ENV['RESERVE'], ENV['FORCE'], ENV['RESERVE_URL'], ENV['DESTROY']
|
15
|
+
|
16
|
+
expires_to_string = lambda do |expires|
|
17
|
+
left = Time.at(expires) - Time.now
|
18
|
+
if left < 60
|
19
|
+
"#{left} seconds"
|
20
|
+
elsif left / 60 < 60
|
21
|
+
"#{sprintf "%.1f", left / 60} minutes"
|
22
|
+
else
|
23
|
+
"#{sprintf "%.1f", left / 60 / 60} hours"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
get = lambda do |full_url, hash|
|
28
|
+
params = ''
|
29
|
+
hash.each do |k, v|
|
30
|
+
params << "#{URI.escape(k.to_s)}=#{URI.escape(v.to_s)}&"
|
31
|
+
end
|
32
|
+
params.chop! # trailing &
|
33
|
+
|
34
|
+
puts "#{full_url}?#{params}"
|
35
|
+
json = open("#{full_url}?#{params}").read
|
36
|
+
Yajl::Parser.parse(json)
|
37
|
+
end
|
12
38
|
|
13
39
|
create = lambda do |params|
|
14
40
|
if time
|
15
|
-
|
41
|
+
get.call("#{url}/reservations/create", {
|
16
42
|
:environment => env, :user => user, :seconds => time.to_i * 60
|
17
43
|
}.merge(params))
|
18
44
|
puts "Reservation created: #{user}@#{env} for #{time.to_i} minutes"
|
19
|
-
elsif
|
20
|
-
res =
|
45
|
+
elsif destroy
|
46
|
+
res = get.call("#{url}/reservations/destroy", :environment => env)
|
21
47
|
if res['status'] == 'reserved'
|
22
|
-
puts "Reservation destroyed: #{res['user']}@#{env} (#{
|
48
|
+
puts "Reservation destroyed: #{res['user']}@#{env} (#{expires_to_string.call Time.at(res['expires'])} left)"
|
23
49
|
end
|
24
50
|
end
|
25
51
|
end
|
26
52
|
|
27
53
|
if env && user
|
28
|
-
if
|
54
|
+
if destroy
|
55
|
+
create.call({})
|
56
|
+
elsif force
|
29
57
|
create.call(:force => true)
|
30
58
|
else
|
31
|
-
res =
|
59
|
+
res = get.call("#{url}/reservations/show", :environment => env)
|
32
60
|
if res['status'] == 'reserved'
|
33
|
-
|
34
|
-
|
35
|
-
else
|
36
|
-
puts "Reservation exists: #{res['user']}@#{env} for #{(Time.at(res['expires']) - Time.now) / 60} minutes"
|
37
|
-
exit 0
|
38
|
-
end
|
61
|
+
puts "Reservation exists: #{res['user']}@#{env} for #{expires_to_string.call Time.at(res['expires'])}"
|
62
|
+
exit 0
|
39
63
|
else
|
40
64
|
create.call({})
|
41
65
|
end
|
42
66
|
end
|
43
67
|
end
|
68
|
+
|
69
|
+
exit
|
44
70
|
end
|
45
71
|
end
|
metadata
CHANGED
@@ -1,45 +1,63 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: cap_reserve
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 1
|
10
|
+
version: 0.1.1
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Winton Welsh
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
17
|
+
|
18
|
+
date: 2011-10-13 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
15
21
|
name: rspec
|
16
|
-
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
17
24
|
none: false
|
18
|
-
requirements:
|
25
|
+
requirements:
|
19
26
|
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 15
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 0
|
32
|
+
version: "1.0"
|
22
33
|
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: yajl-ruby
|
23
37
|
prerelease: false
|
24
|
-
|
25
|
-
- !ruby/object:Gem::Dependency
|
26
|
-
name: nestful
|
27
|
-
requirement: &70146890925420 !ruby/object:Gem::Requirement
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
|
-
requirements:
|
30
|
-
- - =
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
|
40
|
+
requirements:
|
41
|
+
- - "="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 23
|
44
|
+
segments:
|
45
|
+
- 1
|
46
|
+
- 0
|
47
|
+
- 0
|
48
|
+
version: 1.0.0
|
33
49
|
type: :runtime
|
34
|
-
|
35
|
-
version_requirements: *70146890925420
|
50
|
+
version_requirements: *id002
|
36
51
|
description: Uses a maitre_d server to reserve time on deploy environments.
|
37
|
-
email:
|
52
|
+
email:
|
38
53
|
- mail@wintoni.us
|
39
54
|
executables: []
|
55
|
+
|
40
56
|
extensions: []
|
57
|
+
|
41
58
|
extra_rdoc_files: []
|
42
|
-
|
59
|
+
|
60
|
+
files:
|
43
61
|
- .gitignore
|
44
62
|
- Gemfile
|
45
63
|
- LICENSE
|
@@ -51,28 +69,37 @@ files:
|
|
51
69
|
- spec/spec_helper.rb
|
52
70
|
homepage: http://guthub.com/winton/cap_reserve
|
53
71
|
licenses: []
|
72
|
+
|
54
73
|
post_install_message:
|
55
74
|
rdoc_options: []
|
56
|
-
|
75
|
+
|
76
|
+
require_paths:
|
57
77
|
- lib
|
58
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
79
|
none: false
|
60
|
-
requirements:
|
61
|
-
- -
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
|
64
|
-
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
hash: 3
|
84
|
+
segments:
|
85
|
+
- 0
|
86
|
+
version: "0"
|
87
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
88
|
none: false
|
66
|
-
requirements:
|
67
|
-
- -
|
68
|
-
- !ruby/object:Gem::Version
|
69
|
-
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
hash: 3
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
70
96
|
requirements: []
|
97
|
+
|
71
98
|
rubyforge_project:
|
72
|
-
rubygems_version: 1.8.
|
99
|
+
rubygems_version: 1.8.10
|
73
100
|
signing_key:
|
74
101
|
specification_version: 3
|
75
102
|
summary: Uses a maitre_d server to reserve time on deploy environments
|
76
|
-
test_files:
|
103
|
+
test_files:
|
77
104
|
- spec/cap_reserve_spec.rb
|
78
105
|
- spec/spec_helper.rb
|