foca-integrity 0.1.4 → 0.1.6
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/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
|