main 3.0.3 → 4.0.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/README +8 -0
- data/README.erb +8 -0
- data/lib/main.rb +22 -1
- data/lib/main/factories.rb +5 -3
- data/lib/main/program/class_methods.rb +9 -8
- data/lib/main/program/instance_methods.rb +35 -21
- data/main.gemspec +1 -1
- data/test/main.rb +6 -2
- metadata +2 -2
data/README
CHANGED
@@ -457,6 +457,14 @@ DOCS
|
|
457
457
|
API section below
|
458
458
|
|
459
459
|
HISTORY
|
460
|
+
4.0.0
|
461
|
+
- avoid duping ios. new methods Main.push_ios! and Main.pop_ios! are
|
462
|
+
utilized for testing. this was done to make it simple to wrap
|
463
|
+
daemon/servolux programs around main, althought not strictly required.
|
464
|
+
not the version bump - there is not reason to expect existing main
|
465
|
+
programs to break, but it *is* and interface change which requires a major
|
466
|
+
version bump.
|
467
|
+
|
460
468
|
3.0.0
|
461
469
|
- major refactor to support modes via module/extend vs. subclassing.
|
462
470
|
MIGHT NOT be backward compatible, though no known issues thus far.
|
data/README.erb
CHANGED
@@ -186,6 +186,14 @@ DOCS
|
|
186
186
|
API section below
|
187
187
|
|
188
188
|
HISTORY
|
189
|
+
4.0.0
|
190
|
+
- avoid duping ios. new methods Main.push_ios! and Main.pop_ios! are
|
191
|
+
utilized for testing. this was done to make it simple to wrap
|
192
|
+
daemon/servolux programs around main, althought not strictly required.
|
193
|
+
not the version bump - there is not reason to expect existing main
|
194
|
+
programs to break, but it *is* and interface change which requires a major
|
195
|
+
version bump.
|
196
|
+
|
189
197
|
3.0.0
|
190
198
|
- major refactor to support modes via module/extend vs. subclassing.
|
191
199
|
MIGHT NOT be backward compatible, though no known issues thus far.
|
data/lib/main.rb
CHANGED
@@ -2,7 +2,7 @@ module Main
|
|
2
2
|
#
|
3
3
|
# top level constants
|
4
4
|
#
|
5
|
-
Main::VERSION = '
|
5
|
+
Main::VERSION = '4.0.0' unless
|
6
6
|
defined? Main::VERSION
|
7
7
|
def self.version() Main::VERSION end
|
8
8
|
|
@@ -44,4 +44,25 @@ module Main
|
|
44
44
|
require libdir + 'mode'
|
45
45
|
require libdir + 'program'
|
46
46
|
require libdir + 'factories'
|
47
|
+
|
48
|
+
class << Main
|
49
|
+
def push_ios!
|
50
|
+
@ios ||= []
|
51
|
+
@ios.push({
|
52
|
+
:STDIN => STDIN.dup, :STDOUT => STDOUT.dup, :STDERR => STDERR.dup
|
53
|
+
})
|
54
|
+
end
|
55
|
+
|
56
|
+
def pop_ios!
|
57
|
+
@ios ||= []
|
58
|
+
(@ios.pop||{}).each do |const, dup|
|
59
|
+
dst = eval(const.to_s)
|
60
|
+
begin
|
61
|
+
dst.reopen(dup)
|
62
|
+
rescue
|
63
|
+
::Object.const_set(const, dup)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
47
68
|
end
|
data/lib/main/factories.rb
CHANGED
@@ -8,11 +8,14 @@ module Main
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def Main.new(*args, &block)
|
11
|
-
factory(&block).build(*args)
|
11
|
+
main_class = factory(&block).build(*args)
|
12
|
+
main_class.new()
|
12
13
|
end
|
13
14
|
|
14
15
|
def Main.run(*args, &block)
|
15
|
-
|
16
|
+
main_class = factory(&block).build(*args)
|
17
|
+
main = main_class.new()
|
18
|
+
main.run()
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
@@ -21,6 +24,5 @@ private
|
|
21
24
|
def Main(*args, &block)
|
22
25
|
Main.run(*args, &block)
|
23
26
|
end
|
24
|
-
|
25
27
|
alias_method 'main', 'Main'
|
26
28
|
end
|
@@ -48,24 +48,25 @@ module Main
|
|
48
48
|
opts = (args.shift || {}).to_hash.dup
|
49
49
|
|
50
50
|
factory = self
|
51
|
+
|
51
52
|
program = Class.new(Program)
|
52
|
-
program.evaluate(&factory)
|
53
53
|
|
54
|
-
program.
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
program.opts = opts
|
54
|
+
program.factory = factory
|
55
|
+
program.argv = argv
|
56
|
+
program.env = env
|
57
|
+
program.opts = opts
|
59
58
|
|
59
|
+
program.module_eval(&factory)
|
60
|
+
|
61
|
+
program.module_eval do
|
60
62
|
dynamically_extend_via_commandline_modes!
|
61
63
|
program.set_default_options!
|
62
|
-
|
63
64
|
define_method(:run, &block) if block
|
64
|
-
|
65
65
|
wrap_run!
|
66
66
|
end
|
67
67
|
program
|
68
68
|
end
|
69
|
+
|
69
70
|
end
|
70
71
|
|
71
72
|
def new()
|
@@ -41,7 +41,6 @@ module Main
|
|
41
41
|
def before_initialize() :hook end
|
42
42
|
def main_initialize()
|
43
43
|
setup_finalizers
|
44
|
-
setup_io_restoration
|
45
44
|
setup_io_redirection
|
46
45
|
setup_logging
|
47
46
|
end
|
@@ -50,13 +49,14 @@ module Main
|
|
50
49
|
def post_initialize() :hook end
|
51
50
|
|
52
51
|
def setup_finalizers
|
53
|
-
@finalizers
|
52
|
+
@finalizers ||= []
|
54
53
|
ObjectSpace.define_finalizer(self) do
|
55
54
|
while((f = finalizers.pop)); f.call; end
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
59
58
|
def finalize
|
59
|
+
@finalizers ||= []
|
60
60
|
while((f = @finalizers.pop)); f.call; end
|
61
61
|
end
|
62
62
|
|
@@ -76,39 +76,43 @@ module Main
|
|
76
76
|
case log
|
77
77
|
when ::Logger, Logger
|
78
78
|
@logger = log
|
79
|
-
when IO, StringIO
|
80
|
-
@logger = Logger.new log
|
81
|
-
@logger.level = logger_level
|
82
79
|
else
|
83
80
|
@logger = Logger.new(*log)
|
84
|
-
@logger.level = logger_level
|
81
|
+
@logger.level = logger_level
|
85
82
|
end
|
86
83
|
end
|
87
84
|
@logger
|
88
85
|
end
|
89
86
|
|
90
87
|
def setup_io_restoration
|
88
|
+
return
|
89
|
+
@finalizers ||= []
|
91
90
|
[STDIN, STDOUT, STDERR].each do |io|
|
92
|
-
dup = io.dup
|
91
|
+
dup = io.dup
|
92
|
+
@finalizers.push(
|
93
|
+
lambda do
|
94
|
+
io.reopen(dup)
|
95
|
+
end
|
96
|
+
)
|
93
97
|
end
|
94
98
|
end
|
95
|
-
|
99
|
+
|
96
100
|
undef_method 'stdin='
|
97
101
|
def stdin= io
|
98
102
|
unless(defined?(@stdin) and (@stdin == io))
|
99
103
|
@stdin =
|
100
|
-
if io.respond_to?
|
104
|
+
if io.respond_to?('read')
|
101
105
|
io
|
102
106
|
else
|
103
|
-
fd = open
|
104
|
-
@finalizers.push
|
107
|
+
fd = open(io.to_s, 'r+')
|
108
|
+
@finalizers.push(lambda{ fd.close })
|
105
109
|
fd
|
106
110
|
end
|
107
111
|
begin
|
108
|
-
STDIN.reopen
|
112
|
+
STDIN.reopen(@stdin)
|
109
113
|
rescue
|
110
114
|
$stdin = @stdin
|
111
|
-
::Object.const_set
|
115
|
+
::Object.const_set('STDIN', @stdin)
|
112
116
|
end
|
113
117
|
end
|
114
118
|
end
|
@@ -117,14 +121,19 @@ module Main
|
|
117
121
|
def stdout= io
|
118
122
|
unless(defined?(@stdout) and (@stdout == io))
|
119
123
|
@stdout =
|
120
|
-
if io.respond_to?
|
124
|
+
if io.respond_to?('write')
|
121
125
|
io
|
122
126
|
else
|
123
|
-
fd = open
|
124
|
-
@finalizers.push
|
127
|
+
fd = open(io.to_s, 'w+')
|
128
|
+
@finalizers.push(lambda{ fd.close })
|
125
129
|
fd
|
126
130
|
end
|
127
|
-
|
131
|
+
begin
|
132
|
+
STDOUT.reopen(@stdout)
|
133
|
+
rescue
|
134
|
+
$stdout = @stdout
|
135
|
+
::Object.const_set('STDOUT', @stdout)
|
136
|
+
end
|
128
137
|
end
|
129
138
|
end
|
130
139
|
|
@@ -132,14 +141,19 @@ module Main
|
|
132
141
|
def stderr= io
|
133
142
|
unless(defined?(@stderr) and (@stderr == io))
|
134
143
|
@stderr =
|
135
|
-
if io.respond_to?
|
144
|
+
if io.respond_to?('write')
|
136
145
|
io
|
137
146
|
else
|
138
|
-
fd = open
|
139
|
-
@finalizers.push
|
147
|
+
fd = open(io.to_s, 'w+')
|
148
|
+
@finalizers.push(lambda{ fd.close })
|
140
149
|
fd
|
141
150
|
end
|
142
|
-
|
151
|
+
begin
|
152
|
+
STDERR.reopen(@stderr)
|
153
|
+
rescue
|
154
|
+
$stderr = @stderr
|
155
|
+
::Object.const_set('STDERR', @stderr)
|
156
|
+
end
|
143
157
|
end
|
144
158
|
end
|
145
159
|
|
data/main.gemspec
CHANGED
data/test/main.rb
CHANGED
@@ -30,6 +30,8 @@ class T < Test::Unit::TestCase
|
|
30
30
|
ENV.clear
|
31
31
|
env.each{|k,v| ENV[k.to_s]=v.to_s}
|
32
32
|
|
33
|
+
Main.push_ios!
|
34
|
+
|
33
35
|
test = self
|
34
36
|
|
35
37
|
factory = Main.factory(&block)
|
@@ -58,6 +60,8 @@ class T < Test::Unit::TestCase
|
|
58
60
|
|
59
61
|
test.status ||= main.exit_status
|
60
62
|
|
63
|
+
Main.pop_ios!
|
64
|
+
|
61
65
|
main
|
62
66
|
end
|
63
67
|
|
@@ -599,8 +603,8 @@ class T < Test::Unit::TestCase
|
|
599
603
|
end
|
600
604
|
}
|
601
605
|
}
|
602
|
-
assert test(?e, sout.path)
|
603
|
-
assert IO.read(sout.path) == "42\n"
|
606
|
+
assert test(?e, sout.path), 'sout exists'
|
607
|
+
assert IO.read(sout.path) == "42\n", 'sout has correct output'
|
604
608
|
end
|
605
609
|
def test_0370
|
606
610
|
m = nil
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: main
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ara T. Howard
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-20 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|