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 CHANGED
@@ -1,4 +1,18 @@
1
- 0.1.9.2 / unreleased
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
- **There is no changelog for previous release :-)**
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
- Install the test dependencies with `rake test:setup` and
22
- run the test suite with `rake test`.
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 << "<ul>"
51
+ f.puts "<ul>"
74
52
  metrics.map { |m| m.split(":").first }.each { |m|
75
- f << %Q(<li><a href="/#{m}">#{m}</a></li>)
53
+ f.puts %Q(<li><a href="/#{m}">#{m}</a></li>)
76
54
  }
77
- f << "</ul>"
55
+ f.puts "</ul>"
78
56
  }
79
57
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "integrity"
3
- s.version = "0.1.9.2"
4
- s.date = "2009-03-16"
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", [">= 0.9.10"]
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.markdown
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
@@ -69,9 +69,9 @@ module Integrity
69
69
  end
70
70
  private_class_method :logger
71
71
 
72
- class LogFormatter < Logger::Formatter
73
- def call(severity, time, progname, msg)
74
- time.strftime("[%H:%M:%S] ") + msg2str(msg) + "\n"
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
@@ -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.short_commit_identifier]
124
+ show :build, :title => ["projects", current_project.permalink, current_commit.short_identifier]
125
125
  end
126
126
 
127
127
  get "/:project/builds/:commit" do
@@ -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
@@ -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", :order => [:created_at.desc]
14
- belongs_to :project, :class_name => "Integrity::Project"
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) || Author.load('<Commit author not loaded> <<Commit author not loaded>>', :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
@@ -2,7 +2,7 @@ module Integrity
2
2
  module Helpers
3
3
  module Breadcrumbs
4
4
  def pages
5
- @pages ||= [["projects", root_path], ["new project", root_path("/new")]]
5
+ @pages ||= [["projects", root_path("/")], ["new project", root_path("/new")]]
6
6
  end
7
7
 
8
8
  def breadcrumbs(*crumbs)
@@ -16,12 +16,13 @@ module Integrity
16
16
  attrs.update(extras)
17
17
  end
18
18
 
19
- def notifier_form(notifier)
20
- haml(notifier.to_haml, :layout => :notifier, :locals => {
21
- :config => current_project.config_for(notifier),
22
- :notifier => "#{notifier.to_s.split(/::/).last}",
23
- :enabled => current_project.notifies?(notifier)
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.enable_notifiers(params["notifiers"].keys, params["notifiers"])
14
+ project.update_notifiers(params["enabled_notifiers"] || [], params["notifiers"])
15
15
  end
16
16
  end
17
17
  end
@@ -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
 
@@ -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 => false, :length => 255
88
- column :author, String, :nullable => false, :length => 255
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
@@ -6,43 +6,39 @@ module Integrity
6
6
 
7
7
  property :id, Integer, :serial => true
8
8
  property :name, String, :nullable => false
9
- property :config, Yaml, :nullable => false, :lazy => false
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
- constants.map { |name| const_get(name) }.select { |notifier| valid_notifier?(notifier) }
19
+ @@_notifiers ||= {}
20
+ @@_notifiers
18
21
  end
19
22
 
20
- def self.enable_notifiers(project, enabled, config={})
21
- all(:project_id => project).destroy!
22
- list_of_enabled_notifiers(enabled).each do |name|
23
- create! :project_id => project, :name => name, :config => config[name]
24
- end
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.module_eval(name)
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