foca-integrity 0.1.4 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +19 -106
- data/Rakefile +53 -25
- data/VERSION.yml +1 -1
- data/app.rb +24 -153
- data/bin/integrity +2 -80
- data/config/config.sample.ru +2 -1
- data/config/config.sample.yml +4 -0
- data/integrity.gemspec +16 -11
- data/lib/integrity/build.rb +10 -5
- data/lib/integrity/helpers/authorization.rb +33 -0
- data/lib/integrity/helpers/breadcrumbs.rb +20 -0
- data/lib/integrity/helpers/forms.rb +28 -0
- data/lib/integrity/helpers/pretty_output.rb +45 -0
- data/lib/integrity/helpers/rendering.rb +14 -0
- data/lib/integrity/helpers/resources.rb +13 -0
- data/lib/integrity/helpers/urls.rb +47 -0
- data/lib/integrity/helpers.rb +16 -0
- data/lib/integrity/installer.rb +133 -0
- data/lib/integrity/migrations.rb +50 -0
- data/lib/integrity/notifier/base.rb +1 -1
- data/lib/integrity/notifier.rb +2 -2
- data/lib/integrity/project.rb +40 -13
- data/lib/integrity/{builder.rb → project_builder.rb} +1 -3
- data/lib/integrity/scm/git.rb +4 -4
- data/lib/integrity/scm.rb +5 -8
- data/lib/integrity.rb +37 -26
- data/test/helpers/acceptance/git_helper.rb +99 -0
- data/test/helpers/acceptance/textfile_notifier.rb +26 -0
- data/test/helpers/acceptance.rb +126 -0
- data/test/helpers/expectations/be_a.rb +23 -0
- data/test/helpers/expectations/change.rb +90 -0
- data/test/helpers/expectations/have.rb +105 -0
- data/test/helpers/expectations/have_tag.rb +128 -0
- data/test/helpers/expectations/predicates.rb +37 -0
- data/test/helpers/expectations.rb +5 -0
- data/test/helpers/fixtures.rb +83 -0
- data/test/helpers.rb +48 -0
- data/views/_build_info.haml +18 -0
- data/views/build.haml +1 -1
- data/views/error.haml +10 -3
- data/views/home.haml +3 -2
- data/views/integrity.sass +1 -1
- data/views/layout.haml +3 -0
- data/views/new.haml +10 -13
- data/views/notifier.haml +1 -1
- data/views/project.builder +21 -0
- data/views/project.haml +9 -13
- metadata +38 -11
- data/lib/integrity/core_ext/time.rb +0 -13
- data/spec/form_field_matchers.rb +0 -91
- data/spec/spec_helper.rb +0 -135
- data/vendor/sinatra-hacks/lib/hacks.rb +0 -49
- data/views/build_info.haml +0 -22
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'hpricot'
|
2
|
+
|
3
|
+
# evil hack to duck-type CgiResponse so that nested shoulds can use
|
4
|
+
# +rspec_on_rails+ matchers without remembering to call to_s on it
|
5
|
+
#
|
6
|
+
# e.g.
|
7
|
+
#
|
8
|
+
# response.should have_tag("li") do |ul|
|
9
|
+
# ul.should have_text("List Item") # with hack
|
10
|
+
# ul.to_s.should have_text("List Item") # without hack
|
11
|
+
# end
|
12
|
+
class Hpricot::Elem
|
13
|
+
alias body to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
module Matchy::Expectations
|
17
|
+
class HaveTag < Base
|
18
|
+
def initialize(test_case, selector, inner_text_or_options, options, &block)
|
19
|
+
#@expected = expected
|
20
|
+
@test_case = test_case
|
21
|
+
@selector = selector
|
22
|
+
|
23
|
+
if Hash === inner_text_or_options
|
24
|
+
@inner_text = nil
|
25
|
+
@options = inner_text_or_options
|
26
|
+
else
|
27
|
+
@inner_text = inner_text_or_options
|
28
|
+
@options = options
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def matches?(actual, &block)
|
33
|
+
@actual = actual
|
34
|
+
@doc = hpricot_document(@actual)
|
35
|
+
|
36
|
+
matched_elements = @doc.search(@selector)
|
37
|
+
|
38
|
+
return @options[:count] == 0 if matched_elements.empty?
|
39
|
+
|
40
|
+
matched_elements = filter_on_inner_text(matched_elements) if @inner_text
|
41
|
+
matched_elements = filter_on_nested_expectations(matched_elements, block) if block
|
42
|
+
|
43
|
+
@actual_count = matched_elements.length
|
44
|
+
|
45
|
+
return false unless acceptable_count?(@actual_count)
|
46
|
+
|
47
|
+
!matched_elements.empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
def failure_message
|
51
|
+
explanation = @actual_count ? "but found #{@actual_count}" : "but did not"
|
52
|
+
"expected\n#{@doc.to_s}\nto have #{failure_count_phrase} #{failure_selector_phrase}, #{explanation}"
|
53
|
+
end
|
54
|
+
|
55
|
+
def negative_failure_message
|
56
|
+
explanation = @actual_count ? "but found #{@actual_count}" : "but did"
|
57
|
+
"expected\n#{@doc.to_s}\nnot to have #{failure_count_phrase} #{failure_selector_phrase}, #{explanation}"
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def hpricot_document(input)
|
62
|
+
if Hpricot === input
|
63
|
+
input
|
64
|
+
elsif input.respond_to?(:body)
|
65
|
+
Hpricot(input.body)
|
66
|
+
else
|
67
|
+
Hpricot(input.to_s)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def filter_on_inner_text(elements)
|
72
|
+
elements.select do |element|
|
73
|
+
next(element.inner_text =~ @inner_text) if @inner_text.is_a?(Regexp)
|
74
|
+
element.inner_text == @inner_text
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def filter_on_nested_expectations(elements, block)
|
79
|
+
elements.select do |el|
|
80
|
+
begin
|
81
|
+
block.call(el)
|
82
|
+
rescue NoMethodError
|
83
|
+
false
|
84
|
+
else
|
85
|
+
true
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def acceptable_count?(actual_count)
|
91
|
+
if @options[:count]
|
92
|
+
return false unless @options[:count] === actual_count
|
93
|
+
end
|
94
|
+
if @options[:minimum]
|
95
|
+
return false unless actual_count >= @options[:minimum]
|
96
|
+
end
|
97
|
+
if @options[:maximum]
|
98
|
+
return false unless actual_count <= @options[:maximum]
|
99
|
+
end
|
100
|
+
|
101
|
+
true
|
102
|
+
end
|
103
|
+
|
104
|
+
def failure_count_phrase
|
105
|
+
if @options[:count]
|
106
|
+
"#{@options[:count]} elements matching"
|
107
|
+
elsif @options[:minimum] || @options[:maximum]
|
108
|
+
count_explanations = []
|
109
|
+
count_explanations << "at least #{@options[:minimum]}" if @options[:minimum]
|
110
|
+
count_explanations << "at most #{@options[:maximum]}" if @options[:maximum]
|
111
|
+
"#{count_explanations.join(' and ')} elements matching"
|
112
|
+
else
|
113
|
+
"an element matching"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def failure_selector_phrase
|
118
|
+
phrase = @selector.inspect
|
119
|
+
phrase << (@inner_text ? " with inner text #{@inner_text.inspect}" : "")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
module TestCaseExtensions
|
124
|
+
def have_tag(selector, inner_text_or_options = nil, options = {}, &block)
|
125
|
+
Matchy::Expectations::HaveTag.new(self, selector, inner_text_or_options, options, &block)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Matchy::Expectations
|
2
|
+
class PredicateExpectation < Base
|
3
|
+
def initialize(predicate, *arguments)
|
4
|
+
@test_case = arguments.pop
|
5
|
+
@predicate = predicate
|
6
|
+
@arguments = arguments
|
7
|
+
end
|
8
|
+
|
9
|
+
def matches?(receiver)
|
10
|
+
@receiver = receiver
|
11
|
+
@receiver.send("#{@predicate}?", *@arguments)
|
12
|
+
end
|
13
|
+
|
14
|
+
def failure_message
|
15
|
+
message = "Expected #{@receiver.inspect} to be #{@predicate}"
|
16
|
+
message << " with #{@arguments.map {|e| e.inspect }.join(", ")}" unless @arguments.empty?
|
17
|
+
message
|
18
|
+
end
|
19
|
+
|
20
|
+
def negative_failure_message
|
21
|
+
message = "Expected #{@receiver.inspect} not to be #{@predicate}"
|
22
|
+
message << " with #{@arguments.map {|e| e.inspect }.join(", ")}" unless @arguments.empty?
|
23
|
+
message
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module TestCaseExtensions
|
28
|
+
def method_missing(method, *args, &block)
|
29
|
+
if method.to_s =~ /^be_(.*)/
|
30
|
+
args << self
|
31
|
+
Matchy::Expectations::PredicateExpectation.new($1, *args)
|
32
|
+
else
|
33
|
+
super
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/expectations/be_a"
|
2
|
+
require File.dirname(__FILE__) + "/expectations/change"
|
3
|
+
require File.dirname(__FILE__) + "/expectations/have"
|
4
|
+
require File.dirname(__FILE__) + "/expectations/predicates"
|
5
|
+
require File.dirname(__FILE__) + "/expectations/have_tag"
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'dm-sweatshop'
|
3
|
+
|
4
|
+
include DataMapper::Sweatshop::Unique
|
5
|
+
|
6
|
+
class Array
|
7
|
+
def pick
|
8
|
+
self[rand(self.length)]
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def commit_metadata
|
13
|
+
meta_data = <<-EOS
|
14
|
+
---
|
15
|
+
:author: #{/\w+ \w+ <\w+@example.org>/.gen}
|
16
|
+
:message: >-
|
17
|
+
#{/\w+/.gen}
|
18
|
+
:date: #{unique {|i| Time.mktime(2008, 12, 15, 18, (59 - i) % 60) }}
|
19
|
+
EOS
|
20
|
+
end
|
21
|
+
|
22
|
+
def create_notifier!(name)
|
23
|
+
klass = Class.new(Integrity::Notifier::Base) do
|
24
|
+
def self.to_haml; ""; end
|
25
|
+
def deliver!; nil; end
|
26
|
+
end
|
27
|
+
|
28
|
+
unless Integrity::Notifier.const_defined?(name)
|
29
|
+
Integrity::Notifier.const_set(name, klass)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
Integrity::Project.fixture do
|
35
|
+
{ :name => (name = unique { /\w+/.gen }),
|
36
|
+
:uri => "git://github.com/#{/\w+/.gen}/#{name}.git",
|
37
|
+
:branch => ["master", "test-refactoring", "lh-34"].pick,
|
38
|
+
:command => ["rake", "make", "ant -buildfile test.xml"].pick,
|
39
|
+
:public => [true, false].pick,
|
40
|
+
:building => [true, false].pick }
|
41
|
+
end
|
42
|
+
|
43
|
+
Integrity::Project.fixture(:integrity) do
|
44
|
+
{ :name => "Integrity",
|
45
|
+
:uri => "git://github.com/foca/integrity.git",
|
46
|
+
:branch => "master",
|
47
|
+
:command => "rake",
|
48
|
+
:public => true,
|
49
|
+
:building => false }
|
50
|
+
end
|
51
|
+
|
52
|
+
Integrity::Project.fixture(:my_test_project) do
|
53
|
+
{ :name => "My Test Project",
|
54
|
+
:uri => Integrity.root / "my-test-project",
|
55
|
+
:branch => "master",
|
56
|
+
:command => "./test",
|
57
|
+
:public => true,
|
58
|
+
:building => false }
|
59
|
+
end
|
60
|
+
|
61
|
+
Integrity::Build.fixture do
|
62
|
+
{ :output => /[:paragraph:]/.gen,
|
63
|
+
:successful => true,
|
64
|
+
:created_at => unique {|i| Time.mktime(2008, 12, 15, 18, (59 - i) % 60) },
|
65
|
+
:commit_identifier => Digest::SHA1.hexdigest(/[:paragraph:]/.gen),
|
66
|
+
:commit_metadata => commit_metadata }
|
67
|
+
end
|
68
|
+
|
69
|
+
Integrity::Notifier.fixture(:irc) do
|
70
|
+
create_notifier! "IRC"
|
71
|
+
|
72
|
+
{ :project => Integrity::Project.generate,
|
73
|
+
:name => "IRC",
|
74
|
+
:config => { :uri => "irc://irc.freenode.net/integrity" }}
|
75
|
+
end
|
76
|
+
|
77
|
+
Integrity::Notifier.fixture(:twitter) do
|
78
|
+
create_notifier! "Twitter"
|
79
|
+
|
80
|
+
{ :project => Integrity::Project.generate,
|
81
|
+
:name => "Twitter",
|
82
|
+
:config => { :email => "foo@example.org", :pass => "secret" }}
|
83
|
+
end
|
data/test/helpers.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../lib/integrity"
|
2
|
+
|
3
|
+
begin
|
4
|
+
require "test/unit"
|
5
|
+
require "redgreen"
|
6
|
+
require "context"
|
7
|
+
require "storyteller"
|
8
|
+
require "pending"
|
9
|
+
require "matchy"
|
10
|
+
require "rr"
|
11
|
+
require "mocha"
|
12
|
+
require "ruby-debug"
|
13
|
+
rescue LoadError
|
14
|
+
puts "You're missing some gems required to run the tests."
|
15
|
+
puts "Please run `rake test:install_dependencies`"
|
16
|
+
puts "You'll probably need to run that command as root or with sudo."
|
17
|
+
puts
|
18
|
+
puts "Thanks :)"
|
19
|
+
puts
|
20
|
+
|
21
|
+
exit 1
|
22
|
+
end
|
23
|
+
|
24
|
+
require File.dirname(__FILE__) / "helpers" / "expectations"
|
25
|
+
require File.dirname(__FILE__) / "helpers" / "fixtures"
|
26
|
+
require File.dirname(__FILE__) / "helpers" / "acceptance"
|
27
|
+
|
28
|
+
module TestHelper
|
29
|
+
def setup_and_reset_database!
|
30
|
+
DataMapper.setup(:default, "sqlite3::memory:")
|
31
|
+
DataMapper.auto_migrate!
|
32
|
+
end
|
33
|
+
|
34
|
+
def ignore_logs!
|
35
|
+
stub(Integrity).log { nil }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class Test::Unit::TestCase
|
40
|
+
class << self
|
41
|
+
alias_method :specify, :test
|
42
|
+
end
|
43
|
+
|
44
|
+
include RR::Adapters::TestUnit
|
45
|
+
include Integrity
|
46
|
+
include TestHelper
|
47
|
+
end
|
48
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
%h1<
|
2
|
+
&== Built #{build.short_commit_identifier} #{build.successful? ? "successfully" : "and failed"}
|
3
|
+
%blockquote
|
4
|
+
%p&= build.commit_message
|
5
|
+
%p.meta<
|
6
|
+
%span.who<
|
7
|
+
&== by: #{build.commit_author.name}
|
8
|
+
|
|
9
|
+
%span.when{ :title => build.commited_at.iso8601 }<
|
10
|
+
&= pretty_date build.commited_at
|
11
|
+
|
|
12
|
+
%span.what<
|
13
|
+
&== commit: #{build.commit_identifier}
|
14
|
+
|
15
|
+
%h2 Build Output:
|
16
|
+
%pre.output
|
17
|
+
:preserve
|
18
|
+
#{bash_color_codes h(build.output)}
|
data/views/build.haml
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
#build{ :class => @build.status }
|
2
|
-
=
|
2
|
+
= partial(:build_info, :build => @build)
|
data/views/error.haml
CHANGED
@@ -7,12 +7,19 @@
|
|
7
7
|
%dd
|
8
8
|
%strong&= @error.message
|
9
9
|
%pre.backtrace= @error.backtrace.join("\n")
|
10
|
+
%dd
|
11
|
+
%strong Query parameters:
|
12
|
+
%pre.query_params= params.inspect
|
10
13
|
|
11
14
|
%dt What can I do?
|
12
15
|
%dd
|
13
|
-
Is your
|
14
|
-
%a{ :href =>
|
15
|
-
ok?
|
16
|
+
Is your
|
17
|
+
%a{ :href => project_url(@project, :edit) } config
|
18
|
+
ok?
|
19
|
+
Need
|
20
|
+
%a{ :href => "http://integrityapp.com/configure" } help?
|
21
|
+
Remember to restart Integrity.
|
22
|
+
If you think everything is fine,
|
16
23
|
then drop by our irc channel:
|
17
24
|
%a{ :href => "irc://irc.freenode.org:6667/integrity" } #integrity
|
18
25
|
on freenode, and we'll try to help.
|
data/views/home.haml
CHANGED
@@ -9,14 +9,15 @@
|
|
9
9
|
%ul#projects
|
10
10
|
- @projects.each do |project|
|
11
11
|
%li{ :class => cycle("even", "odd") + (project.building? ? ' building' : '') + (project.last_build ? (project.last_build.successful? ? ' success' : ' failed') : '') }
|
12
|
-
%a{ :href =>
|
12
|
+
%a{ :href => project_path(project) }&= project.name
|
13
13
|
.meta
|
14
14
|
- if project.building?
|
15
15
|
Building!
|
16
16
|
- elsif project.last_build.nil?
|
17
17
|
Never built yet
|
18
18
|
- else
|
19
|
-
|
19
|
+
== Built #{project.last_build.short_commit_identifier}
|
20
|
+
= pretty_date(project.last_build.created_at)
|
20
21
|
= project.last_build.successful? ? "successfully" : "and failed"
|
21
22
|
%p#new
|
22
23
|
%a{ :href => "/new" } Add a new project
|
data/views/integrity.sass
CHANGED
data/views/layout.haml
CHANGED
@@ -7,6 +7,9 @@
|
|
7
7
|
%link{ :media => "screen", :type => "text/css", :href => "/reset.css", :rel => "stylesheet" }
|
8
8
|
%link{ :media => "screen", :type => "text/css", :href => "/buttons.css", :rel => "stylesheet" }
|
9
9
|
%link{ :media => "screen", :type => "text/css", :href => "/integrity.css", :rel => "stylesheet" }
|
10
|
+
- unless @project.nil?
|
11
|
+
%link{ :rel => "alternate", :type => "application/atom+xml", :title => "Build history Atom", :href => "#{project_path(@project)}.atom"}
|
12
|
+
|
10
13
|
%body
|
11
14
|
#header
|
12
15
|
%h1= @title.join(" / ")
|
data/views/new.haml
CHANGED
@@ -1,34 +1,31 @@
|
|
1
|
-
%form{ :method => "post", :action => (@project.new_record? ? "/" :
|
1
|
+
%form{ :method => "post", :action => (@project.new_record? ? "/" : project_path(@project)) }
|
2
2
|
- unless @project.new_record?
|
3
3
|
.hidden
|
4
4
|
%input{ :name => "_method", :type => "hidden", :value => "put" }
|
5
5
|
|
6
6
|
%p.required{ :class => error_class(@project, :name) }
|
7
|
-
%label{ :for => "project_name" }
|
8
|
-
Name
|
9
|
-
= errors_on @project, :name
|
7
|
+
%label{ :for => "project_name" }<
|
8
|
+
&== Name #{errors_on @project, :name}
|
10
9
|
%input.text#project_name{ :name => "project_data[name]", :type => "text", :value => h(@project.name) }
|
11
10
|
|
12
11
|
%p.required{ :class => error_class(@project, :uri) }
|
13
|
-
%label{ :for => "project_repository" }
|
14
|
-
Git repository
|
15
|
-
= errors_on @project, :uri
|
12
|
+
%label{ :for => "project_repository" }<
|
13
|
+
&== Git repository #{errors_on @project, :uri}
|
16
14
|
%input.text#project_repository{ :name => "project_data[uri]", :type => "text", :value => h(@project.uri) }
|
17
15
|
|
18
16
|
%p.normal{ :class => error_class(@project, :branch) }
|
19
|
-
%label{ :for => "project_branch" }
|
20
|
-
Branch to track
|
21
|
-
= errors_on @project, :branch
|
17
|
+
%label{ :for => "project_branch" }<
|
18
|
+
&== Branch to track #{errors_on @project, :branch}
|
22
19
|
%input.text#project_branch{ :name => "project_data[branch]", :type => "text", :value => "master", :value => h(@project.branch) }
|
23
20
|
|
24
21
|
%p.normal{ :class => error_class(@project, :command) }
|
25
22
|
%label{ :for => "project_build_script" }
|
26
|
-
Build script
|
27
|
-
= errors_on @project, :command
|
23
|
+
&== Build script #{errors_on @project, :command}
|
28
24
|
%textarea#project_build_script{ :name => "project_data[command]", :cols => 40, :rows => 1 }&= @project.command.to_s
|
29
25
|
|
30
26
|
%p.normal.checkbox
|
31
27
|
%label{ :for => "project_public" } Public project
|
28
|
+
%input.hidden{ :name => "project_data[public]", :value => "0", :type => "hidden" }
|
32
29
|
%input.checkbox#project_public{ checkbox("project_data[public]", @project.public?) }
|
33
30
|
|
34
31
|
- Notifier.available.each do |notifier|
|
@@ -44,7 +41,7 @@
|
|
44
41
|
%p
|
45
42
|
%code#push_url= push_url_for(@project)
|
46
43
|
|
47
|
-
%form{ :method => "post", :action =>
|
44
|
+
%form{ :method => "post", :action => project_path(@project) }
|
48
45
|
.hidden
|
49
46
|
%input{ :name => "_method", :type => "hidden", :value => "delete" }
|
50
47
|
%h2 Delete this project
|
data/views/notifier.haml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
%h2.notifier
|
2
2
|
%label
|
3
|
-
%input.checkbox{ checkbox("enabled_notifiers[]", enabled, :value => notifier) }
|
3
|
+
%input.checkbox{ checkbox("enabled_notifiers[]", enabled, :value => notifier, :id => "enabled_notifiers_#{notifier.downcase}") }
|
4
4
|
== #{notifier} Notifications
|
5
5
|
%span.warning be aware that no validation will be made on these fields
|
6
6
|
%fieldset{ :id => "#{notifier.downcase}_config" }
|
@@ -0,0 +1,21 @@
|
|
1
|
+
xml.instruct!
|
2
|
+
xml.feed :xmlns => "http://www.w3.org/2005/Atom" do
|
3
|
+
xml.title "Build history for #{@project.name}"
|
4
|
+
xml.subtitle @project.uri
|
5
|
+
xml.updated @project.builds.first.created_at
|
6
|
+
xml.link :href => "#{project_url(@project)}.atom", :rel => "self"
|
7
|
+
xml.id "#{project_url(@project)}.atom"
|
8
|
+
|
9
|
+
@project.builds.each do |build|
|
10
|
+
xml.entry do
|
11
|
+
xml.id build_url(build)
|
12
|
+
xml.link :href => build_url(build), :rel => "alternate", :type => "text/html"
|
13
|
+
xml.updated build.created_at
|
14
|
+
xml.published build.created_at
|
15
|
+
|
16
|
+
xml.title "Built #{build.short_commit_identifier} #{build.successful? ? "successfully" : "and failed"}"
|
17
|
+
xml.author { xml.name(build.commit_author.name) }
|
18
|
+
xml.content("<div>#{partial(:build_info, :build => build)}</div>", :type => "html")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/views/project.haml
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#administrative
|
2
|
-
%a{ :href =>
|
2
|
+
%a{ :href => project_path(@project, :edit) } Edit Project
|
3
3
|
|
4
4
|
- if @project.builds.empty?
|
5
|
-
%form.blank_slate{ :action =>
|
5
|
+
%form.blank_slate{ :action => project_path(@project, :builds), :method => :post }
|
6
6
|
%p No builds for this project, buddy
|
7
7
|
%h1
|
8
8
|
You can request a
|
@@ -10,9 +10,9 @@
|
|
10
10
|
- else
|
11
11
|
- @build = @project.last_build
|
12
12
|
#last_build{ :class => @build.status }
|
13
|
-
=
|
13
|
+
= partial(:build_info, :build => @build)
|
14
14
|
|
15
|
-
%form{ :action =>
|
15
|
+
%form{ :action => project_path(@project, :builds), :method => :post }
|
16
16
|
%p.submit
|
17
17
|
%button{ :type => :submit } Request Manual Build
|
18
18
|
|
@@ -21,12 +21,8 @@
|
|
21
21
|
%ul#previous_builds
|
22
22
|
- @project.previous_builds.each do |build|
|
23
23
|
%li{ :class => build.status }
|
24
|
-
%a{ :href =>
|
25
|
-
%strong.build
|
26
|
-
Build
|
27
|
-
|
28
|
-
|
29
|
-
by
|
30
|
-
= succeed "," do
|
31
|
-
&= build.commit_author.name
|
32
|
-
&= pretty_date build.commited_at
|
24
|
+
%a{ :href => build_path(build) }
|
25
|
+
%strong.build<
|
26
|
+
&== Build #{build.short_commit_identifier}
|
27
|
+
%span.attribution<
|
28
|
+
== by #{build.commit_author.name}, #{pretty_date build.commited_at}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foca-integrity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Nicol\xC3\xA1s Sanguinetti"
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date:
|
13
|
+
date: 2009-01-29 00:00:00 -08:00
|
14
14
|
default_executable: integrity
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.3
|
23
|
+
version: 0.9.0.3
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: haml
|
@@ -76,6 +76,15 @@ dependencies:
|
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: 0.9.5
|
78
78
|
version:
|
79
|
+
- !ruby/object:Gem::Dependency
|
80
|
+
name: dm-migrations
|
81
|
+
version_requirement:
|
82
|
+
version_requirements: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 0.9.5
|
87
|
+
version:
|
79
88
|
- !ruby/object:Gem::Dependency
|
80
89
|
name: data_objects
|
81
90
|
version_requirement:
|
@@ -113,7 +122,7 @@ dependencies:
|
|
113
122
|
version: 0.0.2
|
114
123
|
version:
|
115
124
|
- !ruby/object:Gem::Dependency
|
116
|
-
name:
|
125
|
+
name: thor
|
117
126
|
version_requirement:
|
118
127
|
version_requirements: !ruby/object:Gem::Requirement
|
119
128
|
requirements:
|
@@ -122,7 +131,7 @@ dependencies:
|
|
122
131
|
version: "0"
|
123
132
|
version:
|
124
133
|
- !ruby/object:Gem::Dependency
|
125
|
-
name:
|
134
|
+
name: uuidtools
|
126
135
|
version_requirement:
|
127
136
|
version_requirements: !ruby/object:Gem::Requirement
|
128
137
|
requirements:
|
@@ -159,22 +168,41 @@ files:
|
|
159
168
|
- integrity.gemspec
|
160
169
|
- lib/integrity.rb
|
161
170
|
- lib/integrity/build.rb
|
162
|
-
- lib/integrity/builder.rb
|
163
171
|
- lib/integrity/core_ext/object.rb
|
164
172
|
- lib/integrity/core_ext/string.rb
|
165
|
-
- lib/integrity/
|
173
|
+
- lib/integrity/helpers.rb
|
174
|
+
- lib/integrity/helpers/authorization.rb
|
175
|
+
- lib/integrity/helpers/breadcrumbs.rb
|
176
|
+
- lib/integrity/helpers/forms.rb
|
177
|
+
- lib/integrity/helpers/pretty_output.rb
|
178
|
+
- lib/integrity/helpers/rendering.rb
|
179
|
+
- lib/integrity/helpers/resources.rb
|
180
|
+
- lib/integrity/helpers/urls.rb
|
181
|
+
- lib/integrity/installer.rb
|
182
|
+
- lib/integrity/migrations.rb
|
166
183
|
- lib/integrity/notifier.rb
|
167
184
|
- lib/integrity/notifier/base.rb
|
168
185
|
- lib/integrity/project.rb
|
186
|
+
- lib/integrity/project_builder.rb
|
169
187
|
- lib/integrity/scm.rb
|
170
188
|
- lib/integrity/scm/git.rb
|
171
189
|
- lib/integrity/scm/git/uri.rb
|
172
190
|
- public/buttons.css
|
173
191
|
- public/reset.css
|
174
192
|
- public/spinner.gif
|
175
|
-
-
|
193
|
+
- test/helpers.rb
|
194
|
+
- test/helpers/acceptance.rb
|
195
|
+
- test/helpers/acceptance/git_helper.rb
|
196
|
+
- test/helpers/acceptance/textfile_notifier.rb
|
197
|
+
- test/helpers/expectations.rb
|
198
|
+
- test/helpers/expectations/be_a.rb
|
199
|
+
- test/helpers/expectations/change.rb
|
200
|
+
- test/helpers/expectations/have.rb
|
201
|
+
- test/helpers/expectations/have_tag.rb
|
202
|
+
- test/helpers/expectations/predicates.rb
|
203
|
+
- test/helpers/fixtures.rb
|
204
|
+
- views/_build_info.haml
|
176
205
|
- views/build.haml
|
177
|
-
- views/build_info.haml
|
178
206
|
- views/error.haml
|
179
207
|
- views/home.haml
|
180
208
|
- views/integrity.sass
|
@@ -182,10 +210,9 @@ files:
|
|
182
210
|
- views/new.haml
|
183
211
|
- views/not_found.haml
|
184
212
|
- views/notifier.haml
|
213
|
+
- views/project.builder
|
185
214
|
- views/project.haml
|
186
215
|
- views/unauthorized.haml
|
187
|
-
- spec/spec_helper.rb
|
188
|
-
- spec/form_field_matchers.rb
|
189
216
|
has_rdoc: false
|
190
217
|
homepage: http://integrityapp.com
|
191
218
|
post_install_message: Run `integrity help` for information on how to setup Integrity.
|
@@ -1,13 +0,0 @@
|
|
1
|
-
class Time
|
2
|
-
alias :strftime_without_ordinals :strftime
|
3
|
-
def strftime(format_string)
|
4
|
-
format_string.gsub! "%o", case day
|
5
|
-
when 1, 21, 31 then "st"
|
6
|
-
when 2, 22 then "nd"
|
7
|
-
when 3, 23 then "rd"
|
8
|
-
else "th"
|
9
|
-
end
|
10
|
-
|
11
|
-
strftime_without_ordinals(format_string)
|
12
|
-
end
|
13
|
-
end
|