proutils 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +17 -0
- data/COPYING +674 -0
- data/README +78 -0
- data/RELEASE +7 -0
- data/TODO +4 -0
- data/bin/icli +278 -0
- data/bin/mint +139 -0
- data/bin/rtar +69 -0
- data/bin/xact +121 -0
- data/data/mint/cherry/_scaffold.rb +4 -0
- data/data/mint/roll/name-1.0.0.roll +26 -0
- data/data/mint/ruby/README +17 -0
- data/data/mint/ruby/README.first +10 -0
- data/data/mint/ruby/README.license +403 -0
- data/data/mint/ruby/meta/MANIFEST +2 -0
- data/data/mint/ruby/meta/name-1.0.0.roll +26 -0
- data/data/mint/ruby/script/finish_scaffold +8 -0
- data/data/mint/ruby/script/setup +1600 -0
- data/data/mint/website/css/clean.css +5 -0
- data/data/mint/website/index.html +0 -0
- data/demo/demo_rtar/Lorem_ipsum.txt +233 -0
- data/demo/demo_rtar/lib/demo_rock/tryme.rb +2 -0
- data/demo/demo_rtar/meta/data +6 -0
- data/demo/demo_rtar/web/index.html +13 -0
- data/demo/demo_rtar/web/rocklobster.jpg +0 -0
- data/demo/mint/loremipsum.txt +9 -0
- data/demo/mint/tryme.rb +33 -0
- data/lib/proutils/icli/abstract_host.rb +71 -0
- data/lib/proutils/icli/gforge.rb +668 -0
- data/lib/proutils/icli/rubyforge.rb +26 -0
- data/lib/proutils/icli/tool.rb +128 -0
- data/lib/proutils/icli/uploadutils.rb +410 -0
- data/lib/proutils/mint/copier.rb +324 -0
- data/lib/proutils/mint/fileutils.rb +47 -0
- data/lib/proutils/mint/help.txt +0 -0
- data/lib/proutils/rtar/rtar.rb +309 -0
- data/lib/proutils/rtar/vendor/archive/tar/minitar/command.rb +814 -0
- data/lib/proutils/rtar/vendor/archive/tar/minitar.rb +979 -0
- data/lib/proutils/xact/extract.rb +211 -0
- data/lib/proutils/xact/save.rb +151 -0
- data/meta/MANIFEST +100 -0
- data/meta/config.yaml +12 -0
- data/meta/icli.yaml +16 -0
- data/meta/project.yaml +27 -0
- data/meta/proutils.roll +3 -0
- data/test/fixture.rb +6 -0
- data/test/lib/test_exacto.rb +54 -0
- data/work/ANN +14 -0
- data/work/icli/icli +223 -0
- data/work/icli/rake.rb +82 -0
- data/work/icli/utils/consoleutils.rb +67 -0
- data/work/icli/utils/emailutils.rb +85 -0
- data/work/icli/utils/fileutils.rb +47 -0
- data/work/mint/command-old.rb +48 -0
- data/work/mint/lazyfile.rb +97 -0
- data/work/mint/part.rb +316 -0
- data/work/mint/scaffold-old.rb +420 -0
- data/work/rtar/index.html +68 -0
- data/work/rtar/old-index.html +63 -0
- data/work/xact/xact-ginsu +5 -0
- data/work/xact/xact-ruby.rb +155 -0
- metadata +178 -0
data/README
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
= ProUtils
|
2
|
+
|
3
|
+
ProUtils is a collect of handy command line tools. You can think of it as
|
4
|
+
supplements to the ubinqutous GNU CoreUtils.
|
5
|
+
|
6
|
+
ProUtils consits of the following tools:
|
7
|
+
|
8
|
+
=== Mint
|
9
|
+
|
10
|
+
Mint is a managed copy tool. It makes it easy to recreate folder layouts,
|
11
|
+
project scaffolding, and of course update files.
|
12
|
+
|
13
|
+
Mint is managed copy tool. It's especailly useful for managing
|
14
|
+
project scaffolding, and comes with some pre-built Ruby project
|
15
|
+
templates. This is an early version, but it's based on some older code
|
16
|
+
that worked well. Future plans will add plugin support for dynamic
|
17
|
+
scaffolds.
|
18
|
+
|
19
|
+
|
20
|
+
=== Xact
|
21
|
+
|
22
|
+
Script Ginsu! Xact (formerly Exacto) is a text extraction utility.
|
23
|
+
It is useful for extractng any identifiable section of
|
24
|
+
of text. It is also very useful for running comment-embedded
|
25
|
+
tests, examples and/or benchmarks from source scripts.
|
26
|
+
|
27
|
+
|
28
|
+
=== rTar
|
29
|
+
|
30
|
+
rTar is a package format based on tar. But it follows a structural pattern
|
31
|
+
of recursion to allow efficent cherry picking of data from within an archive.
|
32
|
+
|
33
|
+
|
34
|
+
=== iCli
|
35
|
+
|
36
|
+
Command the Web! iCli provides a command-line Interface to World Wide Web.
|
37
|
+
In particular, it makes it easy to interface with gforge-based development
|
38
|
+
sites like Rubyforge.
|
39
|
+
|
40
|
+
Underthe hood, iCli is a web-scrapping toolkit base on the
|
41
|
+
HttpClient library.
|
42
|
+
|
43
|
+
=== How does it differ from the Seattle.rb's 'rubyforge'?
|
44
|
+
|
45
|
+
* It is designed to be extensible to support other sites.
|
46
|
+
* It does not store project data in hidden home directory.
|
47
|
+
Instead it looks up all needed information on the fly.
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
== Status
|
52
|
+
|
53
|
+
This is an early release. Basic functionality is in place. Better documentation
|
54
|
+
and command line help will be available in coming releases.
|
55
|
+
|
56
|
+
|
57
|
+
== Install
|
58
|
+
|
59
|
+
$ gem install proutils
|
60
|
+
|
61
|
+
or to install manually
|
62
|
+
|
63
|
+
$ tar -xzf protuils-0.2.0.tgz
|
64
|
+
$ cd proutils-0.2.0
|
65
|
+
$ sudo task/setup
|
66
|
+
|
67
|
+
|
68
|
+
== Acknowlegments
|
69
|
+
|
70
|
+
iCli is based on Ara T. Howards' original rubyforge.rb script.
|
71
|
+
|
72
|
+
|
73
|
+
== License
|
74
|
+
|
75
|
+
ProUtils Copyright (c) 2006, 2007 Thomas Sawyer, Psi T. Corp.
|
76
|
+
|
77
|
+
ProUtils is ditributed under the terms of the GPL3 license.
|
78
|
+
|
data/RELEASE
ADDED
data/bin/icli
ADDED
@@ -0,0 +1,278 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'facets/arguments'
|
5
|
+
require 'proutils/icli/abstract_host'
|
6
|
+
|
7
|
+
module ICli
|
8
|
+
|
9
|
+
class Command
|
10
|
+
|
11
|
+
def self.start
|
12
|
+
new.run
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize()
|
16
|
+
@command_arguments, @command_options = *Console::Arguments.parameters
|
17
|
+
|
18
|
+
@config_options = file_options(@command_options['use'])
|
19
|
+
|
20
|
+
parse_general_options(@command_options)
|
21
|
+
|
22
|
+
@host = @command_arguments.shift
|
23
|
+
@command = @command_arguments.shift
|
24
|
+
|
25
|
+
@host_options = @config_options[@host].merge(:dryrun=>@dryrun, :trace=>@trace)
|
26
|
+
@command_options = @command_options.merge(@config_options[@host][@command] || {})
|
27
|
+
end
|
28
|
+
|
29
|
+
def run
|
30
|
+
host = host_class(@host).new(@host_options)
|
31
|
+
if host.commands.include?(@command)
|
32
|
+
host.send(@command, @command_options) # TODO Add command_arguments?
|
33
|
+
else
|
34
|
+
puts "Unknown command -- #{@command}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def parse_general_options(options)
|
41
|
+
@dryrun = %w{dryrun dry-run noharm}.any?{ |o| options.delete(o) }
|
42
|
+
@trace = %w{trace}.any?{ |o| options.delete(o) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def dryrun? ; @dryrun ; end
|
46
|
+
def trace? ; @trace ; end
|
47
|
+
|
48
|
+
# Print help usage to stadout.
|
49
|
+
def help
|
50
|
+
puts DATA.read
|
51
|
+
end
|
52
|
+
|
53
|
+
#
|
54
|
+
def host_class(name)
|
55
|
+
ICli.factory(name)
|
56
|
+
end
|
57
|
+
|
58
|
+
def file_options(fname=nil)
|
59
|
+
file = config_file(fname)
|
60
|
+
if file
|
61
|
+
YAML::load(File.open(file))
|
62
|
+
elsif fname
|
63
|
+
raise ArgumentError, "Parameter file not found -- #{fname}" unless file
|
64
|
+
else
|
65
|
+
{}
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def config_file(fname=nil)
|
70
|
+
if fname
|
71
|
+
Dir.glob("#{fname}{.yaml,.yml,}").first
|
72
|
+
else
|
73
|
+
Dir.glob("{meta/icli,.icli}{.yaml,.yml,}").first
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# #
|
78
|
+
#
|
79
|
+
# def config_load(section=nil)
|
80
|
+
# if file = config_file
|
81
|
+
# options = YAML::load(File.open(file))
|
82
|
+
# else
|
83
|
+
# options = {}
|
84
|
+
# end
|
85
|
+
# # merge in the selected section
|
86
|
+
# if section
|
87
|
+
# options.merge!(options[section.to_s] || {})
|
88
|
+
# end
|
89
|
+
# # remove subsections (should we bother?)
|
90
|
+
# options = options.delete_if{ |k,v| Hash === v }
|
91
|
+
# # return
|
92
|
+
# return options
|
93
|
+
# end
|
94
|
+
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
ICli::Command.start
|
100
|
+
|
101
|
+
=begin
|
102
|
+
|
103
|
+
class CommonOptions < Console::Command::Options
|
104
|
+
attr_accessor :host,
|
105
|
+
:domain,
|
106
|
+
:username
|
107
|
+
end
|
108
|
+
|
109
|
+
class ReleaseOptions < CommonOptions
|
110
|
+
attr_accessor :store, # Package folder.
|
111
|
+
:files, # Files to release.
|
112
|
+
:package, # Package name.
|
113
|
+
:version, # Package version.
|
114
|
+
:release, # Release name. Defaults to +version+.
|
115
|
+
:date, # Release Date. Defaults to +Time.now+.
|
116
|
+
:processor, # Processor type. Deafults to +Any+.
|
117
|
+
:changelog, # ChangeLog file.
|
118
|
+
:notelog, # Notes file.
|
119
|
+
:is_public # Is this release public?
|
120
|
+
end
|
121
|
+
|
122
|
+
class PublishOptions < CommonOptions
|
123
|
+
attr_accessor :root # directory with website files
|
124
|
+
end
|
125
|
+
|
126
|
+
class AnnounceOptions < CommonOptions
|
127
|
+
attr_accessor :subject,
|
128
|
+
:message
|
129
|
+
end
|
130
|
+
|
131
|
+
#
|
132
|
+
|
133
|
+
options :publish, PublishOptions
|
134
|
+
options :release, ReleaseOptions
|
135
|
+
options :announce, AnnounceOptions
|
136
|
+
options :touch, CommonOptions
|
137
|
+
|
138
|
+
# Publish
|
139
|
+
#
|
140
|
+
# root directory with website files
|
141
|
+
|
142
|
+
def publish
|
143
|
+
options = config_load('publish')
|
144
|
+
|
145
|
+
# merge in any commandline options
|
146
|
+
options.merge!(PublishOptions.parse.to_h)
|
147
|
+
|
148
|
+
name = options['host'] || options['domain']
|
149
|
+
host = host_class(name).new(options)
|
150
|
+
|
151
|
+
host.publish(options)
|
152
|
+
end
|
153
|
+
|
154
|
+
# Release options. This is a hash of options:
|
155
|
+
#
|
156
|
+
# store Location of packages.
|
157
|
+
# version Package version.
|
158
|
+
# files Files to release. (defaults to source/package-version.*)
|
159
|
+
# package Package name (defaults to +project+).
|
160
|
+
# release Release name (defaults to +version+).
|
161
|
+
# date Release Date (defaults to to +Time.now+).
|
162
|
+
# processor Processor type (deafults to +Any+).
|
163
|
+
# changelog ChangeLog file.
|
164
|
+
# notelog Notes file.
|
165
|
+
# is_public Is this release public?
|
166
|
+
#
|
167
|
+
|
168
|
+
def release
|
169
|
+
options = config_load('release')
|
170
|
+
|
171
|
+
# merge in any commandline options
|
172
|
+
options.merge!(@options.to_h) #(ReleaseOptions.parse.to_h)
|
173
|
+
|
174
|
+
#options = {}
|
175
|
+
#options.update info.gather('rubyforge')
|
176
|
+
#options.update info.gather('release')
|
177
|
+
#options.update info.select('version', 'changelog', 'notelog', 'processor'=>'arch')
|
178
|
+
#options['files'] = Dir[File.join(info.package_store,"*#{options['version']}.*")]
|
179
|
+
|
180
|
+
store = options['store']
|
181
|
+
name = options['package']
|
182
|
+
vers = options['version']
|
183
|
+
|
184
|
+
options['files'] ||= Dir[File.join(store,"#{name}-#{ver}.*")]
|
185
|
+
|
186
|
+
name = options['host'] || options['domain']
|
187
|
+
host = host_class(name).new(options)
|
188
|
+
|
189
|
+
host.release(options)
|
190
|
+
end
|
191
|
+
|
192
|
+
# Annouce to news.
|
193
|
+
|
194
|
+
def announce
|
195
|
+
options = config_load('announce')
|
196
|
+
|
197
|
+
# merge in any commandline options
|
198
|
+
options.merge!(AnnounceOptions.parse.to_h)
|
199
|
+
|
200
|
+
name = options['host'] || options['domain']
|
201
|
+
host = host_class(name).new(options)
|
202
|
+
|
203
|
+
host.announce(options)
|
204
|
+
end
|
205
|
+
|
206
|
+
# Test connection. Simply login and logout.
|
207
|
+
|
208
|
+
def touch
|
209
|
+
options = config_load
|
210
|
+
|
211
|
+
# merge in any commandline options
|
212
|
+
options.merge!(@options.to_h) #(CommonOptions.parse.to_h)
|
213
|
+
|
214
|
+
name = options['host'] || options['domain']
|
215
|
+
host = host_class(name).new(options)
|
216
|
+
|
217
|
+
host.touch
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
# Default action (no subcommand)
|
222
|
+
|
223
|
+
alias_method :default, :help
|
224
|
+
|
225
|
+
|
226
|
+
# def start
|
227
|
+
# config = File.file?(CONFIG_FILE) ? YAML::load(f) : {}
|
228
|
+
# section = (@args[0] || 'all').to_s.downcase
|
229
|
+
#
|
230
|
+
# if section == 'all'
|
231
|
+
# config.each do |name, settings|
|
232
|
+
# settings.update(@keys)
|
233
|
+
# press(settings)
|
234
|
+
# end
|
235
|
+
# else
|
236
|
+
# settings = config[section]
|
237
|
+
# settings.update(@keys)
|
238
|
+
# press(settings)
|
239
|
+
# end
|
240
|
+
# end*/
|
241
|
+
=end
|
242
|
+
|
243
|
+
|
244
|
+
__END__
|
245
|
+
|
246
|
+
Forge v0.2.0
|
247
|
+
|
248
|
+
Usage: forge <command> <options>
|
249
|
+
|
250
|
+
Commands:
|
251
|
+
|
252
|
+
touch
|
253
|
+
Test connection. This simply attempts to login and logout.
|
254
|
+
|
255
|
+
release
|
256
|
+
Release a package.
|
257
|
+
|
258
|
+
announce
|
259
|
+
Make an announcement via news.
|
260
|
+
|
261
|
+
publish
|
262
|
+
Publish website files.
|
263
|
+
|
264
|
+
Common Options:
|
265
|
+
|
266
|
+
--host
|
267
|
+
The host name (eg. rubyforge). If LaForge supports the
|
268
|
+
host name then a specialized adatapter will be used.
|
269
|
+
|
270
|
+
--domain
|
271
|
+
The domain name of the host. If the host is not build in
|
272
|
+
you can supply the domain name instead of the host name.
|
273
|
+
The generic GForge adapter will be used.
|
274
|
+
|
275
|
+
--username
|
276
|
+
Your username on the host.
|
277
|
+
|
278
|
+
For more information, http://proutils.rubyforge.org.
|
data/bin/mint
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'getoptlong'
|
4
|
+
require 'proutils/mint/copier'
|
5
|
+
|
6
|
+
module Mint
|
7
|
+
|
8
|
+
# Scaffolding Console Command
|
9
|
+
|
10
|
+
class Command
|
11
|
+
|
12
|
+
# Start command.
|
13
|
+
|
14
|
+
def self.start
|
15
|
+
new.start
|
16
|
+
end
|
17
|
+
|
18
|
+
# New scaffolding command.
|
19
|
+
|
20
|
+
def initialize
|
21
|
+
@options = {}
|
22
|
+
@cmd = 'copy' # default command
|
23
|
+
|
24
|
+
opts = GetoptLong.new(
|
25
|
+
['--source', '-s', GetoptLong::NO_ARGUMENT],
|
26
|
+
['--dryrun', '--noharm', '-n', GetoptLong::NO_ARGUMENT],
|
27
|
+
['--skip', GetoptLong::NO_ARGUMENT],
|
28
|
+
['--replace', GetoptLong::NO_ARGUMENT],
|
29
|
+
['--help', '-h', GetoptLong::NO_ARGUMENT]
|
30
|
+
)
|
31
|
+
|
32
|
+
opts.each do |k,v|
|
33
|
+
case k
|
34
|
+
when '--dryrun'
|
35
|
+
@options[:dryrun] = true
|
36
|
+
when '--safe'
|
37
|
+
@options[:skip] = true
|
38
|
+
when '--replace'
|
39
|
+
@options[:force] = true
|
40
|
+
when '--help'
|
41
|
+
@cmd = 'help'
|
42
|
+
when '--source'
|
43
|
+
@options[:special] = true
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
# Start execution.
|
50
|
+
|
51
|
+
def start
|
52
|
+
send(@cmd)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Copy scaffolding.
|
56
|
+
|
57
|
+
def copy
|
58
|
+
#if @source
|
59
|
+
# src = Mint.lookup(ARGV[0])
|
60
|
+
# dst = ARGV[1] || '.'
|
61
|
+
#else
|
62
|
+
src = ARGV[0]
|
63
|
+
dst = ARGV[1] || '.'
|
64
|
+
#end
|
65
|
+
|
66
|
+
if src
|
67
|
+
Copier.new(src, dst, @options).copy
|
68
|
+
else
|
69
|
+
puts "Unrecognized source, '#{src}'."
|
70
|
+
exit 0
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Get help.
|
75
|
+
|
76
|
+
def help
|
77
|
+
$stdout << DATA.read
|
78
|
+
exit -1
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
|
83
|
+
def __DIR__
|
84
|
+
File.dirname(__FILE__)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
Mint::Command.start
|
91
|
+
|
92
|
+
|
93
|
+
__END__
|
94
|
+
Mint v0.2.0
|
95
|
+
Usage: mint [-s] <source-path> [destination]
|
96
|
+
|
97
|
+
Opitons:
|
98
|
+
|
99
|
+
-s --source
|
100
|
+
Source path starts in mint paths.
|
101
|
+
|
102
|
+
--skip
|
103
|
+
Skip all duplicates.
|
104
|
+
|
105
|
+
--replace
|
106
|
+
Replace all duplicates.
|
107
|
+
|
108
|
+
--svn (NOT IMPLEMTENTED YET)
|
109
|
+
Create subversion branches/ tags/ trunk/
|
110
|
+
directories at the top level.
|
111
|
+
|
112
|
+
-n --noharm --dryrun
|
113
|
+
Only pretend to create files.
|
114
|
+
|
115
|
+
--help
|
116
|
+
Display's this help information.
|
117
|
+
|
118
|
+
Built-in Sources:
|
119
|
+
|
120
|
+
website Start a website.
|
121
|
+
|
122
|
+
ruby Create a standard ruby project layout.
|
123
|
+
|
124
|
+
Examples:
|
125
|
+
|
126
|
+
To copy a directory:
|
127
|
+
$ mint ~/pictures ~/copy_of_pictures/
|
128
|
+
|
129
|
+
To copy a selection of files:
|
130
|
+
$ mint ~/pictures/*.jpg ~/copy_of_pictures/
|
131
|
+
|
132
|
+
To scaffold a new ruby project in the current directory.
|
133
|
+
$ mint -s ruby .
|
134
|
+
|
135
|
+
To scaffold a new website to a new directory.
|
136
|
+
$ mint -s website mysite/
|
137
|
+
|
138
|
+
To copy a single file, for instance:
|
139
|
+
$ mint -s ruby/meta/name-1.0.0.roll meta/
|
data/bin/rtar
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
|
2
|
+
require 'facet/command'
|
3
|
+
require 'proutils/rtar'
|
4
|
+
|
5
|
+
# Rock command line interface.
|
6
|
+
#
|
7
|
+
class Rock::Command < Console::Command
|
8
|
+
|
9
|
+
def __pack( file )
|
10
|
+
@mode, @file = :pack, file
|
11
|
+
end
|
12
|
+
|
13
|
+
def __unpack( file )
|
14
|
+
@mode, @file = :unpack, file
|
15
|
+
end
|
16
|
+
alias_method :_x, :__unpack
|
17
|
+
|
18
|
+
def __list( file )
|
19
|
+
@mode, @file = :list, file
|
20
|
+
end
|
21
|
+
|
22
|
+
def __verbose
|
23
|
+
$VERBOSE = true
|
24
|
+
end
|
25
|
+
alias_method :_v, :__verbose
|
26
|
+
|
27
|
+
def __force
|
28
|
+
$FORCE = true
|
29
|
+
end
|
30
|
+
alias_method :_f, :__force
|
31
|
+
|
32
|
+
def __help
|
33
|
+
@mode = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
# main routine
|
37
|
+
|
38
|
+
def default
|
39
|
+
$VERBOSE ||= false
|
40
|
+
$FORCE ||= false
|
41
|
+
|
42
|
+
case @mode
|
43
|
+
when :pack
|
44
|
+
rpkg = Rock::Package.new
|
45
|
+
rpkg.pack( @file )
|
46
|
+
when :unpack
|
47
|
+
rpkg = Rock::Package.new
|
48
|
+
rpkg.unpack( @file )
|
49
|
+
when :list
|
50
|
+
rpkg = Rock::Package.new
|
51
|
+
rpkg.list( @file )
|
52
|
+
else
|
53
|
+
puts HELP
|
54
|
+
end
|
55
|
+
|
56
|
+
if nil.status?
|
57
|
+
puts Rock::Errors.__send__(*nil.status)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
VERSION = '0.4.0'
|
62
|
+
|
63
|
+
HELP = <<-END
|
64
|
+
rock v#{VERSION}
|
65
|
+
END
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
Rock::Command.execute
|
data/bin/xact
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
#! /usr/bin/ruby
|
2
|
+
|
3
|
+
require 'getoptlong'
|
4
|
+
require 'proutils/xact/extract'
|
5
|
+
|
6
|
+
module Xact
|
7
|
+
|
8
|
+
#
|
9
|
+
# Extract commandline interface.
|
10
|
+
#
|
11
|
+
|
12
|
+
class Command
|
13
|
+
|
14
|
+
def self.run
|
15
|
+
new.run
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
|
20
|
+
attr_reader :file, :start, :stop, :repeat, :style
|
21
|
+
|
22
|
+
#
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
opts = GetoptLong.new(
|
26
|
+
[ '--help' , GetoptLong::NO_ARGUMENT ],
|
27
|
+
[ '--repeat', '-r' , GetoptLong::NO_ARGUMENT ],
|
28
|
+
[ '--unxml', '-x' , GetoptLong::NO_ARGUMENT ],
|
29
|
+
[ '--style', '-s' , GetoptLong::REQUIRED_ARGUMENT ]
|
30
|
+
)
|
31
|
+
|
32
|
+
repeat = nil
|
33
|
+
style = nil
|
34
|
+
unxml = nil
|
35
|
+
|
36
|
+
opts.each do |opt, arg|
|
37
|
+
case opt
|
38
|
+
when '--help'
|
39
|
+
help
|
40
|
+
exit 0
|
41
|
+
when '--repeat'
|
42
|
+
repeat = true
|
43
|
+
when '--style'
|
44
|
+
style = arg
|
45
|
+
when '--unxml'
|
46
|
+
unxml = true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
file = ARGV.shift
|
51
|
+
start = ARGV.shift
|
52
|
+
stop = ARGV.shift
|
53
|
+
|
54
|
+
# if i = argv.index('-h')
|
55
|
+
# handle = argv[i+1].strip
|
56
|
+
# argv[i+1,1] = nil
|
57
|
+
# argv.delete('-h')
|
58
|
+
# else
|
59
|
+
# handle = 'test'
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# file = argv.pop
|
63
|
+
|
64
|
+
unless file && File.file?(file)
|
65
|
+
puts "No such file -- '#{file}'."
|
66
|
+
exit 0
|
67
|
+
end
|
68
|
+
|
69
|
+
@file = file
|
70
|
+
@start = start
|
71
|
+
@stop = stop
|
72
|
+
@repeat = repeat
|
73
|
+
@style = style
|
74
|
+
@unxml = unxml
|
75
|
+
end
|
76
|
+
|
77
|
+
#
|
78
|
+
|
79
|
+
def extractor
|
80
|
+
@extractor ||= Extractor.new(@file, :unxml => @unxml)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Extract and display.
|
84
|
+
|
85
|
+
def run
|
86
|
+
r = case style
|
87
|
+
when 'ruby'
|
88
|
+
extractor.extract_ruby_block_comment(start||'test')
|
89
|
+
when 'rubymethod'
|
90
|
+
extractor.extract_ruby_method_comment(start)
|
91
|
+
else
|
92
|
+
if stop
|
93
|
+
extractor.extract_block(start, stop)
|
94
|
+
else
|
95
|
+
extractor.extract_pattern(start)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
text, offset = *r
|
99
|
+
$stdout << text
|
100
|
+
end
|
101
|
+
|
102
|
+
# # Extract the code.
|
103
|
+
#
|
104
|
+
# def exact
|
105
|
+
# return *@exacto.extract_block(handle)
|
106
|
+
# end
|
107
|
+
|
108
|
+
# Show help.
|
109
|
+
|
110
|
+
def help
|
111
|
+
puts "USAGE: xact [options...] <file> [pattern] [end-pattern]"
|
112
|
+
puts " --help This help ionformation."
|
113
|
+
puts " -r --repeat Repeat for every occurance."
|
114
|
+
puts " --style Use built-in style."
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
Xact::Command.run
|