engineyard-cloud-client 0.1.4 → 1.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.
@@ -3,7 +3,6 @@ module EY
3
3
  end
4
4
  end
5
5
 
6
- require 'engineyard-cloud-client/ruby_ext'
7
6
  require 'engineyard-cloud-client/model_registry'
8
7
  require 'engineyard-cloud-client/models'
9
8
  require 'engineyard-cloud-client/rest_client_ext'
@@ -1,4 +1,3 @@
1
- require 'launchy'
2
1
  require 'engineyard-cloud-client/models'
3
2
  require 'engineyard-cloud-client/errors'
4
3
 
@@ -64,7 +63,7 @@ module EY
64
63
  app.repository_uri
65
64
  end
66
65
 
67
- def to_hierarchy_str
66
+ def hierarchy_name
68
67
  [account_name, app_name, environment_name].join('/')
69
68
  end
70
69
 
@@ -76,10 +75,6 @@ module EY
76
75
  Deployment.from_hash(api, attrs.merge(:app_environment => self))
77
76
  end
78
77
 
79
- def short_environment_name
80
- environment.name.gsub(/^#{Regexp.quote(app.name)}_/, '')
81
- end
82
-
83
78
  end
84
79
  end
85
80
  end
@@ -47,6 +47,7 @@ module EY
47
47
  alias deployed_by= user_name=
48
48
 
49
49
  def config
50
+ return {} unless deployed_by # not started yet so not all info is here
50
51
  @config ||= {'deployed_by' => deployed_by}.merge(extra_config)
51
52
  end
52
53
 
@@ -1,5 +1,6 @@
1
1
  require 'engineyard-cloud-client/models'
2
2
  require 'engineyard-cloud-client/errors'
3
+ require 'tempfile'
3
4
 
4
5
  module EY
5
6
  class CloudClient
@@ -137,30 +138,24 @@ module EY
137
138
  bridge
138
139
  end
139
140
 
140
- def rebuild
141
+ def update
141
142
  api.request("/environments/#{id}/update_instances", :method => :put)
143
+ true # raises on failure
142
144
  end
145
+ alias rebuild update
143
146
 
144
147
  def run_custom_recipes
145
148
  api.request("/environments/#{id}/run_custom_recipes", :method => :put)
149
+ true
146
150
  end
147
151
 
148
152
  def download_recipes
149
- if File.exist?('cookbooks')
150
- raise EY::CloudClient::Error, "Could not download, cookbooks already exists"
151
- end
152
-
153
- require 'tempfile'
154
153
  tmp = Tempfile.new("recipes")
155
- tmp.write(api.request("/environments/#{id}/recipes"))
154
+ data = api.request("/environments/#{id}/recipes")
155
+ tmp.write(data)
156
156
  tmp.flush
157
157
  tmp.close
158
-
159
- cmd = "tar xzf '#{tmp.path}' cookbooks"
160
-
161
- unless system(cmd)
162
- raise EY::CloudClient::Error, "Could not unarchive recipes.\nCommand `#{cmd}` exited with an error."
163
- end
158
+ tmp
164
159
  end
165
160
 
166
161
  def upload_recipes_at_path(recipes_path)
@@ -172,27 +167,14 @@ module EY
172
167
  end
173
168
  end
174
169
 
175
- def tar_and_upload_recipes_in_cookbooks_dir
176
- require 'tempfile'
177
- unless File.exist?("cookbooks")
178
- raise EY::CloudClient::Error, "Could not find chef recipes. Please run from the root of your recipes repo."
179
- end
180
-
181
- recipes_file = Tempfile.new("recipes")
182
- cmd = "tar czf '#{recipes_file.path}' cookbooks/"
183
-
184
- unless system(cmd)
185
- raise EY::CloudClient::Error, "Could not archive recipes.\nCommand `#{cmd}` exited with an error."
186
- end
187
-
188
- upload_recipes(recipes_file)
189
- end
190
-
170
+ # Expects a File object opened for binary reading.
171
+ # i.e. File.open(path, 'rb')
191
172
  def upload_recipes(file_to_upload)
192
173
  api.request("/environments/#{id}/recipes", {
193
174
  :method => :post,
194
175
  :params => {:file => file_to_upload}
195
176
  })
177
+ true
196
178
  end
197
179
 
198
180
  def shorten_name_for(app)
@@ -202,18 +184,18 @@ module EY
202
184
  private
203
185
 
204
186
  def request_instances
205
- instances_attrs = api.request("/environments/#{id}/instances")["instances"]
206
- load_instances(instances_attrs)
187
+ if instances_count > 0
188
+ instances_attrs = api.request("/environments/#{id}/instances")["instances"]
189
+ load_instances(instances_attrs)
190
+ else
191
+ []
192
+ end
207
193
  end
208
194
 
209
195
  def load_instances(instances_attrs)
210
196
  Instance.from_array(api, instances_attrs, 'environment' => self)
211
197
  end
212
198
 
213
- def no_migrate?(deploy_options)
214
- deploy_options.key?('migrate') && deploy_options['migrate'] == false
215
- end
216
-
217
199
  # attrs["cluster_configuration"]["cluster"] can be 'single', 'cluster', or 'custom'
218
200
  # attrs["cluster_configuration"]["ip"] can be
219
201
  # * 'host' (amazon public hostname)
@@ -34,6 +34,13 @@ class FakeAwsm < Sinatra::Base
34
34
  end
35
35
 
36
36
  before do
37
+ if env['PATH_INFO'] =~ %r#/api/v2#
38
+ user_agent = env['HTTP_USER_AGENT']
39
+ unless user_agent =~ %r#^EngineYardCloudClient/\d#
40
+ $stderr.puts 'No user agent header, expected EngineYardCloudClient/'
41
+ halt 400, 'No user agent header, expected EngineYardCloudClient/'
42
+ end
43
+ end
37
44
  content_type "application/json"
38
45
  token = request.env['HTTP_X_EY_CLOUD_TOKEN']
39
46
  if token
@@ -85,7 +92,6 @@ class FakeAwsm < Sinatra::Base
85
92
  end
86
93
 
87
94
  get "/api/v2/apps" do
88
- raise('No user agent header') unless env['HTTP_USER_AGENT'] =~ %r#^EngineYardCloudClient/#
89
95
  @apps = @user.accounts.apps
90
96
  render :rabl, :apps, :format => "json"
91
97
  end
@@ -115,7 +121,7 @@ class FakeAwsm < Sinatra::Base
115
121
  {
116
122
  "logs" => [
117
123
  {
118
- "id" => params['env_id'].to_i,
124
+ "id" => 'i-12345678',
119
125
  "role" => "app_master",
120
126
  "main" => "MAIN LOG OUTPUT",
121
127
  "custom" => "CUSTOM LOG OUTPUT"
@@ -168,28 +174,23 @@ class FakeAwsm < Sinatra::Base
168
174
  ""
169
175
  end
170
176
 
171
- get "/api/v2/apps/:app_id/environments/:environment_id/deployments/last" do
172
- {
173
- "deployment" => {
174
- "id" => 3,
175
- "ref" => "HEAD",
176
- "resolved_ref" => "HEAD",
177
- "commit" => 'a'*40,
178
- "user_name" => "User Name",
179
- "migrate_command" => "rake db:migrate --trace",
180
- "created_at" => Time.now.utc - 3600,
181
- "finished_at" => Time.now.utc - 3400,
182
- "successful" => true,
183
- }
184
- }.to_json
177
+ post "/api/v2/apps/:app_id/environments/:environment_id/deployments" do
178
+ app_env = @user.accounts.apps.get(params[:app_id]).app_environments.first(:environment_id => params[:environment_id])
179
+ @deployment = app_env.deployments.create(params[:deployment])
180
+ render :rabl, :deployment, :format => "json"
185
181
  end
186
182
 
187
- post "/api/v2/apps/:app_id/environments/:environment_id/deployments" do
188
- {"deployment" => params[:deployment].merge({"id" => 2, "commit" => 'a'*40, "resolved_ref" => "resolved-#{params[:deployment][:ref]}"})}.to_json
183
+ get "/api/v2/apps/:app_id/environments/:environment_id/deployments/last" do
184
+ app_env = @user.accounts.apps.get(params[:app_id]).app_environments.first(:environment_id => params[:environment_id])
185
+ @deployment = app_env.deployments.last
186
+ render :rabl, :deployment, :format => "json"
189
187
  end
190
188
 
191
189
  put "/api/v2/apps/:app_id/environments/:environment_id/deployments/:deployment_id/finished" do
192
- {"deployment" => params[:deployment].merge({"id" => 2, "finished_at" => Time.now})}.to_json
190
+ app_env = @user.accounts.apps.get(params[:app_id]).app_environments.first(:environment_id => params[:environment_id])
191
+ @deployment = app_env.deployments.get(params[:deployment_id])
192
+ @deployment.finished!(params[:deployment])
193
+ render :rabl, :deployment, :format => "json"
193
194
  end
194
195
 
195
196
  post "/api/v2/authenticate" do
@@ -0,0 +1,42 @@
1
+ require 'dm-core'
2
+
3
+ class Deployment
4
+ include DataMapper::Resource
5
+
6
+ property :id, Serial
7
+ property :created_at, DateTime
8
+ property :finished_at, DateTime
9
+ property :commit, String, :default => 'abcdef1234'*4
10
+ property :migrate, String
11
+ property :migrate_command, String
12
+ property :ref, String
13
+ property :successful, Boolean
14
+ property :output, Text
15
+
16
+ belongs_to :app_environment
17
+
18
+ def inspect
19
+ "#<Deployment app_environment:#{app_environment.inspect}>"
20
+ end
21
+
22
+ def user_name
23
+ app_environment.app.account.user.name
24
+ end
25
+
26
+ # normally a property, but we don't have the code to find this so just pretend
27
+ def resolved_ref
28
+ "resolved-#{ref}"
29
+ end
30
+
31
+ def finished?
32
+ finished_at != nil
33
+ end
34
+
35
+ def finished!(attrs)
36
+ return true if finished?
37
+ attrs = attrs.dup
38
+ attrs['finished_at'] ||= Time.now
39
+ update(attrs)
40
+ end
41
+
42
+ end
@@ -0,0 +1,4 @@
1
+ attributes :id, :name, :repository_uri, :app_type_id
2
+ child :account do
3
+ attributes :id, :name
4
+ end
@@ -0,0 +1,2 @@
1
+ object @deployment
2
+ attributes :id, :ref, :resolved_ref, :commit, :user_name, :migrate_command, :created_at, :finished_at, :successful
@@ -3,9 +3,8 @@ attributes :id, :ssh_username, :name, :instances_count, :app_server_stack_name,
3
3
  child :account do
4
4
  attributes :id, :name
5
5
  end
6
- child :apps do
7
- attributes :id, :name, :repository_uri, :app_type_id
8
- child :account do
9
- attributes :id, :name
6
+ node :apps do |m|
7
+ m.apps.map do |app|
8
+ partial('base_app', :object => app, :root => nil)
10
9
  end
11
10
  end
@@ -1,7 +1,7 @@
1
1
  # This file is maintained by a herd of rabid monkeys with Rakes.
2
2
  module EY
3
3
  class CloudClient
4
- VERSION = '0.1.4'
4
+ VERSION = '1.0.0'
5
5
  end
6
6
  end
7
7
  # Please be aware that the monkeys like tho throw poo sometimes.
@@ -9,7 +9,7 @@ describe EY::CloudClient::AppEnvironment do
9
9
  describe ".resolve" do
10
10
  it "finds an environment" do
11
11
  api = scenario_cloud_client "Multiple Ambiguous Accounts"
12
- result = EY::CloudClient::AppEnvironment.resolve(api, 'app_name' => 'rails232app', 'environment_name' => 'giblets', 'account_name' => 'main')
12
+ result = api.resolve_app_environments('app_name' => 'rails232app', 'environment_name' => 'giblets', 'account_name' => 'main')
13
13
  result.should be_one_match
14
14
  end
15
15
 
@@ -35,4 +35,20 @@ describe EY::CloudClient::AppEnvironment do
35
35
  end
36
36
  end
37
37
 
38
+ describe "model" do
39
+ before do
40
+ api = scenario_cloud_client "Multiple Ambiguous Accounts"
41
+ result = EY::CloudClient::AppEnvironment.resolve(api, 'app_name' => 'rails232app', 'environment_name' => 'giblets', 'account_name' => 'main')
42
+ result.should be_one_match
43
+ @app_env = result.matches.first
44
+ end
45
+
46
+ it "supplies methods to easily access names and attributes" do
47
+ @app_env.account_name.should == 'main'
48
+ @app_env.app_name.should == 'rails232app'
49
+ @app_env.environment_name.should == 'giblets'
50
+ @app_env.hierarchy_name.should == 'main/rails232app/giblets'
51
+ @app_env.repository_uri.should == 'user@git.host:path/to/repo.git'
52
+ end
53
+ end
38
54
  end
@@ -12,6 +12,12 @@ describe EY::CloudClient::App do
12
12
  apps = EY::CloudClient::App.all(api)
13
13
  apps.size.should == 1
14
14
  app = apps.first
15
+ app.name.should == 'rails232app'
16
+ end
17
+
18
+ it "includes environments in all apps" do
19
+ api = scenario_cloud_client "One App Many Envs"
20
+ app = api.apps.first
15
21
  app.environments.size.should == 2
16
22
  app.environments.map(&:name).should =~ %w[giblets bakon]
17
23
  end
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+
3
+ describe EY::CloudClient::AppEnvironment do
4
+ before(:each) do
5
+ FakeWeb.allow_net_connect = true
6
+ EY::CloudClient.endpoint = EY::CloudClient::Test::FakeAwsm.uri
7
+ end
8
+
9
+ describe "deploying" do
10
+ before do
11
+ @api = scenario_cloud_client "Multiple Ambiguous Accounts"
12
+ result = EY::CloudClient::AppEnvironment.resolve(@api, 'app_name' => 'rails232app', 'environment_name' => 'giblets', 'account_name' => 'main')
13
+ result.should be_one_match
14
+ @app_env = result.matches.first
15
+ end
16
+
17
+ it "creates a deployment" do
18
+ deployment = @app_env.new_deployment({
19
+ :ref => 'master',
20
+ :migrate => true,
21
+ :migrate_command => 'rake migrate',
22
+ :extra_config => {'extra' => 'config'},
23
+ })
24
+ deployment.commit.should be_nil
25
+ deployment.resolved_ref.should be_nil
26
+
27
+ deployment.start
28
+
29
+ deployment.config.should == {'deployed_by' => 'Multiple Ambiguous Accounts', 'extra' => 'config'}
30
+ deployment.commit.should_not be_nil
31
+ deployment.resolved_ref.should_not be_nil
32
+ deployment.out << "Test output"
33
+ deployment.out << "Test error"
34
+ deployment.successful = true
35
+ deployment.finished
36
+ deployment.should be_finished
37
+
38
+ found_dep = @app_env.last_deployment
39
+ found_dep.id.should == deployment.id
40
+ found_dep.should be_finished
41
+ end
42
+
43
+ it "returns nil when a not found deployment is requested" do
44
+ EY::CloudClient::Deployment.get(@api, @app_env, 0).should be_nil
45
+ end
46
+ end
47
+ end
@@ -12,13 +12,26 @@ describe EY::CloudClient::Environment do
12
12
  envs = EY::CloudClient::Environment.all(api)
13
13
  envs.size.should == 3
14
14
  envs.map(&:name).should =~ %w[giblets bakon beef]
15
+ envs.map(&:username).should =~ %w[turkey ham hamburger]
16
+ envs.map(&:account_name).uniq.should == ['main']
17
+ with_instances = envs.select {|env| env.instances_count > 0 }
18
+ with_instances.size.should == 1
19
+ with_instances.first.instances.map(&:amazon_id).should == ['i-ddbbdd92']
20
+ end
21
+
22
+ it "includes apps in environments" do
23
+ api = scenario_cloud_client "One App Many Envs"
24
+ envs = api.environments
25
+ envs.map do |env|
26
+ env.apps.first && env.apps.first.name
27
+ end.should == ['rails232app', 'rails232app', nil] # 2 envs with the same app, 1 without
15
28
  end
16
29
  end
17
30
 
18
31
  describe ".resolve" do
19
32
  it "finds an environment" do
20
33
  api = scenario_cloud_client "Multiple Ambiguous Accounts"
21
- result = EY::CloudClient::Environment.resolve(api, 'environment_name' => 'giblets', 'account_name' => 'main' )
34
+ result = api.resolve_environments('environment_name' => 'giblets', 'account_name' => 'main' )
22
35
  result.should be_one_match
23
36
  end
24
37
 
@@ -44,13 +57,65 @@ describe EY::CloudClient::Environment do
44
57
  end
45
58
  end
46
59
 
47
- describe "loading instances" do
48
- it "requests instances" do
60
+ context "with an environment" do
61
+ before do
49
62
  api = scenario_cloud_client "Linked App"
50
63
  result = EY::CloudClient::Environment.resolve(api, 'account_name' => 'main', 'app_name' => 'rails232app', 'environment_name' => 'giblets')
51
- env = result.matches.first
52
- env.bridge.role.should == 'app_master'
53
- env.instances.size.should == env.instances_count
64
+ @env = result.matches.first
65
+ end
66
+
67
+ it "requests instances when needed" do
68
+ @env.bridge.role.should == 'app_master'
69
+ @env.instances.size.should == @env.instances_count
70
+ end
71
+
72
+ it "doesn't request when instances_count is zero" do
73
+ api = scenario_cloud_client "Linked App Not Running"
74
+ result = EY::CloudClient::Environment.resolve(api, 'account_name' => 'main', 'app_name' => 'rails232app', 'environment_name' => 'giblets')
75
+ @env = result.matches.first
76
+ @env.instances_count.should == 0
77
+ @env.instances.should == []
78
+ end
79
+
80
+ it "selects deploy_to_instances" do
81
+ @env.deploy_to_instances.map(&:role).should =~ %w[app_master app util util]
82
+ end
83
+
84
+ it "updates the environment" do
85
+ @env.update.should be_true
86
+ end
87
+
88
+ it "runs custom recipes" do
89
+ @env.run_custom_recipes.should be_true
90
+ end
91
+
92
+ it "uploads recipes" do
93
+ res = @env.upload_recipes(Pathname.new('spec/support/fixture_recipes.tgz').expand_path.open('rb'))
94
+ res.should be_true
95
+ end
96
+
97
+ it "uploads recipes at path" do
98
+ res = @env.upload_recipes_at_path(Pathname.new('spec/support/fixture_recipes.tgz').expand_path.to_s)
99
+ res.should be_true
100
+ end
101
+
102
+ it "raises if uploads recipes path doesn't exist" do
103
+ path = Pathname.new('spec/support/nothing')
104
+ lambda {
105
+ @env.upload_recipes_at_path(path)
106
+ }.should raise_error(EY::CloudClient::Error, "Recipes file not found: #{path}")
107
+ end
108
+
109
+ it "downloads recipes" do
110
+ @env.download_recipes
111
+ end
112
+
113
+ it "returns logs" do
114
+ log = @env.logs.first
115
+ log.main.should == 'MAIN LOG OUTPUT'
116
+ log.custom.should == 'CUSTOM LOG OUTPUT'
117
+ log.role.should == 'app_master'
118
+ log.instance_name.should == "app_master i-12345678"
54
119
  end
55
120
  end
56
121
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: engineyard-cloud-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-18 00:00:00.000000000 Z
12
+ date: 2012-05-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rest-client
@@ -43,22 +43,6 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
- - !ruby/object:Gem::Dependency
47
- name: launchy
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - '='
52
- - !ruby/object:Gem::Version
53
- version: 2.0.5
54
- type: :runtime
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - '='
60
- - !ruby/object:Gem::Version
61
- version: 2.0.5
62
46
  - !ruby/object:Gem::Dependency
63
47
  name: rspec
64
48
  requirement: !ruby/object:Gem::Requirement
@@ -288,12 +272,11 @@ files:
288
272
  - lib/engineyard-cloud-client/models.rb
289
273
  - lib/engineyard-cloud-client/resolver_result.rb
290
274
  - lib/engineyard-cloud-client/rest_client_ext.rb
291
- - lib/engineyard-cloud-client/ruby_ext.rb
292
275
  - lib/engineyard-cloud-client/test/fake_awsm/config.ru
293
276
  - lib/engineyard-cloud-client/test/fake_awsm/models/account.rb
294
277
  - lib/engineyard-cloud-client/test/fake_awsm/models/app.rb
295
278
  - lib/engineyard-cloud-client/test/fake_awsm/models/app_environment.rb
296
- - lib/engineyard-cloud-client/test/fake_awsm/models/deployments.rb
279
+ - lib/engineyard-cloud-client/test/fake_awsm/models/deployment.rb
297
280
  - lib/engineyard-cloud-client/test/fake_awsm/models/environment.rb
298
281
  - lib/engineyard-cloud-client/test/fake_awsm/models/instance.rb
299
282
  - lib/engineyard-cloud-client/test/fake_awsm/models/user.rb
@@ -301,8 +284,10 @@ files:
301
284
  - lib/engineyard-cloud-client/test/fake_awsm/scenarios.rb
302
285
  - lib/engineyard-cloud-client/test/fake_awsm/views/accounts.rabl
303
286
  - lib/engineyard-cloud-client/test/fake_awsm/views/apps.rabl
287
+ - lib/engineyard-cloud-client/test/fake_awsm/views/base_app.rabl
304
288
  - lib/engineyard-cloud-client/test/fake_awsm/views/base_app_environment.rabl
305
289
  - lib/engineyard-cloud-client/test/fake_awsm/views/base_environment.rabl
290
+ - lib/engineyard-cloud-client/test/fake_awsm/views/deployment.rabl
306
291
  - lib/engineyard-cloud-client/test/fake_awsm/views/environments.rabl
307
292
  - lib/engineyard-cloud-client/test/fake_awsm/views/instances.rabl
308
293
  - lib/engineyard-cloud-client/test/fake_awsm/views/resolve_app_environments.rabl
@@ -320,6 +305,7 @@ files:
320
305
  - spec/engineyard-cloud-client/integration/account_spec.rb
321
306
  - spec/engineyard-cloud-client/integration/app_environment_spec.rb
322
307
  - spec/engineyard-cloud-client/integration/app_spec.rb
308
+ - spec/engineyard-cloud-client/integration/deployment_spec.rb
323
309
  - spec/engineyard-cloud-client/integration/environment_spec.rb
324
310
  - spec/engineyard-cloud-client/integration/user_spec.rb
325
311
  - spec/engineyard-cloud-client/models/api_struct_spec.rb
@@ -328,6 +314,7 @@ files:
328
314
  - spec/engineyard-cloud-client/models/instance_spec.rb
329
315
  - spec/engineyard-cloud-client/models/keypair_spec.rb
330
316
  - spec/spec_helper.rb
317
+ - spec/support/fixture_recipes.tgz
331
318
  - spec/support/helpers.rb
332
319
  - spec/support/matchers.rb
333
320
  homepage: http://github.com/engineyard/engineyard-cloud-client
@@ -344,7 +331,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
344
331
  version: '0'
345
332
  segments:
346
333
  - 0
347
- hash: 2106101747118900682
334
+ hash: 3506935384923941414
348
335
  required_rubygems_version: !ruby/object:Gem::Requirement
349
336
  none: false
350
337
  requirements:
@@ -353,7 +340,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
353
340
  version: '0'
354
341
  segments:
355
342
  - 0
356
- hash: 2106101747118900682
343
+ hash: 3506935384923941414
357
344
  requirements: []
358
345
  rubyforge_project:
359
346
  rubygems_version: 1.8.24
@@ -365,6 +352,7 @@ test_files:
365
352
  - spec/engineyard-cloud-client/integration/account_spec.rb
366
353
  - spec/engineyard-cloud-client/integration/app_environment_spec.rb
367
354
  - spec/engineyard-cloud-client/integration/app_spec.rb
355
+ - spec/engineyard-cloud-client/integration/deployment_spec.rb
368
356
  - spec/engineyard-cloud-client/integration/environment_spec.rb
369
357
  - spec/engineyard-cloud-client/integration/user_spec.rb
370
358
  - spec/engineyard-cloud-client/models/api_struct_spec.rb
@@ -373,5 +361,6 @@ test_files:
373
361
  - spec/engineyard-cloud-client/models/instance_spec.rb
374
362
  - spec/engineyard-cloud-client/models/keypair_spec.rb
375
363
  - spec/spec_helper.rb
364
+ - spec/support/fixture_recipes.tgz
376
365
  - spec/support/helpers.rb
377
366
  - spec/support/matchers.rb
@@ -1,9 +0,0 @@
1
- class Object
2
- unless respond_to?(:tap)
3
- # Ruby 1.9 has it, 1.8 doesn't
4
- def tap
5
- yield self
6
- self
7
- end
8
- end
9
- end
@@ -1,15 +0,0 @@
1
- require 'dm-core'
2
-
3
- class Deployment
4
- include DataMapper::Resource
5
-
6
- property :id, Serial
7
- property :app_environment_id, Integer
8
-
9
- belongs_to :app_environment
10
-
11
- def inspect
12
- "#<Deployment app_environment:#{app_environment.inspect}>"
13
- end
14
-
15
- end