cerberus 0.2.3 → 0.2.4

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.
data/CHANGES CHANGED
@@ -1,5 +1,13 @@
1
1
  = Cerberus Changelog
2
2
 
3
+ == Version 0.2.4
4
+ Features release
5
+
6
+ * Fix problem with TLS hack. Now possible to send to SSL and vanilla mailservers without modifying code.
7
+ * Added rant support (http://make.rubyforge.org) [Xavier Shay]
8
+ * Fixed escaping of code in RSS publisher [Xavier Shay]
9
+ * If we have only builder or publisher in configuration then use it. Param :type made mandatory.
10
+
3
11
  == Version 0.2.3
4
12
  Features release
5
13
 
@@ -1,39 +1,5 @@
1
- class Cerberus::Builder::Rake
2
- include Cerberus::Utils
3
- attr_reader :output
4
-
1
+ class Cerberus::Builder::Rake < Cerberus::Builder::RubyBase
5
2
  def initialize(config)
6
- @config = config
3
+ super(config, "rake")
7
4
  end
8
-
9
- def run
10
- Dir.chdir @config[:application_root]
11
- @output = `#{@config[:bin_path]}#{choose_rake_exec()} #{@config[:builder, :rake, :task]} 2>&1`
12
- successful?
13
- end
14
-
15
- def successful?
16
- $?.exitstatus == 0 and not @output.include?('rake aborted!')
17
- end
18
-
19
- private
20
- def choose_rake_exec
21
- ext = ['']
22
-
23
- if os() == :windows
24
- ext << '.bat' << '.cmd'
25
- end
26
-
27
- silence_stream(STDERR) {
28
- ext.each do |e|
29
- begin
30
- out = `#{@config[:bin_path]}rake#{e} --version`
31
- return "rake#{e}" if out =~ /rake/
32
- rescue
33
- end
34
- end
35
- }
36
-
37
- raise "Rake builder did not find. Make sure that such script exists and have executable permissions."
38
- end
39
- end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Cerberus::Builder::Rant < Cerberus::Builder::RubyBase
2
+ def initialize(config)
3
+ super(config, "rant")
4
+ end
5
+ end
@@ -0,0 +1,40 @@
1
+ class Cerberus::Builder::RubyBase
2
+ include Cerberus::Utils
3
+ attr_reader :output
4
+
5
+ def initialize(config, cmd)
6
+ @config = config
7
+ @cmd = cmd
8
+ end
9
+
10
+ def run
11
+ Dir.chdir @config[:application_root]
12
+ @output = `#{@config[:bin_path]}#{choose_exec()} #{@config[:builder, @cmd.to_sym, :task]} 2>&1`
13
+ successful?
14
+ end
15
+
16
+ def successful?
17
+ $?.exitstatus == 0 and not @output.include?("#{@cmd} aborted!")
18
+ end
19
+
20
+ private
21
+ def choose_exec
22
+ ext = ['']
23
+
24
+ if os() == :windows
25
+ ext << '.bat' << '.cmd'
26
+ end
27
+
28
+ silence_stream(STDERR) {
29
+ ext.each do |e|
30
+ begin
31
+ out = `#{@config[:bin_path]}#{@cmd}#{e} --version`
32
+ return "#{@cmd}#{e}" if out =~ /#{@cmd}/
33
+ rescue
34
+ end
35
+ end
36
+ }
37
+
38
+ raise "#{@cmd} builder did not find. Make sure that such script exists and have executable permissions."
39
+ end
40
+ end
@@ -0,0 +1,61 @@
1
+ # http://www.intertwingly.net/blog/2005/09/28/XML-Cleansing
2
+ # Tests available at above
3
+ module XChar
4
+ # http://intertwingly.net/stories/2004/04/14/i18n.html#CleaningWindows
5
+ CP1252 = {
6
+ 128 => 8364, # euro sign
7
+ 130 => 8218, # single low-9 quotation mark
8
+ 131 => 402, # latin small letter f with hook
9
+ 132 => 8222, # double low-9 quotation mark
10
+ 133 => 8230, # horizontal ellipsis
11
+ 134 => 8224, # dagger
12
+ 135 => 8225, # double dagger
13
+ 136 => 710, # modifier letter circumflex accent
14
+ 137 => 8240, # per mille sign
15
+ 138 => 352, # latin capital letter s with caron
16
+ 139 => 8249, # single left-pointing angle quotation mark
17
+ 140 => 338, # latin capital ligature oe
18
+ 142 => 381, # latin capital letter z with caron
19
+ 145 => 8216, # left single quotation mark
20
+ 146 => 8217, # right single quotation mark
21
+ 147 => 8220, # left double quotation mark
22
+ 148 => 8221, # right double quotation mark
23
+ 149 => 8226, # bullet
24
+ 150 => 8211, # en dash
25
+ 151 => 8212, # em dash
26
+ 152 => 732, # small tilde
27
+ 153 => 8482, # trade mark sign
28
+ 154 => 353, # latin small letter s with caron
29
+ 155 => 8250, # single right-pointing angle quotation mark
30
+ 156 => 339, # latin small ligature oe
31
+ 158 => 382, # latin small letter z with caron
32
+ 159 => 376} # latin capital letter y with diaeresis
33
+
34
+ # http://www.w3.org/TR/REC-xml/#dt-chardata
35
+ PREDEFINED = {
36
+ 38 => '&amp;', # ampersand
37
+ 60 => '&lt;', # left angle bracket
38
+ 62 => '&gt;'} # right angle bracket
39
+
40
+ # http://www.w3.org/TR/REC-xml/#charsets
41
+ VALID = [[0x9, 0xA, 0xD], (0x20..0xD7FF),
42
+ (0xE000..0xFFFD), (0x10000..0x10FFFF)]
43
+ end
44
+
45
+ class Fixnum
46
+ # xml escaped version of chr
47
+ def xchr
48
+ n = XChar::CP1252[self] || self
49
+ n = 42 unless XChar::VALID.find {|range| range.include? n}
50
+ XChar::PREDEFINED[n] or (n<128 ? n.chr : "&##{n};")
51
+ end
52
+ end
53
+
54
+ class String
55
+ # xml escaped version of to_s
56
+ def to_xs
57
+ unpack('U*').map {|n| n.xchr}.join # ASCII, UTF-8
58
+ rescue
59
+ unpack('C*').map {|n| n.xchr}.join # ISO-8859-1, WIN-1252
60
+ end
61
+ end
@@ -26,7 +26,8 @@ module Cerberus
26
26
 
27
27
  BUILDER_TYPES = {
28
28
  :maven2 => Cerberus::Builder::Maven2,
29
- :rake => Cerberus::Builder::Rake
29
+ :rake => Cerberus::Builder::Rake,
30
+ :rant => Cerberus::Builder::Rant
30
31
  }
31
32
 
32
33
  class AddCommand
@@ -77,8 +78,6 @@ module Cerberus
77
78
  attr_reader :builder, :success, :scm, :status
78
79
 
79
80
  DEFAULT_CONFIG = {:scm => {:type => 'svn'},
80
- :builder => {:type => 'rake'},
81
- :publisher => {:active => 'mail'},
82
81
  :log => {:enable => true}
83
82
  }
84
83
 
@@ -98,7 +97,7 @@ module Cerberus
98
97
  scm_type = @config[:scm, :type]
99
98
  @scm = SCM_TYPES[scm_type.to_sym].new(@config[:application_root], @config)
100
99
 
101
- builder_type = @config[:builder, :type]
100
+ builder_type = get_configuration_option(@config[:builder], :type, :rake)
102
101
  @builder = BUILDER_TYPES[builder_type.to_sym].new(@config)
103
102
  end
104
103
 
@@ -141,7 +140,7 @@ module Cerberus
141
140
 
142
141
  #send notifications
143
142
  if [:failure, :broken, :revival, :setup].include?(state)
144
- active_publishers = @config[:publisher, :active]
143
+ active_publishers = get_configuration_option(@config[:publisher], :active, 'mail')
145
144
  active_publishers.split(/\W+/).each do |pub|
146
145
  raise "Publisher have no configuration: #{pub}" unless @config[:publisher, pub]
147
146
  clazz = PUBLISHER_TYPES[pub.to_sym]
@@ -163,6 +162,15 @@ module Cerberus
163
162
  end
164
163
  end
165
164
  end
165
+
166
+ private
167
+ def get_configuration_option(hash, defining_key = nil, default_option = nil)
168
+ if hash
169
+ return hash[defining_key] if hash[defining_key]
170
+ return hash.keys[0] if hash.size == 1
171
+ end
172
+ return default_option
173
+ end
166
174
  end
167
175
 
168
176
  class BuildAllCommand
@@ -1,6 +1,10 @@
1
1
  require 'action_mailer'
2
2
  require 'cerberus/publisher/base'
3
- require 'cerberus/publisher/netsmtp_tls_fix'
3
+
4
+ if RUBY_VERSION > '1.8.2'
5
+ #This hack works only on 1.8.4
6
+ require 'cerberus/publisher/netsmtp_tls_fix'
7
+ end
4
8
 
5
9
  class Cerberus::Publisher::Mail < Cerberus::Publisher::Base
6
10
  def self.publish(state, manager, options)
@@ -10,20 +10,21 @@ Net::SMTP.class_eval do
10
10
  sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
11
11
  @socket = Net::InternetMessageIO.new(sock)
12
12
  @socket.read_timeout = 60 #@read_timeout
13
- # @socket.debug_output = STDERR #@debug_output
13
+ #@socket.debug_output = STDERR #@debug_output
14
14
 
15
15
  check_response(critical { recv_response() })
16
16
  do_helo(helodomain)
17
17
 
18
- raise 'openssl library not installed' unless defined?(OpenSSL)
19
- starttls
20
- ssl = OpenSSL::SSL::SSLSocket.new(sock)
21
- ssl.sync_close = true
22
- ssl.connect
23
- @socket = Net::InternetMessageIO.new(ssl)
24
- @socket.read_timeout = 60 #@read_timeout
25
- # @socket.debug_output = STDERR #@debug_output
26
- do_helo(helodomain)
18
+ if starttls
19
+ raise 'openssl library not installed' unless defined?(OpenSSL)
20
+ ssl = OpenSSL::SSL::SSLSocket.new(sock)
21
+ ssl.sync_close = true
22
+ ssl.connect
23
+ @socket = Net::InternetMessageIO.new(ssl)
24
+ @socket.read_timeout = 60 #@read_timeout
25
+ #@socket.debug_output = STDERR #@debug_output
26
+ do_helo(helodomain)
27
+ end
27
28
 
28
29
  authenticate user, secret, authtype if user
29
30
  @started = true
@@ -53,7 +54,8 @@ Net::SMTP.class_eval do
53
54
  end
54
55
 
55
56
  def starttls
56
- getok('STARTTLS')
57
+ getok('STARTTLS') rescue return false
58
+ return true
57
59
  end
58
60
 
59
61
  def quit
@@ -1,4 +1,5 @@
1
1
  require 'cerberus/publisher/base'
2
+ require 'cerberus/helper/xchar.rb'
2
3
 
3
4
  class Cerberus::Publisher::RSS < Cerberus::Publisher::Base
4
5
  def self.publish(state, manager, options)
@@ -6,16 +7,17 @@ class Cerberus::Publisher::RSS < Cerberus::Publisher::Base
6
7
  subject,body = Cerberus::Publisher::Base.formatted_message(state, manager, options)
7
8
 
8
9
  pub_date = Time.now.iso8601
10
+ description = "<pre>#{body}</pre>".to_xs
9
11
  result = <<-END
10
12
  <rss version="2.0">
11
13
  <channel>
12
- <title>Cerberus build feed for #{options[:application_name]}</title>
14
+ <title>Cerberus build feed for #{options[:application_name].to_xs}</title>
13
15
  <pubDate>#{pub_date}</pubDate>
14
16
  <generator>http://rubyforge.org/projects/cerberus</generator>
15
17
  <item>
16
- <title>#{subject}</title>
18
+ <title>#{subject.to_xs}</title>
17
19
  <pubDate>#{pub_date}</pubDate>
18
- <description><pre>#{body}</pre></description>
20
+ <description>#{description}</description>
19
21
  </item>
20
22
  </channel>
21
23
  </rss>
@@ -1,9 +1,5 @@
1
1
  module Cerberus
2
2
  module VERSION #:nodoc:
3
- MAJOR = 0
4
- MINOR = 2
5
- TINY = 3
6
-
7
- STRING = [MAJOR, MINOR, TINY].join('.')
3
+ STRING = '0.2.4'
8
4
  end
9
5
  end
@@ -6,14 +6,16 @@ require 'tempfile'
6
6
 
7
7
  class RSSPublisherTest < Test::Unit::TestCase
8
8
  def test_publisher
9
- rss_file = tf = Tempfile.new('cerberus-rss')
10
- options = Cerberus::Config.new(nil, :publisher => {:rss => {:file => rss_file.path}}, :application_name => 'RSSApp')
9
+ rss_file = Tempfile.new('cerberus-rss')
10
+ options = Cerberus::Config.new(nil, :publisher => {:rss => {:file => rss_file.path}}, :application_name => 'RSS<App')
11
11
  build = DummyManager.new('last message', 'this is output', 1235, 'anatol')
12
12
 
13
13
  Cerberus::Publisher::RSS.publish(:setup, build, options)
14
14
 
15
15
  xml = REXML::Document.new(IO.read(rss_file.path))
16
16
 
17
- assert_equal '[RSSApp] Cerberus set up for project (#1235)', xml.elements["rss/channel/item/title/"].get_text.value
17
+ assert_equal '[RSS<App] Cerberus set up for project (#1235)', xml.elements["rss/channel/item/title/"].get_text.value
18
+ assert_match %r{<pre>last message\n\nthis is output\n\n--\nCerberus 0.\d.\d, http://cerberus.rubyforge.com/</pre>},
19
+ xml.elements["rss/channel/item/description/"].get_text.value
18
20
  end
19
21
  end
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.0.1
2
+ rubygems_version: 0.9.0.4
3
3
  specification_version: 1
4
4
  name: cerberus
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.3
7
- date: 2006-09-18 00:00:00 +04:00
6
+ version: 0.2.4
7
+ date: 2006-09-23 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
@@ -37,6 +37,7 @@ files:
37
37
  - lib/cerberus/config.rb
38
38
  - lib/cerberus/config_migration.rb
39
39
  - lib/cerberus/constants.rb
40
+ - lib/cerberus/helper
40
41
  - lib/cerberus/latch.rb
41
42
  - lib/cerberus/manager.rb
42
43
  - lib/cerberus/publisher
@@ -45,6 +46,9 @@ files:
45
46
  - lib/cerberus/version.rb
46
47
  - lib/cerberus/builder/maven2.rb
47
48
  - lib/cerberus/builder/rake.rb
49
+ - lib/cerberus/builder/rant.rb
50
+ - lib/cerberus/builder/ruby_base.rb
51
+ - lib/cerberus/helper/xchar.rb
48
52
  - lib/cerberus/publisher/base.rb
49
53
  - lib/cerberus/publisher/irc.rb
50
54
  - lib/cerberus/publisher/jabber.rb