reap 4.3.4 → 4.4.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.
- data/MANIFEST +424 -0
- data/ProjectInfo +4 -3
- data/README +83 -51
- data/Rakefile +118 -0
- data/bin/reap +2 -1
- data/data/reap/scaffold/standard/setup.rb +1568 -0
- data/data/reap/scaffold/subversion/trunk/setup.rb +1568 -0
- data/data/reap/setup.rb +4 -0
- data/doc/LATEST +24 -0
- data/lib/reap/bin/reap.rb +15 -8
- data/lib/reap/projectinfo.rb +100 -35
- data/lib/reap/rake.rb +16 -0
- data/lib/reap/rake/adapter.rb +50 -0
- data/lib/reap/rake/announce.rb +10 -0
- data/lib/reap/rake/doap.rb +10 -0
- data/lib/reap/rake/extest.rb +10 -0
- data/lib/reap/rake/info.rb +10 -0
- data/lib/reap/rake/install.rb +10 -0
- data/lib/reap/rake/manifest.rb +9 -0
- data/lib/reap/rake/package.rb +10 -0
- data/lib/reap/rake/publish.rb +10 -0
- data/lib/reap/rake/rdoc.rb +10 -0
- data/lib/reap/rake/release.rb +10 -0
- data/lib/reap/rake/test.rb +10 -0
- data/lib/reap/reap.rb +6 -5
- data/lib/reap/task.rb +47 -38
- data/lib/reap/task/announce.rb +81 -51
- data/lib/reap/task/doap.rb +12 -9
- data/lib/reap/task/{testext.rb → extest.rb} +30 -22
- data/lib/reap/task/fileperm.rb +8 -6
- data/lib/reap/task/info.rb +0 -4
- data/lib/reap/task/install.rb +11 -4
- data/lib/reap/task/manifest.rb +59 -0
- data/lib/reap/task/noop.rb +2 -3
- data/lib/reap/task/package.rb +22 -31
- data/lib/reap/task/publish.rb +113 -28
- data/lib/reap/task/rdoc.rb +30 -18
- data/lib/reap/task/release.rb +15 -16
- data/lib/reap/task/test.rb +22 -14
- metadata +26 -6
data/lib/reap/reap.rb
CHANGED
@@ -4,9 +4,8 @@ require 'reap/projectinfo'
|
|
4
4
|
require 'reap/task'
|
5
5
|
|
6
6
|
# Reap tasks
|
7
|
-
require 'reap/task/fileperm'
|
8
7
|
require 'reap/task/test'
|
9
|
-
require 'reap/task/
|
8
|
+
require 'reap/task/extest'
|
10
9
|
require 'reap/task/rdoc'
|
11
10
|
require 'reap/task/announce'
|
12
11
|
require 'reap/task/package'
|
@@ -15,12 +14,14 @@ require 'reap/task/info'
|
|
15
14
|
require 'reap/task/install'
|
16
15
|
require 'reap/task/release'
|
17
16
|
require 'reap/task/doap'
|
17
|
+
require 'reap/task/manifest'
|
18
|
+
require 'reap/task/fileperm' # needs work
|
18
19
|
#require 'reap/task/noop'
|
19
20
|
|
20
21
|
|
21
22
|
module Reap
|
22
23
|
|
23
|
-
Version = "4.3.
|
24
|
+
Version = "4.3.5"
|
24
25
|
|
25
26
|
# Hash of all possible tasks
|
26
27
|
# { task name => task class }
|
@@ -41,8 +42,8 @@ module Reap
|
|
41
42
|
@tasks
|
42
43
|
end
|
43
44
|
|
44
|
-
def self.register( alternative_project_file=nil )
|
45
|
-
$PROJECT_INFO = ProjectInfo.
|
45
|
+
def self.register #( alternative_project_file=nil )
|
46
|
+
$PROJECT_INFO = ProjectInfo.load( nil, true )
|
46
47
|
$PROJECT_INFO.exists?
|
47
48
|
end
|
48
49
|
|
data/lib/reap/task.rb
CHANGED
@@ -7,7 +7,7 @@ require 'facet/string/tabto'
|
|
7
7
|
require 'facet/module/basename'
|
8
8
|
require 'facet/module/attr_setter'
|
9
9
|
|
10
|
-
require 'facet/filelist'
|
10
|
+
require 'facet/filelist' unless defined?( FileList )
|
11
11
|
require 'facet/openobject'
|
12
12
|
|
13
13
|
# _____ _ ___ ___ _
|
@@ -49,10 +49,10 @@ module Reap
|
|
49
49
|
|
50
50
|
class Task
|
51
51
|
|
52
|
-
include ::Config
|
52
|
+
#include ::Config
|
53
53
|
include ::FileUtils
|
54
54
|
|
55
|
-
RUBY = CONFIG['ruby_install_name']
|
55
|
+
RUBY = ::Config::CONFIG['ruby_install_name']
|
56
56
|
|
57
57
|
class << self
|
58
58
|
|
@@ -66,6 +66,11 @@ module Reap
|
|
66
66
|
@task_list ||= {}
|
67
67
|
end
|
68
68
|
|
69
|
+
# task dsl
|
70
|
+
|
71
|
+
def section_required( val ) ; @section_required = val ; end
|
72
|
+
def section_required? ; @section_required ; end
|
73
|
+
|
69
74
|
def task_name
|
70
75
|
basename.downcase
|
71
76
|
end
|
@@ -75,7 +80,6 @@ module Reap
|
|
75
80
|
return @task_desc = block if block_given?
|
76
81
|
return @task_desc.call
|
77
82
|
end
|
78
|
-
#def task_desc ; '(no desciption given)' ; end
|
79
83
|
|
80
84
|
def task_help( text=nil, &block )
|
81
85
|
return @task_help = proc { text } if text
|
@@ -87,8 +91,6 @@ module Reap
|
|
87
91
|
define_method(name) { @task }
|
88
92
|
end
|
89
93
|
|
90
|
-
def section_required( val ) ; @section_required = val ; end
|
91
|
-
def section_required? ; @section_required ; end
|
92
94
|
|
93
95
|
def verify?
|
94
96
|
if section_required?
|
@@ -101,15 +103,6 @@ module Reap
|
|
101
103
|
@master ||= CascadingOpenObject.new( $PROJECT_INFO )
|
102
104
|
end
|
103
105
|
|
104
|
-
# def master_attributes ; @master_attributes ||= [] ; end
|
105
|
-
#
|
106
|
-
# # Use this DSL method to define master task attributes.
|
107
|
-
# def attr_master( *names )
|
108
|
-
# attr_accessor *names
|
109
|
-
# @master_attributes ||= []
|
110
|
-
# @master_attributes |= names.collect { |n| n.to_s }
|
111
|
-
# end
|
112
|
-
|
113
106
|
# properties not to be looked up in master
|
114
107
|
# if they are not in regular task section
|
115
108
|
|
@@ -136,7 +129,13 @@ module Reap
|
|
136
129
|
|
137
130
|
def initialize( *args )
|
138
131
|
#@master = CascadingOpenObject.new( $PROJECT_INFO )
|
139
|
-
|
132
|
+
@args = args
|
133
|
+
end
|
134
|
+
|
135
|
+
# Run task for each section entires given.
|
136
|
+
|
137
|
+
def execute( section=nil )
|
138
|
+
section = section || master[task_name]
|
140
139
|
case section
|
141
140
|
when Array
|
142
141
|
section.each do |s|
|
@@ -147,39 +146,38 @@ module Reap
|
|
147
146
|
end
|
148
147
|
end
|
149
148
|
|
150
|
-
# Per section
|
149
|
+
# Per section entry execution of task.
|
151
150
|
|
152
151
|
def initiate( section )
|
153
152
|
@section = CascadingOpenObject.new( section )
|
154
153
|
|
155
|
-
task_properties = {}
|
154
|
+
task_properties = {} # needed?
|
156
155
|
#self.class.task_only_properties.each { |t| section[t] ||= nil }
|
157
156
|
task_properties = CascadingOpenObject.new( section )
|
158
157
|
task_properties.__parent__ = master
|
159
158
|
@task = task_properties
|
160
159
|
|
161
|
-
init
|
162
|
-
|
163
|
-
|
160
|
+
# deprecate init ?
|
161
|
+
if respond_to?( :init )
|
162
|
+
if method(:init).arity == 0
|
163
|
+
init
|
164
|
+
else
|
165
|
+
init( *@args )
|
166
|
+
end
|
167
|
+
end
|
164
168
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
# #end
|
172
|
-
#
|
173
|
-
# #@section.each do |k,v|
|
174
|
-
# # send( "#{k}=", v )
|
175
|
-
# #end
|
176
|
-
# end
|
169
|
+
if method(:run).arity == 0
|
170
|
+
run
|
171
|
+
else
|
172
|
+
run( *@args )
|
173
|
+
end
|
174
|
+
end
|
177
175
|
|
178
|
-
#
|
176
|
+
# interface
|
179
177
|
|
180
|
-
def init
|
181
|
-
|
182
|
-
end
|
178
|
+
#def init
|
179
|
+
# raise "not implemented for '#{task_name}' task"
|
180
|
+
#end
|
183
181
|
|
184
182
|
def run
|
185
183
|
raise "no action defined for task #{task_name}"
|
@@ -200,9 +198,20 @@ module Reap
|
|
200
198
|
system arg unless $PRETEND
|
201
199
|
end
|
202
200
|
|
201
|
+
def ask( question, answers=nil )
|
202
|
+
print "#{question}"
|
203
|
+
print " [#{answers}] " if answers
|
204
|
+
until inp = $stdin.gets[0,1] ; sleep 1 ; end ; puts
|
205
|
+
inp
|
206
|
+
end
|
207
|
+
|
208
|
+
def tell( statement )
|
209
|
+
puts statement
|
210
|
+
end
|
211
|
+
|
203
212
|
def provide_setup_rb
|
204
213
|
return true if File.exists?( 'setup.rb')
|
205
|
-
# copy from data dir to current directory
|
214
|
+
# copy from data dir to current directory (Won't work with Gem!)
|
206
215
|
f = File.join( Config::CONFIG['datadir'], 'reap', 'setup_rb', 'setup.rb' )
|
207
216
|
if File.exists?(f)
|
208
217
|
File.cp( f, '.' )
|
data/lib/reap/task/announce.rb
CHANGED
@@ -15,12 +15,35 @@ require 'facet/string/word_wrap'
|
|
15
15
|
#
|
16
16
|
|
17
17
|
# = Announcement Task
|
18
|
-
|
18
|
+
#
|
19
|
+
# The announce task is intended for sending out a nice
|
20
|
+
# formated email message to a mailing address, especially
|
21
|
+
# mailing-lists. ProjectInfo uses these parameters:
|
22
|
+
#
|
23
|
+
# announce:
|
24
|
+
# server Email server to route message.
|
25
|
+
# port Email server's port.
|
26
|
+
# domain Email server's domain name.
|
27
|
+
# account Email account name.
|
28
|
+
# type Login type, either plain, cram_md5 or login.
|
29
|
+
# secure Uses TLS security, true or false?
|
30
|
+
# to Email address to send announcemnt.
|
31
|
+
# from Email address sent from.
|
32
|
+
# subject Subject of email message.
|
33
|
+
# title Project title.
|
34
|
+
# summary Brief onl-liner description.
|
35
|
+
# description Long description of project.
|
36
|
+
# homespage Project homepage web address.
|
37
|
+
# links Array of http links to related sites.
|
38
|
+
# file File that contains announcement message.
|
39
|
+
# memo Embedded announcement message.
|
40
|
+
# slogan: Motto for you project.
|
41
|
+
#
|
19
42
|
class Reap::Announce < Reap::Task
|
20
43
|
|
21
44
|
section_required true
|
22
45
|
|
23
|
-
task_desc "
|
46
|
+
task_desc "Email project announcement."
|
24
47
|
|
25
48
|
task_help %{
|
26
49
|
|
@@ -28,9 +51,8 @@ class Reap::Announce < Reap::Task
|
|
28
51
|
|
29
52
|
Send an announcement to a mailaing list or other email address.
|
30
53
|
|
31
|
-
|
32
|
-
|
33
|
-
subject Subject of email message.
|
54
|
+
Server settings are
|
55
|
+
|
34
56
|
server Email server to route message.
|
35
57
|
port Email server's port.
|
36
58
|
domain Email server's domain name.
|
@@ -38,38 +60,46 @@ class Reap::Announce < Reap::Task
|
|
38
60
|
type Login type, either plain, cram_md5 or login.
|
39
61
|
secure Uses TLS security, true or false?
|
40
62
|
|
63
|
+
Message settings are
|
64
|
+
|
65
|
+
to Email address to send announcemnt.
|
66
|
+
from Email address sent from.
|
67
|
+
subject Subject of email message.
|
68
|
+
file File that contains announcement message.
|
69
|
+
memo Embedded announcement message.
|
70
|
+
|
41
71
|
}
|
42
72
|
|
43
|
-
|
73
|
+
alias_method :anc, :task
|
44
74
|
|
45
|
-
|
46
|
-
#attr_accessor :to, :from, :server, :port, :domain, :account
|
47
|
-
#attr_accessor :type, :secure
|
48
|
-
#attr_accessor :links, :slogan, :memo, :file
|
75
|
+
def run
|
49
76
|
|
50
|
-
|
51
|
-
ann.to = (ann.to || 'ruby-talk@ruby-lang.org').to_s.strip
|
52
|
-
ann.from = (ann.from || master['email']).to_s.strip
|
53
|
-
ann.server = ann.server.to_s.strip
|
54
|
-
ann.port = (ann.port || 25).to_i
|
55
|
-
ann.domain = ann.domain.to_s.strip if ann.domain
|
56
|
-
ann.account = ann.account.to_s.strip
|
57
|
-
ann.type = (ann.type || 'plain').to_s.strip #cram_md5 #plain #login
|
77
|
+
# setup
|
58
78
|
|
59
|
-
|
60
|
-
|
79
|
+
anc.to = (anc.to || 'ruby-talk@ruby-lang.org').to_s.strip
|
80
|
+
anc.from = (anc.from || master['email']).to_s.strip
|
81
|
+
anc.server = anc.server.to_s.strip
|
82
|
+
anc.port = (anc.port || 25).to_i
|
83
|
+
anc.domain = anc.domain.to_s.strip if anc.domain
|
84
|
+
anc.account = anc.account.to_s.strip
|
85
|
+
anc.type = (anc.type || 'plain').to_s.strip #cram_md5 #plain #login
|
61
86
|
|
62
|
-
|
63
|
-
|
64
|
-
ann.links ||= []
|
65
|
-
ann.subject ||= "[ANN] #{ann.title}, v#{ann.version}"
|
87
|
+
raise "server is a require announce field" if anc.server.empty?
|
88
|
+
raise "account is a require announce field" if anc.account.empty?
|
66
89
|
|
67
|
-
|
90
|
+
anc.title ||= master.title
|
91
|
+
anc.version ||= master.version || master.date
|
92
|
+
anc.links ||= []
|
93
|
+
anc.subject ||= "[ANN] #{anc.title}, v#{anc.version}"
|
68
94
|
|
69
|
-
|
70
|
-
|
95
|
+
anc.address = anc.to # TODO
|
96
|
+
|
97
|
+
# validate
|
98
|
+
|
99
|
+
#raise "DOMAIN is a required field" if anc.domain.empty?
|
100
|
+
|
101
|
+
# announce
|
71
102
|
|
72
|
-
def run
|
73
103
|
message = build_message
|
74
104
|
|
75
105
|
puts "\n#{message}\n\n"
|
@@ -78,27 +108,27 @@ class Reap::Announce < Reap::Task
|
|
78
108
|
|
79
109
|
unless inp.downcase == 'y'
|
80
110
|
puts "Reap announce task canceled."
|
81
|
-
|
111
|
+
return nil
|
82
112
|
end
|
83
113
|
|
84
114
|
# ask for password
|
85
|
-
print "Password for #{
|
115
|
+
print "Password for #{anc.account}: "
|
86
116
|
until passwd = $stdin.gets.strip ; sleep 1 ; end
|
87
117
|
|
88
118
|
mail = %Q{
|
89
|
-
|From: #{
|
90
|
-
|To: #{
|
91
|
-
|Subject: #{
|
119
|
+
|From: #{anc.from}
|
120
|
+
|To: #{anc.address}
|
121
|
+
|Subject: #{anc.subject}
|
92
122
|
|
|
93
123
|
|#{message}
|
94
124
|
}.margin
|
95
125
|
begin
|
96
126
|
# --- Send using SMTP object and an adaptor
|
97
|
-
Net::SMTP.enable_tls if Net::SMTP.respond_to?(:enable_tls) and
|
98
|
-
Net::SMTP.start(
|
99
|
-
s.send_message mail,
|
127
|
+
Net::SMTP.enable_tls if Net::SMTP.respond_to?(:enable_tls) and anc.secure # == :tls
|
128
|
+
Net::SMTP.start(anc.server, anc.port, anc.domain, anc.account, passwd, anc.type) do |s|
|
129
|
+
s.send_message mail, anc.from, anc.address
|
100
130
|
end
|
101
|
-
puts "Email sent successfully to #{
|
131
|
+
puts "Email sent successfully to #{anc.address}."
|
102
132
|
rescue => e
|
103
133
|
puts "Email delivery failed."
|
104
134
|
puts e
|
@@ -115,55 +145,55 @@ private
|
|
115
145
|
|
|
116
146
|
|A N N O U N C I N G
|
117
147
|
|
|
118
|
-
|#{
|
148
|
+
|#{anc.title}, v#{anc.version}
|
119
149
|
|
|
120
|
-
|#{
|
150
|
+
|#{anc.summary}
|
121
151
|
|
|
122
|
-
|#{
|
152
|
+
|#{anc.homepage}
|
123
153
|
}.margin.align_center(66)
|
124
154
|
|
125
155
|
# abstract
|
126
156
|
abstract = ''
|
127
|
-
if
|
157
|
+
if anc.description
|
128
158
|
abstract << "\n\n"
|
129
|
-
abstract << "ABSTRACT\n------------->\n\n#{
|
159
|
+
abstract << "ABSTRACT\n------------->\n\n#{anc.description}"
|
130
160
|
abstract << "\n"
|
131
161
|
end
|
132
162
|
|
133
163
|
# more info
|
134
164
|
info = ''
|
135
|
-
unless
|
165
|
+
unless anc.links.empty?
|
136
166
|
info << "\n\n"
|
137
167
|
info << "\nRELATED LINKS\n------------------>\n\n" #.center(67)
|
138
|
-
|
168
|
+
anc.links.each{ |mi| info << "#{mi}" << "\n" } #.center(67) << "\n" }
|
139
169
|
info << "\n"
|
140
170
|
end
|
141
171
|
|
142
172
|
# slogan
|
143
173
|
slogan = ''
|
144
|
-
if
|
174
|
+
if anc.slogan
|
145
175
|
slogan << "\n\n"
|
146
|
-
slogan <<
|
176
|
+
slogan << anc.slogan.center(67)
|
147
177
|
slogan << "\n\n"
|
148
178
|
end
|
149
179
|
|
150
180
|
# memo
|
151
181
|
memo = ''
|
152
|
-
if
|
182
|
+
if anc.memo
|
153
183
|
memo = ''
|
154
184
|
#memo << "\n---\n" #<< ('-' * 72) << "\n"
|
155
185
|
memo << "\nRELEASE MEMO\n----------------->\n\n"
|
156
|
-
memo <<
|
186
|
+
memo << anc.memo.strip.fold(true) #.word_wrap(67)
|
157
187
|
#memo << "\n"
|
158
188
|
end
|
159
189
|
|
160
190
|
# msg file
|
161
191
|
msg = ''
|
162
|
-
if
|
192
|
+
if anc.file and File.file?( anc.file )
|
163
193
|
msg << "\nRELEASE MEMO\n----------------->\n\n"
|
164
194
|
#msg << "\n---\n" #<< ("-" * 68) << "\n"
|
165
|
-
#msg << "(from #{
|
166
|
-
mg = File.read(
|
195
|
+
#msg << "(from #{anc.file})\n\n"
|
196
|
+
mg = File.read( anc.file )
|
167
197
|
msg << mg.strip.fold(true) #.word_wrap(67)
|
168
198
|
end
|
169
199
|
|