rbuilder 0.0.1

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.
Files changed (42) hide show
  1. data/Rakefile +47 -0
  2. data/bin/rbuilder +65 -0
  3. data/conf/example.conf +2 -0
  4. data/rbuilder/build.rb +50 -0
  5. data/rbuilder/build_command.rb +33 -0
  6. data/rbuilder/build_configuration.rb +21 -0
  7. data/rbuilder/build_description.rb +46 -0
  8. data/rbuilder/build_report.rb +40 -0
  9. data/rbuilder/build_status.rb +39 -0
  10. data/rbuilder/builder.rb +45 -0
  11. data/rbuilder/gui.rb +6 -0
  12. data/rbuilder/gui/build_details_pane.rb +105 -0
  13. data/rbuilder/gui/build_list_view_entry.rb +33 -0
  14. data/rbuilder/gui/builder_list_view.rb +92 -0
  15. data/rbuilder/gui/builder_monitor_window.rb +112 -0
  16. data/rbuilder/gui/images.rb +5 -0
  17. data/rbuilder/gui/images/broken_builder.gif +0 -0
  18. data/rbuilder/gui/images/building.gif +0 -0
  19. data/rbuilder/gui/images/failed.gif +0 -0
  20. data/rbuilder/gui/images/ok.gif +0 -0
  21. data/rbuilder/gui/images/ok_builder.gif +0 -0
  22. data/rbuilder/lib/observer.rb +7 -0
  23. data/rbuilder/libs.rb +4 -0
  24. data/rbuilder/revision_committed.rb +21 -0
  25. data/rbuilder/source_control.rb +3 -0
  26. data/rbuilder/source_control/status.rb +23 -0
  27. data/rbuilder/source_control/svn.rb +64 -0
  28. data/rbuilder/source_control/tracker.rb +36 -0
  29. data/tests/gui/test_build_details_pane.rb +118 -0
  30. data/tests/gui/test_builder_list_view.rb +202 -0
  31. data/tests/gui/test_builder_list_view_entry.rb +79 -0
  32. data/tests/gui/test_builder_monitor_window.rb +81 -0
  33. data/tests/source_control/test_source_control.rb +52 -0
  34. data/tests/source_control/test_svn.rb +60 -0
  35. data/tests/test_build.rb +111 -0
  36. data/tests/test_build_command.rb +57 -0
  37. data/tests/test_build_configuration.rb +31 -0
  38. data/tests/test_build_description.rb +106 -0
  39. data/tests/test_build_report.rb +56 -0
  40. data/tests/test_builder.rb +54 -0
  41. data/tests/test_revision_comitted.rb +30 -0
  42. metadata +104 -0
@@ -0,0 +1,202 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'mocha'
4
+ require File.join(File.dirname(__FILE__), '..', 'builder_test_env')
5
+ require 'rbuilder/gui'
6
+
7
+ module Gui
8
+
9
+ class TestBuilderListViewCreation < Test::Unit::TestCase
10
+ def test_creates_builder_list_view_and_build_description_list_view_for_each_build_description
11
+ builder = mock
12
+ build_description1 = mock('build_description1')
13
+ build_description2 = mock('build_description2')
14
+ build_description1.expects(:add_observer).with(instance_of(BuildDescriptionListView))
15
+ build_description2.expects(:add_observer).with(instance_of(BuildDescriptionListView))
16
+ builder.expects(:each_description).multiple_yields([build_description1], [build_description2])
17
+ builder_list_view = BuilderListView.new(builder)
18
+
19
+ end
20
+ def test_setting_monitor_window_sets_the_monitor_window_attribute
21
+ builder_list_view = BuilderListView.new(builder = stub_everything)
22
+ monitor_window = stub
23
+ builder_list_view.monitor_window = monitor_window
24
+ assert_equal(monitor_window, builder_list_view.monitor_window)
25
+ end
26
+ end
27
+
28
+ class TestBuilderListView < Test::Unit::TestCase
29
+ attr_reader :builder_list_view, :builder
30
+ def setup
31
+ builder = stub_everything
32
+
33
+ @builder_list_view = BuilderListView.new(builder)
34
+ end
35
+
36
+ def test_has_tree_store_and_tree_view
37
+ assert_equal Gtk::TreeStore, builder_list_view.tree_store.class
38
+ assert_equal Gtk::TreeView, builder_list_view.tree_view.class
39
+ end
40
+
41
+ def test_tree_views_model_is_tree_store
42
+ assert_same(builder_list_view.tree_store, builder_list_view.tree_view.model)
43
+ end
44
+
45
+ def test_tree_models_column_types
46
+ assert_equal(String, builder_list_view.tree_store.get_column_type(1))
47
+ assert_equal(String, builder_list_view.tree_store.get_column_type(2))
48
+ assert_equal(String, builder_list_view.tree_store.get_column_type(3))
49
+ assert_equal(String, builder_list_view.tree_store.get_column_type(4))
50
+ assert_equal(String, builder_list_view.tree_store.get_column_type(5))
51
+ end
52
+
53
+ def test_create_build_description_list_view_creates_one_with_the_store_and_build_description
54
+ build_description = stub_everything
55
+
56
+ build_description_list_view = builder_list_view.create_build_description_list_view(build_description)
57
+
58
+ assert_same builder_list_view, build_description_list_view.builder_list_view
59
+ assert_same builder_list_view.tree_store, build_description_list_view.tree_store
60
+ assert_same build_description, build_description_list_view.build_description
61
+ end
62
+
63
+ def test_has_scrolled_window_as_gtk_container
64
+ assert builder_list_view.gtk_container.instance_of?(Gtk::ScrolledWindow)
65
+ end
66
+
67
+
68
+ def test_build_for_iterator
69
+ expected_build = Object.new
70
+ iterator = [buildlist_entry = mock]
71
+ buildlist_entry.stubs(:build).returns expected_build
72
+ assert_same expected_build, builder_list_view.build_for_iterator(iterator)
73
+ end
74
+ end
75
+
76
+ class TestBuilderListView_BuildSelection_when_no_build_is_selected < Test::Unit::TestCase
77
+ attr_reader :builder_list_view, :monitor_window, :new_selected_build
78
+ def setup
79
+ @monitor_window = mock
80
+ @builder_list_view = BuilderListView.new(builder = stub_everything)
81
+ builder_list_view.monitor_window = monitor_window
82
+ @new_selected_build = Object.new
83
+ end
84
+
85
+ def test_select_build_notifies_monitor_window
86
+ monitor_window.expects(:build_selected).with(new_selected_build)
87
+ builder_list_view.select_build(new_selected_build)
88
+ end
89
+
90
+ def test_replace_build_selection_selects_new_build_if_no_build_was_selected
91
+ current_selected_build = Object.new
92
+ monitor_window.expects(:build_selected).with(new_selected_build)
93
+ builder_list_view.replace_build_selection(new_selected_build, current_selected_build)
94
+ end
95
+ end
96
+
97
+ class TestBuilderListView_BuildSelection_when_a_build_is_selected < Test::Unit::TestCase
98
+ attr_reader :builder_list_view, :monitor_window, :new_selected_build, :current_selected_build
99
+ def setup
100
+ @new_selected_build = Object.new
101
+ @current_selected_build = Object.new
102
+ @monitor_window = mock
103
+ monitor_window.stubs(:build_selected).with(current_selected_build)
104
+ @builder_list_view = BuilderListView.new(builder = stub_everything)
105
+ builder_list_view.monitor_window = monitor_window
106
+ builder_list_view.select_build(current_selected_build)
107
+ end
108
+
109
+ def test_select_build_notifies_monitor_window
110
+ monitor_window.expects(:build_selected).with(new_selected_build)
111
+ builder_list_view.select_build(new_selected_build)
112
+ end
113
+
114
+ def test_replace_build_selection_selects_new_build_if_selection_to_replace_matches_current_selection
115
+ monitor_window.expects(:build_selected).with(new_selected_build)
116
+ builder_list_view.replace_build_selection(new_selected_build, current_selected_build)
117
+ end
118
+
119
+ def test_replace_build_selection_selects_nothing_if_selection_to_replace_does_not_match_current_selection
120
+ not_currently_selected_build = Object.new
121
+ monitor_window.expects(:build_selected).with(new_selected_build).never
122
+ builder_list_view.replace_build_selection(new_selected_build, not_currently_selected_build)
123
+ end
124
+
125
+ end
126
+
127
+ class TestBuildDescriptionListViewCreation < Test::Unit::TestCase
128
+ attr_reader :build_description
129
+ def setup
130
+ @build_description = stub_everything
131
+ end
132
+
133
+ def test_observes_build_description
134
+ build_description.expects(:add_observer).with(instance_of(BuildDescriptionListView))
135
+ BuildDescriptionListView.new(build_description, nil)
136
+ end
137
+
138
+ end
139
+
140
+ class TestBuildDescriptionListView_EntryCreation < Test::Unit::TestCase
141
+ attr_reader :view, :build, :tree_store, :root_of_tree, :on_top_below_root
142
+
143
+ def setup
144
+ build_description = stub_everything
145
+ @build = stub_everything
146
+ @root_of_tree = []
147
+ @on_top_below_root = []
148
+ @tree_store = stub(:append => root_of_tree, :prepend => on_top_below_root)
149
+ @view = BuildDescriptionListView.new(build_description, nil, tree_store)
150
+ end
151
+
152
+ def test_update_with_new_build_creates_new_entry_if_none_exists
153
+ build_list_view_entry = stub
154
+ BuildListViewEntry.expects(:create).with(build,root_of_tree).returns build_list_view_entry
155
+ view.update :new_build => build
156
+ end
157
+
158
+ def test_update_with_new_build_creates_new_entry_and_current_entry_attaches_to_new_iterator
159
+ build_list_view_entry1 = stub(:iterator => root_of_tree, :build => build)
160
+ BuildListViewEntry.expects(:create).with(build, root_of_tree).returns build_list_view_entry1
161
+ view.update :new_build => build
162
+
163
+
164
+ build2 = stub_everything('build2')
165
+ build_list_view_entry2 = stub(:build => build)
166
+
167
+ build_list_view_entry1.expects(:attach_to).with(on_top_below_root)
168
+ BuildListViewEntry.expects(:create).with(build2, root_of_tree).returns build_list_view_entry2
169
+
170
+ view.update :new_build => build2
171
+ end
172
+
173
+
174
+ end
175
+
176
+ class TestBuildDescriptionListViewSelectionHandling < Test::Unit::TestCase
177
+ attr_reader :build_description, :view, :builder_view, :build1
178
+ def setup
179
+ @build1 = stub_everything('build1')
180
+ @build_description = stub_everything
181
+ tree_store = stub(:append => [], :prepend => [])
182
+ @builder_view = mock
183
+ @view = BuildDescriptionListView.new(build_description, builder_view, tree_store)
184
+ end
185
+
186
+ def test_auto_selects_build_when_no_row_selected
187
+ builder_view.expects(:replace_build_selection).with(build1, nil)
188
+ view.update(:new_build => build1)
189
+ end
190
+
191
+ def test_update_replace_previous_build_selection_if_previous_build_present
192
+ build2 = stub_everything('build2')
193
+ builder_view.expects(:replace_build_selection).with(build1, nil)
194
+ view.update(:new_build => build1)
195
+ builder_view.expects(:replace_build_selection).with(build2, build1)
196
+ view.update(:new_build => build2)
197
+ end
198
+
199
+ end
200
+
201
+
202
+ end
@@ -0,0 +1,79 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'mocha'
4
+ require File.join(File.dirname(__FILE__), '..', 'builder_test_env')
5
+ require 'rbuilder/gui'
6
+
7
+ module Gui
8
+ class TestBuilderListViewEntryCreation < Test::Unit::TestCase
9
+ attr_reader :build
10
+ def setup
11
+ @build = stub_everything
12
+ end
13
+ def test_observes_build
14
+ build.expects(:add_observer).with(instance_of(BuildListViewEntry))
15
+ BuildListViewEntry.new(build)
16
+ end
17
+
18
+ def test_attaches_to_tree_view_iterator
19
+ tree_view_iterator = []
20
+ entry = BuildListViewEntry.create(build, tree_view_iterator)
21
+ assert_same tree_view_iterator, entry.iterator
22
+ end
23
+ end
24
+
25
+ class TestBuilderListViewEntry < Test::Unit::TestCase
26
+ attr_reader :build, :entry, :tree_view_iterator
27
+ def setup
28
+ @build = stub(:add_observer => nil, :archive => 'the_archive', :revision => 123, :status => BuildStatus.building, :summary => nil, :committer => 'westgeer')
29
+ @entry = BuildListViewEntry.new(build)
30
+ @tree_view_iterator = []
31
+ end
32
+
33
+ def test_attach_to_tree_view_iterator_sets_revision_and_status_values
34
+ entry.attach_to(tree_view_iterator)
35
+ assert_equal [entry, 'the_archive', '123', 'westgeer', 'building', ''], tree_view_iterator
36
+ end
37
+
38
+ def test_update_updates_tree_view_iterator
39
+ entry.attach_to(tree_view_iterator)
40
+ build.stubs(:archive => 'some_archive', :revision => 300, :status => BuildStatus.ok,:summary => 'done', :committer => 'westgeer')
41
+ entry.update
42
+ assert_equal [entry, 'some_archive', '300', 'westgeer', 'ok', 'done'], tree_view_iterator
43
+ end
44
+ end
45
+
46
+ class TestRendererAttributesUpdate < Test::Unit::TestCase
47
+ attr_reader :build, :entry, :renderer
48
+ def setup
49
+ @renderer = mock('renderer')
50
+ @build = stub_everything
51
+ @entry = BuildListViewEntry.new(build)
52
+ end
53
+
54
+ def test_renderer_background_is_red_when_builder_status_is_failed
55
+ build.stubs(:status).returns BuildStatus.failed
56
+ renderer.expects(:background=).with('red')
57
+ entry.update_renderer_style(renderer)
58
+ end
59
+
60
+ def test_renderer_background_is_green_when_builder_status_is_ok
61
+ build.stubs(:status).returns BuildStatus.ok
62
+ renderer.expects(:background=).with('green')
63
+ entry.update_renderer_style(renderer)
64
+ end
65
+
66
+ def test_renderer_background_is_yellow_when_builder_status_is_building
67
+ build.stubs(:status).returns BuildStatus.building
68
+ renderer.expects(:background=).with('yellow')
69
+ entry.update_renderer_style(renderer)
70
+ end
71
+
72
+ def test_renderer_background_is_not_changed_when_status_is_invalid
73
+ build.stubs(:status).returns 'bogus'
74
+ renderer.expects(:background=).never
75
+ entry.update_renderer_style(renderer)
76
+ end
77
+ end
78
+
79
+ end
@@ -0,0 +1,81 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'mocha'
4
+ require File.join(File.dirname(__FILE__), '..', 'builder_test_env')
5
+ require 'rbuilder/gui'
6
+
7
+ module Gui
8
+ class TestBuilderMonitorWindowCreation < Test::Unit::TestCase
9
+ attr_reader :builder_list_view, :build_details_pane
10
+ def setup
11
+ @builder_list_view = stub_everything('builder_list_view')
12
+ builder_list_view.stubs(:gtk_container).returns(Gtk::Label.new)
13
+ @build_details_pane = stub('build_details_pane',:gtk_container => Gtk::Label.new)
14
+ end
15
+
16
+ def test_sets_monitor_window_on_builder_list_view
17
+ builder = stub(:status => BuilderState.ok)
18
+ builder.expects(:add_observer).with(instance_of(BuilderMonitorWindow))
19
+ builder_list_view.expects(:monitor_window=).with(instance_of(BuilderMonitorWindow))
20
+ window = BuilderMonitorWindow.new(builder, builder_list_view, build_details_pane)
21
+ end
22
+ end
23
+
24
+ class TestBuilderMonitorWindow < Test::Unit::TestCase
25
+ attr_reader :builder_list_view, :build_details_pane, :window, :builder
26
+ def setup
27
+ @builder = stub(:status => BuilderState.ok, :add_observer => nil)
28
+ @builder_list_view = stub_everything('builder_list_view')
29
+ builder_list_view.stubs(:gtk_container).returns(Gtk::Label.new)
30
+ @build_details_pane = stub('build_details_pane',:gtk_container => Gtk::Label.new)
31
+ @window = BuilderMonitorWindow.new(builder, builder_list_view, build_details_pane)
32
+
33
+ end
34
+
35
+ def test_attaches_builder_details_view_on_selecting_a_build
36
+ build = Object
37
+ build_details_pane.expects(:attach_to).with(build)
38
+ window.build_selected(build)
39
+ end
40
+
41
+ def test_show_shows_all
42
+ window.window.expects :show_all
43
+ window.show
44
+ end
45
+
46
+ def test_hide_hides_all
47
+ window.window.expects :hide_all
48
+ window.hide
49
+ end
50
+
51
+ def test_toggle_hides_if_shown
52
+ window.window.stubs(:visible?).returns true
53
+ window.window.expects :hide_all
54
+ window.toggle
55
+ end
56
+
57
+ def test_toggle_shows_if_hidden
58
+ window.hide
59
+ window.window.expects :show_all
60
+ window.toggle
61
+ end
62
+
63
+ def test_status_of_icon_initially_set_to_ok
64
+ assert_equal 'ok_builder', window.status_icon.status
65
+ end
66
+
67
+ def test_update_sets_status_icon_to_broken_if_status_is_broken
68
+ builder.stubs(:status => BuilderState.broken)
69
+ window.update
70
+ assert_equal 'broken_builder', window.status_icon.status
71
+ end
72
+
73
+ def test_update_sets_status_icon_to_ok_if_status_is_broken
74
+ window.update
75
+ assert_equal 'ok_builder', window.status_icon.status
76
+ end
77
+
78
+ end
79
+
80
+
81
+ end
@@ -0,0 +1,52 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'mocha'
4
+ require File.join(File.dirname(__FILE__), '..', 'builder_test_env')
5
+ require 'rbuilder/source_control'
6
+
7
+
8
+ class TestSourceControlCheck < Test::Unit::TestCase
9
+ attr_reader :svn, :source_control, :builder
10
+
11
+ def setup
12
+ @svn = stub(:working_dir => 'the_working_dir', :archive => 'the_archive_name')
13
+ @source_control = SourceControl.new(svn)
14
+ @builder = mock
15
+ end
16
+
17
+
18
+ def expect_new_revision_committed_on_builder(last_commit)
19
+ svn.stubs(:get_info).returns(last_commit)
20
+ builder.expects(:new_revision_committed).with(last_commit)
21
+ end
22
+
23
+ def expect_no_new_revision_committed_on_builder(last_commit)
24
+ svn.stubs(:get_info).returns(last_commit)
25
+ builder.expects(:new_revision_committed).with(last_commit).never
26
+ end
27
+
28
+ def test_working_dir
29
+ assert_equal 'the_working_dir', source_control.working_dir
30
+ end
31
+
32
+ def test_archive
33
+ assert_equal 'the_archive_name', source_control.archive
34
+
35
+ end
36
+
37
+ def test_generates_new_revision_committed_when_source_control_status_has_changed
38
+ expect_new_revision_committed_on_builder(SourceControl::Status.new(35, 'westgeest'))
39
+ source_control.report_change_to(builder)
40
+
41
+ expect_new_revision_committed_on_builder(SourceControl::Status.new(36, 'harry'))
42
+ source_control.report_change_to(builder)
43
+ end
44
+
45
+ def test_generates_nothing_when_source_control_revision_was_not_changed
46
+ expect_new_revision_committed_on_builder(SourceControl::Status.new(35, 'westgeest'))
47
+ source_control.report_change_to(builder)
48
+
49
+ expect_no_new_revision_committed_on_builder(SourceControl::Status.new(35, 'westgeest'))
50
+ source_control.report_change_to(builder)
51
+ end
52
+ end
@@ -0,0 +1,60 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'mocha'
4
+ require File.join(File.dirname(__FILE__), '..', 'builder_test_env')
5
+ require 'rbuilder/source_control'
6
+
7
+ module SourceControl
8
+ class TestSvnBackEndTrackerFactory < Test::Unit::TestCase
9
+
10
+ def test_svn_factory_method_returns_tracker_with_svn_backend
11
+ svn_tracker = SourceControl.svn('.')
12
+ assert_equal Svn, svn_tracker.backend.class
13
+ end
14
+ end
15
+
16
+ class TestSvnBackEnd < Test::Unit::TestCase
17
+ attr_reader :svn
18
+ def setup
19
+ @svn = SourceControl.svn_backend('.')
20
+ end
21
+
22
+ def test_working_dir_returns_working_dir
23
+ assert_equal '.', svn.working_dir
24
+ end
25
+
26
+ def test_archive_returns_name_of_archive
27
+ svn.stubs(:run_info).returns svn_output_for(:repo_root => 'the_repo_root')
28
+ assert_equal 'the_repo_root', svn.archive
29
+ end
30
+
31
+ def test_archive_strips_server_and_trunk_if_possible
32
+ svn.stubs(:run_info).returns svn_output_for(:repo_root => 'svn+ssh://yosemite/home/svn/rbuilder/trunk')
33
+ assert_equal 'home/svn/rbuilder', svn.archive
34
+ end
35
+
36
+ def test_info_returns_info_struct_with_revision_and_committer
37
+ svn.stubs(:run_info).returns svn_output_for(:author => 'westgeest', :revision => '1')
38
+ assert_equal Status.new(1, 'westgeest'), svn.get_info
39
+ svn.stubs(:run_info).returns svn_output_for(:author => 'harry', :revision => '2')
40
+ assert_equal Status.new(2, 'harry'), svn.get_info
41
+ end
42
+
43
+ private
44
+ def svn_output_for(args = {})
45
+ args = {:repo_root => 'svn+ssh://yosemite/home/svn/rbuilder', :author => 'harry', :revision => '2'}.merge args
46
+ %Q{
47
+ Path: .
48
+ URL: svn+ssh://yosemite/home/svn/rbuilder/trunk
49
+ Repository Root: #{args[:repo_root]}
50
+ Repository UUID: f125cab9-89fe-4a65-988d-b833e1c403a1
51
+ Revision: #{args[:revision]}
52
+ Node Kind: directory
53
+ Schedule: normal
54
+ Last Changed Author: #{args[:author]}
55
+ Last Changed Rev: #{args[:revision]}
56
+ Last Changed Date: 2007-12-21 23:31:23 +0100 (Fri, 21 Dec 2007)
57
+ }.gsub(/^ +/,'')
58
+ end
59
+ end
60
+ end