bard 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. data/VERSION +1 -1
  2. data/bard.gemspec +46 -48
  3. data/lib/bard.rb +63 -14
  4. data/lib/bard/error.rb +13 -2
  5. metadata +50 -51
  6. data/.gitignore +0 -7
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.12.0
1
+ 0.13.0
data/bard.gemspec CHANGED
@@ -1,76 +1,74 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{bard}
8
- s.version = "0.12.0"
8
+ s.version = "0.13.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Micah Geisel", "Nick Hogle"]
12
- s.date = %q{2010-12-23}
12
+ s.date = %q{2011-03-15}
13
13
  s.default_executable = %q{bard}
14
14
  s.description = %q{This immaculate work of engineering genius allows mere mortals to collaborate with beings of transcendent intelligence like Micah, Michael, and Nick.}
15
15
  s.email = %q{info@botandrose.com}
16
16
  s.executables = ["bard"]
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE",
19
- "README.rdoc"
19
+ "README.rdoc"
20
20
  ]
21
21
  s.files = [
22
22
  ".document",
23
- ".gitignore",
24
- ".gitmodules",
25
- ".rvmrc",
26
- "Gemfile",
27
- "Gemfile.lock",
28
- "LICENSE",
29
- "README.rdoc",
30
- "Rakefile",
31
- "VERSION",
32
- "bard.gemspec",
33
- "bin/bard",
34
- "features/bard_check.feature",
35
- "features/bard_deploy.feature",
36
- "features/bard_pull.feature",
37
- "features/bard_push.feature",
38
- "features/step_definitions/check_steps.rb",
39
- "features/step_definitions/git_steps.rb",
40
- "features/step_definitions/global_steps.rb",
41
- "features/step_definitions/rails_steps.rb",
42
- "features/step_definitions/submodule_steps.rb",
43
- "features/support/env.rb",
44
- "features/support/grit_ext.rb",
45
- "features/support/io.rb",
46
- "lib/bard.rb",
47
- "lib/bard/capistrano.rb",
48
- "lib/bard/check.rb",
49
- "lib/bard/error.rb",
50
- "lib/bard/git.rb",
51
- "lib/bard/io.rb",
52
- "lib/bard/ssh_delegation.rb",
53
- "lib/bard/template.rb",
54
- "lib/bard/template/adva.rb",
55
- "lib/bard/template/authlogic.rb",
56
- "lib/bard/template/compass.rb",
57
- "lib/bard/template/exception_notifier.rb",
58
- "lib/bard/template/gems.rb",
59
- "lib/bard/template/helper.rb",
60
- "lib/bard/template/initial.rb",
61
- "lib/bard/template/static_pages.rb",
62
- "lib/bard/template/testing.rb",
63
- "spec/bard_spec.rb",
64
- "spec/spec_helper.rb"
23
+ ".gitmodules",
24
+ ".rvmrc",
25
+ "Gemfile",
26
+ "Gemfile.lock",
27
+ "LICENSE",
28
+ "README.rdoc",
29
+ "Rakefile",
30
+ "VERSION",
31
+ "bard.gemspec",
32
+ "bin/bard",
33
+ "features/bard_check.feature",
34
+ "features/bard_deploy.feature",
35
+ "features/bard_pull.feature",
36
+ "features/bard_push.feature",
37
+ "features/step_definitions/check_steps.rb",
38
+ "features/step_definitions/git_steps.rb",
39
+ "features/step_definitions/global_steps.rb",
40
+ "features/step_definitions/rails_steps.rb",
41
+ "features/step_definitions/submodule_steps.rb",
42
+ "features/support/env.rb",
43
+ "features/support/grit_ext.rb",
44
+ "features/support/io.rb",
45
+ "lib/bard.rb",
46
+ "lib/bard/capistrano.rb",
47
+ "lib/bard/check.rb",
48
+ "lib/bard/error.rb",
49
+ "lib/bard/git.rb",
50
+ "lib/bard/io.rb",
51
+ "lib/bard/ssh_delegation.rb",
52
+ "lib/bard/template.rb",
53
+ "lib/bard/template/adva.rb",
54
+ "lib/bard/template/authlogic.rb",
55
+ "lib/bard/template/compass.rb",
56
+ "lib/bard/template/exception_notifier.rb",
57
+ "lib/bard/template/gems.rb",
58
+ "lib/bard/template/helper.rb",
59
+ "lib/bard/template/initial.rb",
60
+ "lib/bard/template/static_pages.rb",
61
+ "lib/bard/template/testing.rb",
62
+ "spec/bard_spec.rb",
63
+ "spec/spec_helper.rb"
65
64
  ]
66
65
  s.homepage = %q{http://github.com/botandrose/bard}
67
- s.rdoc_options = ["--charset=UTF-8"]
68
66
  s.require_paths = ["lib"]
69
67
  s.rubygems_version = %q{1.3.7}
70
68
  s.summary = %q{Tools for collaborating with Bot and Rose Design.}
71
69
  s.test_files = [
72
70
  "spec/bard_spec.rb",
73
- "spec/spec_helper.rb"
71
+ "spec/spec_helper.rb"
74
72
  ]
75
73
 
76
74
  if s.respond_to? :specification_version then
data/lib/bard.rb CHANGED
@@ -91,27 +91,76 @@ class Bard < Thor
91
91
  run_crucial "git push origin master"
92
92
  run_crucial "git checkout integration"
93
93
 
94
- if `curl -s -I --user botandrose:thecakeisalie http://integrity.botandrose.com/#{project_name}` !~ /\bStatus: 404\b/
95
- puts "Integrity: verifying build..."
96
- system "curl -sX POST --user botandrose:thecakeisalie http://integrity.botandrose.com/#{project_name}/builds"
97
- while true
98
- response = `curl -s --user botandrose:thecakeisalie http://integrity.botandrose.com/#{project_name}`
99
- break unless response =~ /div class='(building|pending)' id='last_build'/
100
- sleep(2)
101
- end
102
- case response
103
- when /div class='failed' id='last_build'/ then raise TestsFailedError
104
- when /div class='success' id='last_build'/ then puts "Integrity: success! deploying to production"
105
- else raise "Unknown response from CI server:\n#{response}"
106
- end
107
- end
94
+ invoke :ci
108
95
 
109
96
  run_crucial "cap deploy", options.verbose?
110
97
 
111
98
  puts green("Deploy Succeeded")
112
99
  end
113
100
 
101
+ method_options %w( verbose -v ) => :boolean
102
+ desc "ci", "runs ci against master branch"
103
+ def ci
104
+ return unless has_ci?
105
+
106
+ puts "Continuous integration: starting build..."
107
+ last_build_number = get_last_build_number
108
+ last_time_elapsed = get_last_time_elapsed
109
+ start_ci
110
+ sleep(2) while last_build_number == get_last_build_number
111
+
112
+ start_time = Time.new.to_i
113
+ while (response = `curl -s #{ci_host}/lastBuild/api/xml?token=botandrose`).include? "<building>true</building>"
114
+ elapsed_time = Time.new.to_i - start_time
115
+ percentage = (elapsed_time.to_f / last_time_elapsed.to_f * 100).to_i
116
+ output = " Estimated completion: #{percentage}%"
117
+ print "\x08" * output.length
118
+ print output
119
+ $stdout.flush
120
+ sleep(2)
121
+ end
122
+ puts
123
+
124
+ case response
125
+ when /<result>FAILURE<\/result>/ then
126
+ puts
127
+ puts `curl -s #{ci_host}/lastBuild/console?token=botandrose`.match(/<pre>(.+)<\/pre>/m)[1]
128
+ puts
129
+ raise TestsFailedError, "#{ci_host}/#{get_last_build_number}/console"
130
+
131
+ when /<result>ABORTED<\/result>/ then
132
+ raise TestsAbortedError, "#{ci_host}/#{get_last_build_number}/console"
133
+
134
+ when /<result>SUCCESS<\/result>/ then
135
+ puts "Continuous integration: success! deploying to production"
136
+
137
+ else raise "Unknown response from CI server:\n#{response}"
138
+ end
139
+ end
140
+
114
141
  private
142
+ def ci_host
143
+ "http://botandrose:thecakeisalie!@ci.botandrose.com/job/#{project_name}"
144
+ end
145
+
146
+ def has_ci?
147
+ `curl -s -I #{ci_host}/?token=botandrose` =~ /\b200 OK\b/
148
+ end
149
+
150
+ def start_ci
151
+ `curl -s -I -X POST #{ci_host}/build?token=botandrose`
152
+ end
153
+
154
+ def get_last_build_number
155
+ response = `curl -s #{ci_host}/lastBuild/api/xml?token=botandrose`
156
+ response.match(/<number>(\d+)<\/number>/)[1].to_i
157
+ end
158
+
159
+ def get_last_time_elapsed
160
+ response = `curl -s #{ci_host}/lastStableBuild/api/xml?token=botandrose`
161
+ response.match(/<duration>(\d+)<\/duration>/)[1].to_i / 1000
162
+ end
163
+
115
164
  def ensure_sanity!(dirty_ok = false)
116
165
  auto_update!
117
166
  check_dependencies
data/lib/bard/error.rb CHANGED
@@ -7,8 +7,7 @@ class Bard < Thor
7
7
  "NotInProjectRootError" => "You are not in the project's root directory!",
8
8
  "OnMasterBranchError" => "You are on the master branch!\n This is almost always a bad idea. Please work on a topic branch. If you have made changes on this branch, please see Micah for assistance.",
9
9
  "WorkingTreeDirtyError" => "You have uncommitted changes!\n Please run git commit before attempting to push or pull.",
10
- "StagingDetachedHeadError" => "The staging server is on a detached HEAD!\n Please see Micah for assistance.",
11
- "TestsFailedError" => "Automated tests failed!\n See http://integrity.botandrose.com/ for more info."
10
+ "StagingDetachedHeadError" => "The staging server is on a detached HEAD!\n Please see Micah for assistance."
12
11
  }.each do |error, message|
13
12
  eval <<-RUBY
14
13
  class #{error} < Bard::Error
@@ -18,4 +17,16 @@ class Bard < Thor
18
17
  end
19
18
  RUBY
20
19
  end
20
+
21
+ class TestsFailedError < Bard::Error
22
+ def message
23
+ "Automated tests failed!\n See #{super} for more info."
24
+ end
25
+ end
26
+
27
+ class TestsAbortedError < Bard::Error
28
+ def message
29
+ "Automated tests aborted!\n See #{super} for more info."
30
+ end
31
+ end
21
32
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bard
3
3
  version: !ruby/object:Gem::Version
4
- hash: 47
4
+ hash: 43
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 12
8
+ - 13
9
9
  - 0
10
- version: 0.12.0
10
+ version: 0.13.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Micah Geisel
@@ -16,13 +16,11 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2010-12-23 00:00:00 -08:00
19
+ date: 2011-03-15 00:00:00 -07:00
20
20
  default_executable: bard
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
23
- name: ruby-debug
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
23
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
24
  none: false
27
25
  requirements:
28
26
  - - ">="
@@ -31,12 +29,12 @@ dependencies:
31
29
  segments:
32
30
  - 0
33
31
  version: "0"
32
+ requirement: *id001
33
+ prerelease: false
34
34
  type: :development
35
- version_requirements: *id001
35
+ name: ruby-debug
36
36
  - !ruby/object:Gem::Dependency
37
- name: rspec
38
- prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
40
38
  none: false
41
39
  requirements:
42
40
  - - ">="
@@ -45,12 +43,12 @@ dependencies:
45
43
  segments:
46
44
  - 0
47
45
  version: "0"
46
+ requirement: *id002
47
+ prerelease: false
48
48
  type: :development
49
- version_requirements: *id002
49
+ name: rspec
50
50
  - !ruby/object:Gem::Dependency
51
- name: cucumber
52
- prerelease: false
53
- requirement: &id003 !ruby/object:Gem::Requirement
51
+ version_requirements: &id003 !ruby/object:Gem::Requirement
54
52
  none: false
55
53
  requirements:
56
54
  - - ">="
@@ -59,12 +57,12 @@ dependencies:
59
57
  segments:
60
58
  - 0
61
59
  version: "0"
60
+ requirement: *id003
61
+ prerelease: false
62
62
  type: :development
63
- version_requirements: *id003
63
+ name: cucumber
64
64
  - !ruby/object:Gem::Dependency
65
- name: thor
66
- prerelease: false
67
- requirement: &id004 !ruby/object:Gem::Requirement
65
+ version_requirements: &id004 !ruby/object:Gem::Requirement
68
66
  none: false
69
67
  requirements:
70
68
  - - "="
@@ -75,12 +73,12 @@ dependencies:
75
73
  - 11
76
74
  - 7
77
75
  version: 0.11.7
76
+ requirement: *id004
77
+ prerelease: false
78
78
  type: :runtime
79
- version_requirements: *id004
79
+ name: thor
80
80
  - !ruby/object:Gem::Dependency
81
- name: capistrano
82
- prerelease: false
83
- requirement: &id005 !ruby/object:Gem::Requirement
81
+ version_requirements: &id005 !ruby/object:Gem::Requirement
84
82
  none: false
85
83
  requirements:
86
84
  - - "="
@@ -91,12 +89,12 @@ dependencies:
91
89
  - 5
92
90
  - 10
93
91
  version: 2.5.10
92
+ requirement: *id005
93
+ prerelease: false
94
94
  type: :runtime
95
- version_requirements: *id005
95
+ name: capistrano
96
96
  - !ruby/object:Gem::Dependency
97
- name: grit
98
- prerelease: false
99
- requirement: &id006 !ruby/object:Gem::Requirement
97
+ version_requirements: &id006 !ruby/object:Gem::Requirement
100
98
  none: false
101
99
  requirements:
102
100
  - - "="
@@ -107,12 +105,12 @@ dependencies:
107
105
  - 1
108
106
  - 1
109
107
  version: 1.1.1
108
+ requirement: *id006
109
+ prerelease: false
110
110
  type: :runtime
111
- version_requirements: *id006
111
+ name: grit
112
112
  - !ruby/object:Gem::Dependency
113
- name: git_remote_branch
114
- prerelease: false
115
- requirement: &id007 !ruby/object:Gem::Requirement
113
+ version_requirements: &id007 !ruby/object:Gem::Requirement
116
114
  none: false
117
115
  requirements:
118
116
  - - ">="
@@ -123,12 +121,12 @@ dependencies:
123
121
  - 3
124
122
  - 0
125
123
  version: 0.3.0
124
+ requirement: *id007
125
+ prerelease: false
126
126
  type: :runtime
127
- version_requirements: *id007
127
+ name: git_remote_branch
128
128
  - !ruby/object:Gem::Dependency
129
- name: versionomy
130
- prerelease: false
131
- requirement: &id008 !ruby/object:Gem::Requirement
129
+ version_requirements: &id008 !ruby/object:Gem::Requirement
132
130
  none: false
133
131
  requirements:
134
132
  - - ">="
@@ -139,12 +137,12 @@ dependencies:
139
137
  - 3
140
138
  - 0
141
139
  version: 0.3.0
140
+ requirement: *id008
141
+ prerelease: false
142
142
  type: :runtime
143
- version_requirements: *id008
143
+ name: versionomy
144
144
  - !ruby/object:Gem::Dependency
145
- name: systemu
146
- prerelease: false
147
- requirement: &id009 !ruby/object:Gem::Requirement
145
+ version_requirements: &id009 !ruby/object:Gem::Requirement
148
146
  none: false
149
147
  requirements:
150
148
  - - ">="
@@ -155,12 +153,12 @@ dependencies:
155
153
  - 2
156
154
  - 0
157
155
  version: 1.2.0
156
+ requirement: *id009
157
+ prerelease: false
158
158
  type: :runtime
159
- version_requirements: *id009
159
+ name: systemu
160
160
  - !ruby/object:Gem::Dependency
161
- name: term-ansicolor
162
- prerelease: false
163
- requirement: &id010 !ruby/object:Gem::Requirement
161
+ version_requirements: &id010 !ruby/object:Gem::Requirement
164
162
  none: false
165
163
  requirements:
166
164
  - - ">="
@@ -171,12 +169,12 @@ dependencies:
171
169
  - 0
172
170
  - 3
173
171
  version: 1.0.3
172
+ requirement: *id010
173
+ prerelease: false
174
174
  type: :runtime
175
- version_requirements: *id010
175
+ name: term-ansicolor
176
176
  - !ruby/object:Gem::Dependency
177
- name: bard-rake
178
- prerelease: false
179
- requirement: &id011 !ruby/object:Gem::Requirement
177
+ version_requirements: &id011 !ruby/object:Gem::Requirement
180
178
  none: false
181
179
  requirements:
182
180
  - - ">="
@@ -187,8 +185,10 @@ dependencies:
187
185
  - 1
188
186
  - 1
189
187
  version: 0.1.1
188
+ requirement: *id011
189
+ prerelease: false
190
190
  type: :runtime
191
- version_requirements: *id011
191
+ name: bard-rake
192
192
  description: This immaculate work of engineering genius allows mere mortals to collaborate with beings of transcendent intelligence like Micah, Michael, and Nick.
193
193
  email: info@botandrose.com
194
194
  executables:
@@ -200,7 +200,6 @@ extra_rdoc_files:
200
200
  - README.rdoc
201
201
  files:
202
202
  - .document
203
- - .gitignore
204
203
  - .gitmodules
205
204
  - .rvmrc
206
205
  - Gemfile
@@ -247,8 +246,8 @@ homepage: http://github.com/botandrose/bard
247
246
  licenses: []
248
247
 
249
248
  post_install_message:
250
- rdoc_options:
251
- - --charset=UTF-8
249
+ rdoc_options: []
250
+
252
251
  require_paths:
253
252
  - lib
254
253
  required_ruby_version: !ruby/object:Gem::Requirement
data/.gitignore DELETED
@@ -1,7 +0,0 @@
1
- *.sw?
2
- .DS_Store
3
- coverage
4
- rdoc
5
- pkg
6
- tmp
7
- .bundle