vmc 0.4.0.beta.13 → 0.4.0.beta.14

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.
@@ -40,10 +40,18 @@ module VMC
40
40
  input :framework, :desc => "Filter by framework regexp"
41
41
  input :url, :desc => "Filter by url regexp"
42
42
  def apps(input)
43
- apps =
44
- with_progress("Getting applications") do
45
- client.apps
46
- end
43
+ if v2?
44
+ space = client.current_space
45
+ apps =
46
+ with_progress("Getting applications in #{c(space.name, :name)}") do
47
+ space.apps
48
+ end
49
+ else
50
+ apps =
51
+ with_progress("Getting applications") do
52
+ client.apps
53
+ end
54
+ end
47
55
 
48
56
  if apps.empty? and !quiet?
49
57
  puts ""
@@ -107,34 +115,51 @@ module VMC
107
115
 
108
116
  name = input[:name] if input[:name]
109
117
 
110
- detector = Detector.new(client, path)
111
- frameworks = detector.all_frameworks
112
- detected, default = detector.frameworks
113
-
114
- app = client.app(name)
118
+ exists =
119
+ if v2?
120
+ client.current_space.apps.find { |a| a.name == name }
121
+ elsif client.app(name).exists?
122
+ client.app(name)
123
+ end
115
124
 
116
- if app.exists?
117
- upload_app(app, path)
118
- invoke :restart, :name => app.name if input[:restart]
125
+ if exists
126
+ upload_app(exists, path)
127
+ invoke :restart, :name => exists.name if input[:restart]
119
128
  return
120
129
  end
121
130
 
131
+ detector = Detector.new(client, path)
132
+ frameworks = detector.all_frameworks
133
+ detected, default = detector.frameworks
134
+
135
+ app = client.app
136
+ app.name = name
137
+ app.space = client.current_space if v2?
122
138
  app.total_instances = input[:instances]
123
139
 
140
+ framework_names = frameworks.collect(&:name).sort
124
141
  if detected.empty?
125
- framework = input[:framework, frameworks.keys.sort, nil]
142
+ framework_name = input[:framework, framework_names, nil]
126
143
  else
127
- framework = input[:framework, detected.keys.sort + ["other"], default]
128
- if framework == "other"
144
+ detected_names = detected.collect(&:name).sort
145
+ framework_name =
146
+ input[:framework, detected_names + ["other"], default]
147
+
148
+ if framework_name == "other"
129
149
  input.forget(:framework)
130
- framework = input[:framework, frameworks.keys.sort, nil]
150
+ framework_name = input[:framework, framework_names, nil]
131
151
  end
132
152
  end
133
153
 
134
- framework_runtimes =
135
- frameworks[framework]["runtimes"].collect { |k| k["name"] }
154
+ framework = frameworks.find { |f| f.name == framework_name }
155
+
156
+ runtimes = v2? ? client.runtimes : framework.runtimes
157
+ runtime_name = input[:runtime, runtimes.collect(&:name).sort]
158
+ runtime = runtimes.find { |r| r.name == runtime_name }
136
159
 
137
- runtime = input[:runtime, framework_runtimes.sort]
160
+ fail "Invalid framework '#{input[:framework]}'" unless framework
161
+
162
+ fail "Invalid runtime '#{input[:runtime]}'" unless runtime
138
163
 
139
164
  app.framework = framework
140
165
  app.runtime = runtime
@@ -155,7 +180,7 @@ module VMC
155
180
  app.memory = megabytes(input[:memory, framework, runtime])
156
181
 
157
182
  bindings = []
158
- if input[:create_services] && !force?
183
+ if !v2? && input[:create_services] && !force?
159
184
  services = client.system_services
160
185
 
161
186
  while true
@@ -188,7 +213,7 @@ module VMC
188
213
  end
189
214
  end
190
215
 
191
- if input[:bind_services] && !force?
216
+ if !v2? && input[:bind_services] && !force?
192
217
  services = client.services.collect(&:name)
193
218
 
194
219
  while true
@@ -776,7 +801,7 @@ module VMC
776
801
 
777
802
  puts "#{c(a.name, :name)}: #{status}"
778
803
 
779
- puts " platform: #{b(a.framework)} on #{b(a.runtime)}"
804
+ puts " platform: #{b(a.framework.name)} on #{b(a.runtime.name)}"
780
805
 
781
806
  print " usage: #{b(human_size(a.memory * 1024 * 1024, 0))}"
782
807
  print " #{c(IS_UTF8 ? "\xc3\x97" : "x", :dim)} #{b(a.total_instances)}"
@@ -793,6 +818,10 @@ module VMC
793
818
  end
794
819
 
795
820
  def upload_app(app, path)
821
+ if v2?
822
+ fail "V2 API currently does not support uploading or starting apps."
823
+ end
824
+
796
825
  with_progress("Uploading #{c(app.name, :name)}") do
797
826
  app.upload(path)
798
827
  end
@@ -922,5 +951,49 @@ module VMC
922
951
  end
923
952
  end
924
953
  end
954
+
955
+ def usage(used, limit)
956
+ "#{b(human_size(used))} of #{b(human_size(limit, 0))}"
957
+ end
958
+
959
+ def percentage(num, low = 50, mid = 70)
960
+ color =
961
+ if num <= low
962
+ :good
963
+ elsif num <= mid
964
+ :warning
965
+ else
966
+ :bad
967
+ end
968
+
969
+ c(format("%.1f\%", num), color)
970
+ end
971
+
972
+ def megabytes(str)
973
+ if str =~ /T$/i
974
+ str.to_i * 1024 * 1024
975
+ elsif str =~ /G$/i
976
+ str.to_i * 1024
977
+ elsif str =~ /M$/i
978
+ str.to_i
979
+ elsif str =~ /K$/i
980
+ str.to_i / 1024
981
+ else # assume megabytes
982
+ str.to_i
983
+ end
984
+ end
985
+
986
+ def human_size(num, precision = 1)
987
+ sizes = ["G", "M", "K"]
988
+ sizes.each.with_index do |suf, i|
989
+ pow = sizes.size - i
990
+ unit = 1024 ** pow
991
+ if num >= unit
992
+ return format("%.#{precision}f%s", num / unit, suf)
993
+ end
994
+ end
995
+
996
+ format("%.#{precision}fB", num)
997
+ end
925
998
  end
926
999
  end
@@ -10,100 +10,89 @@ module VMC
10
10
  :desc => "List supported services"
11
11
  input :frameworks, :type => :boolean,
12
12
  :desc => "List supported frameworks"
13
+ input(:all, :type => :boolean, :alias => "-a",
14
+ :desc => "Show all information")
13
15
  def info(input)
14
- info =
15
- with_progress("Getting target information") do
16
- client.info
17
- end
18
-
19
- authorized = !!info["frameworks"]
20
-
21
- if input[:runtimes]
22
- raise NotAuthorized unless authorized
16
+ all = input[:all]
23
17
 
24
- runtimes = {}
25
- info["frameworks"].each do |_, f|
26
- f["runtimes"].each do |r|
27
- runtimes[r["name"]] = r
18
+ if all || input[:runtimes]
19
+ runtimes =
20
+ with_progress("Getting runtimes") do
21
+ client.runtimes
28
22
  end
29
- end
30
-
31
- runtimes = runtimes.values.sort_by { |x| x["name"] }
23
+ end
32
24
 
33
- if quiet?
34
- runtimes.each do |r|
35
- puts r["name"]
25
+ if all || input[:services]
26
+ services =
27
+ with_progress("Getting services") do
28
+ client.services
36
29
  end
37
- return
38
- end
39
-
40
- runtimes.each do |r|
41
- puts ""
42
- puts "#{c(r["name"], :name)}:"
43
- puts " version: #{b(r["version"])}"
44
- puts " description: #{b(r["description"])}"
45
- end
30
+ end
46
31
 
47
- return
32
+ if all || input[:frameworks]
33
+ frameworks =
34
+ with_progress("Getting frameworks") do
35
+ client.frameworks
36
+ end
48
37
  end
49
38
 
50
- if input[:services]
51
- raise NotAuthorized unless authorized
39
+ info = client.info
52
40
 
53
- services = client.system_services
41
+ showing_any = runtimes || services || frameworks
54
42
 
55
- if quiet?
56
- services.each do |name, _|
57
- puts name
58
- end
43
+ unless !all && showing_any
44
+ puts "" if showing_any
45
+ puts info[:description]
46
+ puts ""
47
+ puts "target: #{b(client.target)}"
48
+ puts " version: #{info[:version]}"
49
+ puts " support: #{info[:support]}"
59
50
 
60
- return
51
+ if user = client.current_user
52
+ puts ""
53
+ puts "user: #{b(user.email || user.id)}"
61
54
  end
55
+ end
62
56
 
63
- services.each do |name, meta|
57
+ if runtimes
58
+ unless quiet?
64
59
  puts ""
65
- puts "#{c(name, :name)}:"
66
- puts " versions: #{meta[:versions].join ", "}"
67
- puts " description: #{meta[:description]}"
68
- puts " type: #{meta[:type]}"
60
+ puts "runtimes:"
69
61
  end
70
62
 
71
- return
63
+ puts " #{c("none", :dim)}" if runtimes.empty? && !quiet?
64
+
65
+ runtimes.each.with_index do |r, i|
66
+ display_runtime(r)
67
+ puts "" unless quiet? || i + 1 == runtimes.size
68
+ end
72
69
  end
73
70
 
74
- if input[:frameworks]
75
- raise NotAuthorized unless authorized
71
+ if services
72
+ unless quiet?
73
+ puts ""
74
+ puts "services:"
75
+ end
76
76
 
77
- puts "" unless quiet?
77
+ puts " #{c("none", :dim)}" if services.empty? && !quiet?
78
78
 
79
- info["frameworks"].each do |name, _|
80
- puts name
79
+ services.each.with_index do |s, i|
80
+ display_service(s)
81
+ puts "" unless quiet? || i + 1 == services.size
81
82
  end
82
-
83
- return
84
83
  end
85
84
 
86
- puts ""
85
+ if frameworks
86
+ unless quiet?
87
+ puts ""
88
+ puts "frameworks:"
89
+ end
87
90
 
88
- puts info["description"]
89
- puts ""
90
- puts "target: #{b(client.target)}"
91
- puts " version: #{info["version"]}"
92
- puts " support: #{info["support"]}"
91
+ puts " #{c("none", :dim)}" if frameworks.empty? && !quiet?
93
92
 
94
- if info["user"]
95
- puts ""
96
- puts "user: #{b(info["user"])}"
97
- puts " usage:"
98
-
99
- limits = info["limits"]
100
- info["usage"].each do |k, v|
101
- m = limits[k]
102
- if k == "memory"
103
- puts " #{k}: #{usage(v * 1024 * 1024, m * 1024 * 1024)}"
104
- else
105
- puts " #{k}: #{b(v)} of #{b(m)} limit"
106
- end
93
+ frameworks.each.with_index do |f, i|
94
+ display_framework(f)
95
+ puts "" unless quiet? || i + 1 == frameworks.size
107
96
  end
108
97
  end
109
98
  end
@@ -113,72 +102,132 @@ module VMC
113
102
  group :start
114
103
  input :url, :argument => :optional,
115
104
  :desc => "Target URL to switch to"
105
+ input(:organization, :aliases => ["--org", "-o"],
106
+ :desc => "Organization") { |choices|
107
+ ask("Organization", :choices => choices)
108
+ }
109
+ input(:space, :alias => "-s", :desc => "Space") { |choices|
110
+ ask("Space", :choices => choices)
111
+ }
116
112
  def target(input)
117
- if !input.given?(:url)
113
+ if !input.given?(:url) && !input.given?(:organization) &&
114
+ !input.given?(:space)
118
115
  display_target
116
+ puts "Organization: #{c(client.current_organization.name, :name)}"
117
+ puts "Space: #{c(client.current_space.name, :name)}"
119
118
  return
120
119
  end
121
120
 
122
- target = sane_target_url(input[:url])
123
- display = c(target.sub(/https?:\/\//, ""), :name)
124
- with_progress("Setting target to #{display}") do
125
- unless force?
126
- # check that the target is valid
127
- CFoundry::Client.new(target).info
121
+ if input.given?(:url)
122
+ target = sane_target_url(input[:url])
123
+ display = c(target.sub(/https?:\/\//, ""), :name)
124
+ with_progress("Setting target to #{display}") do
125
+ set_target(target)
128
126
  end
129
127
 
130
- set_target(target)
128
+ return if force?
129
+ end
130
+
131
+ return unless v2?
132
+
133
+ unless client.logged_in?
134
+ invoke :login
135
+ @client = nil
131
136
  end
137
+
138
+ info = target_info
139
+
140
+ select_org_and_space(input, info)
141
+
142
+ save_target_info(info)
132
143
  end
133
144
 
134
145
 
135
146
  desc "List known targets."
136
147
  group :start, :hidden => true
137
148
  def targets(input)
138
- tokens.each do |target, auth|
149
+ targets.each do |target, _|
139
150
  puts target
151
+ # TODO: print org/space
140
152
  end
141
153
  end
142
154
 
143
155
 
156
+ def ask_prompt(type, label)
157
+ if type == "password"
158
+ options = { :echo => "*", :forget => true }
159
+ else
160
+ options = {}
161
+ end
162
+
163
+ ask(label, options)
164
+ end
165
+
166
+ def ask_prompts(credentials, prompts)
167
+ prompts.each do |name, meta|
168
+ type, label = meta
169
+ credentials[name] ||= ask_prompt(type, label)
170
+ end
171
+ end
172
+
144
173
  desc "Authenticate with the target"
145
174
  group :start
146
- input(:email, :argument => true, :desc => "Account email") {
147
- ask("Email")
148
- }
175
+ input :username, :alias => "--email", :argument => :optional,
176
+ :desc => "Account email"
149
177
  input :password, :desc => "Account password"
150
- # TODO: implement new authentication scheme
178
+ input(:organization, :aliases => ["--org", "-o"],
179
+ :desc => "Organization") { |choices|
180
+ ask("Organization", :choices => choices)
181
+ }
182
+ input(:space, :alias => "-s", :desc => "Space") { |choices|
183
+ ask("Space", :choices => choices)
184
+ }
151
185
  def login(input)
152
186
  unless quiet?
153
187
  display_target
154
188
  puts ""
155
189
  end
156
190
 
157
- email = input[:email]
158
- password = input[:password]
191
+ credentials =
192
+ { :username => input[:username],
193
+ :password => input[:password]
194
+ }
195
+
196
+ prompts = client.login_prompts
197
+
198
+ # ask username first
199
+ if prompts.key? :username
200
+ type, label = prompts.delete :username
201
+ credentials[:username] ||= ask_prompt(type, label)
202
+ end
203
+
204
+ info = target_info
159
205
 
160
206
  authenticated = false
161
207
  failed = false
162
208
  until authenticated
163
209
  unless force?
164
- if failed || !password
165
- password = ask("Password", :echo => "*", :forget => true)
166
- end
210
+ ask_prompts(credentials, prompts)
167
211
  end
168
212
 
169
213
  with_progress("Authenticating") do |s|
170
214
  begin
171
- save_token(client.login(email, password))
215
+ info[:token] = client.login(credentials)
172
216
  authenticated = true
173
217
  rescue CFoundry::Denied
174
218
  return if force?
175
219
 
176
220
  s.fail do
177
221
  failed = true
222
+ credentials.delete(:password)
178
223
  end
179
224
  end
180
225
  end
181
226
  end
227
+
228
+ select_org_and_space(input, info) if v2?
229
+
230
+ save_target_info(info)
182
231
  ensure
183
232
  exit_status 1 if not authenticated
184
233
  end
@@ -188,7 +237,7 @@ module VMC
188
237
  group :start
189
238
  def logout(input)
190
239
  with_progress("Logging out") do
191
- remove_token
240
+ remove_target_info
192
241
  end
193
242
  end
194
243
 
@@ -248,5 +297,97 @@ module VMC
248
297
  puts "Target: #{c(client.target, :name)}"
249
298
  end
250
299
  end
300
+
301
+ def display_runtime(r)
302
+ if quiet?
303
+ puts r.name
304
+ else
305
+ puts " #{c(r.name, :name)}:"
306
+
307
+ puts " description: #{b(r.description)}" if r.description
308
+
309
+ # TODO: probably won't have this in final version
310
+ apps = r.apps.collect { |a| c(a.name, :name) }
311
+ app_list = apps.empty? ? c("none", :dim) : apps.join(", ")
312
+ puts " apps: #{app_list}"
313
+ end
314
+ end
315
+
316
+ def display_service(s)
317
+ if quiet?
318
+ puts s.label
319
+ else
320
+ puts " #{c(s.label, :name)}:"
321
+ puts " description: #{s.description}"
322
+ puts " version: #{s.version}"
323
+ puts " provider: #{s.provider}"
324
+ end
325
+ end
326
+
327
+ def display_framework(f)
328
+ if quiet?
329
+ puts f.name
330
+ else
331
+ puts " #{c(f.name, :name)}:"
332
+ puts " description: #{b(f.description)}" if f.description
333
+
334
+ # TODO: probably won't show this in final version; just for show
335
+ apps = f.apps.collect { |a| c(a.name, :name) }
336
+ puts " apps: #{apps.empty? ? c("none", :dim) : apps.join(", ")}"
337
+ end
338
+ end
339
+
340
+ def org_valid?(id, user = client.current_user)
341
+ return false unless id
342
+ client.organization(id).users.include? user
343
+ rescue CFoundry::APIError
344
+ false
345
+ end
346
+
347
+ def space_valid?(id, user = client.current_user)
348
+ return false unless id
349
+ client.space(id).developers.include? user
350
+ rescue CFoundry::APIError
351
+ false
352
+ end
353
+
354
+ def select_org_and_space(input, info)
355
+ if input.given?(:organization) || !org_valid?(info[:organization])
356
+ orgs = client.current_user.organizations
357
+ fail "No organizations!" if orgs.empty?
358
+
359
+ if orgs.size == 1 && !input.given?(:organization)
360
+ org = orgs.first
361
+ else
362
+ org_name = input[:organization, orgs.collect(&:name).sort]
363
+ org = orgs.find { |o| o.name == org_name }
364
+ fail "Unknown organization '#{org_name}'" unless org
365
+ end
366
+
367
+ info[:organization] = org.id
368
+ else
369
+ org = client.current_organization
370
+ end
371
+
372
+ # switching org probably means switching space
373
+ if input.given?(:organization) || input.given?(:space) || \
374
+ !space_valid?(info[:space])
375
+ spaces = client.current_user.spaces.select do |s|
376
+ s.organization.id == org.id
377
+ end
378
+
379
+ fail "No spaces!" if spaces.empty?
380
+
381
+ if spaces.size == 1 && !input.given?(:space)
382
+ space = spaces.first
383
+ else
384
+ space_name = input[:space, spaces.collect(&:name).sort]
385
+ space = spaces.find { |s| s.name == space_name }
386
+ fail "Unknown space '#{space_name}'" unless space
387
+ end
388
+
389
+ info[:space] = space.id
390
+ end
391
+ end
251
392
  end
252
393
  end
@@ -40,7 +40,7 @@ module VMC
40
40
  option(:script)
41
41
  }
42
42
 
43
- option(:script, :alias => "-s", :type => :boolean,
43
+ option(:script, :type => :boolean,
44
44
  :desc => "Shortcut for --quiet and --force") {
45
45
  !$stdout.tty?
46
46
  }
@@ -183,7 +183,7 @@ module VMC
183
183
  @client = nil
184
184
  end
185
185
 
186
- def tokens
186
+ def targets_info
187
187
  new_toks = File.expand_path(VMC::TOKENS_FILE)
188
188
  old_toks = File.expand_path(VMC::OLD_TOKENS_FILE)
189
189
 
@@ -196,11 +196,17 @@ module VMC
196
196
  end
197
197
  end
198
198
 
199
- def client_token
200
- tokens[client_target]
199
+ def target_info
200
+ info = targets_info[client_target]
201
+
202
+ if info.is_a? String
203
+ { :token => info }
204
+ else
205
+ info || {}
206
+ end
201
207
  end
202
208
 
203
- def save_tokens(ts)
209
+ def save_targets(ts)
204
210
  ensure_config_dir
205
211
 
206
212
  File.open(File.expand_path(VMC::TOKENS_FILE), "w") do |io|
@@ -208,69 +214,59 @@ module VMC
208
214
  end
209
215
  end
210
216
 
211
- def save_token(token)
212
- ts = tokens
213
- ts[client_target] = token
214
- save_tokens(ts)
217
+ def save_target_info(info)
218
+ ts = targets_info
219
+ ts[client_target] = info
220
+ save_targets(ts)
215
221
  end
216
222
 
217
- def remove_token
218
- ts = tokens
223
+ def remove_target_info
224
+ ts = target_info
219
225
  ts.delete client_target
220
- save_tokens(ts)
226
+ save_targets(ts)
227
+ end
228
+
229
+ def v2?
230
+ client.is_a?(CFoundry::V2::Client)
221
231
  end
222
232
 
223
233
  def client
224
234
  return @client if @client
225
235
 
226
- @client = CFoundry::Client.new(client_target, client_token)
236
+ info = target_info
237
+
238
+ @client =
239
+ case info[:version]
240
+ when 2
241
+ CFoundry::V2::Client.new(client_target, info[:token])
242
+ when 1
243
+ CFoundry::V1::Client.new(client_target, info[:token])
244
+ else
245
+ CFoundry::Client.new(client_target, info[:token])
246
+ end
247
+
227
248
  @client.proxy = option(:proxy)
228
249
  @client.trace = option(:trace)
229
- @client
230
- end
231
-
232
- def usage(used, limit)
233
- "#{b(human_size(used))} of #{b(human_size(limit, 0))}"
234
- end
235
250
 
236
- def percentage(num, low = 50, mid = 70)
237
- color =
238
- if num <= low
239
- :good
240
- elsif num <= mid
241
- :warning
251
+ info[:version] ||=
252
+ case @client
253
+ when CFoundry::V2::Client
254
+ 2
242
255
  else
243
- :bad
256
+ 1
244
257
  end
245
258
 
246
- c(format("%.1f\%", num), color)
247
- end
248
-
249
- def megabytes(str)
250
- if str =~ /T$/i
251
- str.to_i * 1024 * 1024
252
- elsif str =~ /G$/i
253
- str.to_i * 1024
254
- elsif str =~ /M$/i
255
- str.to_i
256
- elsif str =~ /K$/i
257
- str.to_i / 1024
258
- else # assume megabytes
259
- str.to_i
259
+ if org = info[:organization]
260
+ @client.current_organization = @client.organization(org)
260
261
  end
261
- end
262
262
 
263
- def human_size(num, precision = 1)
264
- sizes = ["G", "M", "K"]
265
- sizes.each.with_index do |suf, i|
266
- pow = sizes.size - i
267
- unit = 1024 ** pow
268
- if num >= unit
269
- return format("%.#{precision}f%s", num / unit, suf)
270
- end
263
+ if space = info[:space]
264
+ @client.current_space = @client.space(space)
271
265
  end
272
266
 
273
- format("%.#{precision}fB", num)
267
+ save_target_info(info)
268
+
269
+ @client
274
270
  end
275
271
  end
276
272
  end
@@ -6,8 +6,7 @@ module VMC
6
6
  end
7
7
 
8
8
  def all_frameworks
9
- info = @client.info
10
- info["frameworks"] || {}
9
+ @client.frameworks
11
10
  end
12
11
 
13
12
  def find_top(entries)
@@ -30,16 +29,14 @@ module VMC
30
29
  end
31
30
 
32
31
  def frameworks
33
- info = @client.info
34
-
35
- matches = {}
36
- all_frameworks.each do |name, meta|
32
+ matches = []
33
+ all_frameworks.each do |framework|
37
34
  matched = false
38
35
 
39
36
  # e.g. standalone has no detection
40
- next if meta["detection"].nil?
37
+ next if framework.detection.nil?
41
38
 
42
- meta["detection"].first.each do |file, match|
39
+ framework.detection.first.each do |file, match|
43
40
  files =
44
41
  if File.file? @path
45
42
  if File.fnmatch(file, @path)
@@ -76,13 +73,11 @@ module VMC
76
73
  end
77
74
  end
78
75
 
79
- if matched
80
- matches[name] = meta
81
- end
76
+ matches << framework if matched
82
77
  end
83
78
 
84
79
  if matches.size == 1
85
- default = matches.keys.first
80
+ default = matches.first
86
81
  end
87
82
 
88
83
  [matches, default]
@@ -1,3 +1,3 @@
1
1
  module VMC
2
- VERSION = "0.4.0.beta.13"
2
+ VERSION = "0.4.0.beta.14"
3
3
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vmc
3
3
  version: !ruby/object:Gem::Version
4
- hash: 62196473
4
+ hash: 62196479
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 0
8
8
  - 4
9
9
  - 0
10
10
  - beta
11
- - 13
12
- version: 0.4.0.beta.13
11
+ - 14
12
+ version: 0.4.0.beta.14
13
13
  platform: ruby
14
14
  authors:
15
15
  - VMware
@@ -17,7 +17,7 @@ autorequire:
17
17
  bindir: bin
18
18
  cert_chain: []
19
19
 
20
- date: 2012-07-03 00:00:00 Z
20
+ date: 2012-07-13 00:00:00 Z
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
23
  name: json_pure
@@ -252,9 +252,9 @@ dependencies:
252
252
  hash: 19
253
253
  segments:
254
254
  - 0
255
- - 2
256
- - 2
257
- version: 0.2.2
255
+ - 3
256
+ - 0
257
+ version: 0.3.0
258
258
  type: :runtime
259
259
  version_requirements: *id014
260
260
  - !ruby/object:Gem::Dependency