polisher 0.3 → 0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +84 -14
- data/Rakefile +21 -19
- data/TODO +5 -4
- data/bin/server +1 -0
- data/config/polisher.yml +0 -15
- data/db/connection.rb +13 -10
- data/db/migrations/{002_create_managed_gems.rb → 001_create_projects.rb} +4 -5
- data/db/migrations/{001_create_sources.rb → 002_create_sources.rb} +1 -3
- data/db/migrations/003_create_project_source_versions.rb +28 -0
- data/db/migrations/{003_create_events.rb → 004_create_events.rb} +2 -2
- data/db/migrations/005_create_project_dependencies.rb +28 -0
- data/db/models/event.rb +47 -21
- data/db/models/project.rb +110 -0
- data/db/models/project_dependency.rb +27 -0
- data/db/models/project_source_version.rb +31 -0
- data/db/models/source.rb +82 -16
- data/lib/common.rb +37 -5
- data/lib/dsl.rb +292 -0
- data/lib/event_handlers.rb +139 -73
- data/lib/gem_adapter.rb +94 -0
- data/polisher.rb +302 -50
- data/public/stylesheets/style.css +15 -31
- data/spec/common_spec.rb +28 -0
- data/spec/dsl_spec.rb +357 -0
- data/spec/event_handlers_spec.rb +166 -30
- data/spec/gem_adapter_spec.rb +89 -0
- data/spec/models_spec.rb +635 -107
- data/spec/polisher_spec.rb +496 -56
- data/views/layout.haml +3 -5
- data/views/projects/index.haml +42 -0
- data/views/projects/index.html.haml +38 -0
- data/views/result.haml +9 -0
- data/views/sources/index.haml +24 -41
- data/views/sources/index.html.haml +26 -0
- metadata +131 -12
- data/db/models/managed_gem.rb +0 -111
- data/public/javascripts/jquery-1.2.6.min.js +0 -32
- data/public/javascripts/polisher.js +0 -15
- data/views/gems/index.haml +0 -106
data/spec/event_handlers_spec.rb
CHANGED
@@ -16,59 +16,107 @@ require 'fileutils'
|
|
16
16
|
|
17
17
|
require File.dirname(__FILE__) + '/spec_helper'
|
18
18
|
|
19
|
-
|
19
|
+
include EventHandlers
|
20
20
|
|
21
|
-
describe "
|
21
|
+
describe "EventHandlers" do
|
22
|
+
|
23
|
+
before(:all) do
|
24
|
+
@gem = Project.create! :name => 'rubygem-polisher'
|
25
|
+
@gem.primary_source = Source.new :name => 'polisher', :source_type => 'gem', :uri => 'http://rubygems.org/gems/polisher-%{version}.gem'
|
26
|
+
@gem_event0 = Event.create! :project => @gem, :process => 'download_sources'
|
27
|
+
@gem_event1 = Event.create! :project => @gem, :process => 'create_rpm_package', :process_options => "mock=fedora-12-x86_64"
|
28
|
+
|
29
|
+
@gem_event2 = Event.create! :project => @gem, :process => 'create_rpm_package',
|
30
|
+
:process_options => "spec=#{ARTIFACTS_DIR}/templates/polisher.spec.tpl;mock=fedora-12-x86_64"
|
31
|
+
|
32
|
+
@gem_event3 = Event.create! :project => @gem, :process => 'update_repo', :process_options => "#{ARTIFACTS_DIR}/repos/fedora-ruby"
|
33
|
+
|
34
|
+
@project = Project.create :name => 'ruby-activerecord'
|
35
|
+
@project.sources << Source.new(:name => 'activerecord', :source_type => 'file',
|
36
|
+
:uri => 'http://rubyforge.org/frs/download.php/%{level}/activerecord-%{version}.tgz')
|
37
|
+
|
38
|
+
@project_event0 = Event.create! :project => @project, :process => 'download_sources', :process_options => "level=28874"
|
39
|
+
@project_event1 = Event.create! :project => @project, :process => 'create_rpm_package',
|
40
|
+
:process_options => "spec=#{ARTIFACTS_DIR}/templates/polisher-projects.spec.tpl;mock=fedora-12-x86_64"
|
41
|
+
|
42
|
+
@project_event2 = Event.create! :project => @project, :process => 'update_repo', :process_options => "#{ARTIFACTS_DIR}/repos/fedora-ruby"
|
43
|
+
end
|
22
44
|
|
23
45
|
before(:each) do
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
46
|
+
FileUtils.rm_rf(ARTIFACTS_DIR) if File.directory? ARTIFACTS_DIR
|
47
|
+
FileUtils.mkdir_p(ARTIFACTS_DIR + '/repos')
|
48
|
+
FileUtils.mkdir_p(ARTIFACTS_DIR + '/SOURCES')
|
49
|
+
FileUtils.mkdir_p(ARTIFACTS_DIR + '/SPECS')
|
50
|
+
FileUtils.mkdir_p(ARTIFACTS_DIR + '/templates')
|
51
|
+
|
52
|
+
File.write(ARTIFACTS_DIR + '/templates/polisher.spec.tpl', POLISHER_GEM2RPM_TEST_TEMPLATE)
|
53
|
+
File.write(ARTIFACTS_DIR + '/templates/polisher-projects.spec.tpl', POLISHER_ERB_TEST_TEMPLATE)
|
54
|
+
end
|
55
|
+
|
56
|
+
after(:each) do
|
57
|
+
FileUtils.rm_rf(ARTIFACTS_DIR) if File.directory? ARTIFACTS_DIR
|
34
58
|
end
|
35
59
|
|
36
|
-
it "should
|
37
|
-
|
38
|
-
|
39
|
-
|
60
|
+
it "should download sources" do
|
61
|
+
download_sources(@gem_event0, "0.3")
|
62
|
+
File.exists?(ARTIFACTS_DIR + '/SOURCES/polisher-0.3.gem').should == true
|
63
|
+
|
64
|
+
download_sources(@project_event0, "2.0.1")
|
65
|
+
File.exists?(ARTIFACTS_DIR + '/SOURCES/activerecord-2.0.1.tgz').should == true
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should correctly create a gem based package" do
|
69
|
+
download_sources(@gem_event0, "0.3")
|
70
|
+
create_rpm_package(@gem_event1, "0.3")
|
40
71
|
File.exists?(ARTIFACTS_DIR + '/SPECS/rubygem-polisher.spec').should == true
|
41
|
-
File.exists?(ARTIFACTS_DIR + "/SRPMS/rubygem-polisher-0.
|
42
|
-
File.exists?(ARTIFACTS_DIR + "/RPMS/noarch/rubygem-polisher-0.
|
72
|
+
File.exists?(ARTIFACTS_DIR + "/SRPMS/rubygem-polisher-0.3-1.fc11.src.rpm").should == true
|
73
|
+
File.exists?(ARTIFACTS_DIR + "/RPMS/noarch/rubygem-polisher-0.3-1.fc12.noarch.rpm").should == true
|
43
74
|
end
|
44
75
|
|
45
|
-
it "should correctly create package using template" do
|
46
|
-
|
47
|
-
|
76
|
+
it "should correctly create a gem based package using template" do
|
77
|
+
download_sources(@gem_event0, "0.3")
|
78
|
+
create_rpm_package(@gem_event2, '0.3')
|
48
79
|
File.exists?(ARTIFACTS_DIR + '/SPECS/rubygem-polisher.spec').should == true
|
49
80
|
File.read_all(ARTIFACTS_DIR + '/SPECS/rubygem-polisher.spec').should =~ /.*by polisher.*/
|
50
81
|
end
|
51
82
|
|
83
|
+
it "should correctly create an upstream based project package" do
|
84
|
+
download_sources(@project_event0, "2.0.1")
|
85
|
+
create_rpm_package(@project_event1, "2.0.1", :release => 3)
|
86
|
+
|
87
|
+
File.exists?(ARTIFACTS_DIR + '/SPECS/ruby-activerecord.spec').should == true
|
88
|
+
File.exists?(ARTIFACTS_DIR + "/SRPMS/ruby-activerecord-2.0.1-3.fc11.src.rpm").should == true
|
89
|
+
File.exists?(ARTIFACTS_DIR + "/RPMS/noarch/ruby-activerecord-2.0.1-3.fc12.noarch.rpm").should == true
|
90
|
+
File.exists?(ARTIFACTS_DIR + "/RPMS/noarch/ruby-activerecord-subpkg-2.0.1-3.fc12.noarch.rpm").should == true
|
91
|
+
File.exists?(ARTIFACTS_DIR + "/RPMS/noarch/another-subpkg-2.0.1-3.fc12.noarch.rpm").should == true
|
92
|
+
end
|
93
|
+
|
52
94
|
it "should correctly update repository" do
|
53
|
-
|
54
|
-
|
95
|
+
download_sources(@gem_event0, "0.3")
|
96
|
+
create_rpm_package(@gem_event1, '0.3')
|
97
|
+
update_yum_repo(@gem_event3, '0.3')
|
98
|
+
|
99
|
+
template = ARTIFACTS_DIR + '/templates/polisher-projects.spec.tpl'
|
100
|
+
File.write(template, POLISHER_ERB_TEST_TEMPLATE)
|
101
|
+
download_sources(@project_event0, "2.0.1")
|
102
|
+
create_rpm_package(@project_event1, "2.0.1", :release => 3)
|
103
|
+
update_yum_repo(@project_event2, '2.0')
|
104
|
+
|
55
105
|
File.directory?(ARTIFACTS_DIR + '/repos/fedora-ruby/noarch').should == true
|
56
106
|
File.directory?(ARTIFACTS_DIR + '/repos/fedora-ruby/repodata').should == true
|
57
|
-
File.exists?(ARTIFACTS_DIR +
|
107
|
+
File.exists?(ARTIFACTS_DIR + "/repos/fedora-ruby/noarch/rubygem-polisher-0.3-1.fc12.noarch.rpm").should == true
|
108
|
+
File.exists?(ARTIFACTS_DIR + "/repos/fedora-ruby/noarch/ruby-activerecord-2.0.1-3.fc12.noarch.rpm").should == true
|
109
|
+
File.exists?(ARTIFACTS_DIR + "/repos/fedora-ruby/noarch/ruby-activerecord-subpkg-2.0.1-3.fc12.noarch.rpm").should == true
|
110
|
+
File.exists?(ARTIFACTS_DIR + "/repos/fedora-ruby/noarch/another-subpkg-2.0.1-3.fc12.noarch.rpm").should == true
|
58
111
|
File.exists?(ARTIFACTS_DIR + '/repos/fedora-ruby/repodata/repomd.xml').should == true
|
59
112
|
File.exists?(ARTIFACTS_DIR + '/repos/fedora-ruby/repodata/primary.xml.gz').should == true
|
60
113
|
File.exists?(ARTIFACTS_DIR + '/repos/fedora-ruby/repodata/other.xml.gz').should == true
|
61
114
|
File.exists?(ARTIFACTS_DIR + '/repos/fedora-ruby/repodata/filelists.xml.gz').should == true
|
62
115
|
end
|
63
116
|
|
64
|
-
it "should correctly notify email recipients" do
|
65
|
-
# TODO test notify subscribers
|
66
|
-
#notify_subscribers(@gem, [...])
|
67
|
-
end
|
68
|
-
|
69
117
|
end
|
70
118
|
|
71
|
-
|
119
|
+
POLISHER_GEM2RPM_TEST_TEMPLATE =
|
72
120
|
%q{# Generated from <%= File::basename(format.gem_path) %> by polisher -*- rpm-spec -*-
|
73
121
|
%define ruby_sitelib %(ruby -rrbconfig -e "puts Config::CONFIG['sitelibdir']")
|
74
122
|
%define gemdir %(ruby -rubygems -e 'puts Gem::dir' 2>/dev/null)
|
@@ -162,3 +210,91 @@ rm -rf %{buildroot}
|
|
162
210
|
* <%= Time.now.strftime("%a %b %d %Y") %> <%= packager %> - <%= spec.version %>-1
|
163
211
|
- Initial package
|
164
212
|
}
|
213
|
+
|
214
|
+
# copied w/ changes from http://cvs.fedoraproject.org/viewvc/rpms/ruby-activerecord/F-13/ruby-activerecord.spec?revision=1.6&view=co
|
215
|
+
POLISHER_ERB_TEST_TEMPLATE =
|
216
|
+
%q{
|
217
|
+
%{!?ruby_sitelib: %define ruby_sitelib %(ruby -rrbconfig -e "puts Config::CONFIG['sitelibdir']")}
|
218
|
+
%define rname activerecord
|
219
|
+
# Only run the tests on distros that have sqlite3
|
220
|
+
%define with_check 0
|
221
|
+
|
222
|
+
Name: ruby-%{rname}
|
223
|
+
Version: <%= version %>
|
224
|
+
Release: <%= release %>%{?dist}
|
225
|
+
Summary: Implements the ActiveRecord pattern for ORM
|
226
|
+
|
227
|
+
Group: Development/Languages
|
228
|
+
|
229
|
+
License: MIT
|
230
|
+
URL: http://rubyforge.org/projects/activerecord/
|
231
|
+
Source0: http://rubyforge.org/frs/download.php/28874/activerecord-%{version}.tgz
|
232
|
+
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
233
|
+
|
234
|
+
BuildArch: noarch
|
235
|
+
BuildRequires: ruby >= 1.8
|
236
|
+
%if %with_check
|
237
|
+
BuildRequires: ruby(active_support) = 2.0.1
|
238
|
+
BuildRequires: ruby(sqlite3)
|
239
|
+
%endif
|
240
|
+
Requires: ruby(abi) = 1.8
|
241
|
+
Requires: ruby(active_support) = 2.0.1
|
242
|
+
Provides: ruby(active_record) = %{version}
|
243
|
+
|
244
|
+
%description
|
245
|
+
Implements the ActiveRecord pattern (Fowler, PoEAA) for ORM. It ties
|
246
|
+
database tables and classes together for business objects, like Customer or
|
247
|
+
Subscription, that can find, save, and destroy themselves without resorting
|
248
|
+
to manual SQL.
|
249
|
+
|
250
|
+
%package subpkg
|
251
|
+
Summary: Test sub package
|
252
|
+
Group: Development/Languages
|
253
|
+
|
254
|
+
%package -n another-subpkg
|
255
|
+
Summary: Another test sub package
|
256
|
+
Group: Development/Languages
|
257
|
+
|
258
|
+
%description subpkg
|
259
|
+
Test subpackage
|
260
|
+
|
261
|
+
%description -n another-subpkg
|
262
|
+
Another est subpackage
|
263
|
+
|
264
|
+
%prep
|
265
|
+
%setup -q -n %{rname}-%{version}
|
266
|
+
chmod 0644 README
|
267
|
+
|
268
|
+
%build
|
269
|
+
|
270
|
+
%install
|
271
|
+
rm -rf $RPM_BUILD_ROOT
|
272
|
+
install -d $RPM_BUILD_ROOT/%{ruby_sitelib}/
|
273
|
+
cp -pr lib/* $RPM_BUILD_ROOT/%{ruby_sitelib}/
|
274
|
+
find $RPM_BUILD_ROOT/%{ruby_sitelib} -type f | xargs chmod a-x
|
275
|
+
|
276
|
+
%check
|
277
|
+
%if %with_check
|
278
|
+
cd test
|
279
|
+
ruby -I "connections/native_sqlite3" base_test.rb
|
280
|
+
%endif
|
281
|
+
|
282
|
+
%clean
|
283
|
+
rm -rf $RPM_BUILD_ROOT
|
284
|
+
|
285
|
+
%files
|
286
|
+
%defattr(-,root,root,-)
|
287
|
+
%{ruby_sitelib}/activerecord.rb
|
288
|
+
%{ruby_sitelib}/active_record.rb
|
289
|
+
%{ruby_sitelib}/active_record
|
290
|
+
%doc README CHANGELOG examples/
|
291
|
+
|
292
|
+
%files subpkg
|
293
|
+
%defattr(-,root,root,-)
|
294
|
+
%doc README
|
295
|
+
|
296
|
+
%files -n another-subpkg
|
297
|
+
%defattr(-,root,root,-)
|
298
|
+
%doc CHANGELOG
|
299
|
+
|
300
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# ruby gem polisher gem adapter spec
|
2
|
+
#
|
3
|
+
# Copyright (C) 2010 Red Hat, Inc.
|
4
|
+
# Written by Mohammed Morsi <mmorsi@redhat.com>
|
5
|
+
#
|
6
|
+
# This program is free software, you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU Affero General Public License
|
8
|
+
# as published by the Free Software Foundation, either version 3
|
9
|
+
# of the License, or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# You should have received a copy of the the GNU Affero
|
12
|
+
# General Public License, along with Polisher. If not, see
|
13
|
+
# <http://www.gnu.org/licenses/>
|
14
|
+
|
15
|
+
require 'uri'
|
16
|
+
require 'json'
|
17
|
+
require 'net/http'
|
18
|
+
|
19
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
20
|
+
|
21
|
+
describe "Polisher::GemAdapter" do
|
22
|
+
it "should successfully subscribe/unsubscribe to updates" do
|
23
|
+
gem = Source.new :name => "polisher", :source_type => "gem",
|
24
|
+
:uri => "http://rubygems.org/downloads/polisher-0.3.gem"
|
25
|
+
|
26
|
+
Polisher::GemAdapter.subscribe(gem,
|
27
|
+
"http://projects.morsi.org/polisher/demo/gems/released/1",
|
28
|
+
POLISHER_CONFIG["gem_api_key"])
|
29
|
+
Polisher::GemAdapter.subscribed?(gem, POLISHER_CONFIG["gem_api_key"]).should == true
|
30
|
+
Polisher::GemAdapter.unsubscribe(gem,
|
31
|
+
"http://projects.morsi.org/polisher/demo/gems/released/1",
|
32
|
+
POLISHER_CONFIG["gem_api_key"])
|
33
|
+
Polisher::GemAdapter.subscribed?(gem, POLISHER_CONFIG["gem_api_key"]).should == false
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should raise error if subscribe source, callback_url, or api_key is invalid" do
|
37
|
+
lambda {
|
38
|
+
Polisher::GemAdapter.subscribe(nil,
|
39
|
+
"http://projects.morsi.org/polisher/demo/gems/released/1",
|
40
|
+
POLISHER_CONFIG['gem_api_key'])
|
41
|
+
}.should raise_error(ArgumentError)
|
42
|
+
|
43
|
+
gem = Source.new :name => "polisher", :source_type => "gem",
|
44
|
+
:uri => "http://rubygems.org/downloads/polisher-0.3.gem"
|
45
|
+
lambda {
|
46
|
+
Polisher::GemAdapter.subscribe(gem, 42, POLISHER_CONFIG['gem_api_key'])
|
47
|
+
}.should raise_error(ArgumentError)
|
48
|
+
|
49
|
+
lambda {
|
50
|
+
Polisher::GemAdapter.subscribe(gem,
|
51
|
+
"http://projects.morsi.org/polisher/demo/gems/released/1",
|
52
|
+
nil)
|
53
|
+
}.should raise_error(ArgumentError)
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should raise error if subscription target is invalid" do
|
57
|
+
gem = Source.new :name => "polisher", :source_type => "gem",
|
58
|
+
:uri => "http://non.existant/downloads/polisher-0.3.gem"
|
59
|
+
lambda {
|
60
|
+
Polisher::GemAdapter.subscribe(gem,
|
61
|
+
"http://projects.morsi.org/polisher/demo/gems/released/1",
|
62
|
+
POLISHER_CONFIG["gem_api_key"])
|
63
|
+
}.should raise_error(RuntimeError)
|
64
|
+
|
65
|
+
gem = Source.new :name => "polisher", :source_type => "gem",
|
66
|
+
:uri => "http://morsi.org/downloads/polisher-0.3.gem"
|
67
|
+
lambda {
|
68
|
+
Polisher::GemAdapter.subscribe(gem,
|
69
|
+
"http://projects.morsi.org/polisher/demo/gems/released/1",
|
70
|
+
POLISHER_CONFIG["gem_api_key"])
|
71
|
+
}.should raise_error(RuntimeError)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should successfully get remote gem info" do
|
75
|
+
gem = Source.new :name => "polisher", :source_type => "gem",
|
76
|
+
:uri => "http://rubygems.org/downloads/polisher-0.3.gem"
|
77
|
+
info = Polisher::GemAdapter.get_info(gem)
|
78
|
+
info["name"].should == "polisher"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should raise error if get info target is invalid" do
|
82
|
+
gem = Source.new :name => "polisher", :source_type => "gem",
|
83
|
+
:uri => "http://invalid.uri/downloads/polisher-0.3.gem"
|
84
|
+
lambda {
|
85
|
+
Polisher::GemAdapter.get_info(gem)
|
86
|
+
}.should raise_error(RuntimeError)
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
data/spec/models_spec.rb
CHANGED
@@ -7,177 +7,664 @@
|
|
7
7
|
# it under the terms of the GNU Affero General Public License
|
8
8
|
# as published by the Free Software Foundation, either version 3
|
9
9
|
# of the License, or (at your option) any later version.
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# You should have received a copy of the the GNU Affero
|
12
|
-
# General Public License, along with Polisher. If not, see
|
12
|
+
# General Public License, along with Polisher. If not, see
|
13
13
|
# <http://www.gnu.org/licenses/>
|
14
14
|
|
15
15
|
require File.dirname(__FILE__) + '/spec_helper'
|
16
16
|
|
17
|
+
describe "Polisher::Project" do
|
18
|
+
before(:each) do
|
19
|
+
FileUtils.rm_rf(ARTIFACTS_DIR) if File.directory? ARTIFACTS_DIR
|
20
|
+
FileUtils.mkdir_p(ARTIFACTS_DIR)
|
21
|
+
end
|
17
22
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
src.valid?.should be(true)
|
23
|
+
after(:each) do
|
24
|
+
FileUtils.rm_rf(ARTIFACTS_DIR) if File.directory? ARTIFACTS_DIR
|
25
|
+
end
|
22
26
|
|
23
|
-
|
24
|
-
|
25
|
-
|
27
|
+
it "should not be valid if name is missing" do
|
28
|
+
project = Project.new :name => 'foo'
|
29
|
+
project.should be_valid
|
26
30
|
|
27
|
-
|
28
|
-
|
29
|
-
|
31
|
+
project.name = nil
|
32
|
+
project.should_not be_valid
|
33
|
+
end
|
30
34
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
35
|
+
it "should not be valid if duplicate name exists" do
|
36
|
+
Project.create! :name => 'dup-project-name-test'
|
37
|
+
project = Project.new :name => 'dup-project-name-test'
|
38
|
+
project.should_not be_valid
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should provide access to all dependencies and dependent projects" do
|
42
|
+
project1 = Project.create! :name => "project-dependency-tree1"
|
43
|
+
project2 = Project.create! :name => "project-dependency-tree2"
|
44
|
+
project3 = Project.create! :name => "project-dependency-tree3"
|
45
|
+
project4 = Project.create! :name => "project-dependency-tree4"
|
46
|
+
project5 = Project.create! :name => "project-dependency-tree5"
|
47
|
+
|
48
|
+
pd1 = ProjectDependency.create! :project => project2, :depends_on_project => project1
|
49
|
+
pd2 = ProjectDependency.create! :project => project3, :depends_on_project => project2
|
50
|
+
pd3 = ProjectDependency.create! :project => project4, :depends_on_project => project2
|
51
|
+
pd4 = ProjectDependency.create! :project => project4, :depends_on_project => project5
|
52
|
+
|
53
|
+
deps = project1.dependencies
|
54
|
+
deps.size.should == 0
|
55
|
+
depts = project1.dependents
|
56
|
+
depts.size.should == 1
|
57
|
+
depts[0].project.id.should == project2.id
|
58
|
+
|
59
|
+
deps = project2.dependencies
|
60
|
+
deps.size.should == 1
|
61
|
+
deps[0].depends_on_project.id.should == project1.id
|
62
|
+
depts = project2.dependents
|
63
|
+
depts.size.should == 2
|
64
|
+
depts[0].project.id.should == project3.id
|
65
|
+
depts[1].project.id.should == project4.id
|
66
|
+
|
67
|
+
deps = project3.dependencies
|
68
|
+
deps.size.should == 1
|
69
|
+
deps[0].depends_on_project.id.should == project2.id
|
70
|
+
depts = project3.dependents
|
71
|
+
depts.size.should == 0
|
72
|
+
|
73
|
+
deps = project4.dependencies
|
74
|
+
deps.size.should == 2
|
75
|
+
deps[0].depends_on_project.id.should == project2.id
|
76
|
+
deps[1].depends_on_project.id.should == project5.id
|
77
|
+
depts = project4.dependents
|
78
|
+
depts.size.should == 0
|
79
|
+
|
80
|
+
deps = project5.dependencies
|
81
|
+
deps.size.should == 0
|
82
|
+
depts = project5.dependents
|
83
|
+
depts.size.should == 1
|
84
|
+
depts[0].project.id.should == project4.id
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should download all sources" do
|
88
|
+
project = Project.create! :name => 'project-dl-test100'
|
89
|
+
|
90
|
+
# see FIXME in Project::download_to
|
91
|
+
source1 = Source.create! :name => 'jffi-spec', :uri => 'http://mo.morsi.org/files/jruby/jffi.spec', :source_type => 'spec'
|
92
|
+
source2 = Source.create! :name => 'joni-spec', :uri => 'http://mo.morsi.org/files/jruby/joni.spec', :source_type => 'spec'
|
93
|
+
|
94
|
+
ps1 = ProjectSourceVersion.create! :project => project, :source => source1
|
95
|
+
ps2 = ProjectSourceVersion.create! :project => project, :source => source2, :project_version => "1.5"
|
96
|
+
|
97
|
+
project.download_to :dir => ARTIFACTS_DIR
|
98
|
+
|
99
|
+
File.size?(ARTIFACTS_DIR + '/joni.spec').should_not be_nil
|
100
|
+
File.size?(ARTIFACTS_DIR + '/jffi.spec').should_not be_nil
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should download all sources for specified version" do
|
104
|
+
project = Project.new :name => 'project-dl-test100'
|
105
|
+
source1 = Source.new :name => 'jffi-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jffi.spec', :source_type => 'spec'
|
106
|
+
source2 = Source.new :name => 'joni-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/joni.spec', :source_type => 'spec'
|
107
|
+
|
108
|
+
ps1 = ProjectSourceVersion.new :project => project, :source => source1, :project_version => "1.6", :source_uri_params => "cluster=jruby;filetype=spec"
|
109
|
+
ps2 = ProjectSourceVersion.new :project => project, :source => source2, :project_version => "1.5", :source_uri_params => "cluster=jruby;dir=files"
|
110
|
+
project.project_source_versions << ps1 << ps2
|
111
|
+
|
112
|
+
project.download_to :version => "1.5", :dir => ARTIFACTS_DIR
|
113
|
+
|
114
|
+
File.size?(ARTIFACTS_DIR + '/joni.spec').should_not be_nil
|
115
|
+
File.size?(ARTIFACTS_DIR + '/jffi.spec').should be_nil
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should return all events for the specified version" do
|
119
|
+
project = Project.new :name => 'project-dl-test100'
|
120
|
+
event1 = Event.new :version_qualifier => "=", :version => "1.5"
|
121
|
+
event2 = Event.new :version_qualifier => ">", :version => "1.6"
|
122
|
+
project.events << event1 << event2
|
123
|
+
|
124
|
+
events = project.events_for_version("1.5")
|
125
|
+
events.size.should == 1
|
126
|
+
events.include?(event1).should be_true
|
127
|
+
events.include?(event2).should be_false
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should return all project_source_versions for the specified version" do
|
131
|
+
project = Project.new :name => 'project-dl-test100'
|
132
|
+
source1 = Source.new :name => 'jffi-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jffi.spec', :source_type => 'spec'
|
133
|
+
source2 = Source.new :name => 'joni-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/joni.spec', :source_type => 'spec'
|
134
|
+
source3 = Source.new :name => 'jruby-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jruby.spec', :source_type => 'spec'
|
135
|
+
|
136
|
+
ps1 = ProjectSourceVersion.new :project => project, :source => source1, :project_version => '1.6', :source_uri_params => "cluster=jruby;filetype=spec"
|
137
|
+
ps2 = ProjectSourceVersion.new :project => project, :source => source2, :project_version => "1.5", :source_uri_params => "cluster=jruby;dir=files"
|
138
|
+
ps3 = ProjectSourceVersion.new :project => project, :source => source3, :source_uri_params => "cluster=jruby;filetype=spec"
|
139
|
+
project.project_source_versions << ps1 << ps2 << ps3
|
140
|
+
|
141
|
+
project_sources = project.project_source_versions_for_version("1.5")
|
142
|
+
project_sources.size.should == 2
|
143
|
+
project_sources.include?(ps1).should be_false
|
144
|
+
project_sources.include?(ps2).should be_true
|
145
|
+
project_sources.include?(ps3).should be_true
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should return all sources for the specified version with formatted uris" do
|
149
|
+
project = Project.new :name => 'project-dl-test100'
|
150
|
+
source1 = Source.new :name => 'jffi-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jffi.spec', :source_type => 'spec'
|
151
|
+
source2 = Source.new :name => 'joni-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/joni.spec', :source_type => 'spec'
|
152
|
+
source3 = Source.new :name => 'jruby-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jruby.spec', :source_type => 'spec'
|
153
|
+
|
154
|
+
ps1 = ProjectSourceVersion.new :project => project, :source => source1, :project_version => "1.6", :source_uri_params => "cluster=jruby;filetype=spec"
|
155
|
+
ps2 = ProjectSourceVersion.new :project => project, :source => source2, :project_version => "1.5", :source_uri_params => "cluster=jruby;dir=files"
|
156
|
+
ps3 = ProjectSourceVersion.new :project => project, :source => source3, :source_uri_params => "cluster=jruby;dir=files"
|
157
|
+
project.project_source_versions << ps1 << ps2 << ps3
|
158
|
+
|
159
|
+
sources = project.sources_for_version("1.5")
|
160
|
+
sources.size.should == 2
|
161
|
+
sources.include?(source1).should be_false
|
162
|
+
sources.include?(source2).should be_true
|
163
|
+
sources.include?(source3).should be_true
|
164
|
+
|
165
|
+
sources[0].uri.should == "http://mo.morsi.org/files/jruby/joni.spec"
|
166
|
+
sources[1].uri.should == "http://mo.morsi.org/files/jruby/jruby.spec"
|
167
|
+
end
|
168
|
+
|
169
|
+
it "should provide access to primary source" do
|
170
|
+
project = Project.create! :name => 'primary-source-project-test'
|
171
|
+
source1 = Source.create!(:name => 'primary-source-test1', :source_type => 'file', :uri => 'http://foo1.foo')
|
172
|
+
source2 = Source.create!(:name => 'primary-source-test2', :source_type => 'file', :uri => 'http://foo2.foo')
|
173
|
+
project.sources << source1
|
174
|
+
project.primary_source= source2
|
175
|
+
|
176
|
+
primary_src = project.primary_source
|
177
|
+
primary_src.should_not be_nil
|
178
|
+
primary_src.name.should == source2.name
|
179
|
+
end
|
180
|
+
|
181
|
+
it "should provide access to all dependencies for the specified version" do
|
182
|
+
project1 = Project.create! :name => "project-dependency-tree10"
|
183
|
+
project2 = Project.create! :name => "project-dependency-tree20"
|
184
|
+
project3 = Project.create! :name => "project-dependency-tree30"
|
185
|
+
project4 = Project.create! :name => "project-dependency-tree40"
|
186
|
+
|
187
|
+
pd1 = ProjectDependency.create! :project => project1, :depends_on_project => project2, :project_version => "1.0.0"
|
188
|
+
pd2 = ProjectDependency.create! :project => project1, :depends_on_project => project3, :project_version => "2.0.0"
|
189
|
+
pd2 = ProjectDependency.create! :project => project1, :depends_on_project => project4
|
190
|
+
|
191
|
+
deps = project1.dependencies_for_version("1.0.0")
|
192
|
+
deps.size.should == 2
|
193
|
+
deps[0].depends_on_project.id.should == project2.id
|
194
|
+
deps[1].depends_on_project.id.should == project4.id
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should return all versions which the project is configured for" do
|
198
|
+
project = Project.new :name => 'project-dl-test100'
|
199
|
+
event1 = Event.new :version_qualifier => "=", :version => "1.5"
|
200
|
+
event2 = Event.new :version_qualifier => ">", :version => "1.6"
|
201
|
+
project.events << event1 << event2
|
202
|
+
|
203
|
+
source1 = Source.new :name => 'jffi-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jffi.spec', :source_type => 'spec'
|
204
|
+
source2 = Source.new :name => 'joni-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/joni.spec', :source_type => 'spec'
|
205
|
+
source3 = Source.new :name => 'jruby-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jruby.spec', :source_type => 'spec'
|
206
|
+
ps1 = ProjectSourceVersion.new :project => project, :source => source1, :source_uri_params => "cluster=jruby;filetype=spec"
|
207
|
+
ps2 = ProjectSourceVersion.new :project => project, :source => source2, :project_version => "1.5", :source_uri_params => "cluster=jruby;dir=files"
|
208
|
+
ps3 = ProjectSourceVersion.new :project => project, :source => source3, :project_version => "1.7", :source_uri_params => "cluster=jruby;dir=files"
|
209
|
+
project.project_source_versions << ps1 << ps2 << ps3
|
210
|
+
|
211
|
+
projectd = Project.new :name => 'project-version-test99'
|
212
|
+
project.project_dependencies << ProjectDependency.new(:project => project, :depends_on_project => projectd, :project_version => "9.9")
|
213
|
+
|
214
|
+
versions = project.versions
|
215
|
+
versions.size.should == 4
|
216
|
+
versions.include?("1.5").should be_true
|
217
|
+
versions.include?("1.6").should be_true
|
218
|
+
versions.include?("1.7").should be_true
|
219
|
+
versions.include?("9.9").should be_true
|
220
|
+
end
|
36
221
|
|
222
|
+
it "should trigger dependencies and events upon release" do
|
223
|
+
project = Project.create :name => 'project-release-test-199'
|
224
|
+
|
225
|
+
Event.create :project => project,
|
226
|
+
:process => "project_released_test_handlerAAA",
|
227
|
+
:version_qualifier => '=',
|
228
|
+
:version => "5.6"
|
229
|
+
|
230
|
+
Event.create :project => project,
|
231
|
+
:process => "project_released_test_handlerBBB",
|
232
|
+
:version_qualifier => '>',
|
233
|
+
:version => "7.9"
|
234
|
+
|
235
|
+
projectd1 = Project.create :name => 'project-release-test-299'
|
236
|
+
Event.create :project => projectd1,
|
237
|
+
:process => "project_released_test_handlerDDD"
|
238
|
+
Event.create :project => projectd1,
|
239
|
+
:process => "project_released_test_handlerEEE",
|
240
|
+
:version_qualifier => "=",
|
241
|
+
:version => "1.9"
|
242
|
+
|
243
|
+
projectd2 = Project.create :name => 'project-release-test-399'
|
244
|
+
Event.create :project => projectd2,
|
245
|
+
:process => "project_released_test_handlerFFF",
|
246
|
+
:version_qualifier => "=",
|
247
|
+
:version => "1.9"
|
248
|
+
Event.create :project => projectd2,
|
249
|
+
:process => "project_released_test_handlerGGG",
|
250
|
+
:version_qualifier => "=",
|
251
|
+
:version => "6.5"
|
252
|
+
|
253
|
+
projectd3 = Project.create :name => 'project-release-test-499'
|
254
|
+
Event.create :project => projectd3,
|
255
|
+
:process => "project_released_test_handlerCCC"
|
256
|
+
|
257
|
+
pd1 = ProjectDependency.new :project => project, :depends_on_project => projectd1, :depends_on_project_params => "jim=bo;john=mark"
|
258
|
+
pd2 = ProjectDependency.new :project => project, :depends_on_project => projectd2, :project_version => "5.6", :depends_on_project_version => "6.5"
|
259
|
+
pd3 = ProjectDependency.new :project => project, :depends_on_project => projectd3, :project_version => "7.9"
|
260
|
+
project.project_dependencies << pd1 << pd2 << pd3
|
261
|
+
|
262
|
+
project.released_version("5.6", :joe => 'bob', :sam => 'sue')
|
263
|
+
|
264
|
+
$project_released_test_handler_flags.include?('AAA').should be_true
|
265
|
+
$project_released_test_handler_flags.include?('BBB').should be_false
|
266
|
+
$project_released_test_handler_flags.include?('CCC').should be_false
|
267
|
+
$project_released_test_handler_flags.include?('DDD').should be_true
|
268
|
+
$project_released_test_handler_flags.include?('EEE').should be_true
|
269
|
+
$project_released_test_handler_flags.include?('FFF').should be_false
|
270
|
+
$project_released_test_handler_flags.include?('GGG').should be_true
|
271
|
+
$project_released_test_handler_flags.include?('joe=bob').should be_true
|
272
|
+
$project_released_test_handler_flags.include?('sam=sue').should be_true
|
273
|
+
$project_released_test_handler_flags.include?('jim=bo').should be_true
|
274
|
+
$project_released_test_handler_flags.include?('john=mark').should be_true
|
275
|
+
end
|
37
276
|
end
|
38
277
|
|
278
|
+
describe "Polisher::Source" do
|
279
|
+
before(:each) do
|
280
|
+
FileUtils.rm_rf(ARTIFACTS_DIR) if File.directory? ARTIFACTS_DIR
|
281
|
+
FileUtils.mkdir_p(ARTIFACTS_DIR)
|
282
|
+
end
|
283
|
+
|
284
|
+
after(:each) do
|
285
|
+
FileUtils.rm_rf(ARTIFACTS_DIR) if File.directory? ARTIFACTS_DIR
|
286
|
+
end
|
39
287
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
gem.valid?.should be(true)
|
288
|
+
it "should not be valid if name, source_type, or uri is missing or invalid" do
|
289
|
+
source = Source.new :uri => 'uri', :name => "foo", :source_type => "gem"
|
290
|
+
source.should be_valid
|
44
291
|
|
45
|
-
|
46
|
-
|
47
|
-
|
292
|
+
source.uri = nil
|
293
|
+
source.should_not be_valid
|
294
|
+
source.uri = 'uri'
|
48
295
|
|
49
|
-
|
50
|
-
|
296
|
+
source.source_type = nil
|
297
|
+
source.should_not be_valid
|
298
|
+
source.source_type = 'bar'
|
299
|
+
source.should_not be_valid
|
300
|
+
source.source_type = 'file'
|
301
|
+
|
302
|
+
source.name = nil
|
303
|
+
source.should_not be_valid
|
51
304
|
end
|
52
305
|
|
53
|
-
it "should not be valid if name is not unique
|
54
|
-
|
55
|
-
|
56
|
-
|
306
|
+
it "should not be valid if name or uri is not unique in scope" do
|
307
|
+
source1 = Source.create! :uri => 'uri', :name => "foo", :source_type => "gem"
|
308
|
+
source2 = Source.new :uri => 'uri', :name => "bar", :source_type => "archive"
|
309
|
+
source2.should_not be_valid
|
310
|
+
|
311
|
+
source3 = Source.new :uri => 'zaz', :name => "foo", :source_type => "archive"
|
312
|
+
source3.should_not be_valid
|
57
313
|
end
|
58
314
|
|
59
|
-
it "should
|
60
|
-
|
61
|
-
|
315
|
+
it "should return filename generated from uri" do
|
316
|
+
source = Source.new(
|
317
|
+
:uri => 'http://mo.morsi.org/files/jruby/joni-123.spec?addition=foo¶ms=bar',
|
318
|
+
:name => "joni-spec", :source_type => "spec")
|
319
|
+
source.filename.should == "joni-123.spec"
|
62
320
|
end
|
63
321
|
|
64
|
-
it "should
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
322
|
+
it "should return all project_source_versions for the specified version" do
|
323
|
+
project1 = Project.new :name => 'project-src-p100'
|
324
|
+
project2 = Project.new :name => 'project-src-p101'
|
325
|
+
project3 = Project.new :name => 'project-src-p102'
|
326
|
+
source = Source.new :name => 'jffi-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jffi.spec', :source_type => 'spec'
|
327
|
+
|
328
|
+
ps1 = ProjectSourceVersion.new :project => project1, :source => source, :source_uri_params => "cluster=jruby;filetype=spec"
|
329
|
+
ps2 = ProjectSourceVersion.new :project => project2, :source => source, :project_version => "1.5", :source_uri_params => "cluster=jruby;dir=files"
|
330
|
+
ps3 = ProjectSourceVersion.new :project => project3, :source => source, :project_version => "1.6", :source_uri_params => "cluster=jruby;dir=files"
|
331
|
+
source.project_source_versions << ps1 << ps2
|
332
|
+
|
333
|
+
project_sources = source.project_source_versions_for_version("1.5")
|
334
|
+
project_sources.size.should == 2
|
335
|
+
project_sources.include?(ps1).should be_true
|
336
|
+
project_sources.include?(ps2).should be_true
|
337
|
+
project_sources.include?(ps3).should be_false
|
70
338
|
end
|
71
339
|
|
72
|
-
it "should
|
73
|
-
|
74
|
-
|
75
|
-
|
340
|
+
it "should return all projects for the specified version" do
|
341
|
+
project1 = Project.new :name => 'project-src-p100'
|
342
|
+
project2 = Project.new :name => 'project-src-p101'
|
343
|
+
project3 = Project.new :name => 'project-src-p102'
|
344
|
+
source = Source.new :name => 'jffi-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jffi.spec', :source_type => 'spec'
|
345
|
+
|
346
|
+
ps1 = ProjectSourceVersion.new :project => project1, :source => source, :source_uri_params => "cluster=jruby;filetype=spec"
|
347
|
+
ps2 = ProjectSourceVersion.new :project => project2, :source => source, :source_version => "1.5", :source_uri_params => "cluster=jruby;dir=files"
|
348
|
+
ps3 = ProjectSourceVersion.new :project => project3, :source => source, :source_version => "1.6", :source_uri_params => "cluster=jruby;dir=files"
|
349
|
+
source.project_source_versions << ps1 << ps2 << ps3
|
350
|
+
|
351
|
+
projects = source.project_source_versions_for_version("1.5")
|
352
|
+
projects.size.should == 2
|
353
|
+
projects.collect { |p| p.source_version }.include?(nil).should be_true
|
354
|
+
projects.collect { |p| p.source_version }.include?("1.5").should be_true
|
355
|
+
projects.collect { |p| p.source_version }.include?("1.6").should be_false
|
356
|
+
|
357
|
+
projects.collect { |p| p.project.name }.include?("project-src-p100").should be_true
|
358
|
+
projects.collect { |p| p.project.name }.include?("project-src-p101").should be_true
|
359
|
+
projects.collect { |p| p.project.name }.include?("project-src-p102").should be_false
|
76
360
|
end
|
77
361
|
|
78
|
-
it "should
|
79
|
-
|
80
|
-
|
362
|
+
it "should return all versions which the source is configured for" do
|
363
|
+
project1 = Project.new :name => 'project-src-p100'
|
364
|
+
project2 = Project.new :name => 'project-src-p101'
|
365
|
+
project3 = Project.new :name => 'project-src-p102'
|
366
|
+
source = Source.new :name => 'jffi-spec', :uri => 'http://mo.morsi.org/%{dir}/%{cluster}/jffi.spec', :source_type => 'spec'
|
367
|
+
|
368
|
+
ps1 = ProjectSourceVersion.new :project => project1, :source => source, :source_uri_params => "cluster=jruby;filetype=spec"
|
369
|
+
ps2 = ProjectSourceVersion.new :project => project2, :source => source, :source_version => "1.5", :source_uri_params => "cluster=jruby;dir=files"
|
370
|
+
ps3 = ProjectSourceVersion.new :project => project3, :source => source, :source_version => "1.6", :source_uri_params => "cluster=jruby;dir=files"
|
371
|
+
source.project_source_versions << ps1 << ps2 << ps3
|
372
|
+
|
373
|
+
versions = source.versions
|
374
|
+
versions.size.should == 2
|
375
|
+
versions.include?("1.5").should be_true
|
376
|
+
versions.include?("1.6").should be_true
|
377
|
+
end
|
81
378
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
379
|
+
it "should format the uri w/ the specified variables" do
|
380
|
+
source = Source.new :uri => "http://%{var1}.%{var2}/%{another}?%{yet_another}=%{even_more}&%{last}"
|
381
|
+
source.format_uri! :var1 => 'val1', :var2 => 'val2',
|
382
|
+
:another => 'foo', :yet_another => 'bar',
|
383
|
+
:even_more => 'something', :last => '123'
|
87
384
|
|
385
|
+
source.uri.should == "http://val1.val2/foo?bar=something&123"
|
386
|
+
end
|
88
387
|
|
89
|
-
|
90
|
-
|
388
|
+
it "should be downloadable" do
|
389
|
+
source = Source.new(
|
390
|
+
:uri => 'http://mo.morsi.org/files/jruby/joni.spec',
|
391
|
+
:name => "joni-spec", :source_type => "spec")
|
392
|
+
path = source.download_to(:dir => ARTIFACTS_DIR)
|
393
|
+
File.size?(ARTIFACTS_DIR + '/joni.spec').should_not be_nil
|
394
|
+
FileUtils.rm(ARTIFACTS_DIR + '/joni.spec')
|
395
|
+
path.should == ARTIFACTS_DIR + '/joni.spec'
|
396
|
+
|
397
|
+
source.download_to(:path => ARTIFACTS_DIR + '/joni.spec')
|
398
|
+
File.size?(ARTIFACTS_DIR + '/joni.spec').should_not be_nil
|
399
|
+
end
|
91
400
|
|
92
|
-
|
93
|
-
|
401
|
+
it "should permit a parameterized download" do
|
402
|
+
source = Source.new(
|
403
|
+
:uri => 'http://mo.morsi.org/files/%{group}/%{name}.spec',
|
404
|
+
:name => "joni-spec", :source_type => 'spec')
|
405
|
+
path = source.download_to(:dir => ARTIFACTS_DIR, :group => "jruby", :name => "joni")
|
406
|
+
File.size?(ARTIFACTS_DIR + '/joni.spec').should_not be_nil
|
407
|
+
FileUtils.rm(ARTIFACTS_DIR + '/joni.spec')
|
408
|
+
path.should == ARTIFACTS_DIR + '/joni.spec'
|
409
|
+
|
410
|
+
source.download_to(:path => ARTIFACTS_DIR + '/joni.spec')
|
411
|
+
File.size?(ARTIFACTS_DIR + '/joni.spec').should_not be_nil
|
94
412
|
end
|
95
413
|
|
414
|
+
it "should raise an exception if download source uri or destination path is invalid" do
|
415
|
+
source = Source.new(
|
416
|
+
:uri => 'http://invalid.uri',
|
417
|
+
:name => 'invalid-source1', :source_type => 'file')
|
418
|
+
lambda {
|
419
|
+
path = source.download_to(:dir => ARTIFACTS_DIR)
|
420
|
+
}.should raise_error(RuntimeError)
|
421
|
+
|
422
|
+
source = Source.new(
|
423
|
+
:uri => 'http://mo.morsi.org/files/jruby/joni.spec',
|
424
|
+
:name => 'invalid-source2', :source_type => 'spec')
|
425
|
+
lambda {
|
426
|
+
path = source.download_to(:dir => '/')
|
427
|
+
}.should raise_error(RuntimeError)
|
428
|
+
|
429
|
+
lambda {
|
430
|
+
path = source.download_to(:dir => '/nonexistantfoobar')
|
431
|
+
}.should raise_error(RuntimeError)
|
432
|
+
end
|
96
433
|
end
|
97
434
|
|
98
|
-
describe "Polisher::
|
435
|
+
describe "Polisher::ProjectSourceVersion" do
|
436
|
+
|
437
|
+
it "should default primary_source to false" do
|
438
|
+
project = Project.create! :name => 'project-source-valid-testproj0'
|
439
|
+
source = Source.create! :name => 'project-source-valid-testsource0',
|
440
|
+
:uri => 'http://presvts234', :source_type => 'file'
|
441
|
+
ps = ProjectSourceVersion.create! :project => project, :source => source
|
442
|
+
ps.primary_source.should be_false
|
443
|
+
end
|
444
|
+
|
445
|
+
it "should default versions to nil" do
|
446
|
+
project = Project.create! :name => 'project-source-valid-testproj10'
|
447
|
+
source = Source.create! :name => 'project-source-valid-testsource10',
|
448
|
+
:uri => 'http://presvts098', :source_type => 'file'
|
449
|
+
ps = ProjectSourceVersion.create! :project => project, :source => source, :project_version => "", :source_version => ""
|
450
|
+
ps.project_version.should be_nil
|
451
|
+
ps.source_version.should be_nil
|
452
|
+
end
|
453
|
+
|
454
|
+
it "should not be valid if a project id/version is associated w/ a source multiple times" do
|
455
|
+
project = Project.create! :name => 'project-source-valid-testproj1'
|
456
|
+
source = Source.create! :name => 'project-source-valid-testsource1',
|
457
|
+
:uri => 'http://presvts581', :source_type => 'file'
|
458
|
+
|
459
|
+
ps1 = ProjectSourceVersion.create! :project => project, :source => source, :project_version => '1.6'
|
460
|
+
ps2 = ProjectSourceVersion.new :project => project, :source => source, :project_version => '1.6'
|
461
|
+
|
462
|
+
ps2.valid?.should be_false
|
463
|
+
end
|
464
|
+
|
465
|
+
it "should not be valid if a project id/version is associated w/ multiple primary sources" do
|
466
|
+
project = Project.create! :name => 'project-source-valid-testproj2'
|
467
|
+
source1 = Source.create! :name => 'project-source-valid-testsource100',
|
468
|
+
:uri => 'http://presvts690', :source_type => 'file'
|
469
|
+
source2 = Source.create! :name => 'project-source-valid-testsource200',
|
470
|
+
:uri => 'http://presvts456', :source_type => 'file'
|
471
|
+
|
472
|
+
ps1 = ProjectSourceVersion.create! :project => project, :source => source1, :project_version => '1.6',
|
473
|
+
:primary_source => true
|
474
|
+
|
475
|
+
ps2 = ProjectSourceVersion.new :project => project, :source => source2, :project_version => '1.6',
|
476
|
+
:primary_source => true
|
99
477
|
|
100
|
-
|
101
|
-
|
478
|
+
ps2.valid?.should be_false
|
479
|
+
end
|
480
|
+
|
481
|
+
end
|
482
|
+
|
483
|
+
describe "Polisher::ProjectDependency" do
|
484
|
+
|
485
|
+
it "should default versions to nil" do
|
486
|
+
project1 = Project.create! :name => 'project-dep-valid-testproj10'
|
487
|
+
project2 = Project.create! :name => 'project-dep-valid-testproj20'
|
488
|
+
|
489
|
+
pd = ProjectDependency.create! :project => project1, :depends_on_project => project2
|
490
|
+
pd.project_version.should be_nil
|
491
|
+
pd.depends_on_project_version.should be_nil
|
492
|
+
end
|
493
|
+
|
494
|
+
it "should not be valid if missing project or depends_on_project" do
|
495
|
+
project1 = Project.create! :name => 'project-dep-valid-testproj30'
|
496
|
+
project2 = Project.create! :name => 'project-dep-valid-testproj40'
|
497
|
+
|
498
|
+
pd = ProjectDependency.new
|
499
|
+
pd.should_not be_valid
|
500
|
+
|
501
|
+
|
502
|
+
pd = ProjectDependency.new :project => project1
|
503
|
+
pd.should_not be_valid
|
504
|
+
|
505
|
+
pd = ProjectDependency.new :depends_on_project => project2
|
506
|
+
pd.should_not be_valid
|
507
|
+
|
508
|
+
pd = ProjectDependency.new :project => project1, :depends_on_project => project2
|
509
|
+
pd.should be_valid
|
510
|
+
end
|
511
|
+
|
512
|
+
it "should not be valid if project/depends_on_project/project_version/depends_on_project_version are not unique" do
|
513
|
+
project1 = Project.create! :name => 'project-dep-valid-testproj50'
|
514
|
+
project2 = Project.create! :name => 'project-dep-valid-testproj60'
|
515
|
+
|
516
|
+
pd = ProjectDependency.create! :project => project1, :depends_on_project => project2, :project_version => "1.0.0", :depends_on_project_version => "2.0.1"
|
102
517
|
|
103
|
-
|
104
|
-
|
518
|
+
pd2 = ProjectDependency.new :project => project1, :depends_on_project => project2, :project_version => "1.0.0", :depends_on_project_version => "2.0.1"
|
519
|
+
pd2.should_not be_valid
|
105
520
|
|
106
|
-
|
107
|
-
|
108
|
-
|
521
|
+
pd2.depends_on_project_version = "2.0.2"
|
522
|
+
pd2.should be_valid
|
523
|
+
end
|
524
|
+
|
525
|
+
end
|
526
|
+
|
527
|
+
describe "Polisher::Event" do
|
528
|
+
|
529
|
+
it "should return list of supported event handlers" do
|
530
|
+
processes = Event::processes
|
531
|
+
processes.size.should == 3
|
532
|
+
processes.include?("download_sources").should be_true
|
533
|
+
processes.include?("create_rpm_package").should be_true
|
534
|
+
processes.include?("update_yum_repo").should be_true
|
535
|
+
end
|
536
|
+
|
537
|
+
it "should not be valid if process is missing" do
|
538
|
+
project = Project.create! :name => 'valid-event-test-project0'
|
539
|
+
event = Event.new :project_id => project.id, :process => 'create_repo'
|
540
|
+
event.should be_valid
|
109
541
|
|
110
542
|
event.process = nil
|
111
|
-
event.
|
543
|
+
event.should_not be_valid
|
544
|
+
end
|
545
|
+
|
546
|
+
it "should not be valid if project is missing" do
|
547
|
+
project = Project.create! :name => 'valid-event-test-project1'
|
548
|
+
event = Event.new :process => 'create_repo'
|
549
|
+
event.should_not be_valid
|
550
|
+
event.project = project
|
551
|
+
event.should be_valid
|
112
552
|
end
|
113
553
|
|
114
554
|
it "should not be valid with invalid version qualifier" do
|
115
|
-
|
555
|
+
project = Project.create! :name => 'valid-event-test-project2'
|
116
556
|
|
117
|
-
event = Event.new :
|
118
|
-
event.
|
557
|
+
event = Event.new :project_id => project.id, :process => 'create_repo', :version_qualifier => ">", :version => 5
|
558
|
+
event.should be_valid
|
119
559
|
|
120
560
|
event.version_qualifier = '=='
|
121
|
-
event.
|
561
|
+
event.should_not be_valid
|
122
562
|
end
|
123
563
|
|
124
564
|
it "should not be valid if version/qualifier are not both present or nil" do
|
125
|
-
|
126
|
-
|
127
|
-
event = Event.new :
|
128
|
-
event.
|
129
|
-
|
130
|
-
event = Event.new :
|
131
|
-
event.
|
132
|
-
|
133
|
-
event = Event.new :
|
134
|
-
event.
|
565
|
+
project = Project.create! :name => 'valid-event-test-project3'
|
566
|
+
|
567
|
+
event = Event.new :project_id => project.id, :process => 'create_repo', :version_qualifier => ">"
|
568
|
+
event.should_not be_valid
|
569
|
+
|
570
|
+
event = Event.new :project_id => project.id, :process => 'create_repo', :version => 5
|
571
|
+
event.should_not be_valid
|
572
|
+
|
573
|
+
event = Event.new :project_id => project.id, :process => 'create_repo', :version => 5, :version_qualifier => '<='
|
574
|
+
event.should be_valid
|
135
575
|
end
|
136
576
|
|
137
577
|
it "should correctly resolve version qualifiers" do
|
138
|
-
event = Event.new :version_qualifier => nil
|
578
|
+
event = Event.new :version_qualifier => nil, :version => "5"
|
139
579
|
event.applies_to_version?('1.1').should be(true)
|
580
|
+
event.applies_to_version?('1.5.3').should be(true)
|
140
581
|
|
141
|
-
event = Event.new :version_qualifier => "=", :
|
582
|
+
event = Event.new :version_qualifier => "=", :version => "5.3"
|
142
583
|
event.applies_to_version?('1.2').should be(false)
|
143
584
|
event.applies_to_version?('5.3').should be(true)
|
585
|
+
event.applies_to_version?('5.3.0').should be(false)
|
586
|
+
event.applies_to_version?('5.3.1').should be(false)
|
144
587
|
event.applies_to_version?('7.9').should be(false)
|
145
588
|
|
146
|
-
event = Event.new :version_qualifier => ">", :
|
147
|
-
event.applies_to_version?('1.8').should be(false)
|
148
|
-
event.applies_to_version?('1.9').should be(false)
|
589
|
+
event = Event.new :version_qualifier => ">", :version => "1.9.2"
|
590
|
+
event.applies_to_version?('1.8.1').should be(false)
|
591
|
+
event.applies_to_version?('1.9.1').should be(false)
|
592
|
+
event.applies_to_version?('1.9.3').should be(true)
|
149
593
|
event.applies_to_version?('2.0').should be(true)
|
150
594
|
|
151
|
-
event = Event.new :version_qualifier => "<", :
|
595
|
+
event = Event.new :version_qualifier => "<", :version => "0.6"
|
152
596
|
event.applies_to_version?('0.5').should be(true)
|
153
597
|
event.applies_to_version?('0.6').should be(false)
|
154
598
|
event.applies_to_version?('0.7').should be(false)
|
155
599
|
|
156
|
-
event = Event.new :version_qualifier => ">=", :
|
600
|
+
event = Event.new :version_qualifier => ">=", :version => "1.9"
|
157
601
|
event.applies_to_version?('1.8').should be(false)
|
158
602
|
event.applies_to_version?('1.9').should be(true)
|
159
603
|
event.applies_to_version?('2.0').should be(true)
|
160
604
|
|
161
|
-
event = Event.new :version_qualifier => "<=", :
|
162
|
-
event.applies_to_version?('0.5').should be(true)
|
163
|
-
event.applies_to_version?('0.6').should be(true)
|
164
|
-
event.applies_to_version?('0.
|
605
|
+
event = Event.new :version_qualifier => "<=", :version => "0.6.4"
|
606
|
+
event.applies_to_version?('0.5.2').should be(true)
|
607
|
+
event.applies_to_version?('0.6.1').should be(true)
|
608
|
+
event.applies_to_version?('0.6.6').should be(false)
|
609
|
+
event.applies_to_version?('0.7.4').should be(false)
|
610
|
+
end
|
611
|
+
|
612
|
+
it "should raise error if trying to compare invalid versions" do
|
613
|
+
event = Event.new
|
614
|
+
|
615
|
+
# nil event version and version_qualifier is permitted
|
616
|
+
#lambda {
|
617
|
+
# event.applies_to_version?('0.5.2')
|
618
|
+
#}.should raise_error(ArgumentError)
|
619
|
+
|
620
|
+
event.version = '0.7'
|
621
|
+
lambda {
|
622
|
+
event.applies_to_version?(111)
|
623
|
+
}.should raise_error(ArgumentError)
|
165
624
|
end
|
166
625
|
|
167
626
|
it "should successfully run event process" do
|
168
|
-
|
169
|
-
event = Event.new :
|
170
|
-
event.run
|
171
|
-
|
172
|
-
$test_event_run_hash[:
|
173
|
-
$test_event_run_hash[:
|
174
|
-
$test_event_run_hash[:
|
175
|
-
$test_event_run_hash[:
|
176
|
-
|
177
|
-
$test_event_run_hash[:
|
178
|
-
|
179
|
-
$test_event_run_hash[:
|
180
|
-
$test_event_run_hash[:
|
627
|
+
project = Project.new :name => "foobar"
|
628
|
+
event = Event.new :project => project, :process => "test_event_run_method"
|
629
|
+
event.run(:version => "5.0", :key1 => "val1", :some => "thing", :answer => 42)
|
630
|
+
|
631
|
+
$test_event_run_hash[:event].should_not be_nil
|
632
|
+
$test_event_run_hash[:project].should_not be_nil
|
633
|
+
$test_event_run_hash[:version].should_not be_nil
|
634
|
+
$test_event_run_hash[:key1].should_not be_nil
|
635
|
+
$test_event_run_hash[:some].should_not be_nil
|
636
|
+
$test_event_run_hash[:answer].should_not be_nil
|
637
|
+
|
638
|
+
$test_event_run_hash[:event].process == "test_event_run_method"
|
639
|
+
$test_event_run_hash[:project].name.should == "foobar"
|
640
|
+
$test_event_run_hash[:version].should == "5.0"
|
641
|
+
$test_event_run_hash[:key1].should == "val1"
|
642
|
+
$test_event_run_hash[:some].should == "thing"
|
643
|
+
$test_event_run_hash[:answer].should == 42
|
644
|
+
end
|
645
|
+
|
646
|
+
it "should raise an exception if running event w/out specifying version" do
|
647
|
+
project = Project.new :name => "foobar"
|
648
|
+
event = Event.new :project => project, :process => "test_event_run_method"
|
649
|
+
lambda {
|
650
|
+
event.run
|
651
|
+
}.should raise_error(ArgumentError)
|
652
|
+
end
|
653
|
+
|
654
|
+
it "should raise an exception if running event process that doesn't correspond to a method" do
|
655
|
+
project = Project.new :name => "foobar"
|
656
|
+
event = Event.new :project => project, :process => "non_existant_method"
|
657
|
+
lambda {
|
658
|
+
event.run :version => "5"
|
659
|
+
}.should raise_error(ArgumentError)
|
660
|
+
end
|
661
|
+
|
662
|
+
it "should raise an exception if event process being run does" do
|
663
|
+
project = Project.new :name => "foobar"
|
664
|
+
event = Event.new :project => project, :process => "error_generating_method"
|
665
|
+
lambda {
|
666
|
+
event.run :version => "5"
|
667
|
+
}.should raise_error(RuntimeError)
|
181
668
|
end
|
182
669
|
end
|
183
670
|
|
@@ -185,9 +672,50 @@ end
|
|
185
672
|
$test_event_run_hash = {}
|
186
673
|
|
187
674
|
# helper method, invoked in Event::run spec
|
188
|
-
def test_event_run_method(
|
189
|
-
$test_event_run_hash[:
|
190
|
-
$test_event_run_hash[:
|
191
|
-
$test_event_run_hash[:
|
192
|
-
$test_event_run_hash[:
|
675
|
+
def test_event_run_method(event, version, args = {})
|
676
|
+
$test_event_run_hash[:event] = event
|
677
|
+
$test_event_run_hash[:project] = event.project
|
678
|
+
$test_event_run_hash[:version] = version
|
679
|
+
$test_event_run_hash[:key1] = args[:key1]
|
680
|
+
$test_event_run_hash[:some] = args[:some]
|
681
|
+
$test_event_run_hash[:answer] = args[:answer]
|
682
|
+
end
|
683
|
+
|
684
|
+
def error_generating_method(event, version, args = {})
|
685
|
+
raise RuntimeError
|
686
|
+
end
|
687
|
+
|
688
|
+
$project_released_test_handler_flags = []
|
689
|
+
|
690
|
+
def project_released_test_handlerAAA(event, version, args = {})
|
691
|
+
$project_released_test_handler_flags << "AAA"
|
692
|
+
end
|
693
|
+
|
694
|
+
def project_released_test_handlerBBB(event, version, args = {})
|
695
|
+
$project_released_test_handler_flags << "BBB"
|
696
|
+
end
|
697
|
+
|
698
|
+
def project_released_test_handlerCCC(event, version, args = {})
|
699
|
+
$project_released_test_handler_flags << "CCC"
|
700
|
+
end
|
701
|
+
|
702
|
+
def project_released_test_handlerDDD(event, version, args = {})
|
703
|
+
$project_released_test_handler_flags << "DDD"
|
704
|
+
|
705
|
+
args.each { |k,v|
|
706
|
+
$project_released_test_handler_flags << "#{k}=#{v}"
|
707
|
+
}
|
193
708
|
end
|
709
|
+
|
710
|
+
def project_released_test_handlerEEE(event, version, args = {})
|
711
|
+
$project_released_test_handler_flags << "EEE"
|
712
|
+
end
|
713
|
+
|
714
|
+
def project_released_test_handlerFFF(event, version, args = {})
|
715
|
+
$project_released_test_handler_flags << "FFF"
|
716
|
+
end
|
717
|
+
|
718
|
+
def project_released_test_handlerGGG(event, version, args = {})
|
719
|
+
$project_released_test_handler_flags << "GGG"
|
720
|
+
end
|
721
|
+
|