integrity 0.1.9.2 → 0.1.9.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +16 -2
- 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 +9 -41
- data/lib/integrity/commit.rb +7 -18
- 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 +7 -3
- data/lib/integrity/project.rb +10 -63
- data/lib/integrity/project/notifiers.rb +33 -0
- data/lib/integrity/project/push.rb +44 -0
- data/lib/integrity/project_builder.rb +35 -35
- 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 +36 -40
- data/test/helpers/acceptance.rb +4 -0
- data/test/helpers/acceptance/notifier_helper.rb +47 -0
- data/test/unit/build_test.rb +21 -10
- data/test/unit/commit_test.rb +4 -21
- data/test/unit/helpers_test.rb +10 -6
- data/test/unit/migrations_test.rb +5 -4
- data/test/unit/notifier/base_test.rb +43 -0
- data/test/unit/notifier_test.rb +18 -49
- data/test/unit/project_builder_test.rb +8 -1
- data/test/unit/project_test.rb +95 -19
- 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
data/CHANGES
CHANGED
@@ -1,4 +1,18 @@
|
|
1
|
-
0.1.9.
|
1
|
+
0.1.9.3 / 2009-04-06
|
2
|
+
====================
|
3
|
+
|
4
|
+
* Fix one more URL issue
|
5
|
+
* Fix that notifiers are always enabled
|
6
|
+
* Fix for when the commit identifier can't be retrieved
|
7
|
+
* Fix the schema to accept NULL commit author and message
|
8
|
+
* Upgrade to DataMapper 0.9.11
|
9
|
+
* Remove all of deprecation code, except on Notifier::Base
|
10
|
+
* Notifiers were refactored and now require to be registered:
|
11
|
+
Integrity.register(Integrity::Notifier::IRC)
|
12
|
+
* The installer do not migrate the database automagically after
|
13
|
+
a successful install anymore
|
14
|
+
|
15
|
+
0.1.9.2 / 2009-03-28
|
2
16
|
====================
|
3
17
|
|
4
18
|
* Add development dependencies to gemspec
|
@@ -25,4 +39,4 @@
|
|
25
39
|
* Fix the installer to work with the current Thor gem
|
26
40
|
|
27
41
|
|
28
|
-
|
42
|
+
(There is no changelog for previous release)
|
@@ -18,8 +18,11 @@ Try it!
|
|
18
18
|
Run the test suite
|
19
19
|
------------------
|
20
20
|
|
21
|
-
|
22
|
-
|
21
|
+
1. Ensure you have `gems.github.com` in your gem sources:
|
22
|
+
`gem sources -a http://gems.github.com`
|
23
|
+
2. Install the runtime and development dependencies:
|
24
|
+
`gem build integrity.gemspec && gem install *.gem --development`.
|
25
|
+
3. Run the test suite: `rake test`
|
23
26
|
|
24
27
|
Thanks
|
25
28
|
------
|
data/Rakefile
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require "rake/testtask"
|
2
|
-
require "rake/clean"
|
3
2
|
|
4
3
|
def spec
|
5
4
|
@spec ||= begin
|
@@ -11,15 +10,6 @@ end
|
|
11
10
|
desc "Default: run all tests"
|
12
11
|
task :default => :test
|
13
12
|
|
14
|
-
desc "Install Integrity dependencies"
|
15
|
-
task :setup do
|
16
|
-
puts "NOTE: assuming you have gems.github.com in your gem sources"
|
17
|
-
|
18
|
-
system "gem install " +
|
19
|
-
spec.dependencies.select { |dep| dep.type == :runtime }.
|
20
|
-
collect(&:name).join(" ")
|
21
|
-
end
|
22
|
-
|
23
13
|
desc "Launch Integrity real quick"
|
24
14
|
task :launch do
|
25
15
|
ruby "bin/integrity launch"
|
@@ -28,39 +18,27 @@ end
|
|
28
18
|
desc "Run tests"
|
29
19
|
task :test => %w(test:units test:acceptance)
|
30
20
|
namespace :test do
|
21
|
+
desc "Run unit tests"
|
31
22
|
Rake::TestTask.new(:units) do |t|
|
32
23
|
t.test_files = FileList["test/unit/*_test.rb"]
|
33
24
|
end
|
34
25
|
|
26
|
+
desc "Run acceptance tests"
|
35
27
|
Rake::TestTask.new(:acceptance) do |t|
|
36
28
|
t.test_files = FileList["test/acceptance/*_test.rb"]
|
37
29
|
end
|
38
|
-
|
39
|
-
desc "Install tests dependencies"
|
40
|
-
task :setup do
|
41
|
-
puts "NOTE: assuming you have gems.github.com in your gem sources"
|
42
|
-
|
43
|
-
system "gem install " +
|
44
|
-
spec.dependencies.select { |dep| dep.type == :development }.
|
45
|
-
collect(&:name).join(" ")
|
46
|
-
end
|
47
30
|
end
|
48
31
|
|
49
32
|
begin
|
50
33
|
require "mg"
|
51
|
-
MG.new("integrity.gemspec")
|
52
|
-
rescue LoadError
|
53
|
-
end
|
54
|
-
|
55
|
-
begin
|
56
34
|
require "metric_fu"
|
35
|
+
|
36
|
+
MG.new("integrity.gemspec")
|
57
37
|
rescue LoadError
|
58
38
|
end
|
59
39
|
|
60
40
|
desc "Special task for running tests on <http://builder.integrityapp.com>"
|
61
41
|
task :ci do
|
62
|
-
sh "git submodule update --init"
|
63
|
-
|
64
42
|
Rake::Task["test"].invoke
|
65
43
|
|
66
44
|
metrics = %w(flay flog:all reek roodi saikuro)
|
@@ -70,10 +48,10 @@ task :ci do
|
|
70
48
|
mv "tmp/metric_fu", "/var/www/integrity-metrics"
|
71
49
|
|
72
50
|
File.open("/var/www/integrity-metrics/index.html", "w") { |f|
|
73
|
-
f
|
51
|
+
f.puts "<ul>"
|
74
52
|
metrics.map { |m| m.split(":").first }.each { |m|
|
75
|
-
f
|
53
|
+
f.puts %Q(<li><a href="/#{m}">#{m}</a></li>)
|
76
54
|
}
|
77
|
-
f
|
55
|
+
f.puts "</ul>"
|
78
56
|
}
|
79
57
|
end
|
data/integrity.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "integrity"
|
3
|
-
s.version = "0.1.9.
|
4
|
-
s.date = "2009-
|
3
|
+
s.version = "0.1.9.3"
|
4
|
+
s.date = "2009-04-06"
|
5
5
|
|
6
6
|
s.description = "Your Friendly Continuous Integration server. Easy, fun and painless!"
|
7
7
|
s.summary = "The easy and fun Continuous Integration server"
|
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_dependency "sinatra", [">= 0.9.1.1"]
|
22
22
|
s.add_dependency "sinatra-authorization"
|
23
23
|
s.add_dependency "haml", [">= 2.0.0"]
|
24
|
-
s.add_dependency "data_mapper", ["
|
24
|
+
s.add_dependency "data_mapper", ["= 0.9.11"]
|
25
25
|
s.add_dependency "uuidtools" # required by dm-types
|
26
26
|
s.add_dependency "bcrypt-ruby" # required by dm-types
|
27
27
|
s.add_dependency "json"
|
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
|
|
35
35
|
s.add_development_dependency "dm-sweatshop"
|
36
36
|
s.add_development_dependency "ParseTree" # required by dm-sweatshop
|
37
37
|
s.add_development_dependency "jeremymcanally-context"
|
38
|
+
s.add_development_dependency "jeremymcanally-matchy"
|
38
39
|
s.add_development_dependency "jeremymcanally-pending"
|
39
40
|
s.add_development_dependency "foca-storyteller"
|
40
41
|
end
|
@@ -42,7 +43,7 @@ Gem::Specification.new do |s|
|
|
42
43
|
s.files = %w[
|
43
44
|
.gitignore
|
44
45
|
CHANGES
|
45
|
-
README.
|
46
|
+
README.md
|
46
47
|
Rakefile
|
47
48
|
bin/integrity
|
48
49
|
config/config.sample.ru
|
@@ -75,6 +76,8 @@ lib/integrity/notifier/test.rb
|
|
75
76
|
lib/integrity/notifier/test/fixtures.rb
|
76
77
|
lib/integrity/notifier/test/hpricot_matcher.rb
|
77
78
|
lib/integrity/project.rb
|
79
|
+
lib/integrity/project/notifiers.rb
|
80
|
+
lib/integrity/project/push.rb
|
78
81
|
lib/integrity/project_builder.rb
|
79
82
|
lib/integrity/scm.rb
|
80
83
|
lib/integrity/scm/git.rb
|
@@ -93,7 +96,6 @@ test/acceptance/error_page_test.rb
|
|
93
96
|
test/acceptance/installer_test.rb
|
94
97
|
test/acceptance/manual_build_project_test.rb
|
95
98
|
test/acceptance/not_found_page_test.rb
|
96
|
-
test/acceptance/notifier_test.rb
|
97
99
|
test/acceptance/project_syndication_test.rb
|
98
100
|
test/acceptance/stylesheet_test.rb
|
99
101
|
test/acceptance/unauthorized_page_test.rb
|
@@ -101,19 +103,20 @@ test/helpers.rb
|
|
101
103
|
test/helpers/acceptance.rb
|
102
104
|
test/helpers/acceptance/email_notifier.rb
|
103
105
|
test/helpers/acceptance/git_helper.rb
|
106
|
+
test/helpers/acceptance/notifier_helper.rb
|
104
107
|
test/helpers/acceptance/textfile_notifier.rb
|
105
108
|
test/helpers/expectations.rb
|
106
109
|
test/helpers/expectations/be_a.rb
|
107
110
|
test/helpers/expectations/change.rb
|
108
111
|
test/helpers/expectations/have.rb
|
109
112
|
test/helpers/expectations/predicates.rb
|
110
|
-
test/helpers/fixtures.rb
|
111
113
|
test/helpers/initial_migration_fixture.sql
|
112
114
|
test/unit/build_test.rb
|
113
115
|
test/unit/commit_test.rb
|
114
116
|
test/unit/helpers_test.rb
|
115
117
|
test/unit/integrity_test.rb
|
116
118
|
test/unit/migrations_test.rb
|
119
|
+
test/unit/notifier/base_test.rb
|
117
120
|
test/unit/notifier/test_test.rb
|
118
121
|
test/unit/notifier_test.rb
|
119
122
|
test/unit/project_builder_test.rb
|
data/lib/integrity.rb
CHANGED
@@ -69,9 +69,9 @@ module Integrity
|
|
69
69
|
end
|
70
70
|
private_class_method :logger
|
71
71
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
72
|
+
class LogFormatter < Logger::Formatter
|
73
|
+
def call(severity, time, progname, msg)
|
74
|
+
time.strftime("[%H:%M:%S] ") + msg2str(msg) + "\n"
|
76
75
|
end
|
76
|
+
end
|
77
77
|
end
|
data/lib/integrity/app.rb
CHANGED
@@ -121,7 +121,7 @@ module Integrity
|
|
121
121
|
get "/:project/commits/:commit" do
|
122
122
|
login_required unless current_project.public?
|
123
123
|
|
124
|
-
show :build, :title => ["projects", current_project.permalink, current_commit.
|
124
|
+
show :build, :title => ["projects", current_project.permalink, current_commit.short_identifier]
|
125
125
|
end
|
126
126
|
|
127
127
|
get "/:project/builds/:commit" do
|
data/lib/integrity/build.rb
CHANGED
@@ -11,12 +11,20 @@ module Integrity
|
|
11
11
|
property :started_at, DateTime
|
12
12
|
property :completed_at, DateTime
|
13
13
|
|
14
|
-
belongs_to :commit, :class_name => "Integrity::Commit"
|
14
|
+
belongs_to :commit, :class_name => "Integrity::Commit",
|
15
|
+
:child_key => [:commit_id]
|
15
16
|
|
16
17
|
def self.pending
|
17
18
|
all(:started_at => nil)
|
18
19
|
end
|
19
20
|
|
21
|
+
def self.queue(commit)
|
22
|
+
commit.update_attributes(:build => new)
|
23
|
+
|
24
|
+
# Build on foreground (this will move away, I promise)
|
25
|
+
ProjectBuilder.build(commit)
|
26
|
+
end
|
27
|
+
|
20
28
|
def pending?
|
21
29
|
started_at.nil?
|
22
30
|
end
|
@@ -40,45 +48,5 @@ module Integrity
|
|
40
48
|
def complete!(time=Time.now)
|
41
49
|
self.completed_at = time
|
42
50
|
end
|
43
|
-
|
44
|
-
#
|
45
|
-
# Deprecated methods
|
46
|
-
#
|
47
|
-
def short_commit_identifier
|
48
|
-
warn "Build#short_commit_identifier is deprecated, use Commit#short_identifier (#{caller[0]})"
|
49
|
-
commit.short_identifier
|
50
|
-
end
|
51
|
-
|
52
|
-
def commit_identifier
|
53
|
-
warn "Build#commit_identifier is deprecated, use Commit#identifier (#{caller[0]})"
|
54
|
-
commit.identifier
|
55
|
-
end
|
56
|
-
|
57
|
-
def commit_author
|
58
|
-
warn "Build#commit_author is deprecated, use Commit#author (#{caller[0]})"
|
59
|
-
commit.author
|
60
|
-
end
|
61
|
-
|
62
|
-
def commit_message
|
63
|
-
warn "Build#commit_message is deprecated, use Commit#message (#{caller[0]})"
|
64
|
-
commit.message
|
65
|
-
end
|
66
|
-
|
67
|
-
def commited_at
|
68
|
-
warn "Build#commited_at is deprecated, use Commit#committed_at (#{caller[0]})"
|
69
|
-
commit.committed_at
|
70
|
-
end
|
71
|
-
|
72
|
-
def project_id
|
73
|
-
warn "Build#project_id is deprecated, use Commit#project_id (#{caller[0]})"
|
74
|
-
commit.project_id
|
75
|
-
end
|
76
|
-
|
77
|
-
def commit_metadata
|
78
|
-
warn "Build#commit_metadata is deprecated, use the different methods in Commit instead (#{caller[0]})"
|
79
|
-
{ :message => commit.message,
|
80
|
-
:author => commit.author,
|
81
|
-
:date => commit.committed_at }
|
82
|
-
end
|
83
51
|
end
|
84
52
|
end
|
data/lib/integrity/commit.rb
CHANGED
@@ -10,15 +10,19 @@ module Integrity
|
|
10
10
|
property :created_at, DateTime
|
11
11
|
property :updated_at, DateTime
|
12
12
|
|
13
|
-
has 1, :build, :class_name => "Integrity::Build",
|
14
|
-
|
13
|
+
has 1, :build, :class_name => "Integrity::Build",
|
14
|
+
:order => [:created_at.desc]
|
15
|
+
|
16
|
+
belongs_to :project, :class_name => "Integrity::Project",
|
17
|
+
:child_key => [:project_id]
|
15
18
|
|
16
19
|
def message
|
17
20
|
attribute_get(:message) || "<Commit message not loaded>"
|
18
21
|
end
|
19
22
|
|
20
23
|
def author
|
21
|
-
attribute_get(:author) ||
|
24
|
+
attribute_get(:author) ||
|
25
|
+
Author.load('<Commit author not loaded> <<Commit author not loaded>>', :author)
|
22
26
|
end
|
23
27
|
|
24
28
|
def short_identifier
|
@@ -52,20 +56,5 @@ module Integrity
|
|
52
56
|
def output
|
53
57
|
build && build.output
|
54
58
|
end
|
55
|
-
|
56
|
-
def queue_build
|
57
|
-
self.build = Build.create(:commit_id => id)
|
58
|
-
self.save
|
59
|
-
|
60
|
-
# Build on foreground (this will move away, I promise)
|
61
|
-
ProjectBuilder.new(project).build(self)
|
62
|
-
end
|
63
|
-
|
64
|
-
# Deprecation layer
|
65
|
-
alias :short_commit_identifier :short_identifier
|
66
|
-
alias :commit_identifier :identifier
|
67
|
-
alias :commit_author :author
|
68
|
-
alias :commit_message :message
|
69
|
-
alias :commited_at :committed_at
|
70
59
|
end
|
71
60
|
end
|
@@ -16,12 +16,13 @@ module Integrity
|
|
16
16
|
attrs.update(extras)
|
17
17
|
end
|
18
18
|
|
19
|
-
def notifier_form
|
20
|
-
|
21
|
-
:
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
def notifier_form
|
20
|
+
Notifier.available.each_pair { |name, klass|
|
21
|
+
haml_concat haml(klass.to_haml, :layout => :notifier, :locals => {
|
22
|
+
:notifier => name,
|
23
|
+
:enabled => current_project.notifies?(name),
|
24
|
+
:config => current_project.config_for(name) })
|
25
|
+
}
|
25
26
|
end
|
26
27
|
end
|
27
28
|
end
|
@@ -11,7 +11,7 @@ module Integrity
|
|
11
11
|
|
12
12
|
def update_notifiers_of(project)
|
13
13
|
if params["notifiers"]
|
14
|
-
project.
|
14
|
+
project.update_notifiers(params["enabled_notifiers"] || [], params["notifiers"])
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
data/lib/integrity/installer.rb
CHANGED
@@ -21,7 +21,6 @@ module Integrity
|
|
21
21
|
create_dir_structure
|
22
22
|
copy_template_files
|
23
23
|
edit_template_files
|
24
|
-
migrate_db(root.join("config.yml"))
|
25
24
|
puts post_install_message
|
26
25
|
end
|
27
26
|
end
|
@@ -45,6 +44,7 @@ module Integrity
|
|
45
44
|
|
46
45
|
File.file?(options[:config].to_s) ?
|
47
46
|
Integrity.new(options[:config]) : Integrity.new
|
47
|
+
Integrity.config[:base_uri] = "http://0.0.0.0:#{options[:port]}"
|
48
48
|
|
49
49
|
DataMapper.auto_migrate!
|
50
50
|
|
@@ -109,6 +109,11 @@ EOF
|
|
109
109
|
<<EOF
|
110
110
|
Awesome! Integrity was installed successfully!
|
111
111
|
|
112
|
+
To complete the installation, please configure the `database_uri` in
|
113
|
+
#{root.join("config.yml")} and install the matching DataMapper adapter if
|
114
|
+
necessary. Then, run `integrity migrate_db #{root.join("config.yml")}
|
115
|
+
|
116
|
+
== Notifiers
|
112
117
|
If you want to enable notifiers, install the gems and then require them
|
113
118
|
in #{root}/config.ru
|
114
119
|
|
data/lib/integrity/migrations.rb
CHANGED
@@ -84,8 +84,8 @@ module Integrity
|
|
84
84
|
create_table :integrity_commits do
|
85
85
|
column :id, Integer, :serial => true
|
86
86
|
column :identifier, String, :nullable => false
|
87
|
-
column :message, String, :nullable =>
|
88
|
-
column :author, String, :nullable =>
|
87
|
+
column :message, String, :nullable => true, :length => 255
|
88
|
+
column :author, String, :nullable => true, :length => 255
|
89
89
|
column :committed_at, DateTime, :nullable => false
|
90
90
|
column :created_at, DateTime
|
91
91
|
column :updated_at, DateTime
|
@@ -136,5 +136,16 @@ module Integrity
|
|
136
136
|
end
|
137
137
|
end
|
138
138
|
end
|
139
|
+
|
140
|
+
migration 3, :add_enabled_column do
|
141
|
+
up do
|
142
|
+
modify_table(:integrity_notifiers) { add_column :enabled, Boolean }
|
143
|
+
end
|
144
|
+
|
145
|
+
down do
|
146
|
+
# TODO: sqlite doesn't support DROP COLUMN ...
|
147
|
+
# modify_table(:integrity_notifiers) { drop_column :enabled }
|
148
|
+
end
|
149
|
+
end
|
139
150
|
end
|
140
151
|
end
|
data/lib/integrity/notifier.rb
CHANGED
@@ -6,43 +6,39 @@ module Integrity
|
|
6
6
|
|
7
7
|
property :id, Integer, :serial => true
|
8
8
|
property :name, String, :nullable => false
|
9
|
-
property :
|
9
|
+
property :enabled, Boolean, :nullable => false, :default => false
|
10
|
+
property :config, Yaml, :nullable => false, :lazy => false
|
10
11
|
|
11
|
-
belongs_to :project, :class_name => "Integrity::Project"
|
12
|
+
belongs_to :project, :class_name => "Integrity::Project",
|
13
|
+
:child_key => [:project_id]
|
12
14
|
|
13
15
|
validates_is_unique :name, :scope => :project_id
|
14
16
|
validates_present :project_id
|
15
17
|
|
16
18
|
def self.available
|
17
|
-
|
19
|
+
@@_notifiers ||= {}
|
20
|
+
@@_notifiers
|
18
21
|
end
|
19
22
|
|
20
|
-
def self.
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
def self.register(klass)
|
24
|
+
raise ArgumentError unless valid?(klass)
|
25
|
+
|
26
|
+
available[klass.to_s.split(":").last] = klass
|
27
|
+
end
|
25
28
|
|
29
|
+
def self.valid?(notifier)
|
30
|
+
notifier.respond_to?(:to_haml) && notifier.respond_to?(:notify_of_build) &&
|
31
|
+
notifier != Notifier::Base
|
26
32
|
end
|
33
|
+
private_class_method :valid?
|
27
34
|
|
28
35
|
def notify_of_build(build)
|
29
36
|
to_const.notify_of_build(build, config)
|
30
37
|
end
|
31
38
|
|
32
39
|
private
|
33
|
-
|
34
40
|
def to_const
|
35
|
-
self.class.
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.list_of_enabled_notifiers(names)
|
39
|
-
[*names].reject { |n| n.nil? }
|
40
|
-
end
|
41
|
-
private_class_method :list_of_enabled_notifiers
|
42
|
-
|
43
|
-
def self.valid_notifier?(notifier)
|
44
|
-
notifier.respond_to?(:to_haml) && notifier.respond_to?(:notify_of_build) && notifier != Notifier::Base
|
41
|
+
self.class.available[name]
|
45
42
|
end
|
46
|
-
private_class_method :valid_notifier?
|
47
43
|
end
|
48
44
|
end
|