cany 0.0.2 → 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.
@@ -20,6 +20,11 @@ describe Cany::Dpkg::Creator do
20
20
  end
21
21
  let(:run) { Cany::Dpkg::Creator.new(spec).run *(@run_args || []) }
22
22
 
23
+ it 'should set the system recipe' do
24
+ expect(spec).to receive(:system_recipe=).with(kind_of(Cany::Dpkg::DebHelperRecipe)).and_call_original
25
+ run
26
+ end
27
+
23
28
  context 'debian directory' do
24
29
  subject { File.join dir, 'debian' }
25
30
 
@@ -45,7 +50,7 @@ describe Cany::Dpkg::Creator do
45
50
  it do
46
51
  run
47
52
  expect(subject).to be_a_file
48
- expect(subject).to have_the_content '8'
53
+ expect(subject).to have_the_content '9'
49
54
  end
50
55
  end
51
56
 
@@ -128,7 +133,10 @@ describe Cany::Dpkg::Creator do
128
133
  end
129
134
 
130
135
  it 'should add extra deps in specific gems are used' do
131
- FileUtils.copy File.expand_path('../../fixtures/testgem.lock', __FILE__), File.join(dir, 'Gemfile.lock')
136
+ FileUtils.copy File.expand_path('../../../fixtures/testgem.lock', __FILE__), File.join(dir, 'Gemfile.lock')
137
+ spec.setup do
138
+ use :bundler
139
+ end
132
140
  run
133
141
  expect(subject.paragraphs.size).to eq 2
134
142
  source =
@@ -200,6 +208,22 @@ describe Cany::Dpkg::Creator do
200
208
  expect(subject).to include "\truby1.9.1 -S cany dpkg-builder $@"
201
209
  expect(subject).to include "\truby1.9.1 -cS cany >/dev/null || ruby1.9.1 -S gem install --no-ri --no-rdoc --install-dir debian/gems --bindir debian/bin $${CANY_GEM:-cany}"
202
210
  end
211
+
212
+ it 'should contain cany version constraint' do
213
+ expect(Cany::VERSION).to receive(:to_s).and_return('0.1').at_least(:once)
214
+ spec.setup { require_cany '~> 0.1' }
215
+ run
216
+
217
+ should match /gem install.+ \$\${CANY_GEM:-cany}.+--version "~> 0\.1"/
218
+ end
219
+
220
+ it 'should allow pre cany versions if the contraint contain characters' do
221
+ expect(Cany::VERSION).to receive(:to_s).and_return('0.1.rc2').at_least(:once)
222
+ spec.setup { require_cany '~> 0.1.rc1' }
223
+ run
224
+
225
+ should match /gem install.+ \$\${CANY_GEM:-cany}.+--version "~> 0\.1\.rc1" --prerelease/
226
+ end
203
227
  end
204
228
 
205
229
  context 'changelog file' do
@@ -0,0 +1,91 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cany::Dpkg::DebHelperRecipe do
4
+ let!(:dir) { Dir.mktmpdir }
5
+ before do
6
+ Dir.mkdir File.join(dir, 'debian')
7
+ @old_path = Dir.pwd
8
+ Dir.chdir(dir)
9
+ end
10
+ after do
11
+ Dir.chdir @old_path
12
+ FileUtils.remove_entry dir
13
+ end
14
+ let(:spec) do
15
+ s = Cany::Specification.new do
16
+ name 'test'
17
+ description 'Your RSpec Upstart-Scripts'
18
+ end
19
+ s.base_dir = dir
20
+ s
21
+ end
22
+ let(:recipe) { described_class.new spec }
23
+ subject { recipe }
24
+
25
+ describe '#binary' do
26
+ it 'should install services' do
27
+ should receive(:install_services)
28
+ subject.binary
29
+ end
30
+ it 'should install base service' do
31
+ should receive(:install_base_service)
32
+ subject.binary
33
+ end
34
+ end
35
+
36
+ describe '#install_services' do
37
+ before do
38
+ recipe.install_service :service, %w(hans args1), user: 'www-data', group: 'www-data'
39
+ recipe.install_services
40
+ end
41
+ subject { File.read File.join(dir, 'debian', 'test.test-service.upstart') }
42
+
43
+ it 'should create files' do
44
+ should eq <<EOF
45
+ description "Your RSpec Upstart-Scripts - service"
46
+
47
+ start on started test
48
+ stop on stopping test
49
+
50
+ respawn
51
+ respawn limit 10 5
52
+ umask 022
53
+
54
+ chdir /usr/share/test
55
+
56
+ setuid www-data
57
+ setgid www-data
58
+
59
+ exec hans args1
60
+ EOF
61
+ expect(@executed_programs).to match_array [['dh_installinit', '--name', 'test-service']]
62
+ end
63
+ end
64
+
65
+ describe '#install_base_services' do
66
+ before do
67
+ recipe.configure :service_pre_scripts, mkdir_run: "mkdir /var/run/#{spec.name}", chown_run: "chown www-data /var/run/#{spec.name}"
68
+ Dir.chdir(dir) { recipe.install_base_service }
69
+ end
70
+ subject { File.read File.join(dir, 'debian', 'test.upstart') }
71
+ it 'should create files' do
72
+ should eq <<EOF
73
+ description "Your RSpec Upstart-Scripts"
74
+
75
+ start on filesystem or runlevel [2345]
76
+ stop on runlevel [!2345]
77
+
78
+ respawn
79
+ respawn limit 10 5
80
+ umask 022
81
+
82
+ pre-start script
83
+ mkdir /var/run/test
84
+ chown www-data /var/run/test
85
+ end script
86
+
87
+ exec sleep 1d
88
+ EOF
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,213 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cany::Recipe do
4
+ let(:spec) do
5
+ Cany::Specification.new do
6
+ name 'test-spec'
7
+ end
8
+ end
9
+ let(:recipe) { Cany::Recipe.new(spec) }
10
+ let(:test_recipe) { TestRecipe.new(spec) }
11
+
12
+ describe '#exec' do
13
+ it 'should execute system command' do
14
+ expect(recipe).to receive(:system).with('a', 'b', 'c').and_return true
15
+ recipe.exec_('a', 'b', 'c')
16
+ end
17
+
18
+ it 'should flatten the passed arguments' do
19
+ expect(recipe).to receive(:system).with('a', 'b', 'c').and_return true
20
+ recipe.exec_(%w(a b c))
21
+ end
22
+
23
+ it 'should flatten the passed arguments #2' do
24
+ expect(recipe).to receive(:system).with('a', 'b', 'c', 'd', 'e', 'f').and_return true
25
+ recipe.exec_('a', %w(b c), 'd', ['e', 'f'])
26
+ end
27
+
28
+ it 'should raise an exception on failed program execution' do
29
+ expect { recipe.exec_ 'false' }.to raise_exception Cany::CommandExecutionFailed, /Could not execute.*false/
30
+ end
31
+
32
+ it 'should raise an exception on failed program execution with args' do
33
+ expect { recipe.exec_ %w(false 4) }.to raise_exception Cany::CommandExecutionFailed, /Could not execute.*false 4/
34
+ end
35
+ end
36
+
37
+ describe 'hook handling' do
38
+ it 'should raise an error on an unknown hooks' do
39
+ expect { recipe.run_hook :test, :after }.to raise_exception Cany::UnknownHook, /Unknown hook.*test/
40
+ end
41
+
42
+ it 'should handle hooks without defined block' do
43
+ test_recipe.run_hook :test_hook, :after
44
+ end
45
+
46
+ it 'should passed block for hook' do
47
+ expect(Cany).to receive(:hook_executed)
48
+ spec.setup do
49
+ use :test_recipe do
50
+ before :test_hook do
51
+ Cany.hook_executed
52
+ end
53
+ end
54
+ end
55
+ spec.recipes[0].run_hook :test_hook, :before
56
+ end
57
+
58
+ it 'hook should be limited to recipe' do
59
+ expect do
60
+ spec.setup do
61
+ use :bundler do
62
+ before :test_hook do
63
+ Dummy.hook_executed
64
+ end
65
+ end
66
+ end
67
+ end.to raise_exception Cany::UnknownHook, /Unknown hook.*test_hook/
68
+ end
69
+ end
70
+
71
+ describe 'recipe configure options' do
72
+ let(:option_name) { :test_conf }
73
+ subject { test_recipe.option option_name }
74
+
75
+ context 'with an undefined config' do
76
+ let(:option_name) { :unknown_option }
77
+ it 'should raise an exception' do
78
+ expect { subject }.to raise_exception Cany::UnknownOption, /Unknown option .*unknown_option/
79
+ end
80
+ end
81
+
82
+ context 'with a defined config' do
83
+ let(:recipe2) { Cany::Recipe.new(spec) }
84
+ it 'should be initialized with {} per default' do
85
+ expect(subject).to eq Hash.new
86
+ end
87
+
88
+ context 'should be configurable' do
89
+ before do
90
+ test_recipe.configure :test_conf, env: 'production'
91
+ end
92
+ it { expect(subject).to eq(env: 'production') }
93
+ end
94
+
95
+ context 'options should be merged between multiple calls' do
96
+ before do
97
+ test_recipe.configure :test_conf, env: 'production'
98
+ test_recipe.configure :test_conf, env2: 'hans'
99
+ end
100
+ it { expect(subject).to eq(env: 'production', env2: 'hans') }
101
+ end
102
+ end
103
+ end
104
+
105
+ describe '#recipe' do
106
+ let(:other_recipe) { :test_recipe }
107
+ subject { recipe.recipe other_recipe }
108
+ context 'to access other loaded recipe' do
109
+ before { spec.setup { use :test_recipe } }
110
+ it 'should return the recipe instance from this specification' do
111
+ expect(subject).to be spec.recipes.first
112
+ end
113
+ end
114
+
115
+ context 'to access an unloaded recipe' do
116
+ it 'should raise an exception' do
117
+ expect { subject }.to raise_exception Cany::UnloadedRecipe, /[Rr]ecipe.+test_recipe.+no.+loaded/
118
+ end
119
+ end
120
+
121
+ context 'to access an unknown recipe' do
122
+ let(:other_recipe) { :unknown_recipe }
123
+ it 'should raise an exception' do
124
+ expect { subject }.to raise_exception Cany::UnknownRecipe, /[Rr]ecipe.+unknown_recipe.+not.+registered./
125
+ end
126
+ end
127
+ end
128
+
129
+ describe '#depend' do
130
+ subject { spec.dependencies }
131
+
132
+ context 'without any call' do
133
+ it 'it should be empty' do
134
+ should eq []
135
+ end
136
+ end
137
+
138
+ context 'with a single string' do
139
+ subject { super().first }
140
+
141
+ context 'without other options' do
142
+ before { recipe.depend 'hans-otto-lib' }
143
+ it 'should converted into a runtime dependency object' do
144
+ should be_instance_of Cany::Dependency
145
+ should be_runtime
146
+ should_not be_build
147
+ end
148
+ end
149
+
150
+ context 'with situation option' do
151
+ before { recipe.depend 'hans-otto-lib', situation: :build }
152
+ it 'should converted into a runtime dependency object' do
153
+ should be_instance_of Cany::Dependency
154
+ should_not be_runtime
155
+ should be_build
156
+ end
157
+ end
158
+
159
+ context 'with a version option' do
160
+ before { recipe.depend 'hans-otto', version: '>= 4' }
161
+ it 'should be convert' do
162
+ should be_instance_of Cany::Dependency
163
+ expect(subject.determine(:a, :b)).to match_array [['hans-otto', '>= 4']]
164
+ end
165
+ end
166
+ end
167
+ context 'with a dependency object' do
168
+ let(:dep) { Cany::Dependency.new }
169
+ subject { super().first }
170
+ before { recipe.depend dep }
171
+ it 'should be passed without modification' do
172
+ should eq dep
173
+ end
174
+ end
175
+ end
176
+
177
+ context '#name' do
178
+ context 'on an unregistered recipe' do
179
+ subject { recipe.name }
180
+ it 'should raise a NoMethodError' do
181
+ expect { subject }.to raise_exception NoMethodError
182
+ end
183
+ end
184
+
185
+ context 'on a registered recipe' do
186
+ subject { test_recipe.name }
187
+ it 'should return its registered name' do
188
+ should eq :test_recipe
189
+ end
190
+ end
191
+ end
192
+
193
+ context '#install_service' do
194
+ let(:name) { :test }
195
+ let(:command) { :command }
196
+ let(:opts) { {} }
197
+ subject { recipe.install_service name, command, opts }
198
+
199
+ context 'on recipe without loaded system recipe' do
200
+ it 'should raise an exception' do
201
+ expect { subject }.to raise_exception Cany::NoSystemRecipe
202
+ end
203
+ end
204
+
205
+ context 'with loaded deb helper recipe' do
206
+ before { spec.system_recipe = Cany::Dpkg::DebHelperRecipe.new spec }
207
+ it 'should pass call to system recipe' do
208
+ expect_any_instance_of(Cany::Dpkg::DebHelperRecipe).to receive(:install_service).with(name, command, opts)
209
+ subject
210
+ end
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cany::Recipes::Bundler::Gem do
4
+ let(:gem_name) { :bundler }
5
+ subject { described_class.get gem_name }
6
+ context '#get' do
7
+ it 'should return always the same instance per gem' do
8
+ should be_instance_of described_class
9
+ expect(subject).to eq described_class.get gem_name
10
+ end
11
+
12
+ it 'should return different instances for different gems' do
13
+ should_not eq described_class.get :bundler2
14
+ end
15
+
16
+ context 'returned gem instance' do
17
+ context '\s gem_name' do
18
+ subject { super().name }
19
+ it { eq gem_name }
20
+ end
21
+
22
+ context '\' dependencies' do
23
+ subject { super().dependencies }
24
+ it 'should be empty per default' do
25
+ should match_array []
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ context '#specify' do
32
+ subject { super().dependencies.first }
33
+ let(:default) { subject.determine(:a, :b).first }
34
+ context 'with added dependencies' do
35
+ before do
36
+ described_class.specify gem_name do
37
+ depend 'hans_otto'
38
+ end
39
+ end
40
+ it 'should added as runtime dependencies' do
41
+ should be_runtime
42
+ expect(default).to match_array [ 'hans_otto', nil]
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cany::Recipes::Bundler do
4
+ let(:spec) do
5
+ Cany::Specification.new do
6
+ name 'test'
7
+ use :bundler
8
+ end
9
+ end
10
+ let(:recipe) { spec.recipes[0] }
11
+ before { recipe.prepare }
12
+
13
+ context 'wrapper-script' do
14
+ subject { recipe.wrapper_script }
15
+ context 'without additional env variables' do
16
+ it 'should contain GEM_PATH to find bundler' do
17
+ expect(subject).to include('export GEM_PATH="bundler"')
18
+ end
19
+ end
20
+
21
+ context 'with additional env variables' do
22
+ before { recipe.configure :env_vars, RAILS_ENV: 'production' }
23
+ it 'should contain all environment variables' do
24
+ expect(subject).to include('export GEM_PATH="bundler"')
25
+ expect(subject).to include('export RAILS_ENV="production"')
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe Cany::Recipes::Rails do
4
+ describe 'DSL' do
5
+ let(:spec) do
6
+ Cany::Specification.new do
7
+ name 'test'
8
+ end
9
+ end
10
+ let(:recipe) { spec.recipes[0] }
11
+
12
+ it 'should compile assets by default' do
13
+ spec.setup do
14
+ use :rails
15
+ end
16
+ expect(recipe.compile_assets).to eq true
17
+ end
18
+
19
+ it 'should be able to disable assets compilation' do
20
+ spec.setup do
21
+ use :rails do
22
+ compile_assets false
23
+ end
24
+ end
25
+ expect(recipe.compile_assets).to eq false
26
+ end
27
+ end
28
+ end