BuildMaster 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,5 @@
1
+ module BuildMaster
2
+
1
3
  class Ant
2
4
  include Shell
3
5
  def initialize(ant_file = nil, &command_runner)
@@ -130,3 +132,5 @@ class RubyAnt
130
132
  return value
131
133
  end
132
134
  end
135
+
136
+ end
@@ -1,3 +1,5 @@
1
+ module BuildMaster
2
+
1
3
  class CvsInfo
2
4
  attr_reader :root, :repository
3
5
 
@@ -54,4 +56,6 @@ class CvsClient
54
56
  def commit(comment)
55
57
  command("commit -m \"#{comment}\"")
56
58
  end
59
+ end
60
+
57
61
  end
@@ -1,3 +1,5 @@
1
+ module BuildMaster
2
+
1
3
  class Release
2
4
  def initialize(vcs_driver, builder)
3
5
  @vcs_driver = vcs_driver
@@ -17,3 +19,4 @@ class Release
17
19
  end
18
20
  end
19
21
 
22
+ end
@@ -2,7 +2,6 @@ $:.unshift File.dirname(__FILE__)
2
2
 
3
3
  require 'fileutils'
4
4
  require 'redcloth'
5
- require 'webrick'
6
5
  require 'source_file_handler'
7
6
  require 'file_processor'
8
7
 
@@ -10,6 +9,12 @@ module BuildMaster
10
9
  #todo match only beginning of the file
11
10
  TEXTILE_REGX = /---(-)*\n(.*)\n(-)*---/
12
11
 
12
+ class NullLogger
13
+ def << message
14
+ puts "IGNORED: #{message}"
15
+ end
16
+ end
17
+
13
18
  class SiteSpec
14
19
  def self.get_instance
15
20
  self.new()
@@ -73,29 +78,49 @@ TEXTILE_REGX = /---(-)*\n(.*)\n(-)*---/
73
78
 
74
79
  def build
75
80
  @count = 0
76
- ensure_directory_exists(@spec.output_dir)
77
81
  build_directory(@spec.output_dir, @spec.content_dir, @template)
78
82
  puts "Generated file count: #{@count}"
79
83
  end
80
84
 
81
- def server
85
+ def server(port_number=2000, log_file=$stdout, level=WEBrick::Log::INFO, access_log=nil)
86
+ require 'webrick'
82
87
  mime_types = WEBrick::HTTPUtils::DefaultMimeTypes.update(
83
88
  {"textile" => "text/plain"}
84
89
  )
85
- server = WEBrick::HTTPServer.new(
86
- :Port => 2000,
87
- :Logger => WEBrick::Log.new($stdout, WEBrick::Log::INFO),
88
- :MimeTypes => mime_types
90
+ @server = WEBrick::HTTPServer.new(
91
+ :Port => port_number,
92
+ :Logger => WEBrick::Log.new(log_file, level),
93
+ :MimeTypes => mime_types,
94
+ :AccessLog => access_log
89
95
  )
90
- server.mount('/', SourceFileHandler, @spec)
91
- server.mount('/source', WEBrick::HTTPServlet::FileHandler, @spec.content_dir, true)
96
+ @server.mount('/', SourceFileHandler, @spec)
97
+ @server.mount('/source', WEBrick::HTTPServlet::FileHandler, @spec.content_dir, true)
92
98
  ['INT', 'TERM'].each { |signal|
93
- trap(signal){ server.shutdown}
94
- }
95
- server.start
99
+ trap(signal){ @server.shutdown}
100
+ }
101
+ @server.start
102
+ end
103
+
104
+ def test(port_number=2000)
105
+ launch_server(port_number) {|port_number| SiteTester.test("http://localhost:#{port_number}")}
106
+ end
107
+
108
+ def test_offline(port_number=2000)
109
+ launch_server(port_number) {|port_number| SiteTester.test_offline("http://localhost:#{port_number}")}
96
110
  end
97
111
 
98
112
  private
113
+
114
+ def launch_server(port_number)
115
+ require 'buildmaster/site_tester'
116
+ Thread.new() {server(port_number, NullLogger.new, 0, NullLogger.new)}
117
+ begin
118
+ yield port_number
119
+ ensure
120
+ @server.stop
121
+ end
122
+ end
123
+
99
124
  def ensure_directory_exists(dir_name)
100
125
  if (not File.exist?(dir_name))
101
126
  ensure_directory_exists(File.join(dir_name, '..'))
@@ -104,6 +129,7 @@ TEXTILE_REGX = /---(-)*\n(.*)\n(-)*---/
104
129
  end
105
130
 
106
131
  def build_directory(out_dir, content_dir, template)
132
+ ensure_directory_exists(out_dir)
107
133
  Dir.foreach(content_dir) do |item|
108
134
  content_path = File.join(content_dir, item)
109
135
  if (item == '.' || item == '..' || item == '.svn' || item == 'CVS')
@@ -144,4 +170,5 @@ TEXTILE_REGX = /---(-)*\n(.*)\n(-)*---/
144
170
  end
145
171
 
146
172
  end
173
+
147
174
  end
@@ -0,0 +1,129 @@
1
+ module BuildMaster
2
+
3
+ require 'watir'
4
+ require 'set'
5
+
6
+ class SiteTester
7
+ URL_PATTERN = /^https?\:\/\/([^\/]*)/
8
+
9
+ def SiteTester.test(url)
10
+ for_url(url, true).start
11
+ end
12
+
13
+ def SiteTester.test_offline(url)
14
+ for_url(url, false).start
15
+ end
16
+
17
+ def SiteTester.for_url(url, check_external_link)
18
+ ie = Watir::IE.start(url)
19
+ return SiteTester.new(ie, check_external_link)
20
+ end
21
+
22
+ def initialize(ie, check_external_link)
23
+ @ie = ie
24
+ @host = get_host(@ie.url)
25
+ @errors = Hash.new
26
+ @visited_pages = Set.new
27
+ @check_external_link = check_external_link
28
+ end
29
+
30
+ def start
31
+ check_page
32
+ @ie.close
33
+ if (@errors.size == 0)
34
+ puts "SUCCESS: NO BROKEN LINK FOUND"
35
+ else
36
+ puts "FAILED"
37
+ end
38
+ end
39
+
40
+ private
41
+ def get_host(url)
42
+ url =~ URL_PATTERN
43
+ return $1
44
+ end
45
+
46
+ def check_page
47
+ if (@visited_pages.include?(@ie.url))
48
+ return
49
+ end
50
+ @visited_pages.add(@ie.url)
51
+ check_links
52
+ errors = @errors[@ie.url]
53
+ if (errors && errors.length > 0)
54
+ report(@ie.url, errors)
55
+ end
56
+ end
57
+
58
+ def check_links
59
+ current = @ie.url
60
+ @ie.links.each do |link|
61
+ if (@host == get_host(link.href))
62
+ click_link(link) {check_page}
63
+ elsif (@check_external_link == true)
64
+ click_link(link) { }
65
+ else
66
+ flash(link)
67
+ next
68
+ end
69
+ go_back(current)
70
+ end
71
+ end
72
+
73
+ def go_back(expected_url)
74
+ @ie.goto(expected_url)
75
+ end
76
+
77
+ def log
78
+ yield
79
+ end
80
+
81
+ def flash(element)
82
+ element.flash
83
+ end
84
+
85
+ def click_link(link)
86
+ from_location = @ie.url
87
+ link_string = link.to_s
88
+ begin
89
+ link.click
90
+ yield
91
+ rescue Watir::Exception::NavigationException => e
92
+ register_broken_link(from_location, link_string)
93
+ end
94
+ end
95
+
96
+ def flash(link) #copied from watir because it is private there
97
+ ole = link.getOLEObject
98
+ original_color = ole.style.backgroundColor
99
+ high_light(ole, 'yellow')
100
+ high_light(ole, original_color)
101
+ end
102
+
103
+ def high_light(ole_object, color)
104
+ ole_object.style.backgroundColor = color
105
+ sleep(0.05)
106
+ end
107
+
108
+ def register_broken_link(from_location, link_string)
109
+ links = @errors[from_location]
110
+ if (not links)
111
+ links = []
112
+ @errors[from_location] = links
113
+ end
114
+ links.push(link_string)
115
+ end
116
+
117
+ def report(url, links)
118
+ puts "#{url}"
119
+ puts "--------------------------------"
120
+ links.each do |link|
121
+ puts "#{link}"
122
+ puts "--------------------------------"
123
+ end
124
+ puts "################################"
125
+ end
126
+
127
+ end
128
+
129
+ end
@@ -7,10 +7,10 @@ module BuildMaster
7
7
 
8
8
  class SourceFileHandler < WEBrick::HTTPServlet::AbstractServlet
9
9
  # uncomment the following for automatic servlet reloading
10
- def SourceFileHandler.get_instance config, *options
11
- load __FILE__
12
- SourceFileHandler.new config, *options
13
- end
10
+ # def SourceFileHandler.get_instance config, *options
11
+ # load __FILE__
12
+ # SourceFileHandler.new config, *options
13
+ # end
14
14
 
15
15
  def initialize(server, spec)
16
16
  super
@@ -47,17 +47,18 @@ class SourceFileHandler < WEBrick::HTTPServlet::AbstractServlet
47
47
  textile_file = "#{file_path}.textile"
48
48
  html_file = "#{file_path}.html"
49
49
  if File.file? textile_file
50
- stats = File::stat(textile_file)
50
+ # stats = File::stat(textile_file)
51
51
  document = FileProcessor.new(@spec.load_template, textile_file, @spec).process_textile()
52
52
  elsif File.file? html_file
53
- stats = File::stat(html_file)
53
+ # stats = File::stat(html_file)
54
54
  document = FileProcessor.new(@spec.load_template, html_file, @spec).process_html()
55
55
  end
56
56
  if (document)
57
57
  content = document.to_s
58
58
  res['content-type'] = 'text/html'
59
59
  res['content-length'] = content.length
60
- res['last-modified'] = stats.mtime.httpdate
60
+ # res['last-modified'] = stats.mtime.httpdate
61
+ res['last-modified'] = DateTime.now
61
62
  res.body = content
62
63
  else
63
64
  @delegate.service(req, res)
@@ -3,6 +3,8 @@ $:.unshift File.join(File.dirname(__FILE__), "..", "..", "lib")
3
3
  require 'test/unit'
4
4
  require 'buildmaster'
5
5
 
6
+ module BuildMaster
7
+
6
8
  class AntTest < Test::Unit::TestCase
7
9
  protected
8
10
  def setup
@@ -25,3 +27,5 @@ class AntTest < Test::Unit::TestCase
25
27
  assert_raise(RuntimeError) {@ant.target('failing')}
26
28
  end
27
29
  end
30
+
31
+ end
@@ -3,6 +3,8 @@ $:.unshift File.join(File.dirname(__FILE__), "..", "..", "lib")
3
3
  require 'test/unit'
4
4
  require 'buildmaster'
5
5
 
6
+ module BuildMaster
7
+
6
8
  class CvsClientTest < Test::Unit::TestCase
7
9
  protected
8
10
  def setUp()
@@ -60,3 +62,5 @@ class CvsClientTest < Test::Unit::TestCase
60
62
  end
61
63
 
62
64
  end
65
+
66
+ end
@@ -4,6 +4,8 @@ require 'test/unit'
4
4
  require 'buildmaster'
5
5
  require 'mock'
6
6
 
7
+ module BuildMaster
8
+
7
9
  class ReleaseTest < Test::Unit::TestCase
8
10
  def testRelease
9
11
  cvs_mock = Mock.new(CvsClient)
@@ -20,4 +22,6 @@ class ReleaseTest < Test::Unit::TestCase
20
22
  cvs_mock.verify
21
23
  builder_mock.verify
22
24
  end
25
+ end
26
+
23
27
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.10
3
3
  specification_version: 1
4
4
  name: BuildMaster
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.5.0
7
- date: 2006-06-02
6
+ version: 0.6.0
7
+ date: 2006-06-20
8
8
  summary: "A project that hosts a series of scripts to be used in project building, project
9
9
  releasing, and site building."
10
10
  require_paths:
@@ -40,6 +40,7 @@ files:
40
40
  - lib/buildmaster/run_ant.rb
41
41
  - lib/buildmaster/shell_command.rb
42
42
  - lib/buildmaster/site.rb
43
+ - lib/buildmaster/site_tester.rb
43
44
  - lib/buildmaster/source_file_handler.rb
44
45
  - lib/buildmaster/svn_driver.rb
45
46
  - lib/buildmaster/template_runner.rb