foca-integrity 0.1.9.2 → 0.1.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +15 -1
- data/{README.markdown → README.md} +5 -2
- data/Rakefile +7 -29
- data/integrity.gemspec +9 -6
- data/lib/integrity.rb +4 -4
- data/lib/integrity/app.rb +1 -1
- data/lib/integrity/build.rb +2 -41
- data/lib/integrity/commit.rb +7 -10
- data/lib/integrity/helpers/breadcrumbs.rb +1 -1
- data/lib/integrity/helpers/forms.rb +7 -6
- data/lib/integrity/helpers/resources.rb +1 -1
- data/lib/integrity/installer.rb +6 -1
- data/lib/integrity/migrations.rb +13 -2
- data/lib/integrity/notifier.rb +16 -20
- data/lib/integrity/notifier/base.rb +2 -2
- data/lib/integrity/project.rb +6 -59
- data/lib/integrity/project/notifiers.rb +33 -0
- data/lib/integrity/project/push.rb +44 -0
- data/test/acceptance/browse_project_test.rb +4 -0
- data/test/acceptance/build_notifications_test.rb +57 -4
- data/test/acceptance/installer_test.rb +4 -1
- data/test/helpers.rb +28 -39
- data/test/helpers/acceptance.rb +4 -0
- data/test/helpers/acceptance/notifier_helper.rb +47 -0
- data/test/unit/build_test.rb +0 -12
- data/test/unit/commit_test.rb +4 -0
- data/test/unit/migrations_test.rb +3 -2
- data/test/unit/notifier/base_test.rb +43 -0
- data/test/unit/notifier_test.rb +18 -49
- data/test/unit/project_test.rb +95 -21
- data/views/_commit_info.haml +1 -1
- data/views/new.haml +1 -2
- metadata +19 -7
- data/test/acceptance/notifier_test.rb +0 -109
- data/test/helpers/fixtures.rb +0 -87
@@ -10,7 +10,7 @@ module Integrity
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.to_haml
|
13
|
-
raise
|
13
|
+
raise NotImplementedError, "you need to implement this method in your notifier"
|
14
14
|
end
|
15
15
|
|
16
16
|
attr_reader :commit
|
@@ -26,7 +26,7 @@ module Integrity
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def deliver!
|
29
|
-
raise
|
29
|
+
raise NotImplementedError, "you need to implement this method in your notifier"
|
30
30
|
end
|
31
31
|
|
32
32
|
def short_message
|
data/lib/integrity/project.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
+
require "integrity/project/notifiers"
|
2
|
+
require "integrity/project/push"
|
3
|
+
|
1
4
|
module Integrity
|
2
5
|
class Project
|
3
6
|
include DataMapper::Resource
|
4
7
|
|
8
|
+
include Helpers::Notifiers
|
9
|
+
include Helpers::Push
|
10
|
+
|
5
11
|
property :id, Integer, :serial => true
|
6
12
|
property :name, String, :nullable => false
|
7
13
|
property :permalink, String
|
@@ -35,41 +41,14 @@ module Integrity
|
|
35
41
|
Build.queue(commit)
|
36
42
|
end
|
37
43
|
|
38
|
-
def push(payload)
|
39
|
-
payload = parse_payload(payload)
|
40
|
-
raise ArgumentError unless valid_payload?(payload)
|
41
|
-
|
42
|
-
commits =
|
43
|
-
if Integrity.config[:build_all_commits]
|
44
|
-
payload["commits"]
|
45
|
-
else
|
46
|
-
[ payload["commits"].first ]
|
47
|
-
end
|
48
|
-
|
49
|
-
commits.each do |commit_data|
|
50
|
-
create_commit_from(commit_data)
|
51
|
-
build(commit_data["id"])
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
44
|
def last_commit
|
56
45
|
commits.first(:project_id => id, :order => [:committed_at.desc])
|
57
46
|
end
|
58
47
|
|
59
|
-
def last_build
|
60
|
-
warn "Project#last_build is deprecated, use Project#last_commit (#{caller[0]})"
|
61
|
-
last_commit
|
62
|
-
end
|
63
|
-
|
64
48
|
def previous_commits
|
65
49
|
commits.all(:project_id => id, :order => [:committed_at.desc]).tap {|commits| commits.shift }
|
66
50
|
end
|
67
51
|
|
68
|
-
def previous_builds
|
69
|
-
warn "Project#previous_builds is deprecated, use Project#previous_commits (#{caller[0]})"
|
70
|
-
previous_commits
|
71
|
-
end
|
72
|
-
|
73
52
|
def status
|
74
53
|
last_commit && last_commit.status
|
75
54
|
end
|
@@ -85,19 +64,6 @@ module Integrity
|
|
85
64
|
end)
|
86
65
|
end
|
87
66
|
|
88
|
-
def config_for(notifier)
|
89
|
-
notifier = notifiers.first(:name => notifier.to_s.split(/::/).last, :project_id => id)
|
90
|
-
notifier.blank? ? {} : notifier.config
|
91
|
-
end
|
92
|
-
|
93
|
-
def notifies?(notifier)
|
94
|
-
!notifiers.first(:name => notifier.to_s.split(/::/).last, :project_id => id).blank?
|
95
|
-
end
|
96
|
-
|
97
|
-
def enable_notifiers(*args)
|
98
|
-
Notifier.enable_notifiers(id, *args)
|
99
|
-
end
|
100
|
-
|
101
67
|
private
|
102
68
|
def find_or_create_commit_with_identifier(commit_identifier)
|
103
69
|
# We abuse +committed_at+ here setting it to Time.now because we use it
|
@@ -116,13 +82,6 @@ module Integrity
|
|
116
82
|
SCM.new(uri, branch).head
|
117
83
|
end
|
118
84
|
|
119
|
-
def create_commit_from(data)
|
120
|
-
commits.create(:identifier => data["id"],
|
121
|
-
:author => "#{data["author"]["name"]} <#{data["author"]["email"]}>",
|
122
|
-
:message => data["message"],
|
123
|
-
:committed_at => data["timestamp"])
|
124
|
-
end
|
125
|
-
|
126
85
|
def set_permalink
|
127
86
|
self.permalink = (name || "").downcase.
|
128
87
|
gsub(/'s/, "s").
|
@@ -137,17 +96,5 @@ module Integrity
|
|
137
96
|
rescue SCM::SCMUnknownError => error
|
138
97
|
Integrity.log "Problem while trying to deleting code: #{error}"
|
139
98
|
end
|
140
|
-
|
141
|
-
def valid_payload?(payload)
|
142
|
-
payload && payload["ref"].to_s.include?(branch) &&
|
143
|
-
!payload["commits"].nil? &&
|
144
|
-
!payload["commits"].to_a.empty?
|
145
|
-
end
|
146
|
-
|
147
|
-
def parse_payload(payload)
|
148
|
-
JSON.parse(payload.to_s)
|
149
|
-
rescue JSON::ParserError
|
150
|
-
false
|
151
|
-
end
|
152
99
|
end
|
153
100
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Integrity
|
2
|
+
class Project
|
3
|
+
module Helpers
|
4
|
+
module Notifiers
|
5
|
+
def notifies?(notifier)
|
6
|
+
return false unless notifier = notifiers.first(:name => notifier)
|
7
|
+
|
8
|
+
notifier.enabled?
|
9
|
+
end
|
10
|
+
|
11
|
+
def enabled_notifiers
|
12
|
+
notifiers.all(:enabled => true)
|
13
|
+
end
|
14
|
+
|
15
|
+
def config_for(notifier)
|
16
|
+
notifier = notifiers.first(:name => notifier)
|
17
|
+
notifier ? notifier.config : {}
|
18
|
+
end
|
19
|
+
|
20
|
+
def update_notifiers(to_enable, config)
|
21
|
+
config.each_pair { |name, config|
|
22
|
+
notifier = notifiers.first(:name => name)
|
23
|
+
notifier ||= notifiers.new(:name => name)
|
24
|
+
|
25
|
+
notifier.enabled = to_enable.include?(name)
|
26
|
+
notifier.config = config
|
27
|
+
notifier.save
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Integrity
|
2
|
+
class Project
|
3
|
+
module Helpers
|
4
|
+
module Push
|
5
|
+
def push(payload)
|
6
|
+
payload = parse_payload(payload)
|
7
|
+
raise ArgumentError unless valid_payload?(payload)
|
8
|
+
|
9
|
+
commits =
|
10
|
+
if Integrity.config[:build_all_commits]
|
11
|
+
payload["commits"]
|
12
|
+
else
|
13
|
+
[ payload["commits"].first ]
|
14
|
+
end
|
15
|
+
|
16
|
+
commits.each do |commit_data|
|
17
|
+
create_commit_from(commit_data)
|
18
|
+
build(commit_data["id"])
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def create_commit_from(data)
|
24
|
+
commits.create(:identifier => data["id"],
|
25
|
+
:author => "#{data["author"]["name"]} <#{data["author"]["email"]}>",
|
26
|
+
:message => data["message"],
|
27
|
+
:committed_at => data["timestamp"])
|
28
|
+
end
|
29
|
+
|
30
|
+
def valid_payload?(payload)
|
31
|
+
payload && payload["ref"].to_s.include?(branch) &&
|
32
|
+
!payload["commits"].nil? &&
|
33
|
+
!payload["commits"].to_a.empty?
|
34
|
+
end
|
35
|
+
|
36
|
+
def parse_payload(payload)
|
37
|
+
JSON.parse(payload.to_s)
|
38
|
+
rescue JSON::ParserError
|
39
|
+
false
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -48,6 +48,10 @@ class BrowsePublicProjectsTest < Test::Unit::AcceptanceTestCase
|
|
48
48
|
click_link "My Test Project"
|
49
49
|
|
50
50
|
assert_have_tag("h1", :content => "My Test Project")
|
51
|
+
|
52
|
+
# He can then go back to the project listing
|
53
|
+
click_link "projects"
|
54
|
+
assert_have_tag("a", :content => "My Test Project")
|
51
55
|
end
|
52
56
|
|
53
57
|
scenario "a user gets a 404 when browsing to an unexisting project" do
|
@@ -1,7 +1,9 @@
|
|
1
1
|
require File.dirname(__FILE__) + "/../helpers/acceptance"
|
2
|
-
require "helpers/acceptance/
|
2
|
+
require "helpers/acceptance/notifier_helper"
|
3
3
|
|
4
4
|
class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
|
5
|
+
include NotifierHelper
|
6
|
+
|
5
7
|
story <<-EOS
|
6
8
|
As an administrator,
|
7
9
|
I want to setup notifiers on my projects
|
@@ -12,11 +14,14 @@ class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
|
|
12
14
|
# This is needed before any available notifier is unset
|
13
15
|
# in the global #before
|
14
16
|
load "helpers/acceptance/textfile_notifier.rb"
|
17
|
+
load "helpers/acceptance/email_notifier.rb"
|
18
|
+
Notifier.register(Integrity::Notifier::Textfile)
|
19
|
+
Notifier.register(Integrity::Notifier::Email)
|
15
20
|
end
|
16
21
|
|
17
|
-
scenario "an admin sets up a notifier
|
22
|
+
scenario "an admin sets up a notifier and issue a manual build" do
|
18
23
|
git_repo(:my_test_project).add_successful_commit
|
19
|
-
Project.gen(:my_test_project, :
|
24
|
+
Project.gen(:my_test_project, :uri => git_repo(:my_test_project).path)
|
20
25
|
rm_f "/tmp/textfile_notifications.txt"
|
21
26
|
|
22
27
|
login_as "admin", "test"
|
@@ -33,10 +38,58 @@ class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
|
|
33
38
|
notification = File.read("/tmp/textfile_notifications.txt")
|
34
39
|
notification.should =~ /=== Built #{git_repo(:my_test_project).short_head} successfully ===/
|
35
40
|
notification.should =~ /Build #{git_repo(:my_test_project).head} was successful/
|
36
|
-
notification.should =~
|
41
|
+
notification.should =~
|
42
|
+
%r(http://www.example.com/my-test-project/commits/#{git_repo(:my_test_project).head})
|
37
43
|
notification.should =~ /Commit Author: John Doe/
|
38
44
|
notification.should =~ /Commit Date: (.+)/
|
39
45
|
notification.should =~ /Commit Message: This commit will work/
|
40
46
|
notification.should =~ /Build Output:\n\nRunning tests...\n/
|
41
47
|
end
|
48
|
+
|
49
|
+
scenario "an admin can setup a notifier without enabling it" do
|
50
|
+
Project.gen(:integrity)
|
51
|
+
|
52
|
+
login_as "admin", "test"
|
53
|
+
|
54
|
+
visit "/integrity"
|
55
|
+
click_link "Edit Project"
|
56
|
+
fill_in_email_notifier
|
57
|
+
click_button "Update Project"
|
58
|
+
|
59
|
+
visit "/integrity/edit"
|
60
|
+
assert_have_email_notifier
|
61
|
+
end
|
62
|
+
|
63
|
+
scenario "an admin configures various notifiers accros multiple projects" do
|
64
|
+
Project.first(:permalink => "integrity").should be_nil
|
65
|
+
|
66
|
+
login_as "admin", "test"
|
67
|
+
|
68
|
+
visit "/"
|
69
|
+
|
70
|
+
add_project "Integrity", "git://github.com/foca/integrity.git"
|
71
|
+
click_link "projects"
|
72
|
+
|
73
|
+
add_project "Webrat", "git://github.com/brynary/webrat.git"
|
74
|
+
click_link "projects"
|
75
|
+
|
76
|
+
add_project "Rails", "git://github.com/rails/rails.git"
|
77
|
+
click_link "projects"
|
78
|
+
|
79
|
+
edit_project "integrity"
|
80
|
+
edit_project "webrat"
|
81
|
+
edit_project "rails"
|
82
|
+
|
83
|
+
visit "/integrity"
|
84
|
+
click_link "Edit Project"
|
85
|
+
assert_have_email_notifier
|
86
|
+
|
87
|
+
visit "/webrat"
|
88
|
+
click_link "Edit Project"
|
89
|
+
assert_have_email_notifier
|
90
|
+
|
91
|
+
visit "/rails"
|
92
|
+
click_link "Edit Project"
|
93
|
+
assert_have_email_notifier
|
94
|
+
end
|
42
95
|
end
|
@@ -24,7 +24,10 @@ class InstallerTest < Test::Unit::AcceptanceTestCase
|
|
24
24
|
end
|
25
25
|
|
26
26
|
scenario "Installing integrity into a given directory" do
|
27
|
-
|
27
|
+
post_install_message = install
|
28
|
+
|
29
|
+
assert post_install_message.include?("Awesome")
|
30
|
+
assert post_install_message.include?("integrity migrate_db #{root.join("config.yml")}")
|
28
31
|
|
29
32
|
assert root.join("builds").directory?
|
30
33
|
assert root.join("log").directory?
|
data/test/helpers.rb
CHANGED
@@ -1,27 +1,24 @@
|
|
1
1
|
$:.unshift File.dirname(__FILE__) + "/../lib", File.dirname(__FILE__)
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
raise
|
23
|
-
end
|
24
|
-
}
|
3
|
+
require "rubygems"
|
4
|
+
|
5
|
+
require "test/unit"
|
6
|
+
require "rr"
|
7
|
+
require "mocha"
|
8
|
+
require "dm-sweatshop"
|
9
|
+
require "webrat/sinatra"
|
10
|
+
|
11
|
+
gem "jeremymcanally-context"
|
12
|
+
gem "jeremymcanally-matchy"
|
13
|
+
gem "jeremymcanally-pending"
|
14
|
+
require "context"
|
15
|
+
require "matchy"
|
16
|
+
require "pending"
|
17
|
+
|
18
|
+
require "integrity"
|
19
|
+
require "integrity/notifier/test/fixtures"
|
20
|
+
|
21
|
+
require "helpers/expectations"
|
25
22
|
|
26
23
|
begin
|
27
24
|
require "ruby-debug"
|
@@ -29,10 +26,6 @@ begin
|
|
29
26
|
rescue LoadError
|
30
27
|
end
|
31
28
|
|
32
|
-
require "integrity"
|
33
|
-
require "helpers/expectations"
|
34
|
-
require "integrity/notifier/test/fixtures"
|
35
|
-
|
36
29
|
module TestHelper
|
37
30
|
def ignore_logs!
|
38
31
|
Integrity.config[:log] = "/tmp/integrity.test.log"
|
@@ -65,29 +58,25 @@ class Test::Unit::TestCase
|
|
65
58
|
|
66
59
|
before(:all) do
|
67
60
|
DataMapper.setup(:default, "sqlite3::memory:")
|
61
|
+
|
62
|
+
require "integrity/migrations"
|
68
63
|
end
|
69
64
|
|
70
65
|
before(:each) do
|
66
|
+
[Project, Build, Commit, Notifier].each(&:auto_migrate_down!)
|
67
|
+
capture_stdout { Integrity.migrate_db }
|
68
|
+
|
71
69
|
RR.reset
|
72
|
-
|
73
|
-
Integrity.instance_variable_set(:@config, nil)
|
70
|
+
|
74
71
|
Notifier.available.each { |n|
|
75
72
|
Notifier.send(:remove_const, n.to_s.split(":").last.to_sym)
|
76
73
|
}
|
77
74
|
|
78
|
-
|
79
|
-
|
80
|
-
transaction.begin
|
81
|
-
repository.adapter.push_transaction(transaction)
|
82
|
-
end
|
75
|
+
Notifier.available.clear
|
76
|
+
Integrity.instance_variable_set(:@config, nil)
|
83
77
|
end
|
84
78
|
|
85
79
|
after(:each) do
|
86
|
-
|
87
|
-
while repository.adapter.current_transaction
|
88
|
-
repository.adapter.current_transaction.rollback
|
89
|
-
repository.adapter.pop_transaction
|
90
|
-
end
|
91
|
-
end
|
80
|
+
capture_stdout { Integrity::Migrations.migrate_down! }
|
92
81
|
end
|
93
82
|
end
|
data/test/helpers/acceptance.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
module NotifierHelper
|
2
|
+
def fill_in_email_notifier
|
3
|
+
fill_in "notifiers[Email][to]", :with => "quentin@example.com"
|
4
|
+
fill_in "notifiers[Email][from]", :with => "ci@example.com"
|
5
|
+
fill_in "notifiers[Email][user]", :with => "inspector"
|
6
|
+
fill_in "notifiers[Email][pass]", :with => "gadget"
|
7
|
+
fill_in "notifiers[Email][auth]", :with => "simple"
|
8
|
+
fill_in "notifiers[Email][domain]", :with => "example.com"
|
9
|
+
end
|
10
|
+
|
11
|
+
def fill_in_project_info(name, repo)
|
12
|
+
fill_in "Name", :with => name
|
13
|
+
fill_in "Git repository", :with => repo
|
14
|
+
fill_in "Branch to track", :with => "master"
|
15
|
+
fill_in "Build script", :with => "rake"
|
16
|
+
check "Public project"
|
17
|
+
|
18
|
+
fill_in_email_notifier
|
19
|
+
end
|
20
|
+
|
21
|
+
def assert_have_email_notifier
|
22
|
+
assert_have_tag "input#email_notifier_to[@value='quentin@example.com']"
|
23
|
+
assert_have_tag "input#email_notifier_from[@value='ci@example.com']"
|
24
|
+
assert_have_tag "input#email_notifier_user[@value='inspector']"
|
25
|
+
assert_have_tag "input#email_notifier_pass[@value='gadget']"
|
26
|
+
assert_have_tag "input#email_notifier_auth[@value='simple']"
|
27
|
+
assert_have_tag "input#email_notifier_domain[@value='example.com']"
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_project(name, repo)
|
31
|
+
visit "/new"
|
32
|
+
fill_in_project_info(name, repo)
|
33
|
+
click_button "Create Project"
|
34
|
+
|
35
|
+
assert_have_tag("h1", :content => name)
|
36
|
+
click_link 'Edit Project'
|
37
|
+
assert_have_email_notifier
|
38
|
+
end
|
39
|
+
|
40
|
+
def edit_project(name)
|
41
|
+
visit "/#{name}"
|
42
|
+
click_link "Edit Project"
|
43
|
+
assert_have_email_notifier
|
44
|
+
fill_in :branch, :with => "testing"
|
45
|
+
click_button "Update Project"
|
46
|
+
end
|
47
|
+
end
|