cerberus 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +6 -0
- data/README +1 -1
- data/Rakefile +9 -9
- data/lib/cerberus/config.rb +13 -4
- data/lib/cerberus/manager.rb +6 -7
- data/lib/cerberus/publisher/irc.rb +1 -0
- data/lib/cerberus/publisher/jabber.rb +2 -0
- data/lib/cerberus/publisher/mail.rb +4 -1
- data/lib/cerberus/utils.rb +12 -0
- data/lib/cerberus/version.rb +1 -1
- data/test/config_test.rb +12 -0
- data/test/functional_test.rb +29 -1
- data/test/test_helper.rb +10 -6
- metadata +2 -2
data/CHANGES
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
= Cerberus Changelog
|
2
2
|
|
3
|
+
== Version 0.2.1
|
4
|
+
Minor fix release
|
5
|
+
|
6
|
+
* publisher -> active flag now not mandatory. Use 'mail' publisher as active if not set any
|
7
|
+
|
8
|
+
|
3
9
|
== Version 0.2.0
|
4
10
|
Config file was changed since 0.1.1 and you need regenerate config files.
|
5
11
|
Or change it by hands: see doc/OPTIONS file to list of all avalable options.
|
data/README
CHANGED
@@ -31,7 +31,7 @@ To use Cerberus it is very easy. First install it. Easiest way to do it through
|
|
31
31
|
|
32
32
|
'gem install cerberus'
|
33
33
|
|
34
|
-
or get Cerberus distribution package right from download page http://rubyforge.org/frs/?group_id=1794
|
34
|
+
or get Cerberus distribution package right from download page http://rubyforge.org/frs/?group_id=1794&release_id=6442
|
35
35
|
|
36
36
|
then you need to add project that will be watched by Cerberus. Do it by
|
37
37
|
|
data/Rakefile
CHANGED
@@ -14,8 +14,8 @@ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
|
14
14
|
|
15
15
|
RELEASE_NAME = "REL #{PKG_VERSION}"
|
16
16
|
|
17
|
-
|
18
|
-
|
17
|
+
RUBYFORGE_PROJECT = "cerberus"
|
18
|
+
RUBYFORGE_USER = "anatol"
|
19
19
|
|
20
20
|
task :default => [:test, :clean]
|
21
21
|
|
@@ -75,7 +75,7 @@ GEM_SPEC = Gem::Specification.new do |s|
|
|
75
75
|
s.author = "Anatol Pomozov"
|
76
76
|
s.email = "anatol.pomozov@gmail.com"
|
77
77
|
s.homepage = "http://rubyforge.org/projects/cerberus"
|
78
|
-
s.rubyforge_project =
|
78
|
+
s.rubyforge_project = RUBYFORGE_PROJECT
|
79
79
|
end
|
80
80
|
|
81
81
|
|
@@ -101,7 +101,7 @@ end
|
|
101
101
|
task :reinstall => [:uninstall, :install]
|
102
102
|
|
103
103
|
task :site_webgen do
|
104
|
-
sh %{pushd doc/site; webgen; scp -r output/* #{
|
104
|
+
sh %{pushd doc/site; webgen; scp -r output/* #{RUBYFORGE_USER}@rubyforge.org:/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/; popd }
|
105
105
|
end
|
106
106
|
|
107
107
|
begin
|
@@ -115,12 +115,12 @@ rescue Object
|
|
115
115
|
end
|
116
116
|
|
117
117
|
task :site_coverage => [:rcov] do
|
118
|
-
sh %{ scp -r test/coverage/* #{
|
118
|
+
sh %{ scp -r test/coverage/* #{RUBYFORGE_USER}@rubyforge.org:/var/www/gforge-projects/#{RUBYFORGE_PROJECT}/coverage/ }
|
119
119
|
end
|
120
120
|
|
121
121
|
task :release_files => [:clean, :package] do
|
122
122
|
require 'meta_project'
|
123
|
-
project = MetaProject::Project::XForge::RubyForge.new(
|
123
|
+
project = MetaProject::Project::XForge::RubyForge.new(RUBYFORGE_PROJECT)
|
124
124
|
|
125
125
|
release_files = FileList[
|
126
126
|
"pkg/#{PKG_FILE_NAME}.gem",
|
@@ -129,7 +129,7 @@ task :release_files => [:clean, :package] do
|
|
129
129
|
]
|
130
130
|
|
131
131
|
Rake::XForge::Release.new(project) do |release|
|
132
|
-
release.user_name =
|
132
|
+
release.user_name = RUBYFORGE_USER
|
133
133
|
release.password = ENV['RUBYFORGE_PASSWORD']
|
134
134
|
release.files = release_files.to_a
|
135
135
|
release.package_name = PKG_NAME
|
@@ -141,9 +141,9 @@ end
|
|
141
141
|
task :publish_news do
|
142
142
|
require 'meta_project'
|
143
143
|
|
144
|
-
project = MetaProject::Project::XForge::RubyForge.new(
|
144
|
+
project = MetaProject::Project::XForge::RubyForge.new(RUBYFORGE_PROJECT)
|
145
145
|
Rake::XForge::NewsPublisher.new(project) do |publisher|
|
146
|
-
publisher.user_name =
|
146
|
+
publisher.user_name = RUBYFORGE_USER
|
147
147
|
publisher.password = ENV['RUBYFORGE_PASSWORD']
|
148
148
|
publisher.subject = "[ANN] Cerberus #{PKG_VERSION} Released"
|
149
149
|
publisher.details = IO.read(File.dirname(__FILE__) + '/README')
|
data/lib/cerberus/config.rb
CHANGED
@@ -2,16 +2,17 @@ require 'rubygems'
|
|
2
2
|
require 'active_support'
|
3
3
|
|
4
4
|
require 'cerberus/constants'
|
5
|
+
require 'cerberus/utils'
|
5
6
|
|
6
7
|
module Cerberus
|
7
8
|
class Config
|
8
|
-
def initialize(app_name, cli_options = {})
|
9
|
+
def initialize(app_name = nil, cli_options = {})
|
9
10
|
@config = HashWithIndifferentAccess.new
|
10
11
|
if app_name
|
11
|
-
|
12
|
-
|
12
|
+
merge!(YAML.load(IO.read(CONFIG_FILE))) if test(?f, CONFIG_FILE)
|
13
|
+
merge!(YAML.load(IO.read(HOME + "/config/#{app_name}.yml")))
|
13
14
|
end
|
14
|
-
|
15
|
+
merge!(cli_options)
|
15
16
|
end
|
16
17
|
|
17
18
|
def [](*path)
|
@@ -23,6 +24,14 @@ module Cerberus
|
|
23
24
|
c
|
24
25
|
end
|
25
26
|
|
27
|
+
def merge!(hash)
|
28
|
+
@config.deep_merge!(hash)
|
29
|
+
end
|
30
|
+
|
31
|
+
def inspect
|
32
|
+
@config.inspect
|
33
|
+
end
|
34
|
+
|
26
35
|
private
|
27
36
|
def symbolize_hash(hash)
|
28
37
|
hash.each_pair{|k,v|
|
data/lib/cerberus/manager.rb
CHANGED
@@ -111,14 +111,13 @@ module Cerberus
|
|
111
111
|
end
|
112
112
|
|
113
113
|
if [:failure, :broken, :revival, :setup].include?(state)
|
114
|
-
@config[:publisher, :active]
|
114
|
+
active_publishers = @config[:publisher, :active] || 'mail'
|
115
|
+
active_publishers.split(/\W+/).each do |pub|
|
116
|
+
raise "Publisher have no configuration: #{pub}" unless @config[:publisher, pub]
|
117
|
+
clazz = PUBLISHER_TYPES[pub.to_sym]
|
118
|
+
raise "There is no such publisher: #{pub}" unless clazz
|
115
119
|
silence_stream(STDOUT) { #some of publishers like IRC very noisy
|
116
|
-
clazz
|
117
|
-
if clazz
|
118
|
-
clazz.publish(state, self, @config)
|
119
|
-
else
|
120
|
-
raise "There is no such publisher: #{pub}"
|
121
|
-
end
|
120
|
+
clazz.publish(state, self, @config)
|
122
121
|
}
|
123
122
|
end
|
124
123
|
end
|
@@ -4,6 +4,7 @@ require 'cerberus/publisher/base'
|
|
4
4
|
class Cerberus::Publisher::IRC < Cerberus::Publisher::Base
|
5
5
|
def self.publish(state, build, options)
|
6
6
|
irc_options = options[:publisher, :irc]
|
7
|
+
raise "There is no channel provided for IRC publisher" unless irc_options[:channel]
|
7
8
|
subject,body = Cerberus::Publisher::Base.formatted_message(state, build, options)
|
8
9
|
message = subject + "\n" + '*' * subject.length + "\n" + body
|
9
10
|
|
@@ -5,6 +5,8 @@ class Cerberus::Publisher::Jabber < Cerberus::Publisher::Base
|
|
5
5
|
def self.publish(state, build, options)
|
6
6
|
begin
|
7
7
|
jabber_options = options[:publisher, :jabber]
|
8
|
+
raise "There is no recipients provided for Jabber publisher" unless jabber_options[:recipients]
|
9
|
+
|
8
10
|
subject,body = Cerberus::Publisher::Base.formatted_message(state, build, options)
|
9
11
|
|
10
12
|
session = login(jabber_options[:jid], jabber_options[:password])
|
@@ -3,7 +3,10 @@ require 'cerberus/publisher/base'
|
|
3
3
|
|
4
4
|
class Cerberus::Publisher::Mail < Cerberus::Publisher::Base
|
5
5
|
def self.publish(state, build, options)
|
6
|
-
|
6
|
+
mail_opts = options[:publisher, :mail].dup
|
7
|
+
raise "There is no recipients provided for mail publisher" unless mail_opts[:recipients]
|
8
|
+
|
9
|
+
configure(mail_opts)
|
7
10
|
ActionMailerPublisher.deliver_message(state, build, options)
|
8
11
|
end
|
9
12
|
|
data/lib/cerberus/utils.rb
CHANGED
@@ -36,4 +36,16 @@ def `(cmd)
|
|
36
36
|
rescue Exception => e
|
37
37
|
raise "Unable to execute: #{cmd}"
|
38
38
|
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Hash
|
42
|
+
def deep_merge!(second)
|
43
|
+
second.each_pair do |k,v|
|
44
|
+
if self[k].is_a?(Hash) and second[k].is_a?(Hash)
|
45
|
+
self[k].deep_merge!(second[k])
|
46
|
+
else
|
47
|
+
self[k] = second[k]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
39
51
|
end
|
data/lib/cerberus/version.rb
CHANGED
data/test/config_test.rb
CHANGED
@@ -23,4 +23,16 @@ class ConfigTest < Test::Unit::TestCase
|
|
23
23
|
assert_equal 'app', cfg['g']
|
24
24
|
assert_equal 'conf', cfg['m']
|
25
25
|
end
|
26
|
+
|
27
|
+
def test_deep_merge
|
28
|
+
cfg = Cerberus::Config.new
|
29
|
+
cfg.merge!(:hello => {'msg' => {:a202 => 'bye'}})
|
30
|
+
cfg.merge!(:hello => {:msg => {:a203 => 'hello'}})
|
31
|
+
cfg.merge!(:hello => {:msg => {:a204 => 'another'}})
|
32
|
+
cfg.merge!(:hello => {:bread => {:a204 => 'bread'}})
|
33
|
+
|
34
|
+
assert_equal 'bye', cfg[:hello, :msg, :a202]
|
35
|
+
assert_equal 'hello', cfg[:hello, :msg, :a203]
|
36
|
+
assert_equal 'bread', cfg[:hello, :bread, :a204]
|
37
|
+
end
|
26
38
|
end
|
data/test/functional_test.rb
CHANGED
@@ -88,7 +88,7 @@ class FunctionalTest < Test::Unit::TestCase
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def test_have_no_awkward_header
|
91
|
-
add_application('myapp', SVN_URL)
|
91
|
+
add_application('myapp', SVN_URL, 'publisher' => {'active' => 'mail'})
|
92
92
|
|
93
93
|
build = Cerberus::BuildCommand.new('myapp')
|
94
94
|
build.run
|
@@ -97,6 +97,34 @@ class FunctionalTest < Test::Unit::TestCase
|
|
97
97
|
assert_equal 0, build.scm.last_commit_message.index('-' * 72)
|
98
98
|
end
|
99
99
|
|
100
|
+
def test_multiply_publishers_without_configuration
|
101
|
+
add_application('myapp', SVN_URL, 'publisher' => {'active' => 'mail , jabber , irc, dddd'})
|
102
|
+
|
103
|
+
build = Cerberus::BuildCommand.new('myapp')
|
104
|
+
|
105
|
+
begin
|
106
|
+
build.run
|
107
|
+
rescue RuntimeError => e
|
108
|
+
assert_equal 'Publisher have no configuration: jabber', e.message
|
109
|
+
else
|
110
|
+
assert false
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_application_and_config_together
|
115
|
+
add_config('publisher' => {'active' => 'jabber'})
|
116
|
+
add_application('myapp', SVN_URL)
|
117
|
+
build = Cerberus::BuildCommand.new('myapp')
|
118
|
+
|
119
|
+
begin
|
120
|
+
build.run
|
121
|
+
rescue RuntimeError => e
|
122
|
+
assert_equal 'Publisher have no configuration: jabber', e.message
|
123
|
+
else
|
124
|
+
assert false
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
100
128
|
def test_batch_running
|
101
129
|
add_application('myapp1', SVN_URL)
|
102
130
|
add_application('myapp2', SVN_URL)
|
data/test/test_helper.rb
CHANGED
@@ -50,15 +50,19 @@ end"
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def add_application(app_name, url, options = {})
|
53
|
-
opt =
|
54
|
-
|
55
|
-
'
|
56
|
-
|
57
|
-
|
58
|
-
|
53
|
+
opt = {'scm'=>{'url'=>url},
|
54
|
+
'publisher'=>{
|
55
|
+
'mail'=>{'recipients'=>'somebody@com.com', 'delivery_method' => 'test'}
|
56
|
+
}}
|
57
|
+
|
58
|
+
opt.deep_merge!(options)
|
59
59
|
|
60
60
|
dump_yml(HOME + "/config/#{app_name}.yml", opt)
|
61
61
|
end
|
62
|
+
|
63
|
+
def add_config(options)
|
64
|
+
dump_yml(HOME + "/config.yml", options)
|
65
|
+
end
|
62
66
|
end
|
63
67
|
|
64
68
|
require 'cerberus/config'
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: cerberus
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.2.
|
7
|
-
date: 2006-08-
|
6
|
+
version: 0.2.1
|
7
|
+
date: 2006-08-14 00:00:00 +04:00
|
8
8
|
summary: Cerberus is a Continuous Integration tool that could be easily run from Cron.
|
9
9
|
require_paths:
|
10
10
|
- lib
|