integrity 0.1.9.3 → 0.1.10

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.
Files changed (40) hide show
  1. data/AUTHORS +35 -0
  2. data/CHANGES +24 -0
  3. data/LICENSE +20 -0
  4. data/README.md +10 -52
  5. data/Rakefile +9 -8
  6. data/config/config.sample.yml +4 -0
  7. data/config/heroku/.gems +1 -1
  8. data/config/heroku/integrity-config.rb +1 -0
  9. data/integrity.gemspec +5 -4
  10. data/lib/integrity.rb +2 -0
  11. data/lib/integrity/app.rb +1 -1
  12. data/lib/integrity/helpers.rb +0 -1
  13. data/lib/integrity/helpers/rendering.rb +24 -0
  14. data/lib/integrity/helpers/urls.rb +3 -3
  15. data/lib/integrity/installer.rb +20 -11
  16. data/lib/integrity/migrations.rb +23 -2
  17. data/lib/integrity/notifier.rb +1 -1
  18. data/lib/integrity/notifier/base.rb +1 -1
  19. data/lib/integrity/notifier/test.rb +21 -28
  20. data/lib/integrity/project.rb +12 -17
  21. data/lib/integrity/project/notifiers.rb +20 -22
  22. data/lib/integrity/project/push.rb +32 -33
  23. data/lib/integrity/project_builder.rb +2 -2
  24. data/test/acceptance/build_notifications_test.rb +45 -2
  25. data/test/acceptance/error_page_test.rb +4 -1
  26. data/test/acceptance/installer_test.rb +3 -1
  27. data/test/acceptance/manual_build_project_test.rb +1 -1
  28. data/test/acceptance/not_found_page_test.rb +1 -1
  29. data/test/acceptance/notifier_test_test.rb +37 -0
  30. data/test/helpers.rb +1 -8
  31. data/test/helpers/acceptance.rb +5 -6
  32. data/test/helpers/acceptance/email_notifier.rb +0 -3
  33. data/test/unit/helpers_test.rb +7 -0
  34. data/test/unit/migrations_test.rb +7 -5
  35. data/test/unit/notifier_test.rb +1 -2
  36. data/test/unit/project_test.rb +12 -15
  37. data/views/project.haml +2 -3
  38. metadata +5 -4
  39. data/lib/integrity/helpers/forms.rb +0 -29
  40. data/test/unit/notifier/test_test.rb +0 -29
data/AUTHORS ADDED
@@ -0,0 +1,35 @@
1
+ Integrity is maintained by Nicolás Sanguinetti and Simon Rozet.
2
+
3
+ Thanks to the following people for their feedbacks, ideas and patches :
4
+
5
+ * Bodaniel Jeanes
6
+ * James Golick
7
+ * Wilson Bilkovich
8
+ * Mislav Marohnić
9
+ * Miles Z. Sterrett
10
+ * Kyle Hargraves
11
+ * Josh Nichols
12
+ * Jeremy Hinegardner
13
+ * Chris Wanstrath
14
+ * Will Leinweber
15
+ * Pier-Hugues Pellerin
16
+ * Justin Knowlden
17
+ * Elliott Cable
18
+ * dbr
19
+ * Scott Taylor
20
+ * Jeff Whitmire
21
+ * Diego Algorta
22
+ * Eric Mill
23
+ * Pat Nakajima
24
+ * Nick Quaranto
25
+ * Levent Ali
26
+ * Jeff Schoolcraft
27
+ * James Adam
28
+ * Harry Vangberg
29
+ * Guilherme Chapiewski
30
+ * David Dollar
31
+ * Corey Donohoe
32
+ * Christopher Redinger
33
+ * Alexander Lang
34
+
35
+ NOTE: Please let us know if your name is missing
data/CHANGES CHANGED
@@ -1,3 +1,27 @@
1
+ 0.1.10 / 2009-05-14
2
+ ====================
3
+
4
+ * Bundle the NULL commit author/message fix as a migration
5
+
6
+ * Fix issue with stale notifier. See 693c95e for details
7
+
8
+ * Rename the "Build the last commit" button to "Fetch and build"
9
+
10
+ * Fix the rebuild button (Eric Mill)
11
+
12
+ * Various improvements to the Heroku install (Miles Z. Sterrett)
13
+
14
+ * Documentation to the default config.yml for the
15
+ :build_all_commits option. (Jeff Whitmire)
16
+
17
+ * `integrity launch` now saves the database into $HOME/.integrity.sqlite3
18
+
19
+ * Changed the Notifier::Test API. Notifiers tests are expected
20
+ to break. That API is still not defined and might change at
21
+ any time. See [#130] to discuss this.
22
+
23
+ * Send notifications to enabled notifiers only
24
+
1
25
  0.1.9.3 / 2009-04-06
2
26
  ====================
3
27
 
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008, 2009 Nicolás Sanguinetti <http://nicolassanguinetti.info>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ 'Software'), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -11,9 +11,9 @@ Integrity
11
11
  Try it!
12
12
  -------
13
13
 
14
- $ git clone git://github.com/foca/integrity.git
14
+ $ git clone git://github.com/integrity/integrity.git
15
15
  $ rake launch
16
- # Navigate to <http://0.0.0.0:4567>
16
+ $ open http://0.0.0.0:4567/
17
17
 
18
18
  Run the test suite
19
19
  ------------------
@@ -24,59 +24,17 @@ Run the test suite
24
24
  `gem build integrity.gemspec && gem install *.gem --development`.
25
25
  3. Run the test suite: `rake test`
26
26
 
27
- Thanks
28
- ------
27
+ Why we don't `require "rubygems"`
28
+ ---------------------------------
29
29
 
30
- Thanks to the fellowing people for their feedbacks, ideas and patches :
31
-
32
- * [James Adam][james]
33
- * [Elliott Cable][ec]
34
- * [Corey Donohoe][atmos]
35
- * [Kyle Hargraves][kyle]
36
- * [Pier-Hugues Pellerin][ph]
37
- * [Simon Rozet][sr]
38
- * [Scott Taylor][scott]
39
-
40
- License
41
- -------
42
-
43
- (The MIT License)
44
-
45
- Copyright (c) 2008 [Nicolás Sanguinetti][foca], [entp][]
46
-
47
- Permission is hereby granted, free of charge, to any person obtaining
48
- a copy of this software and associated documentation files (the
49
- 'Software'), to deal in the Software without restriction, including
50
- without limitation the rights to use, copy, modify, merge, publish,
51
- distribute, sublicense, and/or sell copies of the Software, and to
52
- permit persons to whom the Software is furnished to do so, subject to
53
- the following conditions:
54
-
55
- The above copyright notice and this permission notice shall be
56
- included in all copies or substantial portions of the Software.
57
-
58
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
59
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
60
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
61
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
62
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
63
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
64
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30
+ We decided to leave that choice up to the user. For more information, please
31
+ see [Why "require 'rubygems'" In Your Library/App/Tests Is Wrong][rubygems]
32
+ by [Ryan Tomayko][rtomayko].
65
33
 
66
34
  [website]: http://integrityapp.com
67
35
  [demo]: http://builder.integrityapp.com
68
- [repo]: http://github.com/foca/integrity
36
+ [repo]: http://github.com/integrity/integrity
69
37
  [lighthouse]: http://integrity.lighthouseapp.com/projects/14308-integrity
70
38
  [irc-channel]: irc://irc.freenode.net/integrity
71
-
72
- [foca]: http://nicolassanguinetti.info/
73
- [entp]: http://entp.com
74
-
75
- [james]: http://github.com/lazyatom
76
- [ec]: http://github.com/elliotcabble
77
- [atmos]: http://github.com/atmos
78
- [kyle]: http://github.com/pd
79
- [ph]: http://github.com/ph
80
- [sr]: http://purl.org/net/sr/
81
- [scott]: http://github.com/smtlaissezfaire
82
-
39
+ [rubygems]: http://gist.github.com/54177
40
+ [rtomayko]: http://tomayko.com/about
data/Rakefile CHANGED
@@ -29,16 +29,10 @@ namespace :test do
29
29
  end
30
30
  end
31
31
 
32
- begin
33
- require "mg"
34
- require "metric_fu"
35
-
36
- MG.new("integrity.gemspec")
37
- rescue LoadError
38
- end
39
-
40
32
  desc "Special task for running tests on <http://builder.integrityapp.com>"
41
33
  task :ci do
34
+ require "metric_fu"
35
+
42
36
  Rake::Task["test"].invoke
43
37
 
44
38
  metrics = %w(flay flog:all reek roodi saikuro)
@@ -55,3 +49,10 @@ task :ci do
55
49
  f.puts "</ul>"
56
50
  }
57
51
  end
52
+
53
+ begin
54
+ require "mg"
55
+ MG.new("integrity.gemspec")
56
+ rescue LoadError
57
+ end
58
+
@@ -23,6 +23,10 @@
23
23
  # Path to the integrity log file
24
24
  :log: /var/log/integrity.log
25
25
 
26
+ # If set to true integrity will do a build for each commit. Otherwise
27
+ # it will only do a build for each set of commits (i.e. each push)
28
+ :build_all_commits: true
29
+
26
30
  # Enable or disable HTTP authentication for the app. BE AWARE that if you
27
31
  # disable this anyone can delete and alter projects, so do it only if your
28
32
  # app is running in a controlled environment (ie, behind your company's
data/config/heroku/.gems CHANGED
@@ -1 +1 @@
1
- integrity --version 0.1.9.0
1
+ integrity --version 0.1.9.3
@@ -3,6 +3,7 @@ gem "integrity"
3
3
  require "integrity"
4
4
 
5
5
  Integrity.config = {
6
+ :base_uri => nil, # Edit this! Like :base_uri => 'http://awesome-subdomain-13.heroku.com'
6
7
  :database_uri => ENV["DATABASE_URL"],
7
8
  :export_directory => File.dirname(__FILE__) + "/tmp",
8
9
  :log => File.dirname(__FILE__) + "/log/integrity.log",
data/integrity.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "integrity"
3
- s.version = "0.1.9.3"
3
+ s.version = "0.1.10"
4
4
  s.date = "2009-04-06"
5
5
 
6
6
  s.description = "Your Friendly Continuous Integration server. Easy, fun and painless!"
@@ -18,7 +18,7 @@ Gem::Specification.new do |s|
18
18
  s.has_rdoc = false
19
19
  s.rubygems_version = "1.3.1"
20
20
 
21
- s.add_dependency "sinatra", [">= 0.9.1.1"]
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
24
  s.add_dependency "data_mapper", ["= 0.9.11"]
@@ -42,7 +42,9 @@ Gem::Specification.new do |s|
42
42
 
43
43
  s.files = %w[
44
44
  .gitignore
45
+ AUTHORS
45
46
  CHANGES
47
+ LICENSE
46
48
  README.md
47
49
  Rakefile
48
50
  bin/integrity
@@ -63,7 +65,6 @@ lib/integrity/core_ext/object.rb
63
65
  lib/integrity/helpers.rb
64
66
  lib/integrity/helpers/authorization.rb
65
67
  lib/integrity/helpers/breadcrumbs.rb
66
- lib/integrity/helpers/forms.rb
67
68
  lib/integrity/helpers/pretty_output.rb
68
69
  lib/integrity/helpers/rendering.rb
69
70
  lib/integrity/helpers/resources.rb
@@ -96,6 +97,7 @@ test/acceptance/error_page_test.rb
96
97
  test/acceptance/installer_test.rb
97
98
  test/acceptance/manual_build_project_test.rb
98
99
  test/acceptance/not_found_page_test.rb
100
+ test/acceptance/notifier_test_test.rb
99
101
  test/acceptance/project_syndication_test.rb
100
102
  test/acceptance/stylesheet_test.rb
101
103
  test/acceptance/unauthorized_page_test.rb
@@ -117,7 +119,6 @@ test/unit/helpers_test.rb
117
119
  test/unit/integrity_test.rb
118
120
  test/unit/migrations_test.rb
119
121
  test/unit/notifier/base_test.rb
120
- test/unit/notifier/test_test.rb
121
122
  test/unit/notifier_test.rb
122
123
  test/unit/project_builder_test.rb
123
124
  test/unit/project_test.rb
data/lib/integrity.rb CHANGED
@@ -2,6 +2,8 @@ $:.unshift File.expand_path(File.dirname(__FILE__))
2
2
 
3
3
  require "json"
4
4
  require "haml"
5
+ require "sass"
6
+ require "builder"
5
7
  require "dm-core"
6
8
  require "dm-validations"
7
9
  require "dm-types"
data/lib/integrity/app.rb CHANGED
@@ -32,7 +32,7 @@ module Integrity
32
32
  end
33
33
 
34
34
  get "/?" do
35
- @projects = Project.only_public_unless(authorized?)
35
+ @projects = authorized? ? Project.all : Project.all(:public => true)
36
36
  show :home, :title => "projects"
37
37
  end
38
38
 
@@ -4,7 +4,6 @@ module Integrity
4
4
  module Helpers
5
5
  include Authorization
6
6
  include Breadcrumbs
7
- include Forms
8
7
  include PrettyOutput
9
8
  include Rendering
10
9
  include Resources
@@ -20,6 +20,30 @@ module Integrity
20
20
  def partial(template, locals={})
21
21
  haml("_#{template}".to_sym, :locals => locals, :layout => false)
22
22
  end
23
+
24
+ def errors_on(object, field)
25
+ return "" unless errors = object.errors.on(field)
26
+ errors.map {|e| e.gsub(/#{field} /i, "") }.join(", ")
27
+ end
28
+
29
+ def error_class(object, field)
30
+ object.errors.on(field).nil? ? "" : "with_errors"
31
+ end
32
+
33
+ def checkbox(name, condition, extras={})
34
+ attrs = { :name => name, :type => "checkbox", :value => "1" }
35
+ attrs[:checked] = !!condition
36
+ attrs.update(extras)
37
+ end
38
+
39
+ def notifier_form
40
+ Notifier.available.each_pair { |name, klass|
41
+ haml_concat haml(klass.to_haml, :layout => :notifier, :locals => {
42
+ :notifier => name,
43
+ :enabled => current_project.notifies?(name),
44
+ :config => current_project.config_for(name) })
45
+ }
46
+ end
23
47
  end
24
48
  end
25
49
  end
@@ -17,12 +17,12 @@ module Integrity
17
17
  project_url(project, path).path
18
18
  end
19
19
 
20
- def commit_url(commit)
21
- project_url(commit.project, "commits", commit.identifier)
20
+ def commit_url(commit, *path)
21
+ project_url(commit.project, ["commits", commit.identifier, *path].flatten)
22
22
  end
23
23
 
24
24
  def commit_path(commit, *path)
25
- commit_url(commit).path
25
+ commit_url(commit, *path).path
26
26
  end
27
27
 
28
28
  def build_path(build, *path)
@@ -5,6 +5,11 @@ module Integrity
5
5
  class Installer < Thor
6
6
  include FileUtils
7
7
 
8
+ def self.database_path
9
+ File.join(ENV["HOME"], ".integrity.sqlite3")
10
+ end
11
+ private_class_method :database_path
12
+
8
13
  desc "install [PATH]",
9
14
  "Copy template files to PATH for desired deployement strategy
10
15
  (either Thin, Passenger or Heroku). Next, go there and edit them."
@@ -36,22 +41,25 @@ module Integrity
36
41
  end
37
42
 
38
43
  desc "launch [CONFIG]",
39
- "Launch Integrity real quick."
40
- method_options :config => :optional, :port => 4567
44
+ "Launch Integrity real quick. Database is saved in #{database_path}."
45
+ method_options :config => :optional, :port => :optional
41
46
  def launch
42
47
  require "thin"
43
48
  require "do_sqlite3"
44
49
 
45
- File.file?(options[:config].to_s) ?
46
- Integrity.new(options[:config]) : Integrity.new
47
- Integrity.config[:base_uri] = "http://0.0.0.0:#{options[:port]}"
50
+ port = options[:port] || 4567
51
+
52
+ config = { :database_uri => "sqlite3://#{ENV["HOME"]}/.integrity.db",
53
+ :base_uri => "http://0.0.0.0:#{options[:port]}",
54
+ :export_directory => "/tmp/integrity-exports" }
55
+ config.merge!(YAML.load_file(options[:config])) if options[:config]
48
56
 
49
- DataMapper.auto_migrate!
57
+ migrate_db(config)
50
58
 
51
- Thin::Server.start("0.0.0.0", options[:port], Integrity::App)
59
+ Thin::Server.start("0.0.0.0", port, Integrity::App)
52
60
  rescue LoadError => boom
53
- missing_dependency = boom.message.split("--").last.lstrip
54
- puts "Please install #{missing_dependency} to launch Integrity"
61
+ $stderr << "Make sure thin and do_sqlite3 are insatalled\n\n"
62
+ raise
55
63
  end
56
64
 
57
65
  private
@@ -100,8 +108,9 @@ Your Integrity install is ready to be deployed onto Heroku. Next steps:
100
108
 
101
109
  1. git init && git add . && git commit -am "Initial import"
102
110
  2. heroku create
103
- 3. git push heroku master
104
- 4. heroku rake db:migrate
111
+ 3. Add heroku-given domain as :base_uri in integrity-config.rb
112
+ 4. git push heroku master
113
+ 5. heroku rake db:migrate
105
114
  EOF
106
115
  end
107
116
 
@@ -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 => true, :length => 255
88
- column :author, String, :nullable => true, :length => 255
87
+ column :message, String, :nullable => false, :length => 255
88
+ column :author, String, :nullable => false, :length => 255
89
89
  column :committed_at, DateTime, :nullable => false
90
90
  column :created_at, DateTime
91
91
  column :updated_at, DateTime
@@ -147,5 +147,26 @@ module Integrity
147
147
  # modify_table(:integrity_notifiers) { drop_column :enabled }
148
148
  end
149
149
  end
150
+
151
+ migration 4, :nil_commit_metadata do
152
+ up do
153
+ all_commits = Commit.all.collect { |c| c.dup }
154
+ drop_table :integrity_commits
155
+
156
+ create_table :integrity_commits do
157
+ column :id, Integer, :serial => true
158
+ column :identifier, String, :nullable => false
159
+ column :message, String, :nullable => true, :length => 255
160
+ column :author, String, :nullable => true, :length => 255
161
+ column :committed_at, DateTime, :nullable => false
162
+ column :created_at, DateTime
163
+ column :updated_at, DateTime
164
+
165
+ column :project_id, Integer
166
+ end
167
+
168
+ all_commits.each { |commit| Commit.create(commit.attributes) }
169
+ end
170
+ end
150
171
  end
151
172
  end
@@ -33,7 +33,7 @@ module Integrity
33
33
  private_class_method :valid?
34
34
 
35
35
  def notify_of_build(build)
36
- to_const.notify_of_build(build, config)
36
+ to_const.notify_of_build(build, config) if to_const
37
37
  end
38
38
 
39
39
  private
@@ -2,7 +2,7 @@ module Integrity
2
2
  class Notifier
3
3
  class Base
4
4
  def self.notify_of_build(build, config)
5
- Integrity.log "Notifying of build #{build.commit.short_identifier} using the #{self.class} notifier"
5
+ Integrity.log "Notifying of build #{build.commit.short_identifier} using the #{to_s} notifier"
6
6
  Timeout.timeout(8) { new(build.commit, config).deliver! }
7
7
  rescue Timeout::Error
8
8
  Integrity.log "#{notifier.name} notifier timed out"
@@ -11,49 +11,42 @@ module Integrity
11
11
  DataMapper.auto_migrate!
12
12
  end
13
13
 
14
- def notifier_class
15
- Integrity::Notifier.const_get(notifier)
16
- end
17
-
18
- def notification(commit)
19
- notifier_class.new(commit).full_message
20
- end
21
-
22
- def notification_successful
23
- notification(Integrity::Commit.gen(:successful))
14
+ def build(state=:successful)
15
+ Integrity::Build.gen(state)
24
16
  end
25
17
 
26
- def notification_failed
27
- notification(Integrity::Commit.gen(:failed))
18
+ def notifier_class
19
+ Integrity::Notifier.const_get(notifier)
28
20
  end
29
21
 
30
- def assert_form_have_option(option, value=nil)
22
+ def provides_option?(option, value=nil)
31
23
  selector = "input##{notifier.downcase}_notifier_#{option}"
32
24
  selector << "[@name='notifiers[#{notifier}][#{option}]']"
33
25
  selector << "[@value='#{value}']" if value
34
26
 
35
- assert_form_have_tag(selector, option => value)
27
+ form_have_tag?(selector, option => value)
36
28
  end
37
29
 
38
- def assert_form_have_options(*options)
30
+ def provides_options(*options)
39
31
  options.each { |option| assert_form_have_option(option) }
40
32
  end
41
33
 
42
- def assert_form_have_tag(selector, options={})
43
- content = options.delete(:content)
44
- assert_have_tag(form(options), selector, content)
45
- end
34
+ private
35
+ def form(config={})
36
+ Haml::Engine.new(notifier_class.to_haml).
37
+ render(OpenStruct.new(:config => config))
38
+ end
46
39
 
47
- def assert_have_tag(html, selector, content=nil)
48
- matcher = HpricotMatcher.new(html)
49
- assert_equal content, matcher.tag(selector) if content
50
- assert matcher.tag(selector)
51
- end
40
+ def form_have_tag?(selector, options={})
41
+ content = options.delete(:content)
42
+ have_tag?(form(options), selector, content)
43
+ end
52
44
 
53
- def form(config={})
54
- Haml::Engine.new(notifier_class.to_haml).
55
- render(OpenStruct.new(:config => config))
56
- end
45
+ def have_tag?(html, selector, content=nil)
46
+ matcher = HpricotMatcher.new(html)
47
+ assert_equal content, matcher.tag(selector) if content
48
+ matcher.tag(selector)
49
+ end
57
50
  end
58
51
  end
59
52
  end
@@ -4,9 +4,7 @@ require "integrity/project/push"
4
4
  module Integrity
5
5
  class Project
6
6
  include DataMapper::Resource
7
-
8
- include Helpers::Notifiers
9
- include Helpers::Push
7
+ include Notifiers, Push
10
8
 
11
9
  property :id, Integer, :serial => true
12
10
  property :name, String, :nullable => false
@@ -19,6 +17,8 @@ module Integrity
19
17
  property :created_at, DateTime
20
18
  property :updated_at, DateTime
21
19
 
20
+ default_scope(:default).update(:order => [:name.asc])
21
+
22
22
  has n, :commits, :class_name => "Integrity::Commit"
23
23
  has n, :notifiers, :class_name => "Integrity::Notifier"
24
24
 
@@ -27,17 +27,10 @@ module Integrity
27
27
 
28
28
  validates_is_unique :name
29
29
 
30
- def self.only_public_unless(condition)
31
- if condition
32
- all
33
- else
34
- all(:public => true)
35
- end
36
- end
37
-
38
30
  def build(commit_identifier="HEAD")
39
31
  commit_identifier = head_of_remote_repo if commit_identifier == "HEAD"
40
32
  commit = find_or_create_commit_with_identifier(commit_identifier)
33
+
41
34
  Build.queue(commit)
42
35
  end
43
36
 
@@ -46,7 +39,8 @@ module Integrity
46
39
  end
47
40
 
48
41
  def previous_commits
49
- commits.all(:project_id => id, :order => [:committed_at.desc]).tap {|commits| commits.shift }
42
+ commits.all(:project_id => id, :order => [:committed_at.desc]).
43
+ tap {|commits| commits.shift }
50
44
  end
51
45
 
52
46
  def status
@@ -65,7 +59,7 @@ module Integrity
65
59
  end
66
60
 
67
61
  private
68
- def find_or_create_commit_with_identifier(commit_identifier)
62
+ def find_or_create_commit_with_identifier(identifier)
69
63
  # We abuse +committed_at+ here setting it to Time.now because we use it
70
64
  # to sort (for last_commit and previous_commits). I don't like this
71
65
  # very much, but for now it's the only solution I can find.
@@ -75,7 +69,8 @@ module Integrity
75
69
  #
76
70
  # This might also make your commit listings a little jumpy, if some
77
71
  # commits change place every time a build finishes =\
78
- commits.first_or_create({ :identifier => commit_identifier, :project_id => id }, :committed_at => Time.now)
72
+ commits.first_or_create({:identifier => identifier, :project_id => id},
73
+ :committed_at => Time.now)
79
74
  end
80
75
 
81
76
  def head_of_remote_repo
@@ -83,15 +78,15 @@ module Integrity
83
78
  end
84
79
 
85
80
  def set_permalink
86
- self.permalink = (name || "").downcase.
81
+ attribute_set(:permalink, (name || "").downcase.
87
82
  gsub(/'s/, "s").
88
83
  gsub(/&/, "and").
89
84
  gsub(/[^a-z0-9]+/, "-").
90
- gsub(/-*$/, "")
85
+ gsub(/-*$/, ""))
91
86
  end
92
87
 
93
88
  def delete_working_directory
94
- commits.all(:project_id => id).destroy!
89
+ commits.destroy!
95
90
  ProjectBuilder.delete_working_directory(self)
96
91
  rescue SCM::SCMUnknownError => error
97
92
  Integrity.log "Problem while trying to deleting code: #{error}"
@@ -1,32 +1,30 @@
1
1
  module Integrity
2
2
  class Project
3
- module Helpers
4
- module Notifiers
5
- def notifies?(notifier)
6
- return false unless notifier = notifiers.first(:name => notifier)
3
+ module Notifiers
4
+ def notifies?(notifier)
5
+ return false unless notifier = notifiers.first(:name => notifier)
7
6
 
8
- notifier.enabled?
9
- end
7
+ notifier.enabled?
8
+ end
10
9
 
11
- def enabled_notifiers
12
- notifiers.all(:enabled => true)
13
- end
10
+ def enabled_notifiers
11
+ notifiers.all(:enabled => true)
12
+ end
14
13
 
15
- def config_for(notifier)
16
- notifier = notifiers.first(:name => notifier)
17
- notifier ? notifier.config : {}
18
- end
14
+ def config_for(notifier)
15
+ notifier = notifiers.first(:name => notifier)
16
+ notifier ? notifier.config : {}
17
+ end
19
18
 
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)
19
+ def update_notifiers(to_enable, config)
20
+ config.each_pair { |name, config|
21
+ notifier = notifiers.first(:name => name)
22
+ notifier ||= notifiers.new(:name => name)
24
23
 
25
- notifier.enabled = to_enable.include?(name)
26
- notifier.config = config
27
- notifier.save
28
- }
29
- end
24
+ notifier.enabled = to_enable.include?(name)
25
+ notifier.config = config
26
+ notifier.save
27
+ }
30
28
  end
31
29
  end
32
30
  end
@@ -1,44 +1,43 @@
1
1
  module Integrity
2
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)
3
+ module Push
4
+ def push(payload)
5
+ payload = parse_payload(payload)
6
+ raise ArgumentError unless valid_payload?(payload)
8
7
 
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"])
8
+ commits =
9
+ if Integrity.config[:build_all_commits]
10
+ payload["commits"]
11
+ else
12
+ [ payload["commits"].first ]
19
13
  end
20
- end
21
14
 
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
15
+ commits.each { |commit_data|
16
+ commit = commit_from(commit_data)
17
+ commit.create
18
+ build(commit.identifier)
19
+ }
20
+ end
29
21
 
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
22
+ private
23
+ def commit_from(data)
24
+ commits.new(:identifier => data["id"],
25
+ :author => "#{data["author"]["name"]} <#{data["author"]["email"]}>",
26
+ :message => data["message"],
27
+ :committed_at => data["timestamp"])
28
+ end
35
29
 
36
- def parse_payload(payload)
37
- JSON.parse(payload.to_s)
38
- rescue JSON::ParserError
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
39
  false
40
- end
41
- end
40
+ end
42
41
  end
43
42
  end
44
43
  end
@@ -17,7 +17,7 @@ module Integrity
17
17
 
18
18
  def initialize(project)
19
19
  @project = project
20
- @scm = SCM.new(uri, branch, export_directory)
20
+ @scm = SCM.new(uri, branch, export_directory)
21
21
  end
22
22
 
23
23
  def build(commit)
@@ -39,7 +39,7 @@ module Integrity
39
39
  ensure
40
40
  build.complete!
41
41
  commit.update_attributes(scm.info(commit.identifier) || {})
42
- project.notifiers.each { |notifier| notifier.notify_of_build(build) }
42
+ project.enabled_notifiers.each { |notifier| notifier.notify_of_build(build) }
43
43
  end
44
44
 
45
45
  def delete_code
@@ -1,5 +1,6 @@
1
1
  require File.dirname(__FILE__) + "/../helpers/acceptance"
2
2
  require "helpers/acceptance/notifier_helper"
3
+ require "helpers/acceptance/email_notifier"
3
4
 
4
5
  class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
5
6
  include NotifierHelper
@@ -12,9 +13,11 @@ class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
12
13
 
13
14
  before(:each) do
14
15
  # This is needed before any available notifier is unset
15
- # in the global #before
16
+ # in the global #before.
17
+ # But, we need the reload this one because we remove_const
18
+ # it in a test case. Sigh.
16
19
  load "helpers/acceptance/textfile_notifier.rb"
17
- load "helpers/acceptance/email_notifier.rb"
20
+
18
21
  Notifier.register(Integrity::Notifier::Textfile)
19
22
  Notifier.register(Integrity::Notifier::Email)
20
23
  end
@@ -46,6 +49,25 @@ class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
46
49
  notification.should =~ /Build Output:\n\nRunning tests...\n/
47
50
  end
48
51
 
52
+ scenario "an admin sets up the Textfile notifier but do not enable it" do
53
+ git_repo(:my_test_project).add_successful_commit
54
+ Project.gen(:my_test_project, :uri => git_repo(:my_test_project).path)
55
+ rm_f "/tmp/textfile_notifications.txt"
56
+
57
+ login_as "admin", "test"
58
+
59
+ visit "/my-test-project"
60
+
61
+ click_link "Edit Project"
62
+ uncheck "enabled_notifiers_textfile"
63
+ fill_in "File", :with => "/tmp/textfile_notifications.txt"
64
+ click_button "Update Project"
65
+
66
+ click_button "manual build"
67
+
68
+ assert ! File.file?("/tmp/textfile_notifications.txt")
69
+ end
70
+
49
71
  scenario "an admin can setup a notifier without enabling it" do
50
72
  Project.gen(:integrity)
51
73
 
@@ -60,6 +82,27 @@ class BuildNotificationsTest < Test::Unit::AcceptanceTestCase
60
82
  assert_have_email_notifier
61
83
  end
62
84
 
85
+ scenario "an admin enables the Textfile notifier and get rid of it later" do
86
+ git_repo(:my_test_project).add_successful_commit
87
+ Project.gen(:my_test_project, :uri => git_repo(:my_test_project).path)
88
+
89
+ login_as "admin", "test"
90
+ visit "/my-test-project"
91
+
92
+ click_link "Edit Project"
93
+ check "enabled_notifiers_textfile"
94
+ fill_in "File", :with => "/tmp/textfile_notifications.txt"
95
+ click_button "Update Project"
96
+
97
+ Notifier.send(:remove_const, :Textfile)
98
+ Notifier.available.clear
99
+ rm_f "/tmp/textfile_notifications.txt"
100
+
101
+ click_button "manual build"
102
+
103
+ assert ! File.file?("/tmp/textfile_notifications.txt")
104
+ end
105
+
63
106
  scenario "an admin configures various notifiers accros multiple projects" do
64
107
  Project.first(:permalink => "integrity").should be_nil
65
108
 
@@ -7,8 +7,11 @@ class ErrorPageTest < Test::Unit::AcceptanceTestCase
7
7
  So that I can understand what's going on
8
8
  EOS
9
9
 
10
+ before { app.disable :raise_errors }
11
+ after { app.enable :raise_errors }
12
+
10
13
  scenario "an error happen while I am browsing my Integrity install" do
11
- stub(Project).only_public_unless(false) { raise ArgumentError }
14
+ stub(Project).all { raise ArgumentError }
12
15
  lambda { visit "/" }.should raise_error(Webrat::PageLoadError)
13
16
 
14
17
  response_code.should == 500
@@ -53,6 +53,8 @@ class InstallerTest < Test::Unit::AcceptanceTestCase
53
53
 
54
54
  assert root.join("public").directory?
55
55
  assert root.join("tmp").directory?
56
+
57
+ assert ! root.join("thin.yml").file?
56
58
  end
57
59
 
58
60
  scenario "Installing Integrity for Thin" do
@@ -68,7 +70,7 @@ class InstallerTest < Test::Unit::AcceptanceTestCase
68
70
  scenario "Installing Integrity for Heroku" do
69
71
  message = install("--heroku")
70
72
 
71
- assert_equal "integrity --version 0.1.9.0", root.join(".gems").read.chomp
73
+ assert_equal "integrity --version 0.1.9.3", root.join(".gems").read.chomp
72
74
 
73
75
  assert root.join("Rakefile").file?
74
76
  assert root.join("integrity-config.rb").file?
@@ -53,7 +53,7 @@ class ManualBuildProjectTest < Test::Unit::AcceptanceTestCase
53
53
  click_button "Update Project"
54
54
 
55
55
  visit "/my-test-project"
56
- click_button "Build the last commit"
56
+ click_button "Fetch and build"
57
57
 
58
58
  assert_have_tag("h1", :content => "success")
59
59
  end
@@ -8,7 +8,7 @@ class NotFoundPageTest < Test::Unit::AcceptanceTestCase
8
8
  EOS
9
9
 
10
10
  scenario "chilling on some Integrity instance found via The Holy Hub" do
11
- project = Project.gen
11
+ project = Project.gen(:public => true)
12
12
 
13
13
  visit "/42"
14
14
  assert_equal 404, response_code
@@ -0,0 +1,37 @@
1
+ require File.dirname(__FILE__) + "/../helpers/acceptance"
2
+ require "helpers/acceptance/email_notifier"
3
+ require "helpers/acceptance/textfile_notifier"
4
+
5
+ require "integrity/notifier/test"
6
+
7
+ class NotifierTestTest < Test::Unit::TestCase
8
+ include Integrity::Notifier::Test
9
+
10
+ setup do
11
+ @notifier = Integrity::Notifier::Textfile
12
+ @config = {"file" => "/tmp/integrity.txt"}
13
+
14
+ FileUtils.rm @config["file"] if File.exists?(@config["file"])
15
+ end
16
+
17
+ def notifier
18
+ "Textfile"
19
+ end
20
+
21
+ test "it provides a formulary to configure options" do
22
+ assert provides_option?("file")
23
+ assert provides_option?("file", @config["file"])
24
+ end
25
+
26
+ test "it sends notification" do
27
+ build = build(:successful)
28
+
29
+ @notifier.notify_of_build(build, @config)
30
+
31
+ notification = File.read(@config["file"])
32
+
33
+ assert notification.start_with?("===")
34
+ assert notification.include?(build.commit.identifier)
35
+ assert notification.include?("successful")
36
+ end
37
+ end
data/test/helpers.rb CHANGED
@@ -63,15 +63,8 @@ class Test::Unit::TestCase
63
63
  end
64
64
 
65
65
  before(:each) do
66
- [Project, Build, Commit, Notifier].each(&:auto_migrate_down!)
66
+ [Project, Build, Commit, Notifier].each{ |i| i.auto_migrate_down! }
67
67
  capture_stdout { Integrity.migrate_db }
68
-
69
- RR.reset
70
-
71
- Notifier.available.each { |n|
72
- Notifier.send(:remove_const, n.to_s.split(":").last.to_sym)
73
- }
74
-
75
68
  Notifier.available.clear
76
69
  Integrity.instance_variable_set(:@config, nil)
77
70
  end
@@ -56,14 +56,14 @@ class Test::Unit::AcceptanceTestCase < Test::Unit::TestCase
56
56
  include Webrat::Matchers
57
57
  include Webrat::HaveTagMatcher
58
58
 
59
- # TODO: does this belongs in Webrat::SinatraSession?
60
59
  Webrat::Methods.delegate_to_session :response_code
61
60
 
62
61
  def app
63
- Integrity::App.tap { |app|
64
- app.set :environment, :test
65
- app.disable :raise_errors, :run, :reload
66
- }
62
+ Integrity::App
63
+ end
64
+
65
+ before(:all) do
66
+ app.set(:environment, :test)
67
67
  end
68
68
 
69
69
  before(:each) do
@@ -79,5 +79,4 @@ class Test::Unit::AcceptanceTestCase < Test::Unit::TestCase
79
79
  destroy_all_git_repos
80
80
  rm_r export_directory if File.directory?(export_directory)
81
81
  end
82
-
83
82
  end
@@ -1,6 +1,3 @@
1
- require 'rubygems'
2
- require 'integrity'
3
-
4
1
  module Integrity
5
2
  class Notifier
6
3
  class Email < Notifier::Base
@@ -61,6 +61,13 @@ class BrowsePublicProjectsTest < Test::Unit::TestCase
61
61
  }
62
62
  end
63
63
 
64
+ test "build commit" do
65
+ assert_equal "/ci/foo-bar/commits/#{@commit.identifier}/builds",
66
+ @h.commit_path(@build.commit, :builds)
67
+ assert_equal "http://example.org/ci/foo-bar/commits/#{@commit.identifier}/builds",
68
+ @h.commit_url(@build.commit, :builds).to_s
69
+ end
70
+
64
71
  test "compat" do
65
72
  silence_warnings {
66
73
  assert_equal @h.build_path(@build), @h.commit_path(@build.commit)
@@ -23,7 +23,7 @@ class MigrationsTest < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  before(:each) do
26
- [Project, Build, Commit, Notifier].each(&:auto_migrate_down!)
26
+ [Project, Build, Commit, Notifier].each{ |i| i.auto_migrate_down! }
27
27
  database_adapter.execute("DROP TABLE migration_info")
28
28
  assert !table_exists?("migration_info") # just to be sure
29
29
  end
@@ -31,18 +31,20 @@ class MigrationsTest < Test::Unit::TestCase
31
31
  test "upgrading a pre migration database" do
32
32
  capture_stdout { Integrity.migrate_db }
33
33
 
34
- current_migrations.should == ["initial", "add_commits", "add_enabled_column"]
34
+ current_migrations.should == ["initial", "add_commits",
35
+ "add_enabled_column", "nil_commit_metadata"]
35
36
  assert table_exists?("integrity_projects")
36
37
  assert table_exists?("integrity_builds")
37
38
  assert table_exists?("integrity_notifiers")
38
39
  assert table_exists?("integrity_commits")
39
40
  end
40
41
 
41
- test "migrating data from initial to add_commits migration" do
42
+ test "migrating data up from initial to the last migration" do
42
43
  load_initial_migration_fixture
43
-
44
44
  capture_stdout { Integrity.migrate_db }
45
- current_migrations.should == ["initial", "add_commits", "add_enabled_column"]
45
+
46
+ current_migrations.should == ["initial", "add_commits",
47
+ "add_enabled_column", "nil_commit_metadata"]
46
48
 
47
49
  sinatra = Project.first(:name => "Sinatra")
48
50
  sinatra.should have(1).commits
@@ -1,4 +1,5 @@
1
1
  require File.dirname(__FILE__) + "/../helpers"
2
+ require "helpers/acceptance/textfile_notifier"
2
3
 
3
4
  class NotifierTest < Test::Unit::TestCase
4
5
  specify "IRC fixture is valid and can be saved" do
@@ -68,8 +69,6 @@ class NotifierTest < Test::Unit::TestCase
68
69
 
69
70
  describe "Registering a notifier" do
70
71
  it "registers given notifier class" do
71
- load "helpers/acceptance/textfile_notifier.rb"
72
-
73
72
  Notifier.register(Integrity::Notifier::Textfile)
74
73
 
75
74
  assert_equal Integrity::Notifier::Textfile,
@@ -145,22 +145,17 @@ class ProjectTest < Test::Unit::TestCase
145
145
  end
146
146
  end
147
147
 
148
- describe "Finding public or private projects" do
148
+ describe "Finding any project" do
149
149
  before(:each) do
150
- @public_project = Project.gen(:public => true)
151
- @private_project = Project.gen(:public => false)
150
+ @rails = Project.gen(:name => "rails", :public => true)
151
+ @merb = Project.gen(:name => "merb", :public => true)
152
+ @sinatra = Project.gen(:name => "sinatra", :public => true)
153
+ @camping = Project.gen(:name => "camping", :public => false)
152
154
  end
153
155
 
154
- it "finds only public projects if the condition passed is false" do
155
- projects = Project.only_public_unless(false)
156
- projects.should_not include(@private_project)
157
- projects.should include(@public_project)
158
- end
159
-
160
- it "finds both private and public projects if the condition passed is true" do
161
- projects = Project.only_public_unless(true)
162
- projects.should include(@private_project)
163
- projects.should include(@public_project)
156
+ it "should always be ordered by name" do
157
+ Project.all.should == [@camping, @merb, @rails, @sinatra]
158
+ Project.all(:public => true).should == [@merb, @rails, @sinatra]
164
159
  end
165
160
  end
166
161
 
@@ -231,8 +226,10 @@ class ProjectTest < Test::Unit::TestCase
231
226
 
232
227
  assert_equal 2, Notifier.count
233
228
  assert_equal 2, project.enabled_notifiers.count
234
- assert_equal "IRC", project.notifiers.first.name
235
- assert_equal "Twitter", project.notifiers.last.name
229
+
230
+ notifier_names = project.notifiers.map { |n| n.name }
231
+ assert notifier_names.include?("IRC")
232
+ assert notifier_names.include?("Twitter")
236
233
 
237
234
  project.update_notifiers(["Twitter"],
238
235
  {"IRC" => {"uri" => "irc://irc.freenode.net/integrity"},
data/views/project.haml CHANGED
@@ -14,9 +14,8 @@
14
14
 
15
15
  %form{ :action => project_path(@project, :builds), :method => :post }
16
16
  %p.submit.manual-build
17
- %button{ :type => :submit, :title => "Fetch the last commit and build it" }<
18
- Build the last commit
19
- in the repository (or rebuild the latest)
17
+ %button{ :type => :submit, :title => "Fetch the last commit from the remote repository and build it" }<
18
+ Fetch and build
20
19
 
21
20
  - unless @project.previous_commits.empty?
22
21
  %h2 Previous builds
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: integrity
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9.3
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Nicol\xC3\xA1s Sanguinetti"
@@ -19,7 +19,7 @@ dependencies:
19
19
  version_requirement:
20
20
  version_requirements: !ruby/object:Gem::Requirement
21
21
  requirements:
22
- - - ">="
22
+ - - "="
23
23
  - !ruby/object:Gem::Version
24
24
  version: 0.9.1.1
25
25
  version:
@@ -203,7 +203,9 @@ extra_rdoc_files: []
203
203
 
204
204
  files:
205
205
  - .gitignore
206
+ - AUTHORS
206
207
  - CHANGES
208
+ - LICENSE
207
209
  - README.md
208
210
  - Rakefile
209
211
  - bin/integrity
@@ -224,7 +226,6 @@ files:
224
226
  - lib/integrity/helpers.rb
225
227
  - lib/integrity/helpers/authorization.rb
226
228
  - lib/integrity/helpers/breadcrumbs.rb
227
- - lib/integrity/helpers/forms.rb
228
229
  - lib/integrity/helpers/pretty_output.rb
229
230
  - lib/integrity/helpers/rendering.rb
230
231
  - lib/integrity/helpers/resources.rb
@@ -257,6 +258,7 @@ files:
257
258
  - test/acceptance/installer_test.rb
258
259
  - test/acceptance/manual_build_project_test.rb
259
260
  - test/acceptance/not_found_page_test.rb
261
+ - test/acceptance/notifier_test_test.rb
260
262
  - test/acceptance/project_syndication_test.rb
261
263
  - test/acceptance/stylesheet_test.rb
262
264
  - test/acceptance/unauthorized_page_test.rb
@@ -278,7 +280,6 @@ files:
278
280
  - test/unit/integrity_test.rb
279
281
  - test/unit/migrations_test.rb
280
282
  - test/unit/notifier/base_test.rb
281
- - test/unit/notifier/test_test.rb
282
283
  - test/unit/notifier_test.rb
283
284
  - test/unit/project_builder_test.rb
284
285
  - test/unit/project_test.rb
@@ -1,29 +0,0 @@
1
- module Integrity
2
- module Helpers
3
- module Forms
4
- def errors_on(object, field)
5
- return "" unless errors = object.errors.on(field)
6
- errors.map {|e| e.gsub(/#{field} /i, "") }.join(", ")
7
- end
8
-
9
- def error_class(object, field)
10
- object.errors.on(field).nil? ? "" : "with_errors"
11
- end
12
-
13
- def checkbox(name, condition, extras={})
14
- attrs = { :name => name, :type => "checkbox", :value => "1" }
15
- attrs[:checked] = !!condition
16
- attrs.update(extras)
17
- end
18
-
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
- }
26
- end
27
- end
28
- end
29
- end
@@ -1,29 +0,0 @@
1
- require File.dirname(__FILE__) + "/../../helpers"
2
- require "helpers/acceptance/textfile_notifier"
3
-
4
- require "integrity/notifier/test"
5
-
6
- class NotifierTestTest < Test::Unit::TestCase
7
- include Integrity::Notifier::Test
8
-
9
- before(:each) do
10
- # Because we unset every notifier in global setup
11
- load "helpers/acceptance/textfile_notifier.rb"
12
- end
13
-
14
- def notifier
15
- "Textfile"
16
- end
17
-
18
- test "it provides a formulary to configure options" do
19
- assert_form_have_option("file")
20
- end
21
-
22
- test "it sends notification" do
23
- commit = Integrity::Commit.gen(:build => Build.gen(:successful))
24
-
25
- assert notification(commit).include?(commit.identifier)
26
- assert notification_failed.include?("failed")
27
- assert notification_successful.include?("was successful")
28
- end
29
- end