ftl 0.2.4 → 0.3.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.
- data/Changelog +12 -0
- data/Gemfile.lock +11 -11
- data/ftl.gemspec +1 -0
- data/lib/ftl.rb +2 -1
- data/lib/ftl/client.rb +138 -41
- data/lib/ftl/version.rb +1 -1
- data/lib/resources/ftl.yml +12 -10
- metadata +98 -63
data/Changelog
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
# Release Version 0.3.0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
2
|
+
|
3
|
+
* Feature: Add ftl <script> to execute arbitrary ruby locally within ftl environment
|
4
|
+
* Feature: Add ftl ips to show Elastic IP addresses
|
5
|
+
* Feature: Add ftl stop to stop running instances
|
6
|
+
* Feature: Add ftl start to start running instances
|
7
|
+
* Feature: Add option to pass in spot request instance count
|
8
|
+
* Feature: Add ftl terminate to specifically terminate any instance vs only running ones
|
9
|
+
* Bug fix: Spot requests were launching as regular instances
|
10
|
+
* Bug fix: Other minor bug fixes and cleanups
|
11
|
+
|
12
|
+
|
1
13
|
# Release Version 0.2.4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
2
14
|
|
3
15
|
* Add ftl <action> <server> to execute arbitrary commands on running instances
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ftl (0.
|
4
|
+
ftl (0.3.0)
|
5
5
|
fog
|
6
6
|
formatador (~> 0.2.2)
|
7
|
+
tilt
|
7
8
|
|
8
9
|
GEM
|
9
10
|
remote: https://rubygems.org/
|
@@ -22,11 +23,11 @@ GEM
|
|
22
23
|
gherkin (~> 2.10.0)
|
23
24
|
json (>= 1.4.6)
|
24
25
|
diff-lcs (1.1.3)
|
25
|
-
excon (0.
|
26
|
+
excon (0.14.3)
|
26
27
|
ffi (1.0.11)
|
27
|
-
fog (1.
|
28
|
+
fog (1.4.0)
|
28
29
|
builder
|
29
|
-
excon (~> 0.
|
30
|
+
excon (~> 0.14.0)
|
30
31
|
formatador (~> 0.2.0)
|
31
32
|
mime-types
|
32
33
|
multi_json (~> 1.0)
|
@@ -34,18 +35,16 @@ GEM
|
|
34
35
|
net-ssh (>= 2.1.3)
|
35
36
|
nokogiri (~> 1.5.0)
|
36
37
|
ruby-hmac
|
37
|
-
formatador (0.2.
|
38
|
+
formatador (0.2.3)
|
38
39
|
gherkin (2.10.0)
|
39
40
|
json (>= 1.4.6)
|
40
|
-
jruby-pageant (1.0.2)
|
41
41
|
json (1.7.3)
|
42
|
-
mime-types (1.
|
43
|
-
multi_json (1.3.
|
42
|
+
mime-types (1.19)
|
43
|
+
multi_json (1.3.6)
|
44
44
|
net-scp (1.0.4)
|
45
45
|
net-ssh (>= 1.99.1)
|
46
|
-
net-ssh (2.
|
47
|
-
|
48
|
-
nokogiri (1.5.2)
|
46
|
+
net-ssh (2.5.2)
|
47
|
+
nokogiri (1.5.5)
|
49
48
|
rake (0.9.2.2)
|
50
49
|
rdoc (3.12)
|
51
50
|
json (~> 1.4)
|
@@ -58,6 +57,7 @@ GEM
|
|
58
57
|
diff-lcs (~> 1.1.3)
|
59
58
|
rspec-mocks (2.10.1)
|
60
59
|
ruby-hmac (0.4.0)
|
60
|
+
tilt (1.3.3)
|
61
61
|
|
62
62
|
PLATFORMS
|
63
63
|
ruby
|
data/ftl.gemspec
CHANGED
data/lib/ftl.rb
CHANGED
data/lib/ftl/client.rb
CHANGED
@@ -22,6 +22,7 @@ module Ftl
|
|
22
22
|
ftl edit # Edit ftl.yml with your $EDITOR
|
23
23
|
ftl images # Show AMIs associated with your account
|
24
24
|
ftl <action> ninja # Execute the <action> (specified in ftl.yml) on the remote server instance
|
25
|
+
ftl <script> ninja # Execute the <script> (specified in ftl.yml) on your local machine
|
25
26
|
ftl --config=~/ftl.yml servers # Uses custom config file
|
26
27
|
ftl --headers=id,tags.Name servers # Uses specified headers
|
27
28
|
ftl --version # Show version number
|
@@ -40,17 +41,14 @@ module Ftl
|
|
40
41
|
attr_accessor :options
|
41
42
|
|
42
43
|
def initialize(args=nil, opts={})
|
43
|
-
load_config(opts)
|
44
44
|
if args && args.length > 0
|
45
45
|
arg = args.reverse.pop
|
46
|
+
@args = [arg, args - [arg]]
|
47
|
+
load_config(opts)
|
46
48
|
if (!SINGLE_COMMANDS.include?(arg))
|
47
49
|
@con = Fog::Compute.new(:provider => 'AWS', :aws_secret_access_key => options['SECRET_ACCESS_KEY'], :aws_access_key_id => options['ACCESS_KEY_ID'])
|
48
50
|
end
|
49
|
-
|
50
|
-
send(arg, args - [arg])
|
51
|
-
rescue
|
52
|
-
Ftl.help
|
53
|
-
end
|
51
|
+
send(*@args)
|
54
52
|
else
|
55
53
|
Ftl.help
|
56
54
|
end
|
@@ -59,12 +57,14 @@ module Ftl
|
|
59
57
|
def launch_instance(args)
|
60
58
|
display "Spinning up FTL..."
|
61
59
|
opts = options
|
62
|
-
opts = options[:templates][args.first.to_sym] if !options[:templates][args.first.to_sym].nil?
|
60
|
+
opts = options.merge(options[:templates][args.first.to_sym]) if !options[:templates][args.first.to_sym].nil?
|
63
61
|
|
64
62
|
opts[:group_ids] = (opts[:group_ids] || []) + opts[:groups].select { | group | group.to_s =~ /^sg-[0-9a-f]{8}$/ }
|
65
63
|
opts[:groups] = opts[:groups].reject { | group | group.to_s =~ /^sg-[0-9a-f]{8}$/ }
|
66
64
|
|
67
|
-
|
65
|
+
launcher = options.delete(:launcher) || :servers
|
66
|
+
server = con.send(launcher).create(
|
67
|
+
:user_data => opts[:user_data],
|
68
68
|
:key_name => opts[:keypair],
|
69
69
|
:groups => opts[:groups],
|
70
70
|
:security_group_ids => opts[:group_ids],
|
@@ -75,6 +75,8 @@ module Ftl
|
|
75
75
|
:tags => opts[:tags].merge(:Name => args.first),
|
76
76
|
:subnet_id => opts[:subnet_id],
|
77
77
|
:private_ip_address => opts[:ip_private],
|
78
|
+
:ip_address => opts[:ip_address],
|
79
|
+
:price => opts[:price]
|
78
80
|
)
|
79
81
|
|
80
82
|
display server
|
@@ -84,7 +86,6 @@ module Ftl
|
|
84
86
|
|
85
87
|
def launch(args={})
|
86
88
|
guard(args.first, "Please provide a short name for instance\n\t[bold]ftl[/] launch <name>")
|
87
|
-
display "Spinning up FTL..."
|
88
89
|
options.merge(options[:templates][args.first.to_sym]) if !options[:templates][args.first.to_sym].nil?
|
89
90
|
server = launch_instance(args)
|
90
91
|
end
|
@@ -94,17 +95,20 @@ module Ftl
|
|
94
95
|
alias :new :launch
|
95
96
|
|
96
97
|
def spot(args={})
|
97
|
-
guard(args
|
98
|
+
guard(args[0], "Please provide a short name for instance\n\t[bold]ftl[/] spot <name> <price>")
|
98
99
|
guard(args[1], "Please provide a price for spot request\n\t[bold]ftl[/] spot <name> <price>")
|
99
100
|
display "Spinning up FTL..."
|
100
101
|
options.merge(options[:templates][args.first.to_sym]) if !options[:templates][args.first.to_sym].nil?
|
101
|
-
options[:price] = args[1]
|
102
|
+
options[:price] = args[1] || options[:templates][args.first.to_sym][:price] || options[:price]
|
103
|
+
options.merge!(:launcher => :spot_requests)
|
102
104
|
server = launch_instance(args)
|
103
105
|
end
|
106
|
+
alias :request :spot
|
104
107
|
|
105
108
|
def spots(args={})
|
106
109
|
con.spot_requests.table(_headers_for(:spot_requests))
|
107
110
|
end
|
111
|
+
alias :spot_requests :spots
|
108
112
|
|
109
113
|
def cancel(args={})
|
110
114
|
guard(args.first, "Please provide the id for the spot request to cancel.")
|
@@ -116,11 +120,19 @@ module Ftl
|
|
116
120
|
end
|
117
121
|
end
|
118
122
|
|
123
|
+
def running_instances(name)
|
124
|
+
find_instances(name).select{|i| i.state == "running" }
|
125
|
+
end
|
126
|
+
|
127
|
+
def running_instance(name)
|
128
|
+
instances = running_instances(name)
|
129
|
+
instances.first if instances
|
130
|
+
end
|
131
|
+
|
119
132
|
def connect(args={})
|
120
|
-
if
|
121
|
-
|
122
|
-
|
123
|
-
exec("ssh #{opt_key} #{options[:username]||'root'}@#{hostname}")
|
133
|
+
if server = running_instance(args.first)
|
134
|
+
# puts(ssh_command(server))
|
135
|
+
exec(ssh_command(server))
|
124
136
|
else
|
125
137
|
display "Typo alert! No server found!"
|
126
138
|
end
|
@@ -133,34 +145,49 @@ module Ftl
|
|
133
145
|
server = find_instance(args.first)
|
134
146
|
display server
|
135
147
|
end
|
148
|
+
alias :st :status
|
136
149
|
|
137
150
|
def start(args={})
|
138
|
-
display "
|
151
|
+
display "Bringing \"#{args.first}\" server back to life."
|
152
|
+
find_instance(args.first).start
|
139
153
|
end
|
154
|
+
alias :run :start
|
140
155
|
|
141
156
|
def stop(args={})
|
142
|
-
display "Stopping
|
157
|
+
display "Stopping \"#{args.first}\" server."
|
158
|
+
find_instance(args.first).stop
|
143
159
|
end
|
160
|
+
alias :pause :stop
|
144
161
|
|
145
162
|
def destroy(args={})
|
146
|
-
|
147
|
-
|
148
|
-
|
163
|
+
guard(on_what, "Please provide the name (or partial name for the instance(s) you want to delete. For instance, like: ftl destroy ninja")
|
164
|
+
display "Spinning down FTL..."
|
165
|
+
instances = find_instances(on_what).select{|i| i.state == 'running' }
|
166
|
+
if !instances.empty?
|
167
|
+
instances.map(&:destroy)
|
168
|
+
display "Destroyed [bold]\[#{instances.map(&:id).join(', ')}\][/]"
|
169
|
+
else
|
170
|
+
display "No instances found"
|
149
171
|
end
|
172
|
+
end
|
173
|
+
alias :d :destroy
|
174
|
+
alias :delete :destroy
|
175
|
+
alias :kill :destroy
|
176
|
+
alias :down :destroy
|
177
|
+
alias :shutdown :destroy
|
178
|
+
|
179
|
+
def terminate(args={})
|
180
|
+
guard(on_what, "Please provide the name (or partial name for the instance(s) you want to terminate. For instance, like: ftl destroy ninja")
|
150
181
|
display "Spinning down FTL..."
|
151
|
-
instances = find_instances(
|
152
|
-
if instances
|
182
|
+
instances = find_instances(on_what)
|
183
|
+
if !instances.empty?
|
153
184
|
instances.map(&:destroy)
|
154
|
-
display "
|
185
|
+
display "Destroyed [bold]\[#{instances.map(&:id).join(', ')}\][/]"
|
155
186
|
else
|
156
187
|
display "No instances found"
|
157
188
|
end
|
158
189
|
end
|
159
|
-
alias :
|
160
|
-
alias :delete :destroy
|
161
|
-
alias :kill :destroy
|
162
|
-
alias :down :destroy
|
163
|
-
alias :shutdown :destroy
|
190
|
+
alias :t :terminate
|
164
191
|
|
165
192
|
def info(args={})
|
166
193
|
display find_instance(args.first)
|
@@ -171,11 +198,13 @@ module Ftl
|
|
171
198
|
opts = [:servers] if opts.empty?
|
172
199
|
con.send(opts.first).table(_headers_for(opts.first))
|
173
200
|
end
|
174
|
-
alias :l
|
201
|
+
alias :l :list
|
202
|
+
alias :ls :list
|
175
203
|
|
176
204
|
def image(args={})
|
177
205
|
Formatador.display_table(con.images.find(:id => args.first))
|
178
206
|
end
|
207
|
+
alias :img :image
|
179
208
|
|
180
209
|
# TODO: Make this better by including more details of block devices
|
181
210
|
def images(args={})
|
@@ -188,14 +217,29 @@ module Ftl
|
|
188
217
|
end
|
189
218
|
puts Formatador.display_table(hashes)
|
190
219
|
end
|
220
|
+
alias :describe_images :images
|
221
|
+
|
222
|
+
def ip_addresses
|
223
|
+
con.addresses
|
224
|
+
end
|
225
|
+
|
226
|
+
def ips(args={})
|
227
|
+
# TODO add server "name"
|
228
|
+
addrs = con.describe_addresses.body['addressesSet'] #.collect do |addr|
|
229
|
+
# addr
|
230
|
+
# end
|
231
|
+
Formatador.display_table addrs
|
232
|
+
end
|
233
|
+
alias :addresses :ips
|
191
234
|
|
192
235
|
def headers(args={})
|
193
|
-
|
194
|
-
display
|
236
|
+
what = args.first || :servers
|
237
|
+
display "Showing header options for #{what}"
|
238
|
+
display con.send(what).first.attributes.keys
|
195
239
|
end
|
196
240
|
|
197
241
|
def server_instances(args={})
|
198
|
-
@servers ||=
|
242
|
+
@servers ||= (con.servers.all||[])
|
199
243
|
end
|
200
244
|
|
201
245
|
def edit(args={})
|
@@ -207,10 +251,45 @@ module Ftl
|
|
207
251
|
puts File.open(File.dirname(__FILE__) + "/../resources/ftl.yml").read
|
208
252
|
end
|
209
253
|
|
254
|
+
def command
|
255
|
+
@args[0]
|
256
|
+
end
|
257
|
+
|
258
|
+
def secondary_arguments
|
259
|
+
@args[1]
|
260
|
+
end
|
261
|
+
|
262
|
+
def on_what
|
263
|
+
secondary_arguments.first
|
264
|
+
end
|
265
|
+
|
266
|
+
def volume(args={})
|
267
|
+
arg = args.is_a?(String) ? args : on_what
|
268
|
+
display vol = con.volumes.select{|v| v.tags['Name'] == arg || v.id == arg }.first
|
269
|
+
vol
|
270
|
+
end
|
271
|
+
|
272
|
+
def execute(args={})
|
273
|
+
arg = args.is_a?(String) ? args : args[1]
|
274
|
+
server = find_instances(on_what).select{|i| i.state == 'running' }.first
|
275
|
+
puts %|#{ssh_command(server)} #{arg}|
|
276
|
+
system(%|#{ssh_command(server)} #{arg}|)
|
277
|
+
end
|
278
|
+
alias :ex :execute
|
279
|
+
|
210
280
|
###########################################################################
|
211
281
|
## private ###
|
212
282
|
###########################################################################
|
213
283
|
private
|
284
|
+
|
285
|
+
def ssh_command(server)
|
286
|
+
opt_key = " -i #{options[:keys][server[:key_name]]}" unless (options[:keys].nil? || options[:keys][server[:key_name]].nil?)
|
287
|
+
hostname = server[:public_ip_address] || server[:dns_name] || server[:private_ip_address]
|
288
|
+
server_name = server.tags['Name'].to_sym
|
289
|
+
user_name = options[:templates][server_name][:username]
|
290
|
+
user_name = 'root' if user_name.nil? || user_name.length == 0
|
291
|
+
"ssh#{opt_key} #{user_name}@#{hostname}"
|
292
|
+
end
|
214
293
|
|
215
294
|
def guard(arg, options={:message => "Please refer to ftl help"})
|
216
295
|
if arg.nil?
|
@@ -224,7 +303,7 @@ module Ftl
|
|
224
303
|
end
|
225
304
|
|
226
305
|
def load_config(opts={})
|
227
|
-
# TODO
|
306
|
+
# TODO So ugly, make this less shitty. Such a common pattern.
|
228
307
|
if opts[:config]
|
229
308
|
default_config_file = opts[:config]
|
230
309
|
else
|
@@ -267,9 +346,9 @@ module Ftl
|
|
267
346
|
when :volumes
|
268
347
|
[:server_id, :id, :size, :snapshot_id, :availability_zone, :state, :"tags.Name"]
|
269
348
|
when nil
|
270
|
-
[:id, :image_id, :flavor_id, :availability_zone, :state, :"tags.Name"]
|
349
|
+
[:id, :image_id, :flavor_id, :availability_zone, :state, :created_at, :"tags.Name"]
|
271
350
|
else
|
272
|
-
[:id, :image_id, :flavor_id, :availability_zone, :state, :"tags.Name"]
|
351
|
+
[:id, :image_id, :flavor_id, :availability_zone, :state, :created_at, :"tags.Name"]
|
273
352
|
end
|
274
353
|
end
|
275
354
|
|
@@ -285,17 +364,35 @@ module Ftl
|
|
285
364
|
def eval_action(script, args)
|
286
365
|
# TODO Complete the script to handle multiple servers, like:
|
287
366
|
# ftl bundle server1 server2 server3
|
288
|
-
server = find_instance(
|
367
|
+
# server = find_instance(on_what)
|
368
|
+
server = find_instances(on_what).select{|i| i.state == 'running' }.first
|
369
|
+
eval(script, binding)
|
370
|
+
end
|
371
|
+
|
372
|
+
def eval_script(script, args)
|
289
373
|
eval(script, binding)
|
290
374
|
end
|
291
375
|
|
376
|
+
def local(cmd)
|
377
|
+
puts output = %x|#{cmd}|
|
378
|
+
output
|
379
|
+
end
|
380
|
+
|
381
|
+
# def remote(cmd)
|
382
|
+
# %x|#{ssh_command(server)} #{cmd}|
|
383
|
+
# end
|
384
|
+
|
292
385
|
def method_missing(*args)
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
386
|
+
method = args.first.to_sym
|
387
|
+
if con.respond_to? method
|
388
|
+
results = con.send(method)
|
389
|
+
display results.table(_headers_for(method))
|
390
|
+
elsif options[:actions][method]
|
391
|
+
eval_action(options[:actions][method], args)
|
392
|
+
elsif options[:scripts][method]
|
393
|
+
eval_script(options[:scripts][method], args)
|
394
|
+
else
|
297
395
|
Ftl.help
|
298
|
-
rescue
|
299
396
|
end
|
300
397
|
end
|
301
398
|
|
data/lib/ftl/version.rb
CHANGED
data/lib/resources/ftl.yml
CHANGED
@@ -5,23 +5,20 @@
|
|
5
5
|
ACCESS_KEY_ID:
|
6
6
|
SECRET_ACCESS_KEY:
|
7
7
|
|
8
|
-
:
|
9
|
-
:
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
touch /root/file.touched
|
14
|
-
:post_script: |
|
15
|
-
:tags: {}
|
8
|
+
:scripts:
|
9
|
+
:ls: |
|
10
|
+
local("ls -alh")
|
11
|
+
local("echo '-----------'")
|
12
|
+
|
16
13
|
:actions:
|
17
14
|
:uptime: puts server.ssh('uptime').first.stdout
|
18
15
|
:mount: puts server.ssh('mount').first.stdout
|
19
16
|
:df: puts server.ssh('df -h').first.stdout
|
20
17
|
:w: puts server.ssh('w').first.stdout
|
21
18
|
|
22
|
-
|
23
19
|
:templates:
|
24
|
-
|
20
|
+
|
21
|
+
:defaults: &defaults
|
25
22
|
:ami: ami-a29943cb # Ubuntu 12.04 LTS Precise Pangolin
|
26
23
|
:username: ubuntu
|
27
24
|
:instance_type: m1.small
|
@@ -30,4 +27,9 @@ SECRET_ACCESS_KEY:
|
|
30
27
|
touch /root/file.touched
|
31
28
|
:post_script: |
|
32
29
|
|
30
|
+
:ninja_server:
|
31
|
+
<<: *defaults
|
32
|
+
:user_data: |
|
33
|
+
#!/bin/sh
|
34
|
+
uptime > /root/uptime.txt
|
33
35
|
|
metadata
CHANGED
@@ -1,82 +1,120 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: ftl
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.2.4
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Matt Petty
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-07-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: rdoc
|
17
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
|
-
requirements:
|
20
|
-
- -
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
23
22
|
type: :development
|
24
23
|
prerelease: false
|
25
|
-
version_requirements:
|
26
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
27
31
|
name: aruba
|
28
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
29
33
|
none: false
|
30
|
-
requirements:
|
31
|
-
- -
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
|
-
version_requirements:
|
37
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
38
47
|
name: rake
|
39
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
40
49
|
none: false
|
41
|
-
requirements:
|
50
|
+
requirements:
|
42
51
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
52
|
+
- !ruby/object:Gem::Version
|
44
53
|
version: 0.9.2
|
45
54
|
type: :development
|
46
55
|
prerelease: false
|
47
|
-
version_requirements:
|
48
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.2
|
62
|
+
- !ruby/object:Gem::Dependency
|
49
63
|
name: fog
|
50
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
51
65
|
none: false
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version:
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
56
70
|
type: :runtime
|
57
71
|
prerelease: false
|
58
|
-
version_requirements:
|
59
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
60
79
|
name: formatador
|
61
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
62
81
|
none: false
|
63
|
-
requirements:
|
82
|
+
requirements:
|
64
83
|
- - ~>
|
65
|
-
- !ruby/object:Gem::Version
|
84
|
+
- !ruby/object:Gem::Version
|
66
85
|
version: 0.2.2
|
67
86
|
type: :runtime
|
68
87
|
prerelease: false
|
69
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.2.2
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: tilt
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
70
110
|
description: Ftl is a command line tool for Fog/AWS
|
71
|
-
email:
|
111
|
+
email:
|
72
112
|
- matt@kizmeta.com
|
73
|
-
executables:
|
113
|
+
executables:
|
74
114
|
- ftl
|
75
115
|
extensions: []
|
76
|
-
|
77
116
|
extra_rdoc_files: []
|
78
|
-
|
79
|
-
files:
|
117
|
+
files:
|
80
118
|
- .gitignore
|
81
119
|
- Changelog
|
82
120
|
- Gemfile
|
@@ -101,38 +139,35 @@ files:
|
|
101
139
|
- test/tc_something.rb
|
102
140
|
homepage: http://github.com/lodestone/ftl
|
103
141
|
licenses: []
|
104
|
-
|
105
142
|
post_install_message:
|
106
143
|
rdoc_options: []
|
107
|
-
|
108
|
-
require_paths:
|
144
|
+
require_paths:
|
109
145
|
- lib
|
110
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
146
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
147
|
none: false
|
112
|
-
requirements:
|
113
|
-
- -
|
114
|
-
- !ruby/object:Gem::Version
|
115
|
-
|
116
|
-
segments:
|
148
|
+
requirements:
|
149
|
+
- - ! '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
segments:
|
117
153
|
- 0
|
118
|
-
|
119
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
|
+
hash: 2669038478733499008
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
156
|
none: false
|
121
|
-
requirements:
|
122
|
-
- -
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
|
125
|
-
segments:
|
157
|
+
requirements:
|
158
|
+
- - ! '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
segments:
|
126
162
|
- 0
|
127
|
-
|
163
|
+
hash: 2669038478733499008
|
128
164
|
requirements: []
|
129
|
-
|
130
165
|
rubyforge_project:
|
131
|
-
rubygems_version: 1.8.
|
166
|
+
rubygems_version: 1.8.24
|
132
167
|
signing_key:
|
133
168
|
specification_version: 3
|
134
169
|
summary: Ftl is a command line tool for Fog/AWS
|
135
|
-
test_files:
|
170
|
+
test_files:
|
136
171
|
- features/ftl.feature
|
137
172
|
- features/step_definitions/ftl_steps.rb
|
138
173
|
- features/support/env.rb
|