jenkins_job 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -21,6 +21,12 @@ new project named foo_production testing the production branch.
21
21
  Note well: the command must be executed within the directory containing
22
22
  Jenkins' jobs, which is <jenkins_home>/jobs.
23
23
 
24
+ You can also clone multiple projects at the same time:
25
+ jenkins_job clone foo_master bar_master --original_branch master --new_branch production
26
+
27
+ Taking advantage of shell globbing you can even do:
28
+ jenkins_job clone *_master --original_branch master --new_branch production
29
+
24
30
  == Other features
25
31
  jenkins_job can help you in other ways.
26
32
 
@@ -44,3 +50,9 @@ Just execute this command:
44
50
  Now the bar_master project will have the irc notifications turned on and
45
51
  configured like foo_master.
46
52
 
53
+ You can also copy a setting to multiple projects at the same time:
54
+ jenkins_job copy_setting hudson.plugins.ircbot.IrcPublisher foo_master foo_production bar_master
55
+
56
+ Taking advantage of shell globbing you can even do:
57
+ jenkins_job copy_setting hudson.plugins.ircbot.IrcPublisher foo_master bar*
58
+
@@ -60,19 +60,22 @@ module JenkinsJob
60
60
  end
61
61
  end
62
62
 
63
- desc "copy_setting SOURCE_PROJECT SETTING_NAME DEST_PROJECT",
64
- "Copy SETTING_NAME from SOURCE_PROJECT to DEST_PROJECT"
65
- def copy_setting source_project, setting_name, dest_project
63
+ desc "copy_setting SOURCE_PROJECT SETTING_NAME DEST_PROJECT [DEST_PROJECT, ...]",
64
+ "Copy SETTING_NAME from SOURCE_PROJECT to the specified destination projects"
65
+ def copy_setting source_project, setting_name, *dest_project
66
66
  source = Project.new(source_project)
67
- dest = Project.new(dest_project)
68
-
69
67
  setting = source.setting(setting_name)
70
68
  if setting.nil?
71
- say "#{source_project} doesn't contain the specified setting", :red
72
- else
73
- dest.update_setting(setting_name, setting)
74
- say "#{setting_name} copied", :green
69
+ say("#{source_project} doesn't contain the specified setting", :red)
70
+ Kernel::exit(1)
71
+ end
72
+
73
+ dest_project.each do |p|
74
+ dest = Project.new(p)
75
+ dest.update_setting(setting_name, setting)
76
+ say("#{setting_name} copied to #{p}", :green)
75
77
  end
76
78
  end
79
+
77
80
  end
78
81
  end
@@ -1,3 +1,3 @@
1
1
  module JenkinsJob
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/test/cli_test.rb CHANGED
@@ -75,6 +75,7 @@ class CliTest < Test::Unit::TestCase
75
75
 
76
76
  FakeFS.activate!
77
77
  FakeFS::FileSystem.clear
78
+
78
79
  FileUtils.mkdir_p 'foo_master'
79
80
  File.open('foo_master/config.xml', 'w') do |file|
80
81
  file.write @source_xml
@@ -111,7 +112,7 @@ class CliTest < Test::Unit::TestCase
111
112
 
112
113
  context 'force overwrite enabled' do
113
114
  should 'not prompt user when force is set to true' do
114
- JenkinsJob::Cli.any_instance.expects(:yes?).never
115
+ Thor::Shell::Color.any_instance.expects(:yes?).never
115
116
 
116
117
  capture(:stdout) do
117
118
  JenkinsJob::Cli.start(['clone', 'foo_master', '--original_branch',
@@ -131,7 +132,7 @@ class CliTest < Test::Unit::TestCase
131
132
  context 'force overwrite is not set' do
132
133
  context 'user wants to overwrite' do
133
134
  should 'overwrite the old contents and create the new ones' do
134
- JenkinsJob::Cli.any_instance.expects(:yes?).once.returns(true)
135
+ Thor::Shell::Color.any_instance.expects(:yes?).once.returns(true)
135
136
  capture(:stdout) do
136
137
  JenkinsJob::Cli.start(['clone', 'foo_master', '--original_branch',
137
138
  'master', '--new_branch', 'production'])
@@ -147,7 +148,7 @@ class CliTest < Test::Unit::TestCase
147
148
 
148
149
  context "user doesn't want to overwrite" do
149
150
  should 'preserve the old contents' do
150
- JenkinsJob::Cli.any_instance.expects(:yes?).once.returns(false)
151
+ Thor::Shell::Color.any_instance.expects(:yes?).once.returns(false)
151
152
  capture(:stdout) do
152
153
  JenkinsJob::Cli.start(['clone', 'foo_master', '--original_branch',
153
154
  'master', '--new_branch', 'production'])
@@ -170,33 +171,57 @@ class CliTest < Test::Unit::TestCase
170
171
  source = mock()
171
172
  source.expects(:setting).with('irc_bot').once.returns(nil)
172
173
 
173
- dest = mock()
174
- dest.expects(:update_setting).never
174
+ JenkinsJob::Project.expects(:new).once.returns(source)
175
+ Thor::Shell::Color.any_instance.expects(:say)\
176
+ .with(is_a(String), :red).once
177
+ Kernel.expects(:exit).with(1).raises('exiting')
175
178
 
176
- JenkinsJob::Project.expects(:new).twice.returns(source).then.returns(dest)
177
- JenkinsJob::Cli.any_instance.expects(:say).with(is_a(String), :red).once
179
+ assert_raises RuntimeError do
180
+ capture(:stdout) do
181
+ JenkinsJob::Cli.start(['copy_setting', 'foo_master', 'irc_bot',
182
+ 'foo_production'])
183
+ end
184
+ end
185
+ end
178
186
 
179
- capture(:stdout) do
180
- JenkinsJob::Cli.start(['copy_setting', 'foo_master', 'irc_bot',
181
- 'foo_production'])
187
+ context 'existing setting' do
188
+ should 'handle a single destination' do
189
+ source = mock()
190
+ source.expects(:setting).with('irc_bot').once.returns('foo')
191
+
192
+ dest = mock()
193
+ dest.expects(:update_setting).with('irc_bot', 'foo').once
194
+
195
+ JenkinsJob::Project.expects(:new).twice.returns(source).then.returns(dest)
196
+ Thor::Shell::Color.any_instance.expects(:say)\
197
+ .with(is_a(String), :green) .once
198
+ capture(:stdout) do
199
+ JenkinsJob::Cli.start(['copy_setting', 'foo_master', 'irc_bot',
200
+ 'foo_production'])
201
+ end
182
202
  end
183
203
 
184
- end
204
+ should 'handle multiple destination projects' do
205
+ source = mock()
206
+ source.expects(:setting).with('irc_bot').once.returns('foo')
185
207
 
186
- should 'handle an existing setting' do
187
- source = mock()
188
- source.expects(:setting).with('irc_bot').once.returns('foo')
208
+ dest_foo_prod = mock()
209
+ dest_foo_prod.expects(:update_setting).with('irc_bot', 'foo').once
189
210
 
190
- dest = mock()
191
- dest.expects(:update_setting).with('irc_bot', 'foo').once
211
+ dest_bar_prod = mock()
212
+ dest_bar_prod.expects(:update_setting).with('irc_bot', 'foo').once
192
213
 
193
- JenkinsJob::Project.expects(:new).twice.returns(source).then.returns(dest)
194
- JenkinsJob::Cli.any_instance.expects(:say).with(is_a(String), :green).once
195
- capture(:stdout) do
196
- JenkinsJob::Cli.start(['copy_setting', 'foo_master', 'irc_bot',
197
- 'foo_production'])
214
+ JenkinsJob::Project.expects(:new).times(3)\
215
+ .returns(source).then\
216
+ .returns(dest_foo_prod).then\
217
+ .returns(dest_bar_prod)
218
+ Thor::Shell::Color.any_instance.expects(:say)\
219
+ .with(is_a(String), :green).twice
220
+ capture(:stdout) do
221
+ JenkinsJob::Cli.start(['copy_setting', 'foo_master', 'irc_bot',
222
+ 'foo_production', 'bar_production'])
223
+ end
198
224
  end
199
225
  end
200
-
201
226
  end
202
227
  end
data/test/project_test.rb CHANGED
@@ -87,26 +87,27 @@ class ProjectTest < Test::Unit::TestCase
87
87
  assert_nil actual
88
88
  end
89
89
 
90
- should 'update an existing setting by overwriting it' do
91
- node = REXML::Element.new 'disabled'
92
- node.text = 'true'
93
-
94
- assert @project.enabled?
95
- @project.update_setting 'disabled', node
96
- assert @project.disabled?
97
- end
98
-
99
- should 'update an existing setting by overwriting it' do
100
- parent = REXML::Element.new 'foobar_parent'
101
- node = REXML::Element.new 'foobar'
102
- node.text = 'hello world'
103
- parent << node
104
-
105
-
106
- @project.update_setting 'foobar_parent', parent
107
- actual_node = @project.setting 'foobar_parent/foobar'
108
- assert_equal 1, @project.setting('foobar_parent').size
109
- assert_equal node.text, actual_node.text
90
+ context 'update an existing setting by overwriting it' do
91
+ should 'handle simple nodes' do
92
+ node = REXML::Element.new 'disabled'
93
+ node.text = 'true'
94
+
95
+ assert @project.enabled?
96
+ @project.update_setting 'disabled', node
97
+ assert @project.disabled?
98
+ end
99
+
100
+ should 'handle complex nodes' do
101
+ parent = REXML::Element.new 'foobar_parent'
102
+ node = REXML::Element.new 'foobar'
103
+ node.text = 'hello world'
104
+ parent << node
105
+
106
+ @project.update_setting 'foobar_parent', parent
107
+ actual_node = @project.setting 'foobar_parent/foobar'
108
+ assert_equal 1, @project.setting('foobar_parent').size
109
+ assert_equal node.text, actual_node.text
110
+ end
110
111
  end
111
112
 
112
113
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jenkins_job
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 0
10
- version: 0.1.0
9
+ - 1
10
+ version: 0.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Flavio Castelli