Sutto-perennial 1.0.0.0 → 1.0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/perennial/application.rb +3 -2
- data/lib/perennial.rb +1 -1
- metadata +2 -20
- data/test/delegateable_test.rb +0 -38
- data/test/dispatchable_test.rb +0 -212
- data/test/hookable_test.rb +0 -61
- data/test/loader_test.rb +0 -1
- data/test/loggable_test.rb +0 -38
- data/test/logger_test.rb +0 -59
- data/test/proxy_test.rb +0 -30
- data/test/settings_test.rb +0 -103
- data/test/test_helper.rb +0 -38
- data/vendor/fakefs/LICENSE +0 -20
- data/vendor/fakefs/README.markdown +0 -37
- data/vendor/fakefs/Rakefile +0 -3
- data/vendor/fakefs/lib/fakefs.rb +0 -448
- data/vendor/fakefs/test/fakefs_test.rb +0 -511
- data/vendor/fakefs/test/verify.rb +0 -27
@@ -74,12 +74,13 @@ module Perennial
|
|
74
74
|
controller_name = controller.to_s.underscore
|
75
75
|
controller = controller.to_sym
|
76
76
|
command_name = controller_name.gsub("_", "-")
|
77
|
+
parent = self
|
77
78
|
add("#{command_name} #{"[PATH]" if !opts[:skip_path]}".strip, description) do |*args|
|
78
79
|
options = args.extract_options!
|
79
80
|
path = File.expand_path(args[0] || ".")
|
80
81
|
Settings.root = path
|
81
82
|
if options.delete(:kill)
|
82
|
-
attempt_showing_banner
|
83
|
+
parent.attempt_showing_banner
|
83
84
|
puts "Attempting to kill processess for #{command_name}"
|
84
85
|
Daemon.kill_all(controller)
|
85
86
|
else
|
@@ -148,7 +149,7 @@ module Perennial
|
|
148
149
|
end
|
149
150
|
application.execute args
|
150
151
|
end
|
151
|
-
|
152
|
+
|
152
153
|
def attempt_showing_banner
|
153
154
|
if banner.present?
|
154
155
|
puts banner
|
data/lib/perennial.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Sutto-perennial
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darcy Laycock
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-19 00:00:00 -07:00
|
13
13
|
default_executable: perennial
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,15 +23,6 @@ extra_rdoc_files: []
|
|
23
23
|
|
24
24
|
files:
|
25
25
|
- bin/perennial
|
26
|
-
- vendor/fakefs
|
27
|
-
- vendor/fakefs/lib
|
28
|
-
- vendor/fakefs/lib/fakefs.rb
|
29
|
-
- vendor/fakefs/LICENSE
|
30
|
-
- vendor/fakefs/Rakefile
|
31
|
-
- vendor/fakefs/README.markdown
|
32
|
-
- vendor/fakefs/test
|
33
|
-
- vendor/fakefs/test/fakefs_test.rb
|
34
|
-
- vendor/fakefs/test/verify.rb
|
35
26
|
- lib/perennial
|
36
27
|
- lib/perennial/application.rb
|
37
28
|
- lib/perennial/argument_parser.rb
|
@@ -58,15 +49,6 @@ files:
|
|
58
49
|
- lib/perennial/reloading.rb
|
59
50
|
- lib/perennial/settings.rb
|
60
51
|
- lib/perennial.rb
|
61
|
-
- test/delegateable_test.rb
|
62
|
-
- test/dispatchable_test.rb
|
63
|
-
- test/hookable_test.rb
|
64
|
-
- test/loader_test.rb
|
65
|
-
- test/loggable_test.rb
|
66
|
-
- test/logger_test.rb
|
67
|
-
- test/proxy_test.rb
|
68
|
-
- test/settings_test.rb
|
69
|
-
- test/test_helper.rb
|
70
52
|
- templates/application.erb
|
71
53
|
- templates/boot.erb
|
72
54
|
- templates/rakefile.erb
|
data/test/delegateable_test.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "test_helper")
|
2
|
-
|
3
|
-
class DelegateableTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
context 'basic delegates' do
|
6
|
-
|
7
|
-
setup do
|
8
|
-
@klass = test_class_for(Perennial::Delegateable)
|
9
|
-
@delegateable = @klass.new
|
10
|
-
end
|
11
|
-
|
12
|
-
should 'define a delegate= method' do
|
13
|
-
assert @delegateable.respond_to?(:delegate=)
|
14
|
-
end
|
15
|
-
|
16
|
-
should 'define a delegate_to method' do
|
17
|
-
assert @delegateable.respond_to?(:delegate_to)
|
18
|
-
end
|
19
|
-
|
20
|
-
should 'let you get the delegate proxy' do
|
21
|
-
@delegateable.delegate_to :awesome
|
22
|
-
assert proxy = @delegateable.delegate
|
23
|
-
assert_nothing_raised { proxy.awesomesauce }
|
24
|
-
assert_nothing_raised { proxy.ninja_party }
|
25
|
-
assert_equal "awesome", proxy.to_s
|
26
|
-
end
|
27
|
-
|
28
|
-
should 'let you get the real target of the delegate' do
|
29
|
-
@delegateable.delegate_to :awesome
|
30
|
-
assert real = @delegateable.real_delegate
|
31
|
-
assert_raises(NoMethodError) { proxy.awesomesauce }
|
32
|
-
assert_raises(NoMethodError) { proxy.ninja_party }
|
33
|
-
assert_equal "awesome", real.to_s
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
data/test/dispatchable_test.rb
DELETED
@@ -1,212 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "test_helper")
|
2
|
-
|
3
|
-
class DispatchableTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
class ExampleDispatcher
|
6
|
-
include Perennial::Dispatchable
|
7
|
-
end
|
8
|
-
|
9
|
-
class ExampleHandlerA
|
10
|
-
|
11
|
-
attr_accessor :messages
|
12
|
-
|
13
|
-
def initialize
|
14
|
-
@messages = []
|
15
|
-
end
|
16
|
-
|
17
|
-
def handle(name, opts)
|
18
|
-
@messages << [name, opts]
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
|
23
|
-
class ExampleHandlerB < ExampleHandlerA; end
|
24
|
-
|
25
|
-
class ExampleHandlerC
|
26
|
-
attr_reader :max_count, :messages, :call_stack
|
27
|
-
def initialize(d)
|
28
|
-
@messages = []
|
29
|
-
@max_count = 0
|
30
|
-
@current_count = 0
|
31
|
-
@dispatcher = d
|
32
|
-
@call_stack = []
|
33
|
-
end
|
34
|
-
|
35
|
-
def handle(name, opts)
|
36
|
-
@call_stack << "start-#{name}"
|
37
|
-
@current_count += 1
|
38
|
-
@messages << name
|
39
|
-
@dispatcher.dispatch(:b) if name == :a
|
40
|
-
@max_count = @current_count if @current_count > @max_count
|
41
|
-
@current_count -= 1
|
42
|
-
@call_stack << "end-#{name}"
|
43
|
-
end
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
class RegisterableHandler
|
48
|
-
|
49
|
-
def registered=(value)
|
50
|
-
@registered = value
|
51
|
-
end
|
52
|
-
|
53
|
-
def registered?
|
54
|
-
@registered ||= false
|
55
|
-
end
|
56
|
-
|
57
|
-
def handle(name, opts = {})
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
context 'marking a class as dispatchable' do
|
63
|
-
|
64
|
-
setup do
|
65
|
-
@dispatcher = ExampleDispatcher.new
|
66
|
-
end
|
67
|
-
|
68
|
-
should 'define a dispatch method' do
|
69
|
-
assert @dispatcher.respond_to?(:dispatch)
|
70
|
-
end
|
71
|
-
|
72
|
-
should 'require atleast a name for dispatch' do
|
73
|
-
assert_equal -2, @dispatcher.method(:dispatch).arity
|
74
|
-
end
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
context 'when registering handlers' do
|
79
|
-
|
80
|
-
setup do
|
81
|
-
@dispatcher = test_class_for(Perennial::Dispatchable)
|
82
|
-
end
|
83
|
-
|
84
|
-
should 'append a handler using register_handler' do
|
85
|
-
assert_equal [], @dispatcher.handlers
|
86
|
-
@dispatcher.register_handler(handler = ExampleHandlerA.new)
|
87
|
-
assert_equal [handler], @dispatcher.handlers
|
88
|
-
end
|
89
|
-
|
90
|
-
should 'batch assign handlers on handlers= using register_handler' do
|
91
|
-
handlers = [ExampleHandlerA.new, ExampleHandlerB.new]
|
92
|
-
assert_equal [], @dispatcher.handlers
|
93
|
-
@dispatcher.handlers = handlers
|
94
|
-
assert_equal handlers, @dispatcher.handlers
|
95
|
-
end
|
96
|
-
|
97
|
-
should 'return all handlers via the handlers class method' do
|
98
|
-
handlers = [ExampleHandlerA.new, ExampleHandlerB.new]
|
99
|
-
@dispatcher.handlers = handlers
|
100
|
-
assert_equal handlers, @dispatcher.handlers
|
101
|
-
end
|
102
|
-
|
103
|
-
should 'make handlers available to myself and all subclasses' do
|
104
|
-
# Set A
|
105
|
-
dispatcher_a = class_via(@dispatcher)
|
106
|
-
dispatcher_a.register_handler(handler_a = ExampleHandlerA.new)
|
107
|
-
# Set B
|
108
|
-
dispatcher_b = class_via(dispatcher_a)
|
109
|
-
dispatcher_b.register_handler(handler_b = ExampleHandlerA.new)
|
110
|
-
# Set C
|
111
|
-
dispatcher_c = class_via(dispatcher_b)
|
112
|
-
dispatcher_c.register_handler(handler_c = ExampleHandlerA.new)
|
113
|
-
# Set D
|
114
|
-
dispatcher_d = class_via(dispatcher_a)
|
115
|
-
dispatcher_d.register_handler(handler_d = ExampleHandlerB.new)
|
116
|
-
# Actual Assertions
|
117
|
-
assert_equal [], @dispatcher.handlers
|
118
|
-
assert_equal [handler_a], dispatcher_a.handlers
|
119
|
-
assert_equal [handler_a, handler_b], dispatcher_b.handlers
|
120
|
-
assert_equal [handler_a, handler_b, handler_c], dispatcher_c.handlers
|
121
|
-
assert_equal [handler_a, handler_d], dispatcher_d.handlers
|
122
|
-
end
|
123
|
-
|
124
|
-
end
|
125
|
-
|
126
|
-
context 'dispatching events' do
|
127
|
-
|
128
|
-
setup do
|
129
|
-
@dispatcher = class_via(ExampleDispatcher).new
|
130
|
-
@handler = ExampleHandlerA.new
|
131
|
-
@dispatcher.class.register_handler @handler
|
132
|
-
end
|
133
|
-
|
134
|
-
should 'attempt to call handle_[event_name] on itself' do
|
135
|
-
mock(@dispatcher).respond_to?(:handle_sample_event) { true }
|
136
|
-
mock(@dispatcher).handle_sample_event(:awesome => true, :sauce => 2)
|
137
|
-
@dispatcher.dispatch :sample_event, :awesome => true, :sauce => 2
|
138
|
-
end
|
139
|
-
|
140
|
-
should 'attempt to call handle_[event_name] on each handler' do
|
141
|
-
mock(@handler).respond_to?(:handle_sample_event) { true }
|
142
|
-
mock(@handler).handle_sample_event(:awesome => true, :sauce => 2)
|
143
|
-
@dispatcher.dispatch :sample_event, :awesome => true, :sauce => 2
|
144
|
-
end
|
145
|
-
|
146
|
-
should 'call handle on each handler if handle_[event_name] isn\'t defined' do
|
147
|
-
mock(@handler).respond_to?(:handle_sample_event) { false }
|
148
|
-
mock(@handler).handle(:sample_event, :awesome => true, :sauce => 2)
|
149
|
-
@dispatcher.dispatch :sample_event, :awesome => true, :sauce => 2
|
150
|
-
end
|
151
|
-
|
152
|
-
should 'let you halt handler processing if you raise HaltHandlerProcessing' do
|
153
|
-
handler_two = ExampleHandlerB.new
|
154
|
-
@dispatcher.class.register_handler handler_two
|
155
|
-
mock(@handler).handle(:sample_event, :awesome => true, :sauce => 2) do
|
156
|
-
raise Perennial::HaltHandlerProcessing
|
157
|
-
end
|
158
|
-
dont_allow(handler_two).handle(:sample_event, :awesome => true, :sauce => 2)
|
159
|
-
@dispatcher.dispatch :sample_event, :awesome => true, :sauce => 2
|
160
|
-
end
|
161
|
-
|
162
|
-
should 'log exceptions when encountered and not crash'
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
context 'dispatching nested events' do
|
167
|
-
|
168
|
-
setup do
|
169
|
-
@dispatcher = class_via(ExampleDispatcher).new
|
170
|
-
@handler = ExampleHandlerC.new(@dispatcher)
|
171
|
-
@dispatcher.class.register_handler @handler
|
172
|
-
@dispatcher.dispatch :a
|
173
|
-
end
|
174
|
-
|
175
|
-
should 'call them in the correct order' do
|
176
|
-
assert_equal [:a, :b], @handler.messages
|
177
|
-
end
|
178
|
-
|
179
|
-
should 'only call 1 dispatch at a time' do
|
180
|
-
assert_equal 1, @handler.max_count
|
181
|
-
end
|
182
|
-
|
183
|
-
should 'finish a before dispatching b' do
|
184
|
-
assert_equal ["start-a", "end-a", "start-b", "end-b"], @handler.call_stack
|
185
|
-
end
|
186
|
-
|
187
|
-
end
|
188
|
-
|
189
|
-
context 'registering handlers' do
|
190
|
-
|
191
|
-
setup do
|
192
|
-
@dispatcher = class_via(ExampleDispatcher).new
|
193
|
-
@handler = class_via(RegisterableHandler).new
|
194
|
-
end
|
195
|
-
|
196
|
-
should 'default to not being registered' do
|
197
|
-
assert !@handler.registered?
|
198
|
-
end
|
199
|
-
|
200
|
-
should 'set registered on register_handler' do
|
201
|
-
@dispatcher.class.register_handler @handler
|
202
|
-
assert @handler.registered?
|
203
|
-
end
|
204
|
-
|
205
|
-
should 'call registered= on the handler' do
|
206
|
-
mock(@handler).registered = true
|
207
|
-
@dispatcher.class.register_handler @handler
|
208
|
-
end
|
209
|
-
|
210
|
-
end
|
211
|
-
|
212
|
-
end
|
data/test/hookable_test.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "test_helper")
|
2
|
-
|
3
|
-
class HookableTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
context 'Hookable Classes' do
|
6
|
-
|
7
|
-
setup do
|
8
|
-
@hookable_class = test_class_for(Perennial::Hookable)
|
9
|
-
end
|
10
|
-
|
11
|
-
should 'let you append hooks via append_hook' do
|
12
|
-
assert_equal [], @hookable_class.hooks_for(:awesome)
|
13
|
-
@hookable_class.append_hook(:awesome) { puts "Hello!" }
|
14
|
-
assert_equal 1, @hookable_class.hooks_for(:awesome).size
|
15
|
-
end
|
16
|
-
|
17
|
-
should 'only append hooks if they aren\'t blank' do
|
18
|
-
@hookable_class.append_hook(:awesome)
|
19
|
-
assert_equal [], @hookable_class.hooks_for(:awesome)
|
20
|
-
end
|
21
|
-
|
22
|
-
should 'let you get an array of hooks' do
|
23
|
-
@hookable_class.append_hook(:awesome) { puts "A" }
|
24
|
-
@hookable_class.append_hook(:awesome) { puts "B" }
|
25
|
-
assert_equal 2, @hookable_class.hooks_for(:awesome).size
|
26
|
-
end
|
27
|
-
|
28
|
-
should 'let you invoke hooks' do
|
29
|
-
items = []
|
30
|
-
@hookable_class.append_hook(:awesome) { items << :a }
|
31
|
-
@hookable_class.append_hook(:awesome) { items << :b }
|
32
|
-
@hookable_class.append_hook(:awesome) { items << :c }
|
33
|
-
@hookable_class.invoke_hooks!(:awesome)
|
34
|
-
assert_equal [:a, :b, :c], items
|
35
|
-
end
|
36
|
-
|
37
|
-
should 'call them in the order they are appended' do
|
38
|
-
items = []
|
39
|
-
@hookable_class.append_hook(:awesome) { items << :a }
|
40
|
-
@hookable_class.append_hook(:awesome) { items << :b }
|
41
|
-
@hookable_class.append_hook(:awesome) { items << :c }
|
42
|
-
@hookable_class.invoke_hooks!(:awesome)
|
43
|
-
[:a, :b, :c].each_with_index do |value, index|
|
44
|
-
assert_equal value, items[index]
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
should 'let you define hook accessors' do
|
49
|
-
assert_equal [], @hookable_class.hooks_for(:awesome)
|
50
|
-
assert !@hookable_class.respond_to?(:awesome)
|
51
|
-
assert !@hookable_class.respond_to?(:sauce)
|
52
|
-
@hookable_class.define_hook :awesome, :sauce
|
53
|
-
assert @hookable_class.respond_to?(:awesome)
|
54
|
-
assert @hookable_class.respond_to?(:sauce)
|
55
|
-
@hookable_class.awesome { puts "A" }
|
56
|
-
assert_equal 1, @hookable_class.hooks_for(:awesome).size
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
data/test/loader_test.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "test_helper")
|
data/test/loggable_test.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "test_helper")
|
2
|
-
|
3
|
-
class LoggableTest < Test::Unit::TestCase
|
4
|
-
|
5
|
-
class ExampleLoggable
|
6
|
-
include Perennial::Loggable
|
7
|
-
end
|
8
|
-
|
9
|
-
context "Defining a class as loggable" do
|
10
|
-
|
11
|
-
setup do
|
12
|
-
@example = ExampleLoggable.new
|
13
|
-
end
|
14
|
-
|
15
|
-
should 'define a logger instance method' do
|
16
|
-
assert @example.respond_to?(:logger)
|
17
|
-
end
|
18
|
-
|
19
|
-
should 'define a logger class method' do
|
20
|
-
assert ExampleLoggable.respond_to?(:logger)
|
21
|
-
end
|
22
|
-
|
23
|
-
should 'not define a logger= instance method' do
|
24
|
-
assert !@example.respond_to?(:logger=)
|
25
|
-
end
|
26
|
-
|
27
|
-
should 'not define a logger= class method' do
|
28
|
-
assert !ExampleLoggable.respond_to?(:logger=)
|
29
|
-
end
|
30
|
-
|
31
|
-
should 'define logger to be an instance of Perennial::Logger' do
|
32
|
-
assert_equal Perennial::Logger, ExampleLoggable.logger
|
33
|
-
assert_equal Perennial::Logger, @example.logger
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
data/test/logger_test.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), "test_helper")
|
2
|
-
|
3
|
-
class LoggerTest < Test::Unit::TestCase
|
4
|
-
context 'logger tests' do
|
5
|
-
|
6
|
-
setup do
|
7
|
-
@root_path = Perennial::Settings.root / "log"
|
8
|
-
Perennial::Logger.log_name = "example.log"
|
9
|
-
FileUtils.mkdir_p @root_path
|
10
|
-
end
|
11
|
-
|
12
|
-
context 'setting up a logger' do
|
13
|
-
|
14
|
-
setup { Perennial::Logger.setup! }
|
15
|
-
|
16
|
-
should 'create the log file file after writing' do
|
17
|
-
Perennial::Logger.fatal "Blergh."
|
18
|
-
assert File.exist?(@root_path / "example.log")
|
19
|
-
end
|
20
|
-
|
21
|
-
Perennial::Logger::LEVELS.each_key do |level_name|
|
22
|
-
should "define a method for the #{level_name} log level" do
|
23
|
-
assert Perennial::Logger.respond_to?(level_name)
|
24
|
-
assert Perennial::Logger.logger.respond_to?(level_name)
|
25
|
-
assert_equal 1, Perennial::Logger.logger.method(level_name).arity
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
should 'have a log exception method' do
|
30
|
-
assert Perennial::Logger.respond_to?(:log_exception)
|
31
|
-
assert Perennial::Logger.logger.respond_to?(:log_exception)
|
32
|
-
end
|
33
|
-
|
34
|
-
should 'let you configure a dir that logs are loaded from'
|
35
|
-
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'writing to the log' do
|
39
|
-
|
40
|
-
Perennial::Logger::LEVELS.each_key do |level_name|
|
41
|
-
should "let you write to the #{level_name} log level" do
|
42
|
-
Perennial::Logger.verbose = false
|
43
|
-
Perennial::Logger.level = level_name
|
44
|
-
assert_nothing_raised do
|
45
|
-
Perennial::Logger.logger.send(level_name, "An Example Message No. 1")
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
teardown do
|
53
|
-
log_path = @root_path / "example.log"
|
54
|
-
FileUtils.rm_rf(log_path) if File.exist?(log_path)
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|