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.
Files changed (53) hide show
  1. data/README.markdown +19 -106
  2. data/Rakefile +53 -25
  3. data/VERSION.yml +1 -1
  4. data/app.rb +24 -153
  5. data/bin/integrity +2 -80
  6. data/config/config.sample.ru +2 -1
  7. data/config/config.sample.yml +4 -0
  8. data/integrity.gemspec +16 -11
  9. data/lib/integrity/build.rb +10 -5
  10. data/lib/integrity/helpers/authorization.rb +33 -0
  11. data/lib/integrity/helpers/breadcrumbs.rb +20 -0
  12. data/lib/integrity/helpers/forms.rb +28 -0
  13. data/lib/integrity/helpers/pretty_output.rb +45 -0
  14. data/lib/integrity/helpers/rendering.rb +14 -0
  15. data/lib/integrity/helpers/resources.rb +13 -0
  16. data/lib/integrity/helpers/urls.rb +47 -0
  17. data/lib/integrity/helpers.rb +16 -0
  18. data/lib/integrity/installer.rb +133 -0
  19. data/lib/integrity/migrations.rb +50 -0
  20. data/lib/integrity/notifier/base.rb +1 -1
  21. data/lib/integrity/notifier.rb +2 -2
  22. data/lib/integrity/project.rb +40 -13
  23. data/lib/integrity/{builder.rb → project_builder.rb} +1 -3
  24. data/lib/integrity/scm/git.rb +4 -4
  25. data/lib/integrity/scm.rb +5 -8
  26. data/lib/integrity.rb +37 -26
  27. data/test/helpers/acceptance/git_helper.rb +99 -0
  28. data/test/helpers/acceptance/textfile_notifier.rb +26 -0
  29. data/test/helpers/acceptance.rb +126 -0
  30. data/test/helpers/expectations/be_a.rb +23 -0
  31. data/test/helpers/expectations/change.rb +90 -0
  32. data/test/helpers/expectations/have.rb +105 -0
  33. data/test/helpers/expectations/have_tag.rb +128 -0
  34. data/test/helpers/expectations/predicates.rb +37 -0
  35. data/test/helpers/expectations.rb +5 -0
  36. data/test/helpers/fixtures.rb +83 -0
  37. data/test/helpers.rb +48 -0
  38. data/views/_build_info.haml +18 -0
  39. data/views/build.haml +1 -1
  40. data/views/error.haml +10 -3
  41. data/views/home.haml +3 -2
  42. data/views/integrity.sass +1 -1
  43. data/views/layout.haml +3 -0
  44. data/views/new.haml +10 -13
  45. data/views/notifier.haml +1 -1
  46. data/views/project.builder +21 -0
  47. data/views/project.haml +9 -13
  48. metadata +38 -11
  49. data/lib/integrity/core_ext/time.rb +0 -13
  50. data/spec/form_field_matchers.rb +0 -91
  51. data/spec/spec_helper.rb +0 -135
  52. data/vendor/sinatra-hacks/lib/hacks.rb +0 -49
  53. 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
- = haml(:build_info, :layout => false)
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 => "http://integrityapp.com/configure" } config
15
- ok? If not, try restarting integrity. If you think everything is fine,
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 => project_url(project) }&= project.name
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
- = "Built #{project.last_build.short_commit_identifier}"
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
@@ -358,7 +358,7 @@ a
358
358
  .color37
359
359
  :color #fff
360
360
 
361
- #push_url
361
+ #push_path
362
362
  :display block
363
363
  :margin
364
364
  :top 1em
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? ? "/" : project_url(@project)) }
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 => project_url(@project) }
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 => project_url(@project, :edit) } Edit Project
2
+ %a{ :href => project_path(@project, :edit) } Edit Project
3
3
 
4
4
  - if @project.builds.empty?
5
- %form.blank_slate{ :action => project_url(@project, :builds), :method => :post }
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
- = haml(:build_info, :layout => false)
13
+ = partial(:build_info, :build => @build)
14
14
 
15
- %form{ :action => project_url(@project, :builds), :method => :post }
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 => build_url(build) }
25
- %strong.build
26
- Build
27
- &= build.short_commit_identifier
28
- %span.attribution
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
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: 2008-12-08 00:00:00 -08:00
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.2
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: rspec_hpricot_matchers
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: thor
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/core_ext/time.rb
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
- - vendor/sinatra-hacks/lib/hacks.rb
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