dew 0.1.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.
Files changed (62) hide show
  1. data/LICENSE +22 -0
  2. data/README.md +38 -0
  3. data/Rakefile +26 -0
  4. data/bin/dew +87 -0
  5. data/config/cucumber.yaml +4 -0
  6. data/features/create-ami.feature +16 -0
  7. data/features/create-environments.feature +46 -0
  8. data/features/deploy-puge.feature +16 -0
  9. data/features/step_definitions/aws-steps.rb +101 -0
  10. data/features/step_definitions/deploy-puge-steps.rb +27 -0
  11. data/features/support/env.rb +38 -0
  12. data/features/support/hooks.rb +10 -0
  13. data/lib/dew.rb +7 -0
  14. data/lib/dew/aws_resources.yaml +122 -0
  15. data/lib/dew/base_command.rb +24 -0
  16. data/lib/dew/cloud.rb +79 -0
  17. data/lib/dew/commands.rb +6 -0
  18. data/lib/dew/commands/ami.rb +67 -0
  19. data/lib/dew/commands/console.rb +17 -0
  20. data/lib/dew/commands/console/irb_override.rb +24 -0
  21. data/lib/dew/commands/deploy.rb +114 -0
  22. data/lib/dew/commands/deploy/templates/apache.conf.erb +28 -0
  23. data/lib/dew/commands/deploy/templates/known_hosts +2 -0
  24. data/lib/dew/commands/deploy/templates/rvmrc +2 -0
  25. data/lib/dew/commands/environments.rb +110 -0
  26. data/lib/dew/commands/tidy.rb +35 -0
  27. data/lib/dew/controllers.rb +3 -0
  28. data/lib/dew/controllers/amis_controller.rb +82 -0
  29. data/lib/dew/controllers/deploy_controller.rb +10 -0
  30. data/lib/dew/controllers/environments_controller.rb +48 -0
  31. data/lib/dew/models.rb +7 -0
  32. data/lib/dew/models/account.rb +30 -0
  33. data/lib/dew/models/database.rb +32 -0
  34. data/lib/dew/models/deploy.rb +2 -0
  35. data/lib/dew/models/deploy/puge.rb +61 -0
  36. data/lib/dew/models/deploy/run.rb +19 -0
  37. data/lib/dew/models/environment.rb +199 -0
  38. data/lib/dew/models/fog_model.rb +23 -0
  39. data/lib/dew/models/profile.rb +60 -0
  40. data/lib/dew/models/server.rb +134 -0
  41. data/lib/dew/password.rb +7 -0
  42. data/lib/dew/tasks/spec.rake +14 -0
  43. data/lib/dew/validations.rb +8 -0
  44. data/lib/dew/version.rb +3 -0
  45. data/lib/dew/view.rb +39 -0
  46. data/lib/tasks/spec.rake +14 -0
  47. data/spec/dew/cloud_spec.rb +90 -0
  48. data/spec/dew/controllers/amis_controller_spec.rb +137 -0
  49. data/spec/dew/controllers/deploy_controller_spec.rb +38 -0
  50. data/spec/dew/controllers/environments_controller_spec.rb +133 -0
  51. data/spec/dew/models/account_spec.rb +47 -0
  52. data/spec/dew/models/database_spec.rb +58 -0
  53. data/spec/dew/models/deploy/puge_spec.rb +72 -0
  54. data/spec/dew/models/deploy/run_spec.rb +38 -0
  55. data/spec/dew/models/environment_spec.rb +374 -0
  56. data/spec/dew/models/fog_model_spec.rb +24 -0
  57. data/spec/dew/models/profile_spec.rb +85 -0
  58. data/spec/dew/models/server_spec.rb +190 -0
  59. data/spec/dew/password_spec.rb +11 -0
  60. data/spec/dew/spec_helper.rb +22 -0
  61. data/spec/dew/view_spec.rb +38 -0
  62. metadata +284 -0
@@ -0,0 +1,24 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
2
+
3
+ describe FogModel do
4
+ let (:fog_object) { double('Fog Object', :id => 'i-12345') }
5
+
6
+ before :each do
7
+ @model = FogModel.new(fog_object)
8
+ end
9
+
10
+ it { @model.id.should == fog_object.id }
11
+
12
+ describe :wait_until_ready do
13
+ it "should call Fog's wait_for method to check that the object is ready" do
14
+ fog_object.should_receive(:wait_for)
15
+ @model.wait_until_ready
16
+ end
17
+ end
18
+
19
+ it "should pass unrecognized methods on to its child object" do
20
+ fog_object.should_receive(:wibble).with('hello').and_return('goodbye')
21
+ @model.wibble('hello').should == 'goodbye'
22
+ end
23
+ end
24
+
@@ -0,0 +1,85 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
2
+
3
+ describe Profile do
4
+
5
+ it "should look for profile file in the profiles dir" do
6
+ File.should_receive(:read).with("#{ENV['HOME']}/.dew/profiles/puge.yaml").and_return("---")
7
+ Profile.read('puge')
8
+ end
9
+
10
+ describe "parsing yaml" do
11
+
12
+ # TODO: This can be refactored to use subject to reduce lines of code.
13
+
14
+ let (:yaml) { "blank: blank" }
15
+
16
+ before :each do
17
+ File.stub(:read).and_return(yaml)
18
+ Cloud.stub(:region => 'ap-southeast-1')
19
+ Cloud.stub_chain(:compute, :flavors, :detect => double(:flavor, :ram => 1.7, :cores => 5, :disk => 350, :bits => 32 ))
20
+ end
21
+
22
+ subject { Profile.read('development') }
23
+
24
+ describe "with an instances section" do
25
+ let (:yaml) {
26
+ "
27
+ instances:
28
+ amis:
29
+ ap-southeast-1: ami-ccf405a5
30
+ size: c1.medium
31
+ count: 2
32
+ security-groups:
33
+ - non_default
34
+ keypair: id_revo
35
+ "
36
+ }
37
+
38
+ it { subject.ami.should == 'ami-ccf405a5' }
39
+ it { subject.count.should == 2 }
40
+ it { subject.size.should == 'c1.medium' }
41
+ it { subject.security_groups.should == %w{non_default} }
42
+ it { subject.keypair.should == 'id_revo' }
43
+
44
+ it "should have a to_s" do
45
+ subject.to_s.should == <<EOF
46
+ +-----------------+----------------------------------------------------------------------------------------------------+
47
+ | 2 instances | "c1.medium" (1.7 GB memory, 5 ECUs processor, 350 GB storage, 32-bit platform, ?? I/O performance) |
48
+ | disk image | "ami-ccf405a5" |
49
+ | security groups | ["non_default"] |
50
+ | keypair | "id_revo" |
51
+ +-----------------+----------------------------------------------------------------------------------------------------+
52
+ EOF
53
+ end
54
+ end
55
+
56
+ describe "without an elb or RDS section" do
57
+ it { subject.has_elb?.should be_false }
58
+ it { subject.has_rds?.should be_false }
59
+ end
60
+
61
+ describe "with an elb section" do
62
+ let (:yaml) {
63
+ "
64
+ elb:
65
+ listener_ports:
66
+ - 80
67
+ - 443
68
+ "
69
+ }
70
+ it { subject.has_elb?.should be_true }
71
+ it { subject.elb_listener_ports.should == [80, 443] }
72
+ end
73
+
74
+ describe "with an RDS section" do
75
+ let (:yaml) {
76
+ "
77
+ rds:
78
+ size: db.m1.small
79
+ "
80
+ }
81
+ it { subject.has_rds?.should be_true }
82
+ it { subject.rds_size.should == 'db.m1.small' }
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,190 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '../spec_helper'))
2
+
3
+ describe Server do
4
+
5
+ let (:compute) { double('Compute', :servers => double('ComputeServers'), :images => double('ComputeImages'), :tags => double('ComputeTags')) }
6
+ let (:id) { 'i-12345' }
7
+ let (:endpoint) { '10.4.5.6' }
8
+ let (:key_name) { 'mykey'}
9
+ let (:fog_server) { double('FogServer', :id => id, :public_ip_address => endpoint, :key_name => key_name, :state => 'running', :tags => { 'Creator' => 'foo'} )}
10
+
11
+ before :each do
12
+ compute.servers.stub(:create => fog_server)
13
+ Cloud.stub(:compute => compute)
14
+ end
15
+
16
+ describe ".create!" do
17
+ it "should ask Fog to create a new server with the provided AMI, size and keypair" do
18
+ compute.servers.should_receive(:create).with(:image_id => 'ami', :flavor_id => 'size', :key_name => key_name, :groups => %(non_default))
19
+ Server.create!('ami', 'size', key_name, %(non_default))
20
+ end
21
+
22
+ it "should return a new server object with an ID" do
23
+ server = Server.create!('ami', 'size', key_name, %(non_default))
24
+ server.id.should == id
25
+ end
26
+ end
27
+
28
+ describe ".find" do
29
+ it "should return an instance for each server return from fog matching our tag" do
30
+ compute.servers.should_receive(:all).with('tag:Environment' => 'hello').and_return([fog_server])
31
+ Server.should_receive(:new).with(fog_server).and_return('server')
32
+ Server.find('Environment', 'hello').should == ['server']
33
+ end
34
+
35
+ it "should filter out servers that are not running or pending" do
36
+ terminated_fog_server = double('Terminated Fog Server', :state => 'terminated')
37
+ Server.should_receive(:new).with(fog_server).and_return('server')
38
+ compute.servers.stub(:all => [fog_server, terminated_fog_server])
39
+ Server.find('Environment', 'hello').should == ['server']
40
+ end
41
+ end
42
+
43
+ context "with an already created server" do
44
+ let (:ssh) { double('SSH') }
45
+
46
+ before :each do
47
+ @server = Server.create!('ami', 'size', key_name, %(non_default))
48
+ Gofer::Host.stub(:new => ssh)
49
+ Cloud.stub(:keyfile_path => '')
50
+ File.stub(:read => nil)
51
+ end
52
+
53
+ describe :username do
54
+ it "should always be 'ubuntu'" do
55
+ @server.username.should == 'ubuntu'
56
+ end
57
+ end
58
+
59
+ describe :creator do
60
+ it "should return the creator from the fog_object's tags" do
61
+ @server.creator.should == 'foo'
62
+ end
63
+ end
64
+
65
+ describe :add_tag do
66
+ it "should ask our compute handler to tag an instance with each key value pair provided" do
67
+ compute.tags.should_receive(:create).with(:resource_id => id, :key => 'A', :value => 'b')
68
+ @server.add_tag('A', 'b')
69
+ end
70
+ end
71
+
72
+ describe :credentials do
73
+ context "server has no key" do
74
+ let(:key_name) { nil }
75
+
76
+ it { @server.credentials.should be_false }
77
+ end
78
+
79
+ context "server has a key" do
80
+ before do
81
+ @path = '/key/path'
82
+ Cloud.should_receive(:keyfile_path).with(key_name).and_return(@path)
83
+ end
84
+
85
+ context "key file exists" do
86
+ let(:file_stat) { double(:stat, :mode => 600, :uid => Process.euid) }
87
+ before do
88
+ File.should_receive(:stat).with(@path).and_return(file_stat)
89
+ File.should_receive(:chmod).with(0600, @path).and_return(true)
90
+ end
91
+
92
+ it { @server.credentials.should == "-i /key/path -o StrictHostKeyChecking=no ubuntu@10.4.5.6" }
93
+ end
94
+
95
+ context "key file does not exist" do
96
+ let(:file_stat) { double(:stat, :mode => 600, :uid => Process.euid) }
97
+ before do
98
+ File.should_receive(:stat).with(@path).and_raise(Errno::ENOENT)
99
+ end
100
+
101
+ it { lambda { @server.credentials }.should raise_error /Can't find keyfile/ }
102
+ end
103
+ end
104
+ end
105
+
106
+ it "should delegate some methods to our fog object" do
107
+ %w{availability_zone public_ip_address}.each do |method_name|
108
+ fog_server.should_receive(method_name).with('args').and_return('hello')
109
+ @server.send(method_name, 'args').should == 'hello'
110
+ end
111
+ end
112
+
113
+ # TODO: AMI should be refactored out in to its own class.
114
+ describe :create_ami do
115
+ let (:ami_name) { 'my-new-ami' }
116
+ let (:ami) { double('AMI', :id => 'ami-12345', :wait_for => nil)}
117
+ let (:ami_create_response) {double('response', :body => {'imageId' => ami.id})}
118
+
119
+ before :each do
120
+ compute.stub(:create_image => ami_create_response)
121
+ compute.images.stub(:get => ami)
122
+ Account.stub(:user_ids => [])
123
+ end
124
+
125
+ after :each do
126
+ @server.create_ami ami_name
127
+ end
128
+
129
+ it "should create an AMI from the server image" do
130
+ compute.should_receive(:create_image).with(@server.id, ami_name, //).and_return(ami_create_response)
131
+ compute.images.should_receive(:get).with(ami.id).and_return(ami)
132
+ end
133
+
134
+ it "should wait for the AMI to become ready" do
135
+ ami.should_receive(:wait_for)
136
+ end
137
+
138
+ it "should share the AMI with the other known accounts" do
139
+ Account.should_receive(:user_ids).and_return(['11', '22'])
140
+ compute.should_receive(:modify_image_attributes).with(ami.id, 'launchPermission', 'add', 'UserId' => '11')
141
+ compute.should_receive(:modify_image_attributes).with(ami.id, 'launchPermission', 'add', 'UserId' => '22')
142
+ end
143
+
144
+ end
145
+
146
+ describe :ssh do
147
+ it "should open a new Gofer::Host connection using the hostname, default username and key data" do
148
+ Cloud.should_receive(:keyfile_path).with(key_name).and_return('/key/path')
149
+ File.should_receive(:read).with('/key/path').and_return('key data')
150
+ Gofer::Host.should_receive(:new).with(endpoint, 'ubuntu', hash_including(:key_data => ['key data'])).and_return 'ssh'
151
+ @server.ssh.should == 'ssh'
152
+ end
153
+ end
154
+
155
+ describe :configure_for_database do
156
+ it "should open up an SSH connection and populate /etc/environment with database credentials" do
157
+ database = double('Database')
158
+ database.should_receive(:db_environment_file).with('password').and_return('environment file contents')
159
+ ssh.should_receive(:write).with('environment file contents', '/tmp/envfile')
160
+ ssh.should_receive(:run).with('sudo mv /tmp/envfile /etc/environment')
161
+ @server.configure_for_database database, 'password'
162
+ end
163
+ end
164
+
165
+ describe :wait_until_ready do
166
+ let (:gofer) { double('Gofer::Host') }
167
+
168
+ before :each do
169
+ fog_server.stub(:wait_for => nil)
170
+ Gofer::Host.stub(:new).and_return(gofer)
171
+ end
172
+
173
+ context "with SSH responding correctly" do
174
+ it "should return successfully" do
175
+ gofer.should_receive(:run)
176
+ @server.wait_until_ready
177
+ end
178
+ end
179
+
180
+ context "with SSH timing out" do
181
+ it "should return the underlying error" do
182
+ # Use a very low timeout to avoid the test taking forever.
183
+ gofer.should_receive(:run).at_least(1).and_raise Timeout::Error
184
+ lambda {@server.wait_until_ready(1)}.should raise_error /SSH Timeout/
185
+ end
186
+ end
187
+
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe Password do
4
+
5
+ describe :random do
6
+ it "should return a random string of characters each time it is called" do
7
+ Password.random.should_not == Password.random
8
+ end
9
+ end
10
+ end
11
+
@@ -0,0 +1,22 @@
1
+
2
+ # From https://github.com/colszowka/simplecov#readme
3
+ if ENV['RSPEC_COVERED']
4
+ require 'simplecov'
5
+ SimpleCov.start 'rails' do
6
+ # bug: changing the coverage_dir here breaks coverage recording.
7
+ add_filter "/commands/"
8
+ add_filter "/base_command.rb"
9
+
10
+ at_exit do
11
+ SimpleCov.result.format!
12
+ if SimpleCov.result.covered_percent < 100
13
+ $stderr.puts "Coverage not 100%, build failed."
14
+ exit 1
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ #require File.expand_path(File.join(File.dirname(__FILE__), '..', 'env'))
21
+ require 'dew'
22
+ Inform.level = :error
@@ -0,0 +1,38 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
2
+
3
+ describe String do
4
+ describe :indent do
5
+ it { "Hi there\nHow are you?\n".indent(2).should == " Hi there\n How are you?\n" }
6
+ it { " Hi there\n How are you?\n".indent(-2).should == "Hi there\nHow are you?\n" }
7
+ end
8
+ end
9
+
10
+ describe View do
11
+ subject {
12
+ View.new('Test', [double(:id => 1, :name => 'one'), double(:id => 2, :name => 'two')], [:id, :name]) }
13
+
14
+ describe :index do
15
+ it { subject.index.should == <<EOF
16
+ Test:
17
+ +----+-------+
18
+ | id | name |
19
+ +----+-------+
20
+ | 1 | "one" |
21
+ | 2 | "two" |
22
+ +----+-------+
23
+ EOF
24
+ }
25
+ end
26
+
27
+ describe :show do
28
+ it {
29
+ subject.show(0).should == <<EOF
30
+ Test:
31
+ +------+-------+
32
+ | id | 1 |
33
+ | name | "one" |
34
+ +------+-------+
35
+ EOF
36
+ }
37
+ end
38
+ end
metadata ADDED
@@ -0,0 +1,284 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dew
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.1.0
6
+ platform: ruby
7
+ authors:
8
+ - PlayUp Devops
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-17 00:00:00 +10:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: inform
18
+ prerelease: false
19
+ requirement: &id001 !ruby/object:Gem::Requirement
20
+ none: false
21
+ requirements:
22
+ - - ~>
23
+ - !ruby/object:Gem::Version
24
+ version: 0.0.1
25
+ type: :runtime
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: clamp
29
+ prerelease: false
30
+ requirement: &id002 !ruby/object:Gem::Requirement
31
+ none: false
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 0.2.0
36
+ type: :runtime
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: fog
40
+ prerelease: false
41
+ requirement: &id003 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 0.8.2
47
+ type: :runtime
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: gofer
51
+ prerelease: false
52
+ requirement: &id004 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ version: 0.2.5
58
+ type: :runtime
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: highline
62
+ prerelease: false
63
+ requirement: &id005 !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 1.6.2
69
+ type: :runtime
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: terminal-table
73
+ prerelease: false
74
+ requirement: &id006 !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ~>
78
+ - !ruby/object:Gem::Version
79
+ version: 1.4.2
80
+ type: :runtime
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: nokogiri
84
+ prerelease: false
85
+ requirement: &id007 !ruby/object:Gem::Requirement
86
+ none: false
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ type: :runtime
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
94
+ name: rake
95
+ prerelease: false
96
+ requirement: &id008 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 0.8.7
102
+ type: :development
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
105
+ name: rspec
106
+ prerelease: false
107
+ requirement: &id009 !ruby/object:Gem::Requirement
108
+ none: false
109
+ requirements:
110
+ - - ~>
111
+ - !ruby/object:Gem::Version
112
+ version: 2.6.0
113
+ type: :development
114
+ version_requirements: *id009
115
+ - !ruby/object:Gem::Dependency
116
+ name: cucumber
117
+ prerelease: false
118
+ requirement: &id010 !ruby/object:Gem::Requirement
119
+ none: false
120
+ requirements:
121
+ - - ~>
122
+ - !ruby/object:Gem::Version
123
+ version: 0.10.3
124
+ type: :development
125
+ version_requirements: *id010
126
+ - !ruby/object:Gem::Dependency
127
+ name: simplecov
128
+ prerelease: false
129
+ requirement: &id011 !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ~>
133
+ - !ruby/object:Gem::Version
134
+ version: 0.4.0
135
+ type: :development
136
+ version_requirements: *id011
137
+ - !ruby/object:Gem::Dependency
138
+ name: flay
139
+ prerelease: false
140
+ requirement: &id012 !ruby/object:Gem::Requirement
141
+ none: false
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: 1.4.2
146
+ type: :development
147
+ version_requirements: *id012
148
+ - !ruby/object:Gem::Dependency
149
+ name: geminabox
150
+ prerelease: false
151
+ requirement: &id013 !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: "0"
157
+ type: :development
158
+ version_requirements: *id013
159
+ description: |
160
+ Dew is a layer between fog and the ground
161
+
162
+ email:
163
+ - devops@playup.com
164
+ executables:
165
+ - dew
166
+ extensions: []
167
+
168
+ extra_rdoc_files: []
169
+
170
+ files:
171
+ - lib/dew/commands.rb
172
+ - lib/dew/controllers/deploy_controller.rb
173
+ - lib/dew/controllers/environments_controller.rb
174
+ - lib/dew/controllers/amis_controller.rb
175
+ - lib/dew/base_command.rb
176
+ - lib/dew/models/deploy/puge.rb
177
+ - lib/dew/models/deploy/run.rb
178
+ - lib/dew/models/deploy.rb
179
+ - lib/dew/models/server.rb
180
+ - lib/dew/models/profile.rb
181
+ - lib/dew/models/environment.rb
182
+ - lib/dew/models/account.rb
183
+ - lib/dew/models/database.rb
184
+ - lib/dew/models/fog_model.rb
185
+ - lib/dew/password.rb
186
+ - lib/dew/controllers.rb
187
+ - lib/dew/commands/ami.rb
188
+ - lib/dew/commands/deploy/templates/known_hosts
189
+ - lib/dew/commands/deploy/templates/rvmrc
190
+ - lib/dew/commands/deploy/templates/apache.conf.erb
191
+ - lib/dew/commands/deploy.rb
192
+ - lib/dew/commands/environments.rb
193
+ - lib/dew/commands/console.rb
194
+ - lib/dew/commands/tidy.rb
195
+ - lib/dew/commands/console/irb_override.rb
196
+ - lib/dew/tasks/spec.rake
197
+ - lib/dew/view.rb
198
+ - lib/dew/models.rb
199
+ - lib/dew/aws_resources.yaml
200
+ - lib/dew/version.rb
201
+ - lib/dew/validations.rb
202
+ - lib/dew/cloud.rb
203
+ - lib/tasks/spec.rake
204
+ - lib/dew.rb
205
+ - README.md
206
+ - LICENSE
207
+ - Rakefile
208
+ - spec/dew/controllers/deploy_controller_spec.rb
209
+ - spec/dew/controllers/amis_controller_spec.rb
210
+ - spec/dew/controllers/environments_controller_spec.rb
211
+ - spec/dew/models/profile_spec.rb
212
+ - spec/dew/models/deploy/puge_spec.rb
213
+ - spec/dew/models/deploy/run_spec.rb
214
+ - spec/dew/models/environment_spec.rb
215
+ - spec/dew/models/fog_model_spec.rb
216
+ - spec/dew/models/account_spec.rb
217
+ - spec/dew/models/server_spec.rb
218
+ - spec/dew/models/database_spec.rb
219
+ - spec/dew/password_spec.rb
220
+ - spec/dew/cloud_spec.rb
221
+ - spec/dew/spec_helper.rb
222
+ - spec/dew/view_spec.rb
223
+ - features/support/hooks.rb
224
+ - features/support/env.rb
225
+ - features/deploy-puge.feature
226
+ - features/step_definitions/deploy-puge-steps.rb
227
+ - features/step_definitions/aws-steps.rb
228
+ - features/create-ami.feature
229
+ - features/create-environments.feature
230
+ - config/cucumber.yaml
231
+ - bin/dew
232
+ has_rdoc: true
233
+ homepage: http://github.com/playup/dew
234
+ licenses: []
235
+
236
+ post_install_message:
237
+ rdoc_options: []
238
+
239
+ require_paths:
240
+ - lib
241
+ required_ruby_version: !ruby/object:Gem::Requirement
242
+ none: false
243
+ requirements:
244
+ - - ">="
245
+ - !ruby/object:Gem::Version
246
+ version: "0"
247
+ required_rubygems_version: !ruby/object:Gem::Requirement
248
+ none: false
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: "0"
253
+ requirements: []
254
+
255
+ rubyforge_project:
256
+ rubygems_version: 1.6.2
257
+ signing_key:
258
+ specification_version: 3
259
+ summary: Uses fog to access the cloud
260
+ test_files:
261
+ - Rakefile
262
+ - spec/dew/controllers/deploy_controller_spec.rb
263
+ - spec/dew/controllers/amis_controller_spec.rb
264
+ - spec/dew/controllers/environments_controller_spec.rb
265
+ - spec/dew/models/profile_spec.rb
266
+ - spec/dew/models/deploy/puge_spec.rb
267
+ - spec/dew/models/deploy/run_spec.rb
268
+ - spec/dew/models/environment_spec.rb
269
+ - spec/dew/models/fog_model_spec.rb
270
+ - spec/dew/models/account_spec.rb
271
+ - spec/dew/models/server_spec.rb
272
+ - spec/dew/models/database_spec.rb
273
+ - spec/dew/password_spec.rb
274
+ - spec/dew/cloud_spec.rb
275
+ - spec/dew/spec_helper.rb
276
+ - spec/dew/view_spec.rb
277
+ - features/support/hooks.rb
278
+ - features/support/env.rb
279
+ - features/deploy-puge.feature
280
+ - features/step_definitions/deploy-puge-steps.rb
281
+ - features/step_definitions/aws-steps.rb
282
+ - features/create-ami.feature
283
+ - features/create-environments.feature
284
+ - config/cucumber.yaml