vito 0.0.4 → 0.0.5

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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +11 -0
  3. data/README.md +32 -19
  4. data/Rakefile +5 -20
  5. data/bin/vito +1 -1
  6. data/lib/vito.rb +5 -1
  7. data/lib/vito/command_line/command.rb +21 -0
  8. data/lib/vito/command_line/document_flags.rb +30 -0
  9. data/lib/vito/command_line/options.rb +41 -0
  10. data/lib/vito/command_line/string.rb +35 -0
  11. data/lib/vito/commands/help.rb +62 -0
  12. data/lib/vito/commands/install.rb +17 -0
  13. data/lib/vito/core_ext/string.rb +33 -0
  14. data/lib/vito/dsl/installation.rb +5 -2
  15. data/lib/vito/dsl/server.rb +3 -3
  16. data/lib/vito/dsl_file.rb +11 -5
  17. data/lib/vito/operating_systems/ubuntu_10.rb +4 -0
  18. data/lib/vito/output.rb +3 -1
  19. data/lib/vito/recipe.rb +29 -4
  20. data/lib/vito/recipes/apache/install.rb +155 -0
  21. data/lib/vito/recipes/apache/service.rb +20 -0
  22. data/lib/vito/recipes/git/install.rb +39 -0
  23. data/lib/vito/recipes/passenger/install.rb +83 -0
  24. data/lib/vito/recipes/passenger/paths.rb +27 -0
  25. data/lib/vito/recipes/postgres/install.rb +106 -0
  26. data/lib/vito/recipes/rbenv/install.rb +54 -0
  27. data/lib/vito/recipes/ruby/install.rb +57 -0
  28. data/lib/vito/recipes/ruby/paths.rb +19 -0
  29. data/lib/vito/tasks/vagrant_bootstrap.rb +49 -0
  30. data/lib/vito/tests/vagrant_test_box.rb +44 -0
  31. data/lib/vito/utils/program_version.rb +2 -2
  32. data/lib/vito/version.rb +1 -1
  33. data/spec/acceptance/recipes/apache_acceptance_spec.rb +25 -0
  34. data/spec/acceptance/recipes/git_acceptance_spec.rb +11 -11
  35. data/spec/acceptance/recipes/postgres_acceptance_spec.rb +11 -11
  36. data/spec/acceptance/recipes/rbenv_acceptance_spec.rb +13 -13
  37. data/spec/acceptance/recipes/ruby_acceptance_spec.rb +15 -15
  38. data/spec/support/vagrant.rb +21 -16
  39. data/spec/vagrant_boxes/centos63/.gitkeep +0 -0
  40. data/{Vagrantfile → spec/vagrant_boxes/centos63/Vagrantfile} +5 -4
  41. data/spec/vagrant_boxes/ubuntu10/Vagrantfile +100 -0
  42. data/spec/vagrant_boxes/ubuntu12/Vagrantfile +100 -0
  43. data/spec/vito/command_line/command_spec.rb +20 -0
  44. data/spec/vito/command_line/options_spec.rb +50 -0
  45. data/spec/vito/command_line/string_spec.rb +32 -0
  46. data/spec/vito/commands/install_spec.rb +9 -0
  47. data/spec/vito/connection_spec.rb +2 -2
  48. data/spec/vito/core_ext/string_spec.rb +19 -0
  49. data/spec/vito/dsl/installation_spec.rb +2 -2
  50. data/spec/vito/dsl_file_spec.rb +56 -18
  51. data/spec/vito/output_spec.rb +2 -2
  52. data/spec/vito/recipe_spec.rb +53 -3
  53. data/spec/vito/recipes/apache/install_spec.rb +140 -0
  54. data/spec/vito/recipes/passenger/paths_spec.rb +18 -0
  55. data/spec/vito/recipes/ruby_spec.rb +5 -5
  56. data/spec/vito/tasks/vagrant_bootstrap_spec.rb +65 -0
  57. data/spec/vito/tests/vagrant_test_box_spec.rb +69 -0
  58. data/spec/vito/utils/program_version_spec.rb +4 -2
  59. data/templates/apache2/vito_site +12 -0
  60. data/vito.gemspec +1 -1
  61. data/vito.rb +7 -5
  62. metadata +53 -13
  63. data/lib/vito/recipes/git.rb +0 -37
  64. data/lib/vito/recipes/postgres.rb +0 -104
  65. data/lib/vito/recipes/rbenv.rb +0 -47
  66. data/lib/vito/recipes/ruby.rb +0 -43
  67. data/lib/vito/shell_initializer.rb +0 -21
  68. data/spec/vito/shell_initializer_spec.rb +0 -22
@@ -12,7 +12,7 @@ describe Vito::Connection do
12
12
  let(:command) { "echo" }
13
13
 
14
14
  its(:success?) { should == true }
15
- its(:result) { should == "Alex\n" }
15
+ its(:result) { should == "Alex" }
16
16
  end
17
17
 
18
18
  context "invalid command" do
@@ -20,7 +20,7 @@ describe Vito::Connection do
20
20
 
21
21
  it "raises error and logs its messages" do
22
22
  Vito::Log.should_receive(:raise).with("An error occurred. Here's the stacktrace:")
23
- Vito::Log.should_receive(:raise).with("sh: harrr: command not found\n")
23
+ Vito::Log.should_receive(:raise).with(/sh.*harrr.*not found\n/)
24
24
  Vito::Log.stub(:raise)
25
25
 
26
26
  expect{ subject }.to raise_error "Error."
@@ -0,0 +1,19 @@
1
+ require "vito/core_ext/string"
2
+
3
+ describe String do
4
+ describe "#camelize" do
5
+ specify "ruby_on_rails returns RubyOnRails" do
6
+ "ruby_on_rails".camelize.should == "RubyOnRails"
7
+ end
8
+ end
9
+
10
+ describe "#constantize" do
11
+ specify "'String'.constantize returns String" do
12
+ "String".constantize.should == String
13
+ end
14
+
15
+ specify "'Heya'.constantize raises NameError" do
16
+ expect { "Heya".constantize }.to raise_error NameError, "uninitialized constant Heya"
17
+ end
18
+ end
19
+ end
@@ -9,8 +9,8 @@ describe Vito::Dsl::Installation do
9
9
 
10
10
  describe "#install" do
11
11
  it "installs each recipes" do
12
- ruby.should_receive(:run)
13
- Vito::Recipes::Ruby.stub(:new).with(options, connection) { ruby }
12
+ ruby.should_receive(:install)
13
+ Vito::Recipes::Ruby::Install.stub(:new).with(options, connection) { ruby }
14
14
  subject.install
15
15
  end
16
16
  end
@@ -1,35 +1,73 @@
1
- require "vito/dsl_file"
1
+ require "spec_helper"
2
2
 
3
3
  describe Vito::DslFile do
4
4
  let(:server) { double }
5
+ let(:passed_in_file) { nil }
6
+ let(:command_line) { double(options: double(file: passed_in_file)) }
5
7
 
6
- subject { described_class.new }
7
-
8
- before do
9
- stub_const("Vito::Dsl::Server", Class.new)
10
- end
8
+ subject { described_class.new(command_line) }
11
9
 
12
10
  describe "#run" do
13
- before do
14
- Vito::Dsl::Server.stub(:new).with([:hey]) { server }
15
- end
11
+ describe "basic block operation" do
12
+ before do
13
+ stub_const("Vito::Dsl::Server", Class.new)
14
+ Vito::Dsl::Server.stub(:new).with([:hey]) { server }
15
+ end
16
+
17
+ it "runs the server block evaluating it as string" do
18
+ server.should_receive(:instance_eval)
19
+
20
+ subject.run <<-str
21
+ server :hey do
22
+
23
+ end
24
+ str
25
+ end
16
26
 
17
- it "runs the server block evaluating it as string" do
18
- server.should_receive(:instance_eval)
27
+ it "runs the server as a Ruby block" do
28
+ server.should_receive(:instance_eval)
19
29
 
20
- subject.run <<-str
21
- server :hey do
30
+ subject.run do
31
+ server :hey do
22
32
 
33
+ end
23
34
  end
24
- str
35
+ end
36
+ end
37
+
38
+ describe "advanced block operation" do
39
+ it "calls commands inside the block and passes subblocks to the recipe" do
40
+ Vito::Recipes::Apache::Install.any_instance.should_receive(:with).with(:passenger)
41
+ Vito::Recipes::Apache::Install.any_instance.should_receive(:vhosts).with(path: "/var/projects")
42
+ Vito::Recipes::Apache::Install.any_instance.should_receive(:install)
43
+ subject.run do
44
+ server(:hey) do
45
+ connection :ssh, command: "whatever"
46
+ install :apache do
47
+ with :passenger
48
+ vhosts path: "/var/projects"
49
+ end
50
+ end
51
+ end
52
+ end
25
53
  end
26
54
 
27
- it "runs the server as a Ruby block" do
28
- server.should_receive(:instance_eval)
55
+ describe "reading the vito file" do
56
+ context "default vito.rb file" do
57
+ let(:passed_in_file) { nil }
58
+
59
+ it "uses vito.rb file" do
60
+ File.should_receive(:open).with("vito.rb") { double(read: "") }
61
+ subject.run
62
+ end
63
+ end
29
64
 
30
- subject.run do
31
- server :hey do
65
+ context "custom DSL file" do
66
+ let(:passed_in_file) { "some_file.rb" }
32
67
 
68
+ it "uses some_file.rb file" do
69
+ File.should_receive(:open).with("some_file.rb") { double(read: "") }
70
+ subject.run
33
71
  end
34
72
  end
35
73
  end
@@ -1,7 +1,7 @@
1
1
  require "vito/output"
2
2
 
3
3
  describe Vito::ConnectionOutput do
4
- let(:stdout) { double(read: :stdout_string) }
4
+ let(:stdout) { double(read: "stdout_string\n\n\s") }
5
5
  let(:stderr) { double(read: :stderr_string) }
6
6
  let(:thread) { double(value: double(exitstatus: 0)) }
7
7
 
@@ -21,7 +21,7 @@ describe Vito::ConnectionOutput do
21
21
  describe "result" do
22
22
  it "returns stdout string in case of a successful command" do
23
23
  subject.stub(:success?) { true }
24
- subject.result.should == :stdout_string
24
+ subject.result.should == "stdout_string"
25
25
  end
26
26
 
27
27
  it "returns stdout string in case of a successful command" do
@@ -10,9 +10,59 @@ describe DummyRecipe do
10
10
 
11
11
  subject { described_class.new(options, connection) }
12
12
 
13
- describe "#run" do
13
+ describe "#with" do
14
+ context "with a package specified" do
15
+ before do
16
+ subject.with(:passenger, version: "2.1")
17
+ end
18
+
19
+ describe "dynamic methods generated" do
20
+ it "generates a dynamic method with the same name of the package" do
21
+ subject.passenger.should == { version: "2.1" }
22
+ end
23
+ end
24
+ end
25
+
26
+ context "with no package specified" do
27
+ it "raises error on package name that wasn't specified" do
28
+ expect { subject.passenger }.to raise_error
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "#with?" do
34
+ context "with a package specified" do
35
+ before { subject.with(:passenger, version: "2.1") }
36
+
37
+ it "returns true for that package" do
38
+ subject.with?(:passenger).should be_true
39
+ end
40
+
41
+ it "returns false for other packages" do
42
+ subject.with?(:packagex).should be_false
43
+ end
44
+ end
45
+
46
+ it "returns false when no package is specified" do
47
+ subject.with?(:packagex).should be_false
48
+ end
49
+ end
50
+
51
+ describe "#install" do
52
+ it "raises an error if undefined" do
53
+ expect { subject.install }.to raise_error "DummyRecipe recipe needs to define a #install method"
54
+ end
55
+ end
56
+
57
+ describe "#remove" do
58
+ it "raises an error if undefined" do
59
+ expect { subject.remove }.to raise_error "DummyRecipe recipe needs to define a #remove method"
60
+ end
61
+ end
62
+
63
+ describe "#update" do
14
64
  it "raises an error if undefined" do
15
- expect { subject.run }.to raise_error "DummyRecipe recipe needs to define a #run method"
65
+ expect { subject.update }.to raise_error "DummyRecipe recipe needs to define a #update method"
16
66
  end
17
67
  end
18
68
 
@@ -29,7 +79,7 @@ describe DummyRecipe do
29
79
  operating_system.should_receive(:install_dependencies).with(dependencies)
30
80
  Vito::OperatingSystem.stub(:new).with(connection) { double(os: operating_system) }
31
81
 
32
- subject.install_os_dependencies
82
+ subject.install_os_dependencies(dependencies)
33
83
  end
34
84
  end
35
85
 
@@ -0,0 +1,140 @@
1
+ require "spec_helper"
2
+
3
+ describe Vito::Recipes::Apache::Install do
4
+ let(:options) { {} }
5
+ let(:connection) { double }
6
+ let(:os) { double.as_null_object }
7
+
8
+ subject { described_class.new(options, connection) }
9
+
10
+ before do
11
+ subject.stub(:query) { double.as_null_object }
12
+ subject.stub(:system)
13
+ subject.stub(:run_command)
14
+ subject.stub(:depends_on_recipe)
15
+ #STDOUT.stub(:puts)
16
+ Vito::Log.stub(:write)
17
+
18
+ Vito::OperatingSystem.stub_chain(:new, :os) { os }
19
+ end
20
+
21
+ describe "#install" do
22
+ context "no vhosts or dependency package (with) defined" do
23
+ after do
24
+ subject.install
25
+ end
26
+
27
+ it "installs os dependencies" do
28
+ subject.should_receive(:install_os_dependencies)
29
+ end
30
+
31
+ it "install apache2-mpm-prefork" do
32
+ subject.should_receive(:run_command).with(/sudo.*apt-get.*apache2-mpm-prefork/i)
33
+ end
34
+
35
+ it "doesn't install passenger" do
36
+ subject.should_not_receive(:depends_on_recipe)
37
+ end
38
+
39
+ it "shouldn't disable 000-default site" do
40
+ subject.should_not_receive(:run_command).with("sudo a2dissite 000-default")
41
+ end
42
+
43
+ it "doesn't set up vhosts" do
44
+ Vito::Log.should_not_receive(:write).with(/setting.*hosts/i)
45
+ end
46
+
47
+ it "restarts the Apache2 service" do
48
+ os.should_receive(:service).with(:apache2, :restart)
49
+ end
50
+ end
51
+
52
+ context "vhosts and with(:passenger) defined" do
53
+ before do
54
+ subject.with :passenger
55
+ subject.vhosts with: :ssl, path: "/var/projects"
56
+ subject.stub(:site_already_enabled?) { false }
57
+ end
58
+
59
+ it "installs os dependencies" do
60
+ subject.should_receive(:install_os_dependencies)
61
+ subject.install
62
+ end
63
+
64
+ it "install apache2-mpm-prefork" do
65
+ subject.should_receive(:run_command).with(/sudo.*apt-get.*apache2-mpm-prefork/i)
66
+ subject.install
67
+ end
68
+
69
+ it "installs passenger" do
70
+ subject.should_receive(:depends_on_recipe).with(:passenger, {server: :apache})
71
+ subject.install
72
+ end
73
+
74
+ it "disables 000-default site" do
75
+ subject.should_receive(:run_command).with("sudo a2dissite 000-default")
76
+ subject.install
77
+ end
78
+
79
+ describe "setting up vhosts" do
80
+ it "starts setting up vhosts" do
81
+ Vito::Log.should_receive(:write).with(/setting.*hosts/i)
82
+ subject.install
83
+ end
84
+
85
+ it "downloads the correct file" do
86
+ subject.should_receive(:run_command).with(/curl.*github.*templates.*vito_rails_site/i)
87
+ subject.install
88
+ end
89
+
90
+ it "replaces VITO_PORT" do
91
+ subject.should_receive(:run_command).with(/sed.*VITO_PORT/i)
92
+ subject.install
93
+ end
94
+
95
+ it "replaces VITO_SERVERNAME" do
96
+ subject.should_receive(:run_command).with(/sed.*VITO_SERVERNAME/i)
97
+ subject.install
98
+ end
99
+
100
+ context "Rails app" do
101
+ it "replaces VITO_RAILS_PUBLIC_PATH" do
102
+ subject.should_receive(:run_command).with(/sed.*VITO_RAILS_PUBLIC_PATH/i)
103
+ subject.install
104
+ end
105
+
106
+ it "replaces VITO_RAILS_ENV" do
107
+ subject.should_receive(:run_command).with(/sed.*VITO_RAILS_ENV/i)
108
+ subject.install
109
+ end
110
+
111
+ it "replaces VITO_SITE_PATH" do
112
+ subject.should_receive(:run_command)
113
+ .with(/sed.*VITO_SITE_PATH.*var.*projects/i)
114
+ subject.install
115
+ end
116
+ end
117
+ end
118
+
119
+ it "defines the user for the project dir" do
120
+ subject.should_receive(:run_command).with(/\[ -d \/var\/projects.*|| sudo mkdir -p/i)
121
+ subject.install
122
+ end
123
+
124
+ it "defines the user for the project dir" do
125
+ subject.should_receive(:run_command).with(/sudo chown \\\$USER:admin/i)
126
+ subject.install
127
+ end
128
+
129
+ it "activates port 80 vhosts" do
130
+ subject.should_receive(:run_command).with(/sudo a2ensite vito_rails_site_80/i)
131
+ subject.install
132
+ end
133
+
134
+ it "restarts the Apache2 service" do
135
+ os.should_receive(:service).with(:apache2, :restart)
136
+ subject.install
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ describe Vito::Recipes::Passenger::Paths do
4
+ let(:recipe) { double }
5
+ let(:result) { double(result: gemspec_path) }
6
+ let(:gemspec_path) { "/Users/kurko/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/passenger-4.0.10/passenger.gemspec\n" }
7
+
8
+ subject { described_class.new(recipe) }
9
+
10
+ describe "#mod_passenger" do
11
+ context "apache" do
12
+ it "returns the mod_passenger path" do
13
+ recipe.stub(:query).with("gem contents passenger|grep gemspec") { result }
14
+ subject.mod_passenger(:apache).should == "/Users/kurko/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/passenger-4.0.10/buildout/apache2/mod_passenger.so"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -4,21 +4,21 @@ describe Vito::Recipes::Ruby do
4
4
  let(:options) { double("options").as_null_object }
5
5
  let(:connection) { double("connection").as_null_object }
6
6
 
7
- subject { Vito::Recipes::Ruby.new(options, connection) }
7
+ subject { Vito::Recipes::Ruby::Install.new(options, connection) }
8
8
 
9
9
  before do
10
10
  STDOUT.stub(:puts)
11
11
  Vito::ConnectionOutput.stub(:write)
12
12
  end
13
13
 
14
- describe "#run" do
14
+ describe "#install" do
15
15
  it "installs rbenv" do
16
16
  subject.stub(:install_os_dependencies)
17
17
 
18
18
  rbenv = double
19
- rbenv.should_receive(:run)
20
- Vito::Recipes::Rbenv.stub(:new).with(anything, connection) { rbenv }
21
- subject.run
19
+ rbenv.should_receive(:install)
20
+ Vito::Recipes::Rbenv::Install.stub(:new).with(anything, connection) { rbenv }
21
+ subject.install
22
22
  end
23
23
  end
24
24
  end
@@ -0,0 +1,65 @@
1
+ require "vito/tasks/vagrant_bootstrap"
2
+
3
+ describe Vito::Tasks::VagrantBootstrap do
4
+ subject { described_class.new("ubuntu12") }
5
+
6
+ before do
7
+ subject.stub(:system)
8
+ subject.stub(:`)
9
+ STDOUT.stub(:puts)
10
+ Dir.stub(:chdir)
11
+ subject.stub(:snapshot_exist?) { true }
12
+ end
13
+
14
+ describe "#install" do
15
+ it "outputs a message about the setup about to start" do
16
+ STDOUT.should_receive(:puts).with(/ubuntu12.*ubuntu12_test_box.*vagrant_boxes\/ubuntu12/)
17
+ subject.install
18
+ end
19
+
20
+ it "changes dir to the box one" do
21
+ Dir.stub(:chdir)
22
+ Dir.should_receive(:chdir).with("spec/vagrant_boxes/ubuntu12")
23
+ subject.install
24
+ end
25
+
26
+ it "starts the vagrant box and halts it" do
27
+ subject.should_receive(:system).with("vagrant up && vagrant halt")
28
+ subject.install
29
+ end
30
+
31
+ describe "snapshot plugin installation" do
32
+ it "installs the snapshot plugin if it's not present" do
33
+ subject.stub(:system) { false }
34
+ subject.should_receive(:system).with("vagrant plugin install vagrant-vbox-snapshot")
35
+ subject.install
36
+ end
37
+
38
+ it " doesn't install the snapshot plugin if it's present" do
39
+ subject.stub(:system) { true }
40
+ subject.should_not_receive(:system).with("vagrant plugin install vagrant-vbox-snapshot")
41
+ subject.install
42
+ end
43
+ end
44
+
45
+ describe "snapshot creation" do
46
+ it "takes a initial snapshot if none exist" do
47
+ subject.stub(:snapshot_exist?) { false }
48
+ subject.should_receive(:system).with("vagrant snapshot take ubuntu12_initial_box")
49
+ subject.install
50
+ end
51
+
52
+ it "doesn't take a initial snapshot if it already exists" do
53
+ subject.stub(:snapshot_exist?) { true }
54
+ subject.should_not_receive(:system).with("vagrant snapshot take ubuntu12_initial_box")
55
+ subject.install
56
+ end
57
+ end
58
+
59
+ it "gets back to the original dir" do
60
+ Dir.stub(:pwd) { :original_path }
61
+ Dir.should_receive(:chdir).with(:original_path)
62
+ subject.install
63
+ end
64
+ end
65
+ end