bard 0.12.0 → 0.13.0

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