class_loader 3.0.4 → 3.0.5
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/Rakefile
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'rake_ext'
|
2
2
|
|
3
|
-
project
|
3
|
+
project \
|
4
4
|
name: "class_loader",
|
5
5
|
gem: true,
|
6
|
-
summary: "Automatically
|
6
|
+
summary: "Automatically finds, loads and reloads classes",
|
7
7
|
# version: '3.0.0',
|
8
8
|
|
9
9
|
author: "Alexey Petrushin",
|
10
|
-
homepage: "http://github.com/alexeypetrushin/class_loader"
|
11
|
-
)
|
10
|
+
homepage: "http://github.com/alexeypetrushin/class_loader"
|
@@ -2,7 +2,7 @@ require 'class_loader/support'
|
|
2
2
|
require 'monitor'
|
3
3
|
|
4
4
|
module ClassLoader
|
5
|
-
@loaded_classes = {}
|
5
|
+
@loaded_classes, @after_callbacks = {}, {}
|
6
6
|
@monitor = Monitor.new
|
7
7
|
class << self
|
8
8
|
attr_reader :loaded_classes, :monitor
|
@@ -58,6 +58,9 @@ module ClassLoader
|
|
58
58
|
# Getting the class itself.
|
59
59
|
klass = namespace ? namespace.const_get(const, false) : Object.const_get(const, false)
|
60
60
|
|
61
|
+
# Firing after callbacks.
|
62
|
+
if callbacks = after_callbacks[klass.name] then callbacks.each{|c| c.call klass} end
|
63
|
+
|
61
64
|
loaded_classes[class_name] = klass
|
62
65
|
|
63
66
|
return klass
|
@@ -86,7 +89,7 @@ module ClassLoader
|
|
86
89
|
|
87
90
|
# Watch and reload files.
|
88
91
|
def watch *paths
|
89
|
-
paths.each{|path| watcher.paths << path}
|
92
|
+
paths.each{|path| watcher.paths << path unless watcher.paths.include? path}
|
90
93
|
watcher.start
|
91
94
|
end
|
92
95
|
|
@@ -95,11 +98,17 @@ module ClassLoader
|
|
95
98
|
@watcher ||= ClassLoader::Watcher.new monitor
|
96
99
|
end
|
97
100
|
|
101
|
+
def after class_name, &block
|
102
|
+
(@after_callbacks[class_name] ||= []) << block
|
103
|
+
end
|
104
|
+
|
98
105
|
def filter_backtrace backtrace
|
99
106
|
backtrace.reject{|path| path.include?("/lib/class_loader") or path.include?('monitor.rb')}
|
100
107
|
end
|
101
108
|
|
102
109
|
protected
|
110
|
+
attr_reader :after_callbacks
|
111
|
+
|
103
112
|
# Use this method to define class name to file name mapping, by default it uses underscored paths,
|
104
113
|
# but You can override this method to use camel case for example.
|
105
114
|
def get_file_name class_name
|
data/readme.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# Automatically finds, loads and reloads classes
|
2
2
|
|
3
3
|
Suppose there's following directory structure:
|
4
4
|
|
@@ -17,7 +17,7 @@ SomeClass
|
|
17
17
|
SomeNamespace::AnotherClass
|
18
18
|
```
|
19
19
|
|
20
|
-
No need for `require`
|
20
|
+
No need for `require`, `autoload` and code like this:
|
21
21
|
|
22
22
|
``` ruby
|
23
23
|
require 'some_class'
|
@@ -31,18 +31,28 @@ module SomeNamespace
|
|
31
31
|
end
|
32
32
|
```
|
33
33
|
|
34
|
-
|
34
|
+
Watching and reloading changed classes:
|
35
35
|
|
36
36
|
``` ruby
|
37
37
|
ClassLoader.watch 'my_app/lib'
|
38
38
|
```
|
39
39
|
|
40
|
-
|
40
|
+
Preload classes eagerly:
|
41
41
|
|
42
42
|
``` ruby
|
43
43
|
ClassLoader.preload 'my_app/lib'
|
44
44
|
```
|
45
45
|
|
46
|
+
Execute callbacks after loading class:
|
47
|
+
|
48
|
+
``` ruby
|
49
|
+
ClassLoader.after 'SomeClass' do |klass|
|
50
|
+
klass.include SomeModule
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
It's also very small, sources are about 150 lines (and third of it are comments).
|
55
|
+
|
46
56
|
## Installation
|
47
57
|
|
48
58
|
$ gem install class_loader
|
data/spec/class_loader_spec.rb
CHANGED
@@ -5,28 +5,10 @@ describe 'Autoloading classes' do
|
|
5
5
|
with_tmp_spec_dir
|
6
6
|
|
7
7
|
after do
|
8
|
+
remove_constants :SomeNamespace, :SomeClass, :AnotherClass, :Tmp
|
9
|
+
|
8
10
|
ClassLoader.loaded_classes.clear
|
9
11
|
ClassLoader.watcher.stop
|
10
|
-
|
11
|
-
remove_constants %w(
|
12
|
-
SomeNamespace
|
13
|
-
AnotherNamespace
|
14
|
-
|
15
|
-
SomeClass
|
16
|
-
AnotherClass
|
17
|
-
|
18
|
-
BasicSpec
|
19
|
-
OnlyOnceSpec
|
20
|
-
NamespaceTypeResolving NamespaceIsAlreadyDefinedAsClass
|
21
|
-
InvalidInfinityLoopClassName
|
22
|
-
AnonymousSpec
|
23
|
-
AnotherNamespace
|
24
|
-
ClassReloadingSpec
|
25
|
-
UnloadOldClass
|
26
|
-
PreloadingSpec
|
27
|
-
UnderscoredNamespace
|
28
|
-
Tmp
|
29
|
-
)
|
30
12
|
end
|
31
13
|
|
32
14
|
it "basics" do
|
@@ -106,6 +88,17 @@ describe 'Autoloading classes' do
|
|
106
88
|
end
|
107
89
|
end
|
108
90
|
|
91
|
+
it "after" do
|
92
|
+
with_load_path "#{spec_dir}/after" do
|
93
|
+
ClassLoader.after 'SomeClass' do |klass|
|
94
|
+
klass.class_eval do
|
95
|
+
def self.extension; :ok end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
SomeClass.extension.should == :ok
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
109
102
|
it "should reload class files" do
|
110
103
|
with_load_path "#{spec_dir}/reloading" do
|
111
104
|
watcher = ClassLoader.watcher
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: class_loader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.
|
4
|
+
version: 3.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -23,6 +23,7 @@ files:
|
|
23
23
|
- lib/class_loader/support.rb
|
24
24
|
- lib/class_loader/watcher.rb
|
25
25
|
- lib/class_loader.rb
|
26
|
+
- spec/class_loader_spec/after/some_class.rb
|
26
27
|
- spec/class_loader_spec/anonymous_class/some_namespace/some_class.rb
|
27
28
|
- spec/class_loader_spec/another_namespace/some_namespace/namespace_a.rb
|
28
29
|
- spec/class_loader_spec/another_namespace/some_namespace/namespace_b.rb
|
@@ -40,7 +41,6 @@ files:
|
|
40
41
|
- spec/class_loader_spec/preloading/some_namespace.rb
|
41
42
|
- spec/class_loader_spec/reloading/some_class.rb
|
42
43
|
- spec/class_loader_spec/underscored/underscored_namespace/underscored_class.rb
|
43
|
-
- spec/class_loader_spec/unload_old_class/UnloadOldClass.rb
|
44
44
|
- spec/class_loader_spec.rb
|
45
45
|
homepage: http://github.com/alexeypetrushin/class_loader
|
46
46
|
licenses: []
|
@@ -65,5 +65,5 @@ rubyforge_project:
|
|
65
65
|
rubygems_version: 1.8.6
|
66
66
|
signing_key:
|
67
67
|
specification_version: 3
|
68
|
-
summary: Automatically
|
68
|
+
summary: Automatically finds, loads and reloads classes
|
69
69
|
test_files: []
|