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.
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