impromptu 1.2.1 → 1.3.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/VERSION +1 -1
- data/impromptu.gemspec +4 -2
- data/lib/impromptu/folder.rb +29 -1
- data/lib/impromptu/impromptu.rb +7 -0
- data/lib/impromptu/resource.rb +19 -2
- data/test/framework/preload/preload.rb +7 -0
- data/test/framework/test.components +1 -0
- data/test/test_integration.rb +36 -7
- metadata +6 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.3.0
|
data/impromptu.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{impromptu}
|
8
|
-
s.version = "1.
|
8
|
+
s.version = "1.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Will Cannings"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-01-21}
|
13
13
|
s.description = %q{Component and dependency manager for Ruby}
|
14
14
|
s.email = %q{me@willcannings.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -48,6 +48,7 @@ Gem::Specification.new do |s|
|
|
48
48
|
"test/framework/other/ignore.rb",
|
49
49
|
"test/framework/other/load.rb",
|
50
50
|
"test/framework/other/two.rb",
|
51
|
+
"test/framework/preload/preload.rb",
|
51
52
|
"test/framework/private/klass.rb",
|
52
53
|
"test/framework/private/other.rb",
|
53
54
|
"test/framework/stdlib/string.rb",
|
@@ -85,6 +86,7 @@ Gem::Specification.new do |s|
|
|
85
86
|
"test/framework/other/ignore.rb",
|
86
87
|
"test/framework/other/load.rb",
|
87
88
|
"test/framework/other/two.rb",
|
89
|
+
"test/framework/preload/preload.rb",
|
88
90
|
"test/framework/private/klass.rb",
|
89
91
|
"test/framework/private/other.rb",
|
90
92
|
"test/framework/stdlib/string.rb",
|
data/lib/impromptu/folder.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Impromptu
|
2
2
|
class Folder
|
3
3
|
attr_accessor :folder, :files, :component
|
4
|
-
DEFAULT_OPTIONS = {nested_namespaces: true, reloadable: true, implicitly_loaded: true, namespace: nil}
|
4
|
+
DEFAULT_OPTIONS = {nested_namespaces: true, reloadable: true, implicitly_loaded: true, namespace: nil, preload: false}
|
5
5
|
SOURCE_EXTENSIONS = %w{rb so bundle}
|
6
6
|
|
7
7
|
# Register a new folder containing source files for a
|
@@ -23,6 +23,9 @@ module Impromptu
|
|
23
23
|
# * namespace: override a component's default namespace with
|
24
24
|
# a namespace specific to this folder. The normal rules
|
25
25
|
# with nested namespaces apply.
|
26
|
+
# * preload: forces the loading of all files within a folder.
|
27
|
+
# The resources defined can still be reloaded, but loading
|
28
|
+
# won't wait until the resource is referenced.
|
26
29
|
def initialize(path, component, options={}, block)
|
27
30
|
@folder = path.realpath
|
28
31
|
@component = component
|
@@ -72,6 +75,21 @@ module Impromptu
|
|
72
75
|
@options[:implicitly_loaded]
|
73
76
|
end
|
74
77
|
|
78
|
+
# True if the resources of the folder are loaded immediately on
|
79
|
+
# startup, and won't be autoloaded.
|
80
|
+
def preload?
|
81
|
+
@options[:preload]
|
82
|
+
end
|
83
|
+
|
84
|
+
# Preload the resources defined by this folder. Should only be called
|
85
|
+
# by the Impromptu module, and only once (at app startup).
|
86
|
+
def preload
|
87
|
+
return unless preload?
|
88
|
+
@files.each do |file|
|
89
|
+
file.reload
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
75
93
|
# A string or symbol for this folder which overrides the components
|
76
94
|
# default namespace. Nil if no namespace has been defined.
|
77
95
|
def namespace
|
@@ -160,6 +178,16 @@ module Impromptu
|
|
160
178
|
file.refreeze
|
161
179
|
end
|
162
180
|
end
|
181
|
+
|
182
|
+
# ensure all resources defined by this folder
|
183
|
+
# are marked to be preloaded if required
|
184
|
+
if preload?
|
185
|
+
@files.each do |file|
|
186
|
+
file.resources.each do |resource|
|
187
|
+
resource.preload = true
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
163
191
|
end
|
164
192
|
|
165
193
|
|
data/lib/impromptu/impromptu.rb
CHANGED
@@ -60,6 +60,13 @@ module Impromptu
|
|
60
60
|
# modules or classes. we can't catch uses of these resources
|
61
61
|
# using const_missing, so we need to load them now.
|
62
62
|
@root_resource.load_if_extending_stdlib
|
63
|
+
|
64
|
+
# load any folders which are to be preloaded
|
65
|
+
components.each do |component|
|
66
|
+
component.folders.each do |folder|
|
67
|
+
folder.preload if folder.preload?
|
68
|
+
end
|
69
|
+
end
|
63
70
|
end
|
64
71
|
|
65
72
|
# Open and run a file defining components. The folder containing
|
data/lib/impromptu/resource.rb
CHANGED
@@ -4,7 +4,7 @@ module Impromptu
|
|
4
4
|
# resources yourself - use component definitions to define folders
|
5
5
|
# of files which will implement resources.
|
6
6
|
class Resource
|
7
|
-
attr_reader :name, :base_symbol, :files, :children, :parent
|
7
|
+
attr_reader :name, :base_symbol, :files, :children, :parent, :preload
|
8
8
|
|
9
9
|
def initialize(name, parent)
|
10
10
|
@name = name.to_sym
|
@@ -15,6 +15,7 @@ module Impromptu
|
|
15
15
|
@reference = nil
|
16
16
|
@namespace = false
|
17
17
|
@dont_undef = self.loaded? # existing constants, such as 'String', should never be unloaded
|
18
|
+
@preload = false # true if any folder defining this resource is marked to be preloaded
|
18
19
|
@implicitly_defined = true
|
19
20
|
end
|
20
21
|
|
@@ -32,6 +33,16 @@ module Impromptu
|
|
32
33
|
@name.hash
|
33
34
|
end
|
34
35
|
|
36
|
+
# Define this resource as preloaded
|
37
|
+
def preload=(preload)
|
38
|
+
@preload = preload
|
39
|
+
end
|
40
|
+
|
41
|
+
# True if this resource is defined as preloaded
|
42
|
+
def preload?
|
43
|
+
@preload
|
44
|
+
end
|
45
|
+
|
35
46
|
# Attempts to retrieve a reference to the object represented by
|
36
47
|
# this resource. If the resource is unloaded, nil is returned.
|
37
48
|
def reference
|
@@ -48,11 +59,12 @@ module Impromptu
|
|
48
59
|
def reload
|
49
60
|
@parent.reload unless @parent.loaded?
|
50
61
|
if @implicitly_defined
|
51
|
-
|
62
|
+
unload
|
52
63
|
Object.module_eval "module #{@name}; end"
|
53
64
|
else
|
54
65
|
@files.first.reload
|
55
66
|
end
|
67
|
+
reload_preloaded_resources
|
56
68
|
end
|
57
69
|
|
58
70
|
# Unload the resource by undefining the constant representing it.
|
@@ -203,5 +215,10 @@ module Impromptu
|
|
203
215
|
reload if loaded? && !self.root?
|
204
216
|
@children.each_value(&:load_if_extending_stdlib)
|
205
217
|
end
|
218
|
+
|
219
|
+
def reload_preloaded_resources
|
220
|
+
reload if !loaded? && preload?
|
221
|
+
@children.each_value(&:reload_preloaded_resources)
|
222
|
+
end
|
206
223
|
end
|
207
224
|
end
|
data/test/test_integration.rb
CHANGED
@@ -17,8 +17,8 @@ class TestIntegration < Test::Unit::TestCase
|
|
17
17
|
assert_equal 5, Impromptu.components.size
|
18
18
|
end
|
19
19
|
|
20
|
-
should "02 have
|
21
|
-
assert_equal
|
20
|
+
should "02 have the correct number of folders per component" do
|
21
|
+
assert_equal 2, Impromptu.components['framework'].folders.size
|
22
22
|
assert_equal 1, Impromptu.components['framework.extensions'].folders.size
|
23
23
|
assert_equal 1, Impromptu.components['other'].folders.size
|
24
24
|
assert_equal 1, Impromptu.components['private'].folders.size
|
@@ -49,6 +49,7 @@ class TestIntegration < Test::Unit::TestCase
|
|
49
49
|
assert Impromptu.root_resource.child(:Framework).child(:Extensions).child?(:Blog)
|
50
50
|
assert Impromptu.root_resource.child(:Framework).child?(:Klass)
|
51
51
|
assert Impromptu.root_resource.child(:Framework).child?(:Klass2)
|
52
|
+
assert Impromptu.root_resource.child(:Framework).child?(:Preload)
|
52
53
|
assert Impromptu.root_resource.child?(:Load)
|
53
54
|
assert Impromptu.root_resource.child?(:OtherName)
|
54
55
|
assert Impromptu.root_resource.child?(:ModOne)
|
@@ -70,13 +71,13 @@ class TestIntegration < Test::Unit::TestCase
|
|
70
71
|
assert_equal false, Impromptu.root_resource.child(:ModOne).namespace?
|
71
72
|
assert_equal false, Impromptu.root_resource.child(:ModTwo).namespace?
|
72
73
|
assert_equal false, Impromptu.root_resource.child(:Another).namespace?
|
73
|
-
assert_equal true,
|
74
|
+
assert_equal true, Impromptu.root_resource.child(:Namespace).namespace?
|
74
75
|
assert_equal false, Impromptu.root_resource.child(:Namespace).child(:Stream).namespace?
|
75
76
|
assert_equal false, Impromptu.root_resource.child(:Namespace).child(:TwoNames).namespace?
|
76
77
|
end
|
77
78
|
|
78
|
-
should "08 keep all resources unloaded to start with" do
|
79
|
-
|
79
|
+
should "08 keep all non-preloaded resources unloaded to start with, and preload otherwise" do
|
80
|
+
# normal, non preloaded resources
|
80
81
|
assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions').loaded?
|
81
82
|
assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions::Blog').loaded?
|
82
83
|
assert_equal false, Impromptu.root_resource.child(:'Framework::Klass').loaded?
|
@@ -89,14 +90,19 @@ class TestIntegration < Test::Unit::TestCase
|
|
89
90
|
assert_equal false, Impromptu.root_resource.child(:'Namespace').loaded?
|
90
91
|
assert_equal false, Impromptu.root_resource.child(:'Namespace::Stream').loaded?
|
91
92
|
assert_equal false, Impromptu.root_resource.child(:'Namespace::TwoNames').loaded?
|
93
|
+
|
94
|
+
# preloaded resources are the opposite of this
|
95
|
+
assert Impromptu.root_resource.child(:'Framework').loaded?
|
96
|
+
assert Impromptu.root_resource.child(:'Framework::Preload').loaded?
|
92
97
|
end
|
93
|
-
|
98
|
+
|
94
99
|
should "09 have all resources specified by the correct number of files" do
|
95
100
|
assert_equal 0, Impromptu.root_resource.child(:'Framework').files.size
|
96
101
|
assert_equal 1, Impromptu.root_resource.child(:'Framework::Extensions').files.size
|
97
102
|
assert_equal 1, Impromptu.root_resource.child(:'Framework::Extensions::Blog').files.size
|
98
103
|
assert_equal 2, Impromptu.root_resource.child(:'Framework::Klass').files.size
|
99
104
|
assert_equal 1, Impromptu.root_resource.child(:'Framework::Klass2').files.size
|
105
|
+
assert_equal 1, Impromptu.root_resource.child(:'Framework::Preload').files.size
|
100
106
|
assert_equal 1, Impromptu.root_resource.child(:'Framework::Klass2').files.size
|
101
107
|
assert_equal 1, Impromptu.root_resource.child(:'Load').files.size
|
102
108
|
assert_equal 2, Impromptu.root_resource.child(:'OtherName').files.size
|
@@ -114,7 +120,6 @@ class TestIntegration < Test::Unit::TestCase
|
|
114
120
|
# Loading/unloading
|
115
121
|
# ----------------------------------------
|
116
122
|
should "10 allow loading the implicitly namespace modules" do
|
117
|
-
assert_equal false, Impromptu.root_resource.child(:'Framework').loaded?
|
118
123
|
Impromptu.root_resource.child(:'Framework').reload
|
119
124
|
assert_equal true, Impromptu.root_resource.child(:'Framework').loaded?
|
120
125
|
assert_nothing_raised do
|
@@ -130,6 +135,13 @@ class TestIntegration < Test::Unit::TestCase
|
|
130
135
|
end
|
131
136
|
|
132
137
|
should "11 load resources using associated files when required" do
|
138
|
+
# preloaded resource
|
139
|
+
assert_nothing_raised do
|
140
|
+
Framework::Preload
|
141
|
+
end
|
142
|
+
assert_respond_to Framework::Preload, :method
|
143
|
+
assert Framework::Preload.method
|
144
|
+
|
133
145
|
# ext
|
134
146
|
Impromptu.root_resource.child(:'Framework::Extensions::Blog').reload
|
135
147
|
assert_equal true, Impromptu.root_resource.child(:'Framework::Extensions').loaded?
|
@@ -245,6 +257,23 @@ class TestIntegration < Test::Unit::TestCase
|
|
245
257
|
assert_equal true, Impromptu.root_resource.child(:'Framework::Extensions::Blog').loaded?
|
246
258
|
end
|
247
259
|
|
260
|
+
should "15 automatically reload preloaded resources when their parent is reloaded" do
|
261
|
+
# ensure the preloaded resource is in fact preloaded
|
262
|
+
assert Impromptu.root_resource.child(:'Framework').loaded?
|
263
|
+
assert Impromptu.root_resource.child(:'Framework::Preload').loaded?
|
264
|
+
assert_nothing_raised do
|
265
|
+
Framework::Preload
|
266
|
+
end
|
267
|
+
|
268
|
+
# reload the parent resource and ensure the preloaded resource is still available
|
269
|
+
Impromptu.root_resource.child(:'Framework').reload
|
270
|
+
assert Impromptu.root_resource.child(:'Framework').loaded?
|
271
|
+
assert Impromptu.root_resource.child(:'Framework::Preload').loaded?
|
272
|
+
assert_nothing_raised do
|
273
|
+
Framework::Preload
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
248
277
|
|
249
278
|
# ----------------------------------------
|
250
279
|
# Updating files
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 1
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 1.
|
7
|
+
- 3
|
8
|
+
- 0
|
9
|
+
version: 1.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Will Cannings
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-01-21 00:00:00 +11:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- test/framework/other/ignore.rb
|
72
72
|
- test/framework/other/load.rb
|
73
73
|
- test/framework/other/two.rb
|
74
|
+
- test/framework/preload/preload.rb
|
74
75
|
- test/framework/private/klass.rb
|
75
76
|
- test/framework/private/other.rb
|
76
77
|
- test/framework/stdlib/string.rb
|
@@ -135,6 +136,7 @@ test_files:
|
|
135
136
|
- test/framework/other/ignore.rb
|
136
137
|
- test/framework/other/load.rb
|
137
138
|
- test/framework/other/two.rb
|
139
|
+
- test/framework/preload/preload.rb
|
138
140
|
- test/framework/private/klass.rb
|
139
141
|
- test/framework/private/other.rb
|
140
142
|
- test/framework/stdlib/string.rb
|