rbuilder 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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