sysexits 1.0.0 → 1.0.1
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.tar.gz.sig +0 -0
- data/ChangeLog +0 -9
- data/README.md +1 -1
- data/Rakefile +17 -10
- data/lib/sysexits.rb +2 -2
- data/rake/documentation.rb +35 -0
- data/rake/hg.rb +15 -3
- data/rake/manual.rb +7 -2
- data/rake/publishing.rb +162 -92
- data/rake/testing.rb +52 -88
- metadata +33 -12
- metadata.gz.sig +0 -0
data.tar.gz.sig
ADDED
Binary file
|
data/ChangeLog
CHANGED
@@ -1,9 +0,0 @@
|
|
1
|
-
2[tip] 5b05aabe75b9 2010-06-18 16:36 -0700 ged
|
2
|
-
Wow, Kernel.include? Really? Good thing it's Friday.
|
3
|
-
|
4
|
-
1 975a57604d30 2010-06-18 16:15 -0700 ged
|
5
|
-
Cleanup, switched README and class docs, docs corrections, no-monkeypatch test.
|
6
|
-
|
7
|
-
0 917705a6837d 2010-06-18 14:50 -0700 ged
|
8
|
-
Initial checkin
|
9
|
-
|
data/README.md
CHANGED
@@ -36,7 +36,7 @@ You can check out the current development source with Mercurial like so:
|
|
36
36
|
|
37
37
|
hg clone http://repo.deveiate.org/sysexits
|
38
38
|
|
39
|
-
You can submit bug reports, suggestions, and read more super-
|
39
|
+
You can submit bug reports, suggestions, and read more super-excited pointless marketing at:
|
40
40
|
|
41
41
|
http://deveiate.org/sysexits.html
|
42
42
|
|
data/Rakefile
CHANGED
@@ -18,6 +18,7 @@ BEGIN {
|
|
18
18
|
libdir = basedir + "lib"
|
19
19
|
extdir = libdir + Config::CONFIG['sitearch']
|
20
20
|
|
21
|
+
$LOAD_PATH.unshift( basedir.to_s ) unless $LOAD_PATH.include?( basedir.to_s )
|
21
22
|
$LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
|
22
23
|
$LOAD_PATH.unshift( extdir.to_s ) unless $LOAD_PATH.include?( extdir.to_s )
|
23
24
|
}
|
@@ -63,7 +64,7 @@ MANUALDIR = DOCSDIR + 'manual'
|
|
63
64
|
|
64
65
|
PROJECT_NAME = 'sysexits'
|
65
66
|
PKG_NAME = PROJECT_NAME.downcase
|
66
|
-
PKG_SUMMARY = '
|
67
|
+
PKG_SUMMARY = 'Exit status codes for system programs.'
|
67
68
|
|
68
69
|
# Cruisecontrol stuff
|
69
70
|
CC_BUILD_LABEL = ENV['CC_BUILD_LABEL']
|
@@ -76,7 +77,7 @@ elsif VERSION_FILE.exist?
|
|
76
77
|
PKG_VERSION = VERSION_FILE.read[ /VERSION\s*=\s*['"](\d+\.\d+\.\d+)['"]/, 1 ]
|
77
78
|
end
|
78
79
|
|
79
|
-
PKG_VERSION = '0.0.0' unless defined?( PKG_VERSION )
|
80
|
+
PKG_VERSION = '0.0.0' unless defined?( PKG_VERSION ) && !PKG_VERSION.nil?
|
80
81
|
|
81
82
|
PKG_FILE_NAME = "#{PKG_NAME.downcase}-#{PKG_VERSION}"
|
82
83
|
GEM_FILE_NAME = "#{PKG_FILE_NAME}.gem"
|
@@ -168,7 +169,7 @@ include RakefileHelpers
|
|
168
169
|
|
169
170
|
# Set the build ID if the mercurial executable is available
|
170
171
|
if hg = which( 'hg' )
|
171
|
-
id =
|
172
|
+
id = `#{hg} id -n`.chomp
|
172
173
|
PKG_BUILD = "pre%03d" % [(id.chomp[ /^[[:xdigit:]]+/ ] || '1')]
|
173
174
|
else
|
174
175
|
PKG_BUILD = 'pre000'
|
@@ -208,6 +209,8 @@ PROJECT_DOCDIR = "#{PROJECT_PUBDIR}/#{PKG_NAME}"
|
|
208
209
|
PROJECT_SCPPUBURL = "#{PROJECT_HOST}:#{PROJECT_PUBDIR}"
|
209
210
|
PROJECT_SCPDOCURL = "#{PROJECT_HOST}:#{PROJECT_DOCDIR}"
|
210
211
|
|
212
|
+
GEM_PUBHOST = 'rubygems.org'
|
213
|
+
|
211
214
|
# Gem dependencies: gemname => version
|
212
215
|
DEPENDENCIES = {
|
213
216
|
}
|
@@ -224,7 +227,6 @@ DEVELOPMENT_DEPENDENCIES = {
|
|
224
227
|
'text-format' => '>= 1.0.0',
|
225
228
|
'tmail' => '>= 1.2.3.1',
|
226
229
|
'diff-lcs' => '>= 1.1.2',
|
227
|
-
'rake-compiler' => '>=0',
|
228
230
|
}
|
229
231
|
|
230
232
|
# Non-gem requirements: packagename => version
|
@@ -238,13 +240,14 @@ GEMSPEC = Gem::Specification.new do |gem|
|
|
238
240
|
|
239
241
|
gem.summary = PKG_SUMMARY
|
240
242
|
gem.description = [
|
241
|
-
"Have you ever wanted to call exit() with an error condition, but
|
242
|
-
"
|
243
|
+
"Have you ever wanted to call exit() with an error condition, but",
|
244
|
+
"weren't sure what exit status to use? No? Maybe it's just me, then.",
|
243
245
|
"",
|
244
|
-
"Anyway, I was reading
|
245
|
-
"
|
246
|
-
"to my chagrin, I couldn't find a 'sysexits' for
|
247
|
-
"
|
246
|
+
"Anyway, I was reading manpages late one evening before retiring to ",
|
247
|
+
"bed in my palatial estate in rural Oregon, and I stumbled across ",
|
248
|
+
"sysexits(3). Much to my chagrin, I couldn't find a 'sysexits' for",
|
249
|
+
"Ruby! Well, for the other 2 people that actually care about style(9) ",
|
250
|
+
"as it applies to Ruby code, now there is one!",
|
248
251
|
].join( "\n" )
|
249
252
|
gem.post_install_message = [
|
250
253
|
"Happy exiting!",
|
@@ -270,6 +273,10 @@ GEMSPEC = Gem::Specification.new do |gem|
|
|
270
273
|
gem.files = RELEASE_FILES
|
271
274
|
gem.test_files = SPEC_FILES
|
272
275
|
|
276
|
+
# signing key and certificate chain
|
277
|
+
gem.signing_key = '/Volumes/Keys/ged-private_gem_key.pem'
|
278
|
+
gem.cert_chain = [File.expand_path('~/.gem/ged-public_gem_cert.pem')]
|
279
|
+
|
273
280
|
DEPENDENCIES.each do |name, version|
|
274
281
|
version = '>= 0' if version.length.zero?
|
275
282
|
gem.add_runtime_dependency( name, version )
|
data/lib/sysexits.rb
CHANGED
data/rake/documentation.rb
CHANGED
@@ -44,6 +44,7 @@ begin
|
|
44
44
|
end
|
45
45
|
|
46
46
|
class YARD::CLI::Base; include YardGlobals; end
|
47
|
+
class YARD::CLI::Command; include YardGlobals; end
|
47
48
|
class YARD::Parser::SourceParser; extend YardGlobals; include YardGlobals; end
|
48
49
|
class YARD::Parser::CParser; include YardGlobals; end
|
49
50
|
class YARD::CodeObjects::Base; include YardGlobals; end
|
@@ -51,7 +52,41 @@ begin
|
|
51
52
|
class YARD::Handlers::Processor; include YardGlobals; end
|
52
53
|
class YARD::Serializers::Base; include YardGlobals; end
|
53
54
|
class YARD::RegistryStore; include YardGlobals; end
|
55
|
+
class YARD::Docstring; include YardGlobals; end
|
54
56
|
module YARD::Templates::Helpers::ModuleHelper; include YardGlobals; end
|
57
|
+
module YARD::Templates::Helpers::HtmlHelper; include YardGlobals; end
|
58
|
+
|
59
|
+
if vvec(RUBY_VERSION) >= vvec("1.9.1")
|
60
|
+
# Monkeypatched to allow more than two '#' characters at the beginning
|
61
|
+
# of the comment line.
|
62
|
+
# Patched from yard-0.5.8
|
63
|
+
require 'yard/parser/ruby/ruby_parser'
|
64
|
+
class YARD::Parser::Ruby::RipperParser < Ripper
|
65
|
+
def on_comment(comment)
|
66
|
+
visit_ns_token(:comment, comment)
|
67
|
+
case comment
|
68
|
+
when /\A# @group\s+(.+)\s*\Z/
|
69
|
+
@groups.unshift [lineno, $1]
|
70
|
+
return
|
71
|
+
when /\A# @endgroup\s*\Z/
|
72
|
+
@groups.unshift [lineno, nil]
|
73
|
+
return
|
74
|
+
end
|
75
|
+
|
76
|
+
comment = comment.gsub(/^\#+\s{0,1}/, '').chomp
|
77
|
+
append_comment = @comments[lineno - 1]
|
78
|
+
|
79
|
+
if append_comment && @comments_last_column == column
|
80
|
+
@comments.delete(lineno - 1)
|
81
|
+
comment = append_comment + "\n" + comment
|
82
|
+
end
|
83
|
+
|
84
|
+
@comments[lineno] = comment
|
85
|
+
@comments_last_column = column
|
86
|
+
end
|
87
|
+
end # class YARD::Parser::Ruby::RipperParser
|
88
|
+
end
|
89
|
+
|
55
90
|
# </metamonkeypatch>
|
56
91
|
|
57
92
|
YARD_OPTIONS = [] unless defined?( YARD_OPTIONS )
|
data/rake/hg.rb
CHANGED
@@ -85,7 +85,7 @@ unless defined?( HG_DOTDIR )
|
|
85
85
|
|
86
86
|
### Return the list of files which are of status 'unknown'
|
87
87
|
def get_unknown_files
|
88
|
-
list = read_command_output( 'hg', 'status', '-un', '--
|
88
|
+
list = read_command_output( 'hg', 'status', '-un', '--color', 'never' )
|
89
89
|
list = list.split( /\n/ )
|
90
90
|
|
91
91
|
trace "New files: %p" % [ list ]
|
@@ -215,13 +215,20 @@ unless defined?( HG_DOTDIR )
|
|
215
215
|
paths = get_repo_paths()
|
216
216
|
if origin_url = paths['default']
|
217
217
|
ask_for_confirmation( "Pull and update from '#{origin_url}'?", false ) do
|
218
|
-
|
218
|
+
Rake::Task['hg:pull_without_confirmation'].invoke
|
219
219
|
end
|
220
220
|
else
|
221
221
|
trace "Skipping pull: No 'default' path."
|
222
222
|
end
|
223
223
|
end
|
224
224
|
|
225
|
+
|
226
|
+
desc "Pull and update without confirmation"
|
227
|
+
task :pull_without_confirmation do
|
228
|
+
run 'hg', 'pull', '-u'
|
229
|
+
end
|
230
|
+
|
231
|
+
|
225
232
|
desc "Check the current code in if tests pass"
|
226
233
|
task :checkin => ['hg:pull', 'hg:newfiles', 'test', COMMIT_MSG_FILE] do
|
227
234
|
targets = get_target_args()
|
@@ -242,13 +249,18 @@ unless defined?( HG_DOTDIR )
|
|
242
249
|
paths = get_repo_paths()
|
243
250
|
if origin_url = paths['default']
|
244
251
|
ask_for_confirmation( "Push to '#{origin_url}'?", false ) do
|
245
|
-
|
252
|
+
Rake::Task['hg:push_without_confirmation'].invoke
|
246
253
|
end
|
247
254
|
else
|
248
255
|
trace "Skipping push: No 'default' path."
|
249
256
|
end
|
250
257
|
end
|
251
258
|
|
259
|
+
desc "Push to the default repo without confirmation"
|
260
|
+
task :push_without_confirmation do
|
261
|
+
run 'hg', 'push'
|
262
|
+
end
|
263
|
+
|
252
264
|
end
|
253
265
|
|
254
266
|
if HG_DOTDIR.exist?
|
data/rake/manual.rb
CHANGED
@@ -147,9 +147,14 @@ module Manual
|
|
147
147
|
|
148
148
|
layout = self.config['layout'].sub( /\.page$/, '' )
|
149
149
|
templatepath = @layouts_dir + "#{layout}.page"
|
150
|
-
template =
|
151
|
-
|
150
|
+
template = nil
|
151
|
+
if Object.const_defined?( :Encoding )
|
152
|
+
template = ERB.new( templatepath.read(:encoding => 'UTF-8') )
|
153
|
+
else
|
154
|
+
template = ERB.new( templatepath.read )
|
155
|
+
end
|
152
156
|
|
157
|
+
page = self
|
153
158
|
html = template.result( binding() )
|
154
159
|
|
155
160
|
# Use Tidy to clean up the html if 'cleanup' is turned on, but remove the Tidy
|
data/rake/publishing.rb
CHANGED
@@ -13,6 +13,7 @@ $publish_privately = false
|
|
13
13
|
|
14
14
|
### Add SSL to Net::SMTP
|
15
15
|
class Net::SMTP
|
16
|
+
|
16
17
|
def ssl_start( helo='localhost.localdomain', user=nil, secret=nil, authtype=nil )
|
17
18
|
if block_given?
|
18
19
|
begin
|
@@ -93,6 +94,9 @@ begin
|
|
93
94
|
require 'etc'
|
94
95
|
require 'socket'
|
95
96
|
require 'text/format'
|
97
|
+
require 'rubygems/gemcutter_utilities'
|
98
|
+
|
99
|
+
include Gem::GemcutterUtilities
|
96
100
|
|
97
101
|
### Generate a valid RFC822 message-id
|
98
102
|
def gen_message_id
|
@@ -104,6 +108,48 @@ begin
|
|
104
108
|
end
|
105
109
|
|
106
110
|
|
111
|
+
### Fetch the rubygems API token if it hasn't been already.
|
112
|
+
def sign_in_to_rubygems
|
113
|
+
return if Gem.configuration.rubygems_api_key
|
114
|
+
|
115
|
+
log "Enter your RubyGems.org credentials."
|
116
|
+
|
117
|
+
email = prompt " Email: "
|
118
|
+
password = prompt_for_password( "Password: " )
|
119
|
+
|
120
|
+
response = rubygems_api_request( :get, "api/v1/api_key" ) do |request|
|
121
|
+
request.basic_auth( email, password )
|
122
|
+
end
|
123
|
+
|
124
|
+
with_response( response ) do |resp|
|
125
|
+
log "Signed in."
|
126
|
+
Gem.configuration.rubygems_api_key = resp.body
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
### Push the gem at the specified +path+ to the rubygems server at +gemhost+.
|
132
|
+
def push_gem( path, gemhost )
|
133
|
+
ENV['RUBYGEMS_HOST'] = "http://#{gemhost}"
|
134
|
+
|
135
|
+
sign_in_to_rubygems()
|
136
|
+
|
137
|
+
response = rubygems_api_request( :post, "api/v1/gems" ) do |request|
|
138
|
+
request.body = Gem.read_binary( path )
|
139
|
+
request.add_field "Content-Length", request.body.size
|
140
|
+
request.add_field "Content-Type", "application/octet-stream"
|
141
|
+
request.add_field "Authorization", Gem.configuration.rubygems_api_key
|
142
|
+
end
|
143
|
+
|
144
|
+
case response
|
145
|
+
when Net::HTTPSuccess
|
146
|
+
log( response.body )
|
147
|
+
else
|
148
|
+
fail( response.body )
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
|
107
153
|
namespace :release do
|
108
154
|
task :default => [ :prep_release, :upload, :publish, :announce ]
|
109
155
|
|
@@ -133,124 +179,147 @@ begin
|
|
133
179
|
end
|
134
180
|
CLOBBER.include( RELEASE_NOTES_FILE )
|
135
181
|
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
182
|
+
# Only define upload tasks if there's an upload host
|
183
|
+
if PROJECT_HOST.empty?
|
184
|
+
task :no_upload_host do
|
185
|
+
log "Skipping upload: no upload host."
|
186
|
+
end
|
187
|
+
task :upload => :no_upload_host
|
188
|
+
task :upload_docs => :no_upload_host
|
189
|
+
task :upload_packages => :no_upload_host
|
190
|
+
else
|
191
|
+
desc "Upload project documentation and packages to #{PROJECT_HOST}"
|
192
|
+
task :upload => [ :upload_docs, :upload_packages ]
|
193
|
+
task :project => :upload # the old name
|
194
|
+
|
195
|
+
desc "Publish the project docs to #{PROJECT_HOST}"
|
196
|
+
task :upload_docs => [ :apidocs ] do
|
197
|
+
when_writing( "Publishing docs to #{PROJECT_SCPDOCURL}" ) do
|
198
|
+
log "Uploading API documentation to %s:%s" % [ PROJECT_HOST, PROJECT_DOCDIR ]
|
199
|
+
run 'ssh', PROJECT_HOST, "rm -rf #{PROJECT_DOCDIR}"
|
200
|
+
run 'scp', '-qCr', API_DOCSDIR, PROJECT_SCPDOCURL
|
201
|
+
end
|
147
202
|
end
|
148
|
-
end
|
149
203
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
204
|
+
desc "Publish the project packages to #{PROJECT_HOST}"
|
205
|
+
task :upload_packages => [ :package ] do
|
206
|
+
when_writing( "Uploading packages") do
|
207
|
+
pkgs = Pathname.glob( PKGDIR + "#{PKG_FILE_NAME}.{gem,tar.gz,tar.bz2,zip}" )
|
208
|
+
log "Uploading %d packages to #{PROJECT_SCPPUBURL}" % [ pkgs.length ]
|
209
|
+
pkgs.each do |pkgfile|
|
210
|
+
run 'scp', '-qC', pkgfile, PROJECT_SCPPUBURL
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
159
214
|
end
|
160
215
|
|
216
|
+
# Only define the announcement tasks if there are addresses to announce to
|
217
|
+
if RELEASE_ANNOUNCE_ADDRESSES.empty?
|
218
|
+
task :no_announce_addresses do
|
219
|
+
log "Skipping announcement: no announce addresses"
|
220
|
+
end
|
221
|
+
task :announce => :no_announce_addresses
|
161
222
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
Version #{PKG_VERSION} of #{PKG_NAME} has been released.
|
167
|
-
|
168
|
-
#{Text::Format.new(:first_indent => 0).format_one_paragraph(GEMSPEC.description)}
|
223
|
+
else
|
224
|
+
file RELEASE_ANNOUNCE_FILE => [RELEASE_NOTES_FILE] do |task|
|
225
|
+
relnotes = File.read( RELEASE_NOTES_FILE )
|
226
|
+
announce_body = %{
|
169
227
|
|
170
|
-
|
228
|
+
Version #{PKG_VERSION} of #{PKG_NAME} has been released.
|
171
229
|
|
172
|
-
|
230
|
+
#{Text::Format.new(:first_indent => 0).format_one_paragraph(GEMSPEC.description)}
|
173
231
|
|
174
|
-
|
232
|
+
== Project Page
|
175
233
|
|
176
|
-
|
234
|
+
#{GEMSPEC.homepage}
|
177
235
|
|
178
|
-
|
236
|
+
== Installation
|
179
237
|
|
180
|
-
|
238
|
+
Via gems:
|
181
239
|
|
182
|
-
|
183
|
-
$ tar -xzvf #{PKG_FILE_NAME}.tar.gz
|
184
|
-
$ cd #{PKG_FILE_NAME}
|
185
|
-
$ sudo rake install
|
240
|
+
$ sudo gem install #{GEMSPEC.name}
|
186
241
|
|
187
|
-
|
188
|
-
#{relnotes}
|
189
|
-
}.gsub( /^\t+/, '' )
|
242
|
+
or from source:
|
190
243
|
|
191
|
-
|
192
|
-
|
193
|
-
|
244
|
+
$ wget http://deveiate.org/code/#{PKG_FILE_NAME}.tar.gz
|
245
|
+
$ tar -xzvf #{PKG_FILE_NAME}.tar.gz
|
246
|
+
$ cd #{PKG_FILE_NAME}
|
247
|
+
$ sudo rake install
|
194
248
|
|
195
|
-
|
196
|
-
|
197
|
-
|
249
|
+
== Changes
|
250
|
+
#{relnotes}
|
251
|
+
}.gsub( /^\t+/, '' )
|
198
252
|
|
253
|
+
File.open( task.name, File::WRONLY|File::TRUNC|File::CREAT ) do |fh|
|
254
|
+
fh.print( announce_body )
|
255
|
+
end
|
199
256
|
|
200
|
-
|
201
|
-
task :announce => [RELEASE_ANNOUNCE_FILE] do
|
202
|
-
email = TMail::Mail.new
|
203
|
-
|
204
|
-
if $publish_privately || RELEASE_ANNOUNCE_ADDRESSES.empty?
|
205
|
-
trace "Sending private announce mail"
|
206
|
-
email.to = 'rubymage@gmail.com'
|
207
|
-
else
|
208
|
-
trace "Sending public announce mail"
|
209
|
-
email.to = RELEASE_ANNOUNCE_ADDRESSES
|
210
|
-
email.bcc = 'rubymage@gmail.com'
|
257
|
+
edit task.name
|
211
258
|
end
|
259
|
+
CLOBBER.include( RELEASE_ANNOUNCE_FILE )
|
212
260
|
|
213
|
-
from = prompt_with_default( "Send announcement as:",
|
214
|
-
'Michael Granger <ged@FaerieMUD.org>' ) or fail
|
215
|
-
|
216
|
-
email.from = from
|
217
|
-
email.subject = "[ANN] #{PKG_NAME} #{PKG_VERSION}"
|
218
|
-
email.body = File.read( RELEASE_ANNOUNCE_FILE )
|
219
|
-
email.date = Time.new
|
220
|
-
|
221
|
-
email.message_id = gen_message_id()
|
222
|
-
|
223
|
-
log "About to send the following email:"
|
224
|
-
puts '---',
|
225
|
-
email.to_s,
|
226
|
-
'---'
|
227
261
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
username = prompt_with_default( "SMTP user", curuser )
|
232
|
-
password = prompt_for_password()
|
262
|
+
desc 'Send out a release announcement'
|
263
|
+
task :announce => [RELEASE_ANNOUNCE_FILE] do
|
264
|
+
email = TMail::Mail.new
|
233
265
|
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
266
|
+
if $publish_privately || RELEASE_ANNOUNCE_ADDRESSES.empty?
|
267
|
+
trace "Sending private announce mail"
|
268
|
+
email.to = 'rubymage@gmail.com'
|
269
|
+
else
|
270
|
+
trace "Sending public announce mail"
|
271
|
+
email.to = RELEASE_ANNOUNCE_ADDRESSES
|
272
|
+
email.bcc = 'rubymage@gmail.com'
|
273
|
+
end
|
238
274
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
275
|
+
from = prompt_with_default( "Send announcement as:",
|
276
|
+
'Michael Granger <ged@FaerieMUD.org>' ) or fail
|
277
|
+
|
278
|
+
email.from = from
|
279
|
+
email.subject = "[ANN] #{PKG_NAME} #{PKG_VERSION}"
|
280
|
+
email.body = File.read( RELEASE_ANNOUNCE_FILE )
|
281
|
+
email.date = Time.new
|
282
|
+
|
283
|
+
email.message_id = gen_message_id()
|
284
|
+
|
285
|
+
log "About to send the following email:"
|
286
|
+
puts '---',
|
287
|
+
email.to_s,
|
288
|
+
'---'
|
289
|
+
|
290
|
+
ask_for_confirmation( "Will send via #{SMTP_HOST}." ) do
|
291
|
+
pwent = Etc.getpwuid( Process.euid )
|
292
|
+
curuser = pwent ? pwent.name : 'unknown'
|
293
|
+
username = prompt_with_default( "SMTP user", curuser )
|
294
|
+
password = prompt_for_password()
|
295
|
+
|
296
|
+
trace "Creating SMTP connection to #{SMTP_HOST}:#{SMTP_PORT}"
|
297
|
+
smtp = Net::SMTP.new( SMTP_HOST, SMTP_PORT )
|
298
|
+
smtp.set_debug_output( $stdout )
|
299
|
+
smtp.esmtp = true
|
300
|
+
|
301
|
+
trace "connecting..."
|
302
|
+
smtp.ssl_start( Socket.gethostname, username, password, :plain ) do |smtp|
|
303
|
+
trace "sending message..."
|
304
|
+
smtp.send_message( email.to_s, email.from, email.to )
|
305
|
+
end
|
306
|
+
trace "done."
|
243
307
|
end
|
244
|
-
trace "done."
|
245
308
|
end
|
246
309
|
end
|
247
310
|
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
311
|
+
if GEM_PUBHOST.empty?
|
312
|
+
task :no_gem_host do
|
313
|
+
log "Skipping gem push: no gem publication host."
|
314
|
+
end
|
315
|
+
task :publish => :no_gem_host
|
316
|
+
else
|
317
|
+
desc 'Publish the new gem to #{GEM_PUBHOST}'
|
318
|
+
task :publish => [:clean, :gem, :notes] do |task|
|
319
|
+
ask_for_confirmation( "Publish #{GEM_FILE_NAME} to #{GEM_PUBHOST}?", false ) do
|
320
|
+
gempath = PKGDIR + GEM_FILE_NAME
|
321
|
+
push_gem( gempath, GEM_PUBHOST )
|
322
|
+
end
|
254
323
|
end
|
255
324
|
end
|
256
325
|
end
|
@@ -266,6 +335,7 @@ rescue LoadError => err
|
|
266
335
|
end
|
267
336
|
|
268
337
|
task :release => :no_release_tasks
|
338
|
+
task "release:rerelease" => :no_release_tasks
|
269
339
|
task "release:announce" => :no_release_tasks
|
270
340
|
task "release:publish" => :no_release_tasks
|
271
341
|
task "release:notes" => :no_release_tasks
|
data/rake/testing.rb
CHANGED
@@ -16,7 +16,7 @@ end
|
|
16
16
|
SPEC_FILES = [] unless defined?( SPEC_FILES )
|
17
17
|
TEST_FILES = [] unless defined?( TEST_FILES )
|
18
18
|
|
19
|
-
|
19
|
+
COMMON_RSPEC_OPTS = [] unless defined?( COMMON_RSPEC_OPTS )
|
20
20
|
|
21
21
|
COVERAGE_TARGETDIR = BASEDIR + 'coverage' unless defined?( COVERAGE_TARGETDIR )
|
22
22
|
RCOV_EXCLUDES = 'spec,tests,/Library/Ruby,/var/lib,/usr/local/lib' unless
|
@@ -39,10 +39,10 @@ end
|
|
39
39
|
|
40
40
|
### RSpec specifications
|
41
41
|
begin
|
42
|
-
gem 'rspec', '>=
|
42
|
+
gem 'rspec', '>= 2.0.0'
|
43
43
|
|
44
|
-
require '
|
45
|
-
require '
|
44
|
+
require 'rspec'
|
45
|
+
require 'rspec/core/rake_task'
|
46
46
|
|
47
47
|
### Task: spec
|
48
48
|
desc "Run specs"
|
@@ -51,137 +51,101 @@ begin
|
|
51
51
|
namespace :spec do
|
52
52
|
desc "Run rspec every time there's a change to one of the files"
|
53
53
|
task :autotest do
|
54
|
-
require 'autotest
|
55
|
-
|
56
|
-
|
57
|
-
autotester.run
|
54
|
+
require 'autotest'
|
55
|
+
Autotest.add_discovery { "rspec2" }
|
56
|
+
Autotest.run
|
58
57
|
end
|
59
58
|
|
60
59
|
desc "Generate regular color 'doc' spec output"
|
61
|
-
|
62
|
-
task.
|
63
|
-
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 's', '-c']
|
60
|
+
RSpec::Core::RakeTask.new( :doc ) do |task|
|
61
|
+
task.rspec_opts = COMMON_RSPEC_OPTS + ['-f', 'p', '-c']
|
64
62
|
end
|
65
63
|
|
66
64
|
desc "Generate spec output with profiling"
|
67
|
-
|
68
|
-
task.
|
69
|
-
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 'o']
|
65
|
+
RSpec::Core::RakeTask.new( :profile ) do |task|
|
66
|
+
task.rspec_opts = COMMON_RSPEC_OPTS + ['-f', 'p', '-p']
|
70
67
|
end
|
71
68
|
|
72
69
|
desc "Generate quiet non-colored plain-text output"
|
73
|
-
|
74
|
-
task.
|
75
|
-
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 'p']
|
70
|
+
RSpec::Core::RakeTask.new( :quiet ) do |task|
|
71
|
+
task.rspec_opts = COMMON_RSPEC_OPTS + ['-f', 'p']
|
76
72
|
end
|
77
73
|
|
78
74
|
desc "Generate HTML output"
|
79
|
-
|
80
|
-
task.
|
81
|
-
task.spec_opts = COMMON_SPEC_OPTS + ['-f', 'h']
|
75
|
+
RSpec::Core::RakeTask.new( :html ) do |task|
|
76
|
+
task.rspec_opts = COMMON_RSPEC_OPTS + ['-f', 'h']
|
82
77
|
end
|
83
78
|
|
84
|
-
end
|
85
|
-
rescue LoadError => err
|
86
|
-
task :no_rspec do
|
87
|
-
$stderr.puts "Specification tasks not defined: %s" % [ err.message ]
|
88
|
-
end
|
89
|
-
|
90
|
-
task :spec => :no_rspec
|
91
|
-
namespace :spec do
|
92
|
-
task :autotest => :no_rspec
|
93
|
-
task :doc => :no_rspec
|
94
|
-
task :profile => :no_rspec
|
95
|
-
task :quiet => :no_rspec
|
96
|
-
task :html => :no_rspec
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
|
101
|
-
### Test::Unit tests
|
102
|
-
begin
|
103
|
-
require 'rake/testtask'
|
104
|
-
|
105
|
-
Rake::TestTask.new( :unittests ) do |task|
|
106
|
-
task.libs += [LIBDIR]
|
107
|
-
task.test_files = TEST_FILES
|
108
|
-
task.verbose = true
|
109
|
-
end
|
110
79
|
|
111
|
-
rescue LoadError => err
|
112
|
-
task :no_test do
|
113
|
-
$stderr.puts "Test tasks not defined: %s" % [ err.message ]
|
114
80
|
end
|
115
81
|
|
116
|
-
task :unittests => :no_rspec
|
117
|
-
end
|
118
|
-
|
119
|
-
|
120
|
-
### RCov (via RSpec) tasks
|
121
|
-
begin
|
122
|
-
gem 'rcov'
|
123
|
-
gem 'rspec', '>= 1.1.3'
|
124
|
-
|
125
|
-
require 'spec'
|
126
|
-
require 'rcov'
|
127
|
-
|
128
82
|
### Task: coverage (via RCov)
|
129
83
|
desc "Build test coverage reports"
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
task.rcov_opts = RCOV_OPTS
|
136
|
-
task.rcov = true
|
137
|
-
end
|
84
|
+
RSpec::Core::RakeTask.new( :coverage ) do |task|
|
85
|
+
task.ruby_opts = [ "-I#{LIBDIR}" ]
|
86
|
+
task.rspec_opts = ['-f', 'p', '-b']
|
87
|
+
task.rcov_opts = RCOV_OPTS
|
88
|
+
task.rcov = true
|
138
89
|
end
|
139
90
|
|
140
|
-
|
141
91
|
### Task: rcov
|
142
92
|
task :rcov => :coverage
|
143
93
|
|
144
94
|
### Other coverage tasks
|
145
95
|
namespace :coverage do
|
146
96
|
desc "Generate a detailed text coverage report"
|
147
|
-
|
148
|
-
task.spec_files = SPEC_FILES
|
97
|
+
RSpec::Core::RakeTask.new( :text ) do |task|
|
149
98
|
task.rcov_opts = RCOV_OPTS + ['--text-report']
|
150
99
|
task.rcov = true
|
151
100
|
end
|
152
101
|
|
153
102
|
desc "Show differences in coverage from last run"
|
154
|
-
|
155
|
-
task.
|
156
|
-
task.spec_opts = ['-f', 'p', '-b']
|
103
|
+
RSpec::Core::RakeTask.new( :diff ) do |task|
|
104
|
+
task.rspec_opts = ['-f', 'p', '-b']
|
157
105
|
task.rcov_opts = RCOV_OPTS - ['--save'] + ['--text-coverage-diff']
|
158
106
|
task.rcov = true
|
159
107
|
end
|
160
108
|
|
161
109
|
desc "Run RCov in 'spec-only' mode to check coverage from specs"
|
162
|
-
|
163
|
-
task.spec_files = SPEC_FILES
|
110
|
+
RSpec::Core::RakeTask.new( :speconly ) do |task|
|
164
111
|
task.rcov_opts = ['--exclude', RCOV_EXCLUDES, '--text-report', '--save']
|
165
112
|
task.rcov = true
|
166
113
|
end
|
167
114
|
end
|
168
115
|
|
169
116
|
CLOBBER.include( COVERAGE_TARGETDIR )
|
170
|
-
|
171
117
|
rescue LoadError => err
|
172
|
-
task :
|
173
|
-
$stderr.puts "
|
174
|
-
[ err.message ]
|
118
|
+
task :no_rspec do
|
119
|
+
$stderr.puts "Specification tasks not defined: %s" % [ err.message ]
|
175
120
|
end
|
176
121
|
|
177
|
-
task :
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
task :
|
182
|
-
task :
|
122
|
+
task :spec => :no_rspec
|
123
|
+
namespace :spec do
|
124
|
+
task :autotest => :no_rspec
|
125
|
+
task :doc => :no_rspec
|
126
|
+
task :profile => :no_rspec
|
127
|
+
task :quiet => :no_rspec
|
128
|
+
task :html => :no_rspec
|
183
129
|
end
|
184
|
-
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
### Test::Unit tests
|
134
|
+
begin
|
135
|
+
require 'rake/testtask'
|
136
|
+
|
137
|
+
Rake::TestTask.new( :unittests ) do |task|
|
138
|
+
task.libs += [LIBDIR]
|
139
|
+
task.test_files = TEST_FILES
|
140
|
+
task.verbose = true
|
141
|
+
end
|
142
|
+
|
143
|
+
rescue LoadError => err
|
144
|
+
task :no_test do
|
145
|
+
$stderr.puts "Test tasks not defined: %s" % [ err.message ]
|
146
|
+
end
|
147
|
+
|
148
|
+
task :unittests => :no_rspec
|
185
149
|
end
|
186
150
|
|
187
151
|
|
metadata
CHANGED
@@ -1,32 +1,53 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sysexits
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 1
|
10
|
+
version: 1.0.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Michael Granger
|
14
14
|
autorequire:
|
15
15
|
bindir: bin
|
16
|
-
cert_chain:
|
16
|
+
cert_chain:
|
17
|
+
- |
|
18
|
+
-----BEGIN CERTIFICATE-----
|
19
|
+
MIIDLDCCAhSgAwIBAgIBADANBgkqhkiG9w0BAQUFADA8MQwwCgYDVQQDDANnZWQx
|
20
|
+
FzAVBgoJkiaJk/IsZAEZFgdfYWVyaWVfMRMwEQYKCZImiZPyLGQBGRYDb3JnMB4X
|
21
|
+
DTEwMDkxNjE0NDg1MVoXDTExMDkxNjE0NDg1MVowPDEMMAoGA1UEAwwDZ2VkMRcw
|
22
|
+
FQYKCZImiZPyLGQBGRYHX2FlcmllXzETMBEGCgmSJomT8ixkARkWA29yZzCCASIw
|
23
|
+
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALy//BFxC1f/cPSnwtJBWoFiFrir
|
24
|
+
h7RicI+joq/ocVXQqI4TDWPyF/8tqkvt+rD99X9qs2YeR8CU/YiIpLWrQOYST70J
|
25
|
+
vDn7Uvhb2muFVqq6+vobeTkILBEO6pionWDG8jSbo3qKm1RjKJDwg9p4wNKhPuu8
|
26
|
+
KGue/BFb67KflqyApPmPeb3Vdd9clspzqeFqp7cUBMEpFS6LWxy4Gk+qvFFJBJLB
|
27
|
+
BUHE/LZVJMVzfpC5Uq+QmY7B+FH/QqNndn3tOHgsPadLTNimuB1sCuL1a4z3Pepd
|
28
|
+
TeLBEFmEao5Dk3K/Q8o8vlbIB/jBDTUx6Djbgxw77909x6gI9doU4LD5XMcCAwEA
|
29
|
+
AaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFJeoGkOr9l4B
|
30
|
+
+saMkW/ZXT4UeSvVMA0GCSqGSIb3DQEBBQUAA4IBAQBG2KObvYI2eHyyBUJSJ3jN
|
31
|
+
vEnU3d60znAXbrSd2qb3r1lY1EPDD3bcy0MggCfGdg3Xu54z21oqyIdk8uGtWBPL
|
32
|
+
HIa9EgfFGSUEgvcIvaYqiN4jTUtidfEFw+Ltjs8AP9gWgSIYS6Gr38V0WGFFNzIH
|
33
|
+
aOD2wmu9oo/RffW4hS/8GuvfMzcw7CQ355wFR4KB/nyze+EsZ1Y5DerCAagMVuDQ
|
34
|
+
U0BLmWDFzPGGWlPeQCrYHCr+AcJz+NRnaHCKLZdSKj/RHuTOt+gblRex8FAh8NeA
|
35
|
+
cmlhXe46pZNJgWKbxZah85jIjx95hR8vOI+NAM5iH9kOqK13DrxacTKPhqj5PjwF
|
36
|
+
-----END CERTIFICATE-----
|
17
37
|
|
18
|
-
date: 2010-
|
38
|
+
date: 2010-10-14 00:00:00 -07:00
|
19
39
|
default_executable:
|
20
40
|
dependencies: []
|
21
41
|
|
22
42
|
description: |-
|
23
|
-
Have you ever wanted to call exit() with an error condition, but
|
24
|
-
|
43
|
+
Have you ever wanted to call exit() with an error condition, but
|
44
|
+
weren't sure what exit status to use? No? Maybe it's just me, then.
|
25
45
|
|
26
|
-
Anyway, I was reading
|
27
|
-
|
28
|
-
to my chagrin, I couldn't find a 'sysexits' for
|
29
|
-
|
46
|
+
Anyway, I was reading manpages late one evening before retiring to
|
47
|
+
bed in my palatial estate in rural Oregon, and I stumbled across
|
48
|
+
sysexits(3). Much to my chagrin, I couldn't find a 'sysexits' for
|
49
|
+
Ruby! Well, for the other 2 people that actually care about style(9)
|
50
|
+
as it applies to Ruby code, now there is one!
|
30
51
|
email:
|
31
52
|
- ged@FaerieMUD.org
|
32
53
|
executables: []
|
@@ -94,6 +115,6 @@ rubyforge_project:
|
|
94
115
|
rubygems_version: 1.3.7
|
95
116
|
signing_key:
|
96
117
|
specification_version: 3
|
97
|
-
summary:
|
118
|
+
summary: Exit status codes for system programs.
|
98
119
|
test_files:
|
99
120
|
- spec/sysexits_spec.rb
|
metadata.gz.sig
ADDED
Binary file
|