reap 4.3.4 → 4.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|