impromptu 1.4.0 → 1.5.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 CHANGED
@@ -1 +1 @@
1
- 1.4.0
1
+ 1.5.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.4.0"
8
+ s.version = "1.5.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{2011-01-21}
12
+ s.date = %q{2011-01-23}
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 = [
@@ -44,6 +44,7 @@ Gem::Specification.new do |s|
44
44
  "test/framework/folder_namespace/two_names.rb",
45
45
  "test/framework/lib/group/klass2.rb",
46
46
  "test/framework/lib/klass.rb",
47
+ "test/framework/lib/sub_klass.rb",
47
48
  "test/framework/other/also.rb",
48
49
  "test/framework/other/ignore.rb",
49
50
  "test/framework/other/load.rb",
@@ -82,6 +83,7 @@ Gem::Specification.new do |s|
82
83
  "test/framework/folder_namespace/two_names.rb",
83
84
  "test/framework/lib/group/klass2.rb",
84
85
  "test/framework/lib/klass.rb",
86
+ "test/framework/lib/sub_klass.rb",
85
87
  "test/framework/other/also.rb",
86
88
  "test/framework/other/ignore.rb",
87
89
  "test/framework/other/load.rb",
@@ -15,13 +15,17 @@ module Impromptu
15
15
  # have been marked as reloadable. Any modified files will be
16
16
  # reloaded, any new files will have their assiciated resources
17
17
  # inserted in the resource tree, and any removed files will be
18
- # unloaded.
18
+ # unloaded. Any preloaded resources which are unloaded as a
19
+ # result of an update will automatically be reloaded again.
19
20
  def self.update
20
21
  components.each do |component|
21
22
  component.folders.each do |folder|
22
23
  folder.reload if folder.reloadable?
23
24
  end
24
25
  end
26
+
27
+ # force any unloaded preloading resources to reload
28
+ self.root_resource.reload_preloaded_resources
25
29
  end
26
30
 
27
31
  # Reset Impromptu by removing all known components and resources.
@@ -70,10 +70,26 @@ module Impromptu
70
70
 
71
71
  # Unload the resource by undefining the constant representing it.
72
72
  # Any resources contained within this resource will also be
73
- # unloaded. This allows the resource to be garbage collected.
73
+ # unloaded. This allows the resource to be garbage collected. If
74
+ # the resource is a class, you can define a class method called
75
+ # 'descendants' that returns an array of references to subclasses.
76
+ # Any subclasses known to Impromptu will also be unloaded, just as
77
+ # namespaced children are. This prevents subclasses holding a
78
+ # reference to a stale version of a super class.
74
79
  def unload
75
80
  return unless loaded?
81
+
82
+ # unload namespaced children
76
83
  @children.each_value(&:unload)
84
+
85
+ # unload descendants if they can be reloaded by impromptu
86
+ if reference.respond_to? :descendants
87
+ reference.descendants.each do |descendant|
88
+ resource = Impromptu.root_resource.child(descendant.name.to_sym)
89
+ resource.unload unless resource.nil?
90
+ end
91
+ end
92
+
77
93
  unless @dont_undef
78
94
  @parent.reference.send(:remove_const, @base_symbol)
79
95
  @reference = nil
@@ -217,6 +233,10 @@ module Impromptu
217
233
  @children.each_value(&:load_if_extending_stdlib)
218
234
  end
219
235
 
236
+ # Loads this resource, and any child resources, if the resource is
237
+ # marked as requiring preloading, and the resource is not currently
238
+ # loaded. This loading may happen multiple times during the application
239
+ # life cycle depending on whether parent resources are reloaded and so on.
220
240
  def reload_preloaded_resources
221
241
  reload if !loaded? && preload?
222
242
  @children.each_value(&:reload_preloaded_resources)
@@ -6,5 +6,14 @@ module Framework
6
6
 
7
7
  def self.new_method
8
8
  end
9
+
10
+ def self.descendants
11
+ @descendants ||= []
12
+ end
13
+
14
+ def self.inherited(child)
15
+ super(child)
16
+ descendants << child
17
+ end
9
18
  end
10
19
  end
@@ -6,5 +6,14 @@ module Framework
6
6
  def self.overriden_method
7
7
  1
8
8
  end
9
+
10
+ def self.descendants
11
+ @descendants ||= []
12
+ end
13
+
14
+ def self.inherited(child)
15
+ super(child)
16
+ descendants << child
17
+ end
9
18
  end
10
19
  end
@@ -6,5 +6,14 @@ module Framework
6
6
  def self.overriden_method
7
7
  1
8
8
  end
9
+
10
+ def self.descendants
11
+ @descendants ||= []
12
+ end
13
+
14
+ def self.inherited(child)
15
+ super(child)
16
+ descendants << child
17
+ end
9
18
  end
10
19
  end
@@ -0,0 +1,4 @@
1
+ module Framework
2
+ class SubKlass < Klass
3
+ end
4
+ end
@@ -35,19 +35,20 @@ class TestIntegration < Test::Unit::TestCase
35
35
  assert_equal nil, Impromptu.components['other'].namespace
36
36
  end
37
37
 
38
- should "05 start tracking 11 files" do
39
- assert_equal 2, Impromptu.components['framework'].folders.first.files.size
38
+ should "05 start tracking all files" do
39
+ assert_equal 3, Impromptu.components['framework'].folders.first.files.size
40
40
  assert_equal 2, Impromptu.components['framework.extensions'].folders.first.files.size
41
41
  assert_equal 3, Impromptu.components['other'].folders.first.files.size
42
42
  assert_equal 2, Impromptu.components['private'].folders.first.files.size
43
43
  assert_equal 2, Impromptu.components['folder_namespace'].folders.first.files.size
44
44
  end
45
45
 
46
- should "06 load definitions for 13 resources" do
46
+ should "06 load definitions for all resources" do
47
47
  assert Impromptu.root_resource.child?(:Framework)
48
48
  assert Impromptu.root_resource.child(:Framework).child?(:Extensions)
49
49
  assert Impromptu.root_resource.child(:Framework).child(:Extensions).child?(:Blog)
50
50
  assert Impromptu.root_resource.child(:Framework).child?(:Klass)
51
+ assert Impromptu.root_resource.child(:Framework).child?(:SubKlass)
51
52
  assert Impromptu.root_resource.child(:Framework).child?(:Klass2)
52
53
  assert Impromptu.root_resource.child(:Framework).child?(:Preload)
53
54
  assert Impromptu.root_resource.child?(:Load)
@@ -65,6 +66,7 @@ class TestIntegration < Test::Unit::TestCase
65
66
  assert_equal false, Impromptu.root_resource.child(:Framework).child(:Extensions).namespace?
66
67
  assert_equal false, Impromptu.root_resource.child(:Framework).child(:Extensions).child(:Blog).namespace?
67
68
  assert_equal false, Impromptu.root_resource.child(:Framework).child(:Klass).namespace?
69
+ assert_equal false, Impromptu.root_resource.child(:Framework).child(:SubKlass).namespace?
68
70
  assert_equal false, Impromptu.root_resource.child(:Framework).child(:Klass2).namespace?
69
71
  assert_equal false, Impromptu.root_resource.child(:Load).namespace?
70
72
  assert_equal false, Impromptu.root_resource.child(:OtherName).namespace?
@@ -81,6 +83,7 @@ class TestIntegration < Test::Unit::TestCase
81
83
  assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions').loaded?
82
84
  assert_equal false, Impromptu.root_resource.child(:'Framework::Extensions::Blog').loaded?
83
85
  assert_equal false, Impromptu.root_resource.child(:'Framework::Klass').loaded?
86
+ assert_equal false, Impromptu.root_resource.child(:'Framework::SubKlass').loaded?
84
87
  assert_equal false, Impromptu.root_resource.child(:'Framework::Klass2').loaded?
85
88
  assert_equal false, Impromptu.root_resource.child(:'Load').loaded?
86
89
  assert_equal false, Impromptu.root_resource.child(:'OtherName').loaded?
@@ -101,6 +104,7 @@ class TestIntegration < Test::Unit::TestCase
101
104
  assert_equal 1, Impromptu.root_resource.child(:'Framework::Extensions').files.size
102
105
  assert_equal 1, Impromptu.root_resource.child(:'Framework::Extensions::Blog').files.size
103
106
  assert_equal 2, Impromptu.root_resource.child(:'Framework::Klass').files.size
107
+ assert_equal 1, Impromptu.root_resource.child(:'Framework::SubKlass').files.size
104
108
  assert_equal 1, Impromptu.root_resource.child(:'Framework::Klass2').files.size
105
109
  assert_equal 1, Impromptu.root_resource.child(:'Framework::Preload').files.size
106
110
  assert_equal 1, Impromptu.root_resource.child(:'Framework::Klass2').files.size
@@ -292,9 +296,10 @@ class TestIntegration < Test::Unit::TestCase
292
296
  File.open('test/framework/lib/klass.rb', 'w') do |file|
293
297
  file.write old_klass
294
298
  end
299
+ sleep 1 # because file mod times are in seconds, delay by 1s so further tests so an updated timestamp
295
300
  end
296
301
 
297
- should "reload a class definition correctly when a file is changed" do
302
+ should "reload a class definition correctly when a file is changed" do
298
303
  # update impromptu and test the new klass is loaded
299
304
  assert_respond_to Framework::Klass, :standard_method
300
305
  assert_equal 2, Framework::Klass.overriden_method
@@ -303,6 +308,19 @@ class TestIntegration < Test::Unit::TestCase
303
308
  assert_equal false, Framework::Klass.respond_to?(:standard_method)
304
309
  assert_equal 2, Framework::Klass.overriden_method
305
310
  end
311
+
312
+ should "unload a subclass if a parent class file is updated" do
313
+ assert_respond_to Framework::SubKlass, :standard_method
314
+ assert_equal 2, Framework::SubKlass.overriden_method
315
+
316
+ Impromptu.update
317
+
318
+ assert_equal false, Impromptu.root_resource.child(:'Framework::SubKlass').loaded?
319
+ Impromptu.root_resource.child(:'Framework::SubKlass').reload
320
+ assert_respond_to Framework::SubKlass, :new_method
321
+ assert_equal false, Framework::SubKlass.respond_to?(:standard_method)
322
+ assert_equal 2, Framework::SubKlass.overriden_method
323
+ end
306
324
  end
307
325
 
308
326
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 4
7
+ - 5
8
8
  - 0
9
- version: 1.4.0
9
+ version: 1.5.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: 2011-01-21 00:00:00 +11:00
17
+ date: 2011-01-23 00:00:00 +11:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -67,6 +67,7 @@ files:
67
67
  - test/framework/folder_namespace/two_names.rb
68
68
  - test/framework/lib/group/klass2.rb
69
69
  - test/framework/lib/klass.rb
70
+ - test/framework/lib/sub_klass.rb
70
71
  - test/framework/other/also.rb
71
72
  - test/framework/other/ignore.rb
72
73
  - test/framework/other/load.rb
@@ -132,6 +133,7 @@ test_files:
132
133
  - test/framework/folder_namespace/two_names.rb
133
134
  - test/framework/lib/group/klass2.rb
134
135
  - test/framework/lib/klass.rb
136
+ - test/framework/lib/sub_klass.rb
135
137
  - test/framework/other/also.rb
136
138
  - test/framework/other/ignore.rb
137
139
  - test/framework/other/load.rb