bones 1.3.2 → 1.3.3
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/History.txt +19 -4
- data/Manifest.txt +3 -0
- data/README.txt +33 -30
- data/Rakefile +31 -2
- data/data/tasks/ann.rake +77 -0
- data/data/tasks/annotations.rake +6 -14
- data/data/tasks/gem.rake +22 -1
- data/data/tasks/manifest.rake +13 -18
- data/data/tasks/setup.rb +36 -4
- data/lib/bones.rb +4 -2
- data/lib/bones/main.rb +2 -2
- data/lib/bones/smtp_tls.rb +69 -0
- data/tasks/ann.rake +77 -0
- data/tasks/annotations.rake +6 -14
- data/tasks/gem.rake +23 -2
- data/tasks/manifest.rake +14 -19
- data/tasks/setup.rb +37 -5
- metadata +10 -3
data/History.txt
CHANGED
@@ -1,6 +1,21 @@
|
|
1
|
+
== 1.3.3 / 2008-02-18
|
2
|
+
|
3
|
+
* 4 minor enhancements
|
4
|
+
- The annotation tags to search for can be specified by the user
|
5
|
+
in the Rakefile
|
6
|
+
- Directory names can be substituted during skeleton creation
|
7
|
+
- Support for the GEM post_install_message
|
8
|
+
- Support to generate an announcement text file and send the
|
9
|
+
announcement via e-mail
|
10
|
+
- Added a manifest:assert task that can be used when building the
|
11
|
+
gem to assert that the manifest is up to date
|
12
|
+
task 'gem:package' => 'manifest:assert'
|
13
|
+
* 1 bug fix
|
14
|
+
- Fixed a circular dependency in the gem creation tasks
|
15
|
+
|
1
16
|
== 1.3.2 / 2008-02-05
|
2
17
|
|
3
|
-
* 1 minor
|
18
|
+
* 1 minor enhancement
|
4
19
|
- Added colorization to the manifest:check task
|
5
20
|
|
6
21
|
== 1.3.1 / 2008-02-01
|
@@ -16,7 +31,7 @@
|
|
16
31
|
- RSpec tasks were not including the user defined project libraries
|
17
32
|
such as "ext" or anything besides "lib"
|
18
33
|
- Tweaked the gem install/uninstall tasks to remove installed binaries
|
19
|
-
and to install
|
34
|
+
and to install platform specific gem versions
|
20
35
|
- Fixed a bug where the RDoc task was ignore the PROJ.rdoc_opts
|
21
36
|
|
22
37
|
== 1.3.0 / 2008-01-04
|
@@ -46,12 +61,12 @@
|
|
46
61
|
* 2 minor enhancements
|
47
62
|
- The pkg and doc directories are now excluded from the manifest
|
48
63
|
- Added method to hide tasks from the rake task listing
|
49
|
-
* 1
|
64
|
+
* 1 bug fix
|
50
65
|
- Fixed typo in an abort message (thanks Bill Kleb)
|
51
66
|
|
52
67
|
== 1.1.1 / 2007-12-29
|
53
68
|
|
54
|
-
* 1
|
69
|
+
* 1 bug fix
|
55
70
|
- Fixed the bad interaction with RSpec gem
|
56
71
|
|
57
72
|
== 1.1.0 / 2007-12-29
|
data/Manifest.txt
CHANGED
@@ -11,6 +11,7 @@ data/bin/NAME.erb
|
|
11
11
|
data/lib/NAME.rb.erb
|
12
12
|
data/spec/NAME_spec.rb.erb
|
13
13
|
data/spec/spec_helper.rb.erb
|
14
|
+
data/tasks/ann.rake
|
14
15
|
data/tasks/annotations.rake
|
15
16
|
data/tasks/doc.rake
|
16
17
|
data/tasks/gem.rake
|
@@ -25,6 +26,8 @@ data/test/test_NAME.rb
|
|
25
26
|
lib/bones.rb
|
26
27
|
lib/bones/annotation_extractor.rb
|
27
28
|
lib/bones/main.rb
|
29
|
+
lib/bones/smtp_tls.rb
|
30
|
+
tasks/ann.rake
|
28
31
|
tasks/annotations.rake
|
29
32
|
tasks/doc.rake
|
30
33
|
tasks/gem.rake
|
data/README.txt
CHANGED
@@ -14,36 +14,39 @@ gem dependency required).
|
|
14
14
|
|
15
15
|
Mr Bones provides the following rake tasks:
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
doc
|
22
|
-
doc:
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
gem
|
27
|
-
gem:
|
28
|
-
gem:
|
29
|
-
gem:
|
30
|
-
gem:
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
notes
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
spec
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
17
|
+
ann # Alias to ann:announcement
|
18
|
+
ann:announcement # Create an announcement file
|
19
|
+
ann:email # Send email announcement
|
20
|
+
clobber # Remove all build products
|
21
|
+
doc # Alias to doc:rdoc
|
22
|
+
doc:rdoc # Build the rdoc HTML Files
|
23
|
+
doc:release # Publish RDoc to RubyForge
|
24
|
+
doc:rerdoc # Force a rebuild of the RDOC files
|
25
|
+
doc:ri # Generate ri locally for testing
|
26
|
+
gem # Alias to gem:package
|
27
|
+
gem:debug # Show information about the gem
|
28
|
+
gem:gem # Build the gem file bones-1.3.3.gem
|
29
|
+
gem:install # Install the gem
|
30
|
+
gem:package # Build all the packages
|
31
|
+
gem:release # Package and upload to RubyForge
|
32
|
+
gem:repackage # Force a rebuild of the package files
|
33
|
+
gem:uninstall # Uninstall the gem
|
34
|
+
manifest # Alias to manifest:check
|
35
|
+
manifest:check # Verify the manifest
|
36
|
+
manifest:create # Create a new manifest
|
37
|
+
notes # Enumerate all annotations
|
38
|
+
notes:fixme # Enumerate all FIXME annotations
|
39
|
+
notes:optimize # Enumerate all OPTIMIZE annotations
|
40
|
+
notes:todo # Enumerate all TODO annotations
|
41
|
+
spec # Alias to spec:run
|
42
|
+
spec:rcov # Run all specs with RCov
|
43
|
+
spec:run # Run all specs with basic output
|
44
|
+
spec:specdoc # Run all specs with text output
|
45
|
+
svn:create_tag # Create a new tag in the SVN repository
|
46
|
+
svn:show_tags # Show tags from the SVN repository
|
47
|
+
test # Alias to test:run
|
48
|
+
test:rcov # Run rcov on the unit tests
|
49
|
+
test:run # Run tests for run
|
47
50
|
|
48
51
|
The rake tasks in the Mr Bones framework can be found in the "tasks"
|
49
52
|
directory. Add your own tasks there when you need more functionality.
|
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: Rakefile
|
1
|
+
# $Id: Rakefile 536 2008-02-18 23:07:49Z tim_pease $
|
2
2
|
|
3
3
|
$:.unshift('lib')
|
4
4
|
|
@@ -14,11 +14,40 @@ PROJ.url = 'http://codeforpeople.rubyforge.org/bones'
|
|
14
14
|
PROJ.rubyforge_name = 'codeforpeople'
|
15
15
|
PROJ.rdoc_remote_dir = 'bones'
|
16
16
|
PROJ.version = Bones::VERSION
|
17
|
+
PROJ.release_name = 'Fractal Bovine'
|
17
18
|
|
18
19
|
PROJ.rdoc_exclude << '^data/'
|
19
|
-
PROJ.annotation_exclude = %w(^README\.txt$ ^data/)
|
20
|
+
PROJ.annotation_exclude = %w(^README\.txt$ ^data/ ^tasks/setup.rb$)
|
20
21
|
PROJ.svn = 'bones'
|
21
22
|
|
22
23
|
PROJ.spec_opts << '--color'
|
23
24
|
|
25
|
+
PROJ.ann_email[:server] = 'smtp.gmail.com'
|
26
|
+
PROJ.ann_email[:port] = 587
|
27
|
+
|
28
|
+
PROJ.post_install_message = <<-MSG
|
29
|
+
--------------------------
|
30
|
+
Keep rattlin' dem bones!
|
31
|
+
--------------------------
|
32
|
+
MSG
|
33
|
+
|
34
|
+
PROJ.ann_paragraphs = %w[install synopsis features requirements]
|
35
|
+
PROJ.ann_text = <<-ANN
|
36
|
+
== FUN FACT
|
37
|
+
|
38
|
+
Half of all Americans are below average.
|
39
|
+
|
40
|
+
== POST SCRIPT
|
41
|
+
|
42
|
+
Blessings,
|
43
|
+
TwP
|
44
|
+
|
45
|
+
#{PROJ.post_install_message}
|
46
|
+
ANN
|
47
|
+
|
48
|
+
task 'gem:package' => 'manifest:assert'
|
49
|
+
|
50
|
+
task(:titlize) {PROJ.name = 'Mr Bones'}
|
51
|
+
task 'ann:announcement' => :titlize
|
52
|
+
|
24
53
|
# EOF
|
data/data/tasks/ann.rake
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# $Id$
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bones/smtp_tls'
|
5
|
+
rescue LoadError
|
6
|
+
require 'net/smtp'
|
7
|
+
end
|
8
|
+
require 'time'
|
9
|
+
|
10
|
+
namespace :ann do
|
11
|
+
|
12
|
+
desc "Create an announcement file"
|
13
|
+
task :announcement do
|
14
|
+
File.open('announcement.txt','w') do |fd|
|
15
|
+
fd.puts("#{PROJ.name} version #{PROJ.version}")
|
16
|
+
fd.puts(" by #{Array(PROJ.authors).first}") if PROJ.authors
|
17
|
+
fd.puts(" #{PROJ.url}") if PROJ.url
|
18
|
+
fd.puts(" (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
|
19
|
+
fd.puts
|
20
|
+
fd.puts("== DESCRIPTION")
|
21
|
+
fd.puts
|
22
|
+
fd.puts(PROJ.description)
|
23
|
+
fd.puts
|
24
|
+
fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
|
25
|
+
fd.puts
|
26
|
+
PROJ.ann_paragraphs.each do |p|
|
27
|
+
fd.puts "== #{p.upcase}"
|
28
|
+
fd.puts
|
29
|
+
fd.puts paragraphs_of('README.txt', p).join("\n\n")
|
30
|
+
fd.puts
|
31
|
+
end
|
32
|
+
fd.puts PROJ.ann_text if PROJ.ann_text
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Send email announcement"
|
37
|
+
task :email => :announcement do
|
38
|
+
from = PROJ.ann_email[:from] || PROJ.email
|
39
|
+
to = Array(PROJ.ann_email[:to])
|
40
|
+
|
41
|
+
### build a mail header for RFC 822
|
42
|
+
rfc822msg = "From: #{from}\n"
|
43
|
+
rfc822msg << "To: #{to.join(',')}\n"
|
44
|
+
rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
|
45
|
+
rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
|
46
|
+
rfc822msg << "\n"
|
47
|
+
rfc822msg << "Date: #{Time.new.rfc822}\n"
|
48
|
+
rfc822msg << "Message-Id: "
|
49
|
+
rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{PROJ.ann_email[:domain]}>\n\n"
|
50
|
+
rfc822msg << File.read('announcement.txt')
|
51
|
+
|
52
|
+
params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
|
53
|
+
PROJ.ann_email[key]
|
54
|
+
end
|
55
|
+
|
56
|
+
params[3] = PROJ.email if params[3].nil?
|
57
|
+
|
58
|
+
if params[4].nil?
|
59
|
+
STDOUT.write "Please enter your e-mail password (#{params[3]}): "
|
60
|
+
params[4] = STDIN.gets.chomp
|
61
|
+
end
|
62
|
+
|
63
|
+
### send email
|
64
|
+
Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
|
65
|
+
end
|
66
|
+
|
67
|
+
task :clobber_announcement do
|
68
|
+
rm 'announcement.txt' rescue nil
|
69
|
+
end
|
70
|
+
end # namespace :ann
|
71
|
+
|
72
|
+
desc 'Alias to ann:announcement'
|
73
|
+
task :ann => 'ann:announcement'
|
74
|
+
|
75
|
+
task :clobber => %w(ann:clobber_announcement)
|
76
|
+
|
77
|
+
# EOF
|
data/data/tasks/annotations.rake
CHANGED
@@ -5,23 +5,15 @@ if HAVE_BONES
|
|
5
5
|
desc "Enumerate all annotations"
|
6
6
|
task :notes do
|
7
7
|
Bones::AnnotationExtractor.enumerate(
|
8
|
-
PROJ,
|
8
|
+
PROJ, PROJ.annotation_tags.join('|'), :tag => true)
|
9
9
|
end
|
10
10
|
|
11
11
|
namespace :notes do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
desc "Enumerate all FIXME annotations"
|
18
|
-
task :fixme do
|
19
|
-
Bones::AnnotationExtractor.enumerate(PROJ, "FIXME")
|
20
|
-
end
|
21
|
-
|
22
|
-
desc "Enumerate all TODO annotations"
|
23
|
-
task :todo do
|
24
|
-
Bones::AnnotationExtractor.enumerate(PROJ, "TODO")
|
12
|
+
PROJ.annotation_tags.each do |tag|
|
13
|
+
desc "Enumerate all #{tag} annotations"
|
14
|
+
task tag.downcase.to_sym do
|
15
|
+
Bones::AnnotationExtractor.enumerate(PROJ, tag)
|
16
|
+
end
|
25
17
|
end
|
26
18
|
end
|
27
19
|
|
data/data/tasks/gem.rake
CHANGED
@@ -12,6 +12,7 @@ namespace :gem do
|
|
12
12
|
s.email = PROJ.email
|
13
13
|
s.homepage = Array(PROJ.url).first
|
14
14
|
s.rubyforge_project = PROJ.rubyforge_name
|
15
|
+
s.post_install_message = PROJ.post_install_message
|
15
16
|
|
16
17
|
s.description = PROJ.description
|
17
18
|
|
@@ -62,9 +63,29 @@ namespace :gem do
|
|
62
63
|
puts PROJ.spec.to_ruby
|
63
64
|
end
|
64
65
|
|
65
|
-
Rake::
|
66
|
+
pkg = Rake::PackageTask.new(PROJ.name, PROJ.version) do |pkg|
|
66
67
|
pkg.need_tar = PROJ.need_tar
|
67
68
|
pkg.need_zip = PROJ.need_zip
|
69
|
+
pkg.package_files += PROJ.spec.files
|
70
|
+
end
|
71
|
+
Rake::Task['gem:package'].instance_variable_set(:@full_comment, nil)
|
72
|
+
|
73
|
+
gem_file = if PROJ.spec.platform == Gem::Platform::RUBY
|
74
|
+
"#{pkg.package_name}.gem"
|
75
|
+
else
|
76
|
+
"#{pkg.package_name}-#{PROJ.spec.platform}.gem"
|
77
|
+
end
|
78
|
+
|
79
|
+
desc "Build the gem file #{gem_file}"
|
80
|
+
task :package => "#{pkg.package_dir}/#{gem_file}"
|
81
|
+
|
82
|
+
file "#{pkg.package_dir}/#{gem_file}" => [pkg.package_dir] + PROJ.spec.files do
|
83
|
+
when_writing("Creating GEM") {
|
84
|
+
Gem::Builder.new(PROJ.spec).build
|
85
|
+
verbose(true) {
|
86
|
+
mv gem_file, "#{pkg.package_dir}/#{gem_file}"
|
87
|
+
}
|
88
|
+
}
|
68
89
|
end
|
69
90
|
|
70
91
|
desc 'Install the gem'
|
data/data/tasks/manifest.rake
CHANGED
@@ -7,16 +7,9 @@ namespace :manifest do
|
|
7
7
|
desc 'Verify the manifest'
|
8
8
|
task :check do
|
9
9
|
fn = 'Manifest.tmp'
|
10
|
-
files =
|
11
|
-
exclude = Regexp.new(PROJ.exclude.join('|'))
|
12
|
-
Find.find '.' do |path|
|
13
|
-
path.sub! %r/^(\.\/|\/)/o, ''
|
14
|
-
next unless test ?f, path
|
15
|
-
next if path =~ exclude
|
16
|
-
files << path
|
17
|
-
end
|
10
|
+
files = manifest_files
|
18
11
|
|
19
|
-
File.open(fn, 'w') {|fp| fp.puts files
|
12
|
+
File.open(fn, 'w') {|fp| fp.puts files}
|
20
13
|
lines = %x(#{DIFF} -du Manifest.txt #{fn}).split("\n")
|
21
14
|
if HAVE_FACETS_ANSICODE and ENV.has_key?('TERM')
|
22
15
|
lines.map! do |line|
|
@@ -35,18 +28,20 @@ namespace :manifest do
|
|
35
28
|
desc 'Create a new manifest'
|
36
29
|
task :create do
|
37
30
|
fn = 'Manifest.txt'
|
38
|
-
files =
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
next unless test ?f, path
|
43
|
-
next if path =~ exclude
|
44
|
-
files << path
|
31
|
+
files = manifest_files
|
32
|
+
unless test(?f, fn)
|
33
|
+
files << fn
|
34
|
+
files.sort!
|
45
35
|
end
|
36
|
+
File.open(fn, 'w') {|fp| fp.puts files}
|
37
|
+
end
|
46
38
|
|
47
|
-
|
48
|
-
|
39
|
+
task :assert do
|
40
|
+
files = manifest_files
|
41
|
+
manifest = File.read('Manifest.txt').split($/)
|
42
|
+
raise RuntimeError, "Manifest.txt is out of date" unless files == manifest
|
49
43
|
end
|
44
|
+
|
50
45
|
end # namespace :manifest
|
51
46
|
|
52
47
|
desc 'Alias to manifest:check'
|
data/data/tasks/setup.rb
CHANGED
@@ -16,7 +16,8 @@ PROJ.email = nil
|
|
16
16
|
PROJ.url = nil
|
17
17
|
PROJ.version = ENV['VERSION'] || '0.0.0'
|
18
18
|
PROJ.rubyforge_name = nil
|
19
|
-
PROJ.exclude = %w(tmp$ bak$ ~$ CVS .svn/ ^pkg/ ^doc/)
|
19
|
+
PROJ.exclude = %w(tmp$ bak$ ~$ CVS .svn/ ^pkg/ ^doc/ announcement.txt)
|
20
|
+
PROJ.release_name = ENV['RELEASE']
|
20
21
|
|
21
22
|
# Rspec
|
22
23
|
PROJ.specs = FileList['spec/**/*_spec.rb']
|
@@ -55,10 +56,12 @@ PROJ.executables = PROJ.files.find_all {|fn| fn =~ %r/^bin/}
|
|
55
56
|
PROJ.dependencies = []
|
56
57
|
PROJ.need_tar = true
|
57
58
|
PROJ.need_zip = false
|
59
|
+
PROJ.post_install_message = nil
|
58
60
|
|
59
61
|
# File Annotations
|
60
|
-
PROJ.annotation_exclude =
|
62
|
+
PROJ.annotation_exclude = %w(^tasks/setup.rb$)
|
61
63
|
PROJ.annotation_extensions = %w(.txt .rb .erb) << ''
|
64
|
+
PROJ.annotation_tags = %w(FIXME OPTIMIZE TODO)
|
62
65
|
|
63
66
|
# Subversion Repository
|
64
67
|
PROJ.svn = false
|
@@ -67,6 +70,20 @@ PROJ.svn_trunk = 'trunk'
|
|
67
70
|
PROJ.svn_tags = 'tags'
|
68
71
|
PROJ.svn_branches = 'branches'
|
69
72
|
|
73
|
+
# Announce
|
74
|
+
PROJ.ann_text = nil
|
75
|
+
PROJ.ann_paragraphs = []
|
76
|
+
PROJ.ann_email = {
|
77
|
+
:from => nil,
|
78
|
+
:to => %w(ruby-talk@ruby-lang.org),
|
79
|
+
:server => 'localhost',
|
80
|
+
:port => 25,
|
81
|
+
:domain => ENV['HOSTNAME'],
|
82
|
+
:acct => nil,
|
83
|
+
:passwd => nil,
|
84
|
+
:authtype => :plain
|
85
|
+
}
|
86
|
+
|
70
87
|
# Load the other rake files in the tasks folder
|
71
88
|
rakefiles = Dir.glob('tasks/*.rake').sort
|
72
89
|
rakefiles.unshift(rakefiles.delete('tasks/post_load.rake')).compact!
|
@@ -99,8 +116,8 @@ SUDO = if WIN32 then ''
|
|
99
116
|
else '' end
|
100
117
|
end
|
101
118
|
|
102
|
-
RCOV = WIN32 ? 'rcov.
|
103
|
-
GEM = WIN32 ? 'gem.
|
119
|
+
RCOV = WIN32 ? 'rcov.bat' : 'rcov'
|
120
|
+
GEM = WIN32 ? 'gem.bat' : 'gem'
|
104
121
|
|
105
122
|
%w(rcov spec/rake/spectask rubyforge bones facets/ansicode).each do |lib|
|
106
123
|
begin
|
@@ -186,4 +203,19 @@ def in_directory( dir, &block )
|
|
186
203
|
end
|
187
204
|
end
|
188
205
|
|
206
|
+
# Scans the current working directory and creates a list of files that are
|
207
|
+
# candidates to be in the manifest.
|
208
|
+
#
|
209
|
+
def manifest_files
|
210
|
+
files = []
|
211
|
+
exclude = Regexp.new(PROJ.exclude.join('|'))
|
212
|
+
Find.find '.' do |path|
|
213
|
+
path.sub! %r/^(\.\/|\/)/o, ''
|
214
|
+
next unless test ?f, path
|
215
|
+
next if path =~ exclude
|
216
|
+
files << path
|
217
|
+
end
|
218
|
+
files.sort!
|
219
|
+
end
|
220
|
+
|
189
221
|
# EOF
|
data/lib/bones.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
# $Id: bones.rb
|
1
|
+
# $Id: bones.rb 509 2008-02-08 17:17:53Z tim_pease $
|
2
2
|
|
3
3
|
module Bones
|
4
4
|
|
5
5
|
# :stopdoc:
|
6
|
-
VERSION = '1.3.
|
6
|
+
VERSION = '1.3.3'
|
7
7
|
PATH = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
8
8
|
WIN32 = %r/win32/ =~ RUBY_PLATFORM
|
9
9
|
DEV_NULL = WIN32 ? 'NUL:' : '/dev/null'
|
@@ -29,6 +29,8 @@ module Bones
|
|
29
29
|
# these guys are just grabbing whatever is there and not pulling
|
30
30
|
# the filenames from the manifest
|
31
31
|
|
32
|
+
# TODO: create some tasks to generate e-mails / announcements
|
33
|
+
|
32
34
|
end # module Bones
|
33
35
|
|
34
36
|
|
data/lib/bones/main.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: main.rb
|
1
|
+
# $Id: main.rb 536 2008-02-18 23:07:49Z tim_pease $
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
4
|
require 'optparse'
|
@@ -210,7 +210,7 @@ class Main
|
|
210
210
|
# indicating that the file is being created.
|
211
211
|
#
|
212
212
|
def cp( file )
|
213
|
-
dir = File.dirname(file)
|
213
|
+
dir = File.dirname(file).sub('NAME', name)
|
214
214
|
dir = (dir == '.' ? name : File.join(name, dir))
|
215
215
|
dst = File.join(dir, File.basename(file, '.erb').sub('NAME', name))
|
216
216
|
src = File.join(data, file)
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# $Id: smtp_tls.rb 536 2008-02-18 23:07:49Z tim_pease $
|
2
|
+
|
3
|
+
# This code enables SMTPTLS authentication requireed for sending mail
|
4
|
+
# via the gmail servers. I found this code via a blog entry from James
|
5
|
+
# Britt.
|
6
|
+
#
|
7
|
+
# http://d.hatena.ne.jp/zorio/20060416
|
8
|
+
# http://www.jamesbritt.com/2007/12/18/sending-mail-through-gmail-with-ruby-s-net-smtp
|
9
|
+
|
10
|
+
require "openssl"
|
11
|
+
require "net/smtp"
|
12
|
+
|
13
|
+
Net::SMTP.class_eval do
|
14
|
+
private
|
15
|
+
def do_start(helodomain, user, secret, authtype)
|
16
|
+
raise IOError, 'SMTP session already started' if @started
|
17
|
+
check_auth_args user, secret, authtype if user or secret
|
18
|
+
|
19
|
+
sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }
|
20
|
+
@socket = Net::InternetMessageIO.new(sock)
|
21
|
+
@socket.read_timeout = 60 #@read_timeout
|
22
|
+
@socket.debug_output = STDERR #@debug_output
|
23
|
+
|
24
|
+
check_response(critical { recv_response() })
|
25
|
+
do_helo(helodomain)
|
26
|
+
|
27
|
+
raise 'openssl library not installed' unless defined?(OpenSSL)
|
28
|
+
starttls
|
29
|
+
ssl = OpenSSL::SSL::SSLSocket.new(sock)
|
30
|
+
ssl.sync_close = true
|
31
|
+
ssl.connect
|
32
|
+
@socket = Net::InternetMessageIO.new(ssl)
|
33
|
+
@socket.read_timeout = 60 #@read_timeout
|
34
|
+
@socket.debug_output = STDERR #@debug_output
|
35
|
+
do_helo(helodomain)
|
36
|
+
|
37
|
+
authenticate user, secret, authtype if user
|
38
|
+
@started = true
|
39
|
+
ensure
|
40
|
+
unless @started
|
41
|
+
# authentication failed, cancel connection.
|
42
|
+
@socket.close if not @started and @socket and not @socket.closed?
|
43
|
+
@socket = nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def do_helo(helodomain)
|
48
|
+
begin
|
49
|
+
if @esmtp
|
50
|
+
ehlo helodomain
|
51
|
+
else
|
52
|
+
helo helodomain
|
53
|
+
end
|
54
|
+
rescue Net::ProtocolError
|
55
|
+
if @esmtp
|
56
|
+
@esmtp = false
|
57
|
+
@error_occured = false
|
58
|
+
retry
|
59
|
+
end
|
60
|
+
raise
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def starttls
|
65
|
+
getok('STARTTLS')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# EOF
|
data/tasks/ann.rake
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
# $Id: ann.rake 536 2008-02-18 23:07:49Z tim_pease $
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bones/smtp_tls'
|
5
|
+
rescue LoadError
|
6
|
+
require 'net/smtp'
|
7
|
+
end
|
8
|
+
require 'time'
|
9
|
+
|
10
|
+
namespace :ann do
|
11
|
+
|
12
|
+
desc "Create an announcement file"
|
13
|
+
task :announcement do
|
14
|
+
File.open('announcement.txt','w') do |fd|
|
15
|
+
fd.puts("#{PROJ.name} version #{PROJ.version}")
|
16
|
+
fd.puts(" by #{Array(PROJ.authors).first}") if PROJ.authors
|
17
|
+
fd.puts(" #{PROJ.url}") if PROJ.url
|
18
|
+
fd.puts(" (the \"#{PROJ.release_name}\" release)") if PROJ.release_name
|
19
|
+
fd.puts
|
20
|
+
fd.puts("== DESCRIPTION")
|
21
|
+
fd.puts
|
22
|
+
fd.puts(PROJ.description)
|
23
|
+
fd.puts
|
24
|
+
fd.puts(PROJ.changes.sub(%r/^.*$/, '== CHANGES'))
|
25
|
+
fd.puts
|
26
|
+
PROJ.ann_paragraphs.each do |p|
|
27
|
+
fd.puts "== #{p.upcase}"
|
28
|
+
fd.puts
|
29
|
+
fd.puts paragraphs_of('README.txt', p).join("\n\n")
|
30
|
+
fd.puts
|
31
|
+
end
|
32
|
+
fd.puts PROJ.ann_text if PROJ.ann_text
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
desc "Send email announcement"
|
37
|
+
task :email => :announcement do
|
38
|
+
from = PROJ.ann_email[:from] || PROJ.email
|
39
|
+
to = Array(PROJ.ann_email[:to])
|
40
|
+
|
41
|
+
### build a mail header for RFC 822
|
42
|
+
rfc822msg = "From: #{from}\n"
|
43
|
+
rfc822msg << "To: #{to.join(',')}\n"
|
44
|
+
rfc822msg << "Subject: [ANN] #{PROJ.name} #{PROJ.version}"
|
45
|
+
rfc822msg << " (#{PROJ.release_name})" if PROJ.release_name
|
46
|
+
rfc822msg << "\n"
|
47
|
+
rfc822msg << "Date: #{Time.new.rfc822}\n"
|
48
|
+
rfc822msg << "Message-Id: "
|
49
|
+
rfc822msg << "<#{"%.8f" % Time.now.to_f}@#{PROJ.ann_email[:domain]}>\n\n"
|
50
|
+
rfc822msg << File.read('announcement.txt')
|
51
|
+
|
52
|
+
params = [:server, :port, :domain, :acct, :passwd, :authtype].map do |key|
|
53
|
+
PROJ.ann_email[key]
|
54
|
+
end
|
55
|
+
|
56
|
+
params[3] = PROJ.email if params[3].nil?
|
57
|
+
|
58
|
+
if params[4].nil?
|
59
|
+
STDOUT.write "Please enter your e-mail password (#{params[3]}): "
|
60
|
+
params[4] = STDIN.gets.chomp
|
61
|
+
end
|
62
|
+
|
63
|
+
### send email
|
64
|
+
Net::SMTP.start(*params) {|smtp| smtp.sendmail(rfc822msg, from, to)}
|
65
|
+
end
|
66
|
+
|
67
|
+
task :clobber_announcement do
|
68
|
+
rm 'announcement.txt' rescue nil
|
69
|
+
end
|
70
|
+
end # namespace :ann
|
71
|
+
|
72
|
+
desc 'Alias to ann:announcement'
|
73
|
+
task :ann => 'ann:announcement'
|
74
|
+
|
75
|
+
task :clobber => %w(ann:clobber_announcement)
|
76
|
+
|
77
|
+
# EOF
|
data/tasks/annotations.rake
CHANGED
@@ -5,23 +5,15 @@ if HAVE_BONES
|
|
5
5
|
desc "Enumerate all annotations"
|
6
6
|
task :notes do
|
7
7
|
Bones::AnnotationExtractor.enumerate(
|
8
|
-
PROJ,
|
8
|
+
PROJ, PROJ.annotation_tags.join('|'), :tag => true)
|
9
9
|
end
|
10
10
|
|
11
11
|
namespace :notes do
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
desc "Enumerate all FIXME annotations"
|
18
|
-
task :fixme do
|
19
|
-
Bones::AnnotationExtractor.enumerate(PROJ, "FIXME")
|
20
|
-
end
|
21
|
-
|
22
|
-
desc "Enumerate all TODO annotations"
|
23
|
-
task :todo do
|
24
|
-
Bones::AnnotationExtractor.enumerate(PROJ, "TODO")
|
12
|
+
PROJ.annotation_tags.each do |tag|
|
13
|
+
desc "Enumerate all #{tag} annotations"
|
14
|
+
task tag.downcase.to_sym do
|
15
|
+
Bones::AnnotationExtractor.enumerate(PROJ, tag)
|
16
|
+
end
|
25
17
|
end
|
26
18
|
end
|
27
19
|
|
data/tasks/gem.rake
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id$
|
1
|
+
# $Id: gem.rake 536 2008-02-18 23:07:49Z tim_pease $
|
2
2
|
|
3
3
|
require 'rake/gempackagetask'
|
4
4
|
|
@@ -12,6 +12,7 @@ namespace :gem do
|
|
12
12
|
s.email = PROJ.email
|
13
13
|
s.homepage = Array(PROJ.url).first
|
14
14
|
s.rubyforge_project = PROJ.rubyforge_name
|
15
|
+
s.post_install_message = PROJ.post_install_message
|
15
16
|
|
16
17
|
s.description = PROJ.description
|
17
18
|
|
@@ -62,9 +63,29 @@ namespace :gem do
|
|
62
63
|
puts PROJ.spec.to_ruby
|
63
64
|
end
|
64
65
|
|
65
|
-
Rake::
|
66
|
+
pkg = Rake::PackageTask.new(PROJ.name, PROJ.version) do |pkg|
|
66
67
|
pkg.need_tar = PROJ.need_tar
|
67
68
|
pkg.need_zip = PROJ.need_zip
|
69
|
+
pkg.package_files += PROJ.spec.files
|
70
|
+
end
|
71
|
+
Rake::Task['gem:package'].instance_variable_set(:@full_comment, nil)
|
72
|
+
|
73
|
+
gem_file = if PROJ.spec.platform == Gem::Platform::RUBY
|
74
|
+
"#{pkg.package_name}.gem"
|
75
|
+
else
|
76
|
+
"#{pkg.package_name}-#{PROJ.spec.platform}.gem"
|
77
|
+
end
|
78
|
+
|
79
|
+
desc "Build the gem file #{gem_file}"
|
80
|
+
task :package => "#{pkg.package_dir}/#{gem_file}"
|
81
|
+
|
82
|
+
file "#{pkg.package_dir}/#{gem_file}" => [pkg.package_dir] + PROJ.spec.files do
|
83
|
+
when_writing("Creating GEM") {
|
84
|
+
Gem::Builder.new(PROJ.spec).build
|
85
|
+
verbose(true) {
|
86
|
+
mv gem_file, "#{pkg.package_dir}/#{gem_file}"
|
87
|
+
}
|
88
|
+
}
|
68
89
|
end
|
69
90
|
|
70
91
|
desc 'Install the gem'
|
data/tasks/manifest.rake
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id$
|
1
|
+
# $Id: manifest.rake 536 2008-02-18 23:07:49Z tim_pease $
|
2
2
|
|
3
3
|
require 'find'
|
4
4
|
|
@@ -7,16 +7,9 @@ namespace :manifest do
|
|
7
7
|
desc 'Verify the manifest'
|
8
8
|
task :check do
|
9
9
|
fn = 'Manifest.tmp'
|
10
|
-
files =
|
11
|
-
exclude = Regexp.new(PROJ.exclude.join('|'))
|
12
|
-
Find.find '.' do |path|
|
13
|
-
path.sub! %r/^(\.\/|\/)/o, ''
|
14
|
-
next unless test ?f, path
|
15
|
-
next if path =~ exclude
|
16
|
-
files << path
|
17
|
-
end
|
10
|
+
files = manifest_files
|
18
11
|
|
19
|
-
File.open(fn, 'w') {|fp| fp.puts files
|
12
|
+
File.open(fn, 'w') {|fp| fp.puts files}
|
20
13
|
lines = %x(#{DIFF} -du Manifest.txt #{fn}).split("\n")
|
21
14
|
if HAVE_FACETS_ANSICODE and ENV.has_key?('TERM')
|
22
15
|
lines.map! do |line|
|
@@ -35,18 +28,20 @@ namespace :manifest do
|
|
35
28
|
desc 'Create a new manifest'
|
36
29
|
task :create do
|
37
30
|
fn = 'Manifest.txt'
|
38
|
-
files =
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
next unless test ?f, path
|
43
|
-
next if path =~ exclude
|
44
|
-
files << path
|
31
|
+
files = manifest_files
|
32
|
+
unless test(?f, fn)
|
33
|
+
files << fn
|
34
|
+
files.sort!
|
45
35
|
end
|
36
|
+
File.open(fn, 'w') {|fp| fp.puts files}
|
37
|
+
end
|
46
38
|
|
47
|
-
|
48
|
-
|
39
|
+
task :assert do
|
40
|
+
files = manifest_files
|
41
|
+
manifest = File.read('Manifest.txt').split($/)
|
42
|
+
raise RuntimeError, "manifest is out of date" unless files == manifest
|
49
43
|
end
|
44
|
+
|
50
45
|
end # namespace :manifest
|
51
46
|
|
52
47
|
desc 'Alias to manifest:check'
|
data/tasks/setup.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# $Id: setup.rb
|
1
|
+
# $Id: setup.rb 536 2008-02-18 23:07:49Z tim_pease $
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'rake'
|
@@ -16,7 +16,8 @@ PROJ.email = nil
|
|
16
16
|
PROJ.url = nil
|
17
17
|
PROJ.version = ENV['VERSION'] || '0.0.0'
|
18
18
|
PROJ.rubyforge_name = nil
|
19
|
-
PROJ.exclude = %w(tmp$ bak$ ~$ CVS .svn/ ^pkg/ ^doc/)
|
19
|
+
PROJ.exclude = %w(tmp$ bak$ ~$ CVS .svn/ ^pkg/ ^doc/ announcement.txt)
|
20
|
+
PROJ.release_name = ENV['RELEASE']
|
20
21
|
|
21
22
|
# Rspec
|
22
23
|
PROJ.specs = FileList['spec/**/*_spec.rb']
|
@@ -55,10 +56,12 @@ PROJ.executables = PROJ.files.find_all {|fn| fn =~ %r/^bin/}
|
|
55
56
|
PROJ.dependencies = []
|
56
57
|
PROJ.need_tar = true
|
57
58
|
PROJ.need_zip = false
|
59
|
+
PROJ.post_install_message = nil
|
58
60
|
|
59
61
|
# File Annotations
|
60
|
-
PROJ.annotation_exclude =
|
62
|
+
PROJ.annotation_exclude = %w(^tasks/setup.rb$)
|
61
63
|
PROJ.annotation_extensions = %w(.txt .rb .erb) << ''
|
64
|
+
PROJ.annotation_tags = %w(FIXME OPTIMIZE TODO)
|
62
65
|
|
63
66
|
# Subversion Repository
|
64
67
|
PROJ.svn = false
|
@@ -67,6 +70,20 @@ PROJ.svn_trunk = 'trunk'
|
|
67
70
|
PROJ.svn_tags = 'tags'
|
68
71
|
PROJ.svn_branches = 'branches'
|
69
72
|
|
73
|
+
# Announce
|
74
|
+
PROJ.ann_text = nil
|
75
|
+
PROJ.ann_paragraphs = []
|
76
|
+
PROJ.ann_email = {
|
77
|
+
:from => nil,
|
78
|
+
:to => %w(ruby-talk@ruby-lang.org),
|
79
|
+
:server => 'localhost',
|
80
|
+
:port => 25,
|
81
|
+
:domain => ENV['HOSTNAME'],
|
82
|
+
:acct => nil,
|
83
|
+
:passwd => nil,
|
84
|
+
:authtype => :plain
|
85
|
+
}
|
86
|
+
|
70
87
|
# Load the other rake files in the tasks folder
|
71
88
|
rakefiles = Dir.glob('tasks/*.rake').sort
|
72
89
|
rakefiles.unshift(rakefiles.delete('tasks/post_load.rake')).compact!
|
@@ -99,8 +116,8 @@ SUDO = if WIN32 then ''
|
|
99
116
|
else '' end
|
100
117
|
end
|
101
118
|
|
102
|
-
RCOV = WIN32 ? 'rcov.
|
103
|
-
GEM = WIN32 ? 'gem.
|
119
|
+
RCOV = WIN32 ? 'rcov.bat' : 'rcov'
|
120
|
+
GEM = WIN32 ? 'gem.bat' : 'gem'
|
104
121
|
|
105
122
|
%w(rcov spec/rake/spectask rubyforge bones facets/ansicode).each do |lib|
|
106
123
|
begin
|
@@ -186,4 +203,19 @@ def in_directory( dir, &block )
|
|
186
203
|
end
|
187
204
|
end
|
188
205
|
|
206
|
+
# Scans the current working directory and creates a list of files that are
|
207
|
+
# candidates to be in the manifest.
|
208
|
+
#
|
209
|
+
def manifest_files
|
210
|
+
files = []
|
211
|
+
exclude = Regexp.new(PROJ.exclude.join('|'))
|
212
|
+
Find.find '.' do |path|
|
213
|
+
path.sub! %r/^(\.\/|\/)/o, ''
|
214
|
+
next unless test ?f, path
|
215
|
+
next if path =~ exclude
|
216
|
+
files << path
|
217
|
+
end
|
218
|
+
files.sort!
|
219
|
+
end
|
220
|
+
|
189
221
|
# EOF
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bones
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Pease
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-02-
|
12
|
+
date: 2008-02-18 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -37,6 +37,7 @@ files:
|
|
37
37
|
- data/lib/NAME.rb.erb
|
38
38
|
- data/spec/NAME_spec.rb.erb
|
39
39
|
- data/spec/spec_helper.rb.erb
|
40
|
+
- data/tasks/ann.rake
|
40
41
|
- data/tasks/annotations.rake
|
41
42
|
- data/tasks/doc.rake
|
42
43
|
- data/tasks/gem.rake
|
@@ -51,6 +52,8 @@ files:
|
|
51
52
|
- lib/bones.rb
|
52
53
|
- lib/bones/annotation_extractor.rb
|
53
54
|
- lib/bones/main.rb
|
55
|
+
- lib/bones/smtp_tls.rb
|
56
|
+
- tasks/ann.rake
|
54
57
|
- tasks/annotations.rake
|
55
58
|
- tasks/doc.rake
|
56
59
|
- tasks/gem.rake
|
@@ -63,7 +66,11 @@ files:
|
|
63
66
|
- tasks/test.rake
|
64
67
|
has_rdoc: true
|
65
68
|
homepage: http://codeforpeople.rubyforge.org/bones
|
66
|
-
post_install_message:
|
69
|
+
post_install_message: |
|
70
|
+
--------------------------
|
71
|
+
Keep rattlin' dem bones!
|
72
|
+
--------------------------
|
73
|
+
|
67
74
|
rdoc_options:
|
68
75
|
- --main
|
69
76
|
- README.txt
|