class_loader 0.4.15 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +2 -1
- data/lib/class_loader/class_loader.rb +99 -207
- data/lib/class_loader/support.rb +0 -11
- data/lib/class_loader/watcher.rb +44 -0
- data/lib/class_loader.rb +6 -19
- data/readme.md +27 -28
- data/spec/class_loader_spec/anonymous_class/some_namespace/some_class.rb +2 -0
- data/spec/class_loader_spec/another_namespace/some_namespace/namespace_a.rb +2 -0
- data/spec/class_loader_spec/another_namespace/{AnotherNamespace/NamespaceB.rb → some_namespace/namespace_b.rb} +1 -1
- data/spec/class_loader_spec/another_namespace/some_namespace.rb +2 -0
- data/spec/class_loader_spec/basics/another_class.rb +2 -0
- data/spec/class_loader_spec/{basic/BasicSpec/SomeNamespace/SomeClass.rb → basics/some_class.rb} +0 -0
- data/spec/class_loader_spec/basics/some_namespace/some_class.rb +2 -0
- data/spec/class_loader_spec/basics/some_namespace.rb +2 -0
- data/spec/class_loader_spec/infinity_loop/some_class.rb +2 -0
- data/spec/class_loader_spec/namespace_resolving/some_namespace/some_class.rb +2 -0
- data/spec/class_loader_spec/namespace_resolving/some_namespace.rb +2 -0
- data/spec/class_loader_spec/{namespace_type_resolving/NamespaceIsAlreadyDefinedAsClass/SomeClass.rb → only_once/some_class.rb} +0 -0
- data/spec/class_loader_spec/{namespace_type_resolving/NamespaceTypeResolving/SomeClass.rb → preloading/some_class.rb} +0 -0
- data/spec/class_loader_spec/preloading/some_namespace/another_class.rb +2 -0
- data/spec/class_loader_spec/preloading/some_namespace.rb +2 -0
- data/spec/class_loader_spec/reloading/some_class.rb +3 -0
- data/spec/class_loader_spec.rb +96 -78
- metadata +20 -27
- data/lib/class_loader/chained_adapter.rb +0 -48
- data/lib/class_loader/file_system_adapter/camel_case_translator.rb +0 -16
- data/lib/class_loader/file_system_adapter/underscored_translator.rb +0 -16
- data/lib/class_loader/file_system_adapter.rb +0 -145
- data/lib/class_loader/spec.rb +0 -17
- data/lib/class_loader/tasks.rb +0 -8
- data/spec/class_loader_spec/anonymous_class/AnonymousSpec/ClassInsideOfAnonymousClass.rb +0 -2
- data/spec/class_loader_spec/another_namespace/AnotherNamespace/NamespaceA.rb +0 -2
- data/spec/class_loader_spec/basic/BasicSpec.rb +0 -2
- data/spec/class_loader_spec/infinity_loop/InfinityLoop.rb +0 -2
- data/spec/class_loader_spec/namespace_type_resolving/NamespaceTypeResolving.rb +0 -2
- data/spec/class_loader_spec/only_once/OnlyOnceSpec.rb +0 -2
- data/spec/class_loader_spec/preloading/PreloadingSpec.rb +0 -2
- data/spec/file_system_adapter_spec/common/SomeNamespace/SomeClass.rb +0 -1
- data/spec/file_system_adapter_spec/multiple_class_paths/path_a/ClassInPathA.rb +0 -2
- data/spec/file_system_adapter_spec/multiple_class_paths/path_b/ClassInPathB.rb +0 -2
- data/spec/file_system_adapter_spec/shouldnt_mess/CamelCaseClass.rb +0 -0
- data/spec/file_system_adapter_spec/shouldnt_mess/underscored_class.rb +0 -0
- data/spec/file_system_adapter_spec.rb +0 -112
- data/spec/translators_spec.rb +0 -35
data/spec/class_loader_spec/{basic/BasicSpec/SomeNamespace/SomeClass.rb → basics/some_class.rb}
RENAMED
File without changes
|
File without changes
|
File without changes
|
data/spec/class_loader_spec.rb
CHANGED
@@ -1,11 +1,20 @@
|
|
1
1
|
require 'rspec_ext'
|
2
2
|
require "class_loader"
|
3
3
|
|
4
|
-
describe
|
4
|
+
describe 'Autoloading classes' do
|
5
5
|
with_tmp_spec_dir
|
6
6
|
|
7
|
-
after
|
7
|
+
after do
|
8
|
+
ClassLoader.loaded_classes.clear
|
9
|
+
ClassLoader.watcher.stop
|
10
|
+
|
8
11
|
remove_constants %w(
|
12
|
+
SomeNamespace
|
13
|
+
AnotherNamespace
|
14
|
+
|
15
|
+
SomeClass
|
16
|
+
AnotherClass
|
17
|
+
|
9
18
|
BasicSpec
|
10
19
|
OnlyOnceSpec
|
11
20
|
NamespaceTypeResolving NamespaceIsAlreadyDefinedAsClass
|
@@ -16,122 +25,131 @@ describe ClassLoader do
|
|
16
25
|
UnloadOldClass
|
17
26
|
PreloadingSpec
|
18
27
|
UnderscoredNamespace
|
28
|
+
Tmp
|
19
29
|
)
|
20
30
|
end
|
21
31
|
|
22
|
-
|
23
|
-
|
24
|
-
|
32
|
+
it "basics" do
|
33
|
+
with_load_path "#{spec_dir}/basics" do
|
34
|
+
SomeClass.name.should == 'SomeClass'
|
35
|
+
SomeClass.class.should == Class
|
25
36
|
|
26
|
-
|
27
|
-
|
37
|
+
SomeNamespace::SomeClass.name.should == 'SomeNamespace::SomeClass'
|
38
|
+
SomeNamespace.class.should == Module
|
28
39
|
|
29
|
-
|
30
|
-
|
40
|
+
SomeNamespace::AnotherClass
|
41
|
+
end
|
31
42
|
end
|
32
43
|
|
33
44
|
it "should load classes only once" do
|
34
|
-
|
45
|
+
begin
|
46
|
+
Tmp = []
|
47
|
+
ClassLoader.class_eval do
|
48
|
+
class << self
|
49
|
+
alias_method :load_without_test, :load
|
50
|
+
def load_with_test namespace, const
|
51
|
+
Tmp << const
|
52
|
+
load_without_test namespace, const
|
53
|
+
end
|
54
|
+
alias_method :load, :load_with_test
|
55
|
+
end
|
56
|
+
end
|
35
57
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
check.loaded
|
41
|
-
end
|
58
|
+
with_load_path "#{spec_dir}/only_once" do
|
59
|
+
SomeClass
|
60
|
+
SomeClass
|
61
|
+
end
|
42
62
|
|
43
|
-
|
44
|
-
|
63
|
+
Tmp.should == [:SomeClass]
|
64
|
+
ensure
|
65
|
+
ClassLoader.class_eval do
|
66
|
+
class << self
|
67
|
+
alias_method :load, :load_without_test
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
45
71
|
end
|
46
72
|
|
47
|
-
it "should resolve
|
48
|
-
|
49
|
-
|
50
|
-
NamespaceTypeResolving.class.should == Class
|
51
|
-
NamespaceTypeResolving::SomeClass
|
73
|
+
it "should resolve namespace" do
|
74
|
+
with_load_path "#{spec_dir}/namespace_resolving" do
|
75
|
+
SomeNamespace
|
52
76
|
|
53
|
-
|
54
|
-
|
77
|
+
SomeNamespace.class.should == Module
|
78
|
+
SomeNamespace::SomeClass
|
79
|
+
end
|
55
80
|
end
|
56
81
|
|
57
82
|
it "should recognize infinity loop" do
|
58
|
-
|
59
|
-
|
60
|
-
|
83
|
+
with_load_path "#{spec_dir}/infinity_loop" do
|
84
|
+
-> {SomeClass}.should raise_error(/class name 'SomeClass' doesn't correspond to file name 'some_class'/)
|
85
|
+
end
|
61
86
|
end
|
62
87
|
|
63
88
|
it "should correctly works inside of anonymous class" do
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
89
|
+
with_load_path "#{spec_dir}/anonymous_class" do
|
90
|
+
module SomeNamespace
|
91
|
+
class << self
|
92
|
+
def anonymous
|
93
|
+
SomeClass
|
94
|
+
end
|
70
95
|
end
|
71
96
|
end
|
72
|
-
end
|
73
97
|
|
74
|
-
|
98
|
+
SomeNamespace.anonymous
|
99
|
+
end
|
75
100
|
end
|
76
101
|
|
77
102
|
it "should raise exception if class defined in another namespace" do
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
-> {
|
83
|
-
AnotherNamespace::NamespaceB
|
84
|
-
}.should raise_error(/something wrong with/)
|
85
|
-
# }.should raise_error(/Class '.+' is not defined in the '.+' Namespace!/)
|
103
|
+
with_load_path "#{spec_dir}/another_namespace" do
|
104
|
+
SomeNamespace::NamespaceA
|
105
|
+
-> {SomeNamespace::NamespaceB}.should raise_error(/something wrong with/)
|
106
|
+
end
|
86
107
|
end
|
87
108
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
autoload_path class_reloading_dir
|
109
|
+
it "should reload class files" do
|
110
|
+
with_load_path "#{spec_dir}/reloading" do
|
111
|
+
watcher = ClassLoader.watcher
|
112
|
+
watcher.paths << "#{spec_dir}/reloading"
|
93
113
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
end
|
98
|
-
RUBY
|
114
|
+
# Watcher should not load classes by itself.
|
115
|
+
watcher.check
|
116
|
+
Object.const_defined?(:SomeClass).should be_false
|
99
117
|
|
100
|
-
|
101
|
-
|
102
|
-
ClassReloadingSpec.check.should == :value
|
118
|
+
# Autoloading class.
|
119
|
+
SomeClass.version.should == 1
|
103
120
|
|
121
|
+
# Writing new version of file.
|
104
122
|
code = <<-RUBY
|
105
|
-
class
|
106
|
-
|
123
|
+
class SomeClass
|
124
|
+
def self.version; 2 end
|
107
125
|
end
|
108
126
|
RUBY
|
109
127
|
|
110
|
-
|
128
|
+
class_path = "#{spec_dir}/reloading/some_class.rb"
|
129
|
+
File.open(class_path, 'w'){|f| f.write code}
|
111
130
|
|
112
|
-
|
113
|
-
|
114
|
-
|
131
|
+
# File system doesn't notice small changes in file update date, so
|
132
|
+
# we stubbing it.
|
133
|
+
updated_at = File.mtime class_path
|
134
|
+
File.stub!(:mtime).and_return(updated_at + 1)
|
115
135
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
# UnloadOldClass.instance_variable_get("@value").should == nil
|
122
|
-
# end
|
136
|
+
# Should reload class.
|
137
|
+
watcher.stub! :warn
|
138
|
+
ClassLoader.watcher.check
|
139
|
+
SomeClass.version.should == 2
|
140
|
+
end
|
123
141
|
end
|
124
142
|
|
125
143
|
it "should be able to preload all classes in production" do
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
Object.const_defined?(:PreloadingSpec).should be_true
|
130
|
-
end
|
144
|
+
with_load_path "#{spec_dir}/preloading" do
|
145
|
+
Object.const_defined?(:SomeClass).should be_false
|
146
|
+
Object.const_defined?(:SomeNamespace).should be_false
|
131
147
|
|
132
|
-
|
133
|
-
autoload_path "#{spec_dir}/underscored"
|
148
|
+
ClassLoader.preload "#{spec_dir}/preloading"
|
134
149
|
|
135
|
-
|
150
|
+
Object.const_defined?(:SomeClass).should be_true
|
151
|
+
Object.const_defined?(:SomeNamespace).should be_true
|
152
|
+
SomeNamespace.const_defined?(:AnotherClass).should be_true
|
153
|
+
end
|
136
154
|
end
|
137
155
|
end
|
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: 0.
|
4
|
+
version: 3.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-10-29 00:00:00.000000000Z
|
13
13
|
dependencies: []
|
14
14
|
description:
|
15
15
|
email:
|
@@ -19,36 +19,29 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- Rakefile
|
21
21
|
- readme.md
|
22
|
-
- lib/class_loader/chained_adapter.rb
|
23
22
|
- lib/class_loader/class_loader.rb
|
24
|
-
- lib/class_loader/file_system_adapter/camel_case_translator.rb
|
25
|
-
- lib/class_loader/file_system_adapter/underscored_translator.rb
|
26
|
-
- lib/class_loader/file_system_adapter.rb
|
27
|
-
- lib/class_loader/spec.rb
|
28
23
|
- lib/class_loader/support.rb
|
29
|
-
- lib/class_loader/
|
24
|
+
- lib/class_loader/watcher.rb
|
30
25
|
- lib/class_loader.rb
|
31
|
-
- spec/class_loader_spec/anonymous_class/
|
32
|
-
- spec/class_loader_spec/another_namespace/
|
33
|
-
- spec/class_loader_spec/another_namespace/
|
34
|
-
- spec/class_loader_spec/
|
35
|
-
- spec/class_loader_spec/
|
36
|
-
- spec/class_loader_spec/
|
37
|
-
- spec/class_loader_spec/
|
38
|
-
- spec/class_loader_spec/
|
39
|
-
- spec/class_loader_spec/
|
40
|
-
- spec/class_loader_spec/
|
41
|
-
- spec/class_loader_spec/
|
26
|
+
- spec/class_loader_spec/anonymous_class/some_namespace/some_class.rb
|
27
|
+
- spec/class_loader_spec/another_namespace/some_namespace/namespace_a.rb
|
28
|
+
- spec/class_loader_spec/another_namespace/some_namespace/namespace_b.rb
|
29
|
+
- spec/class_loader_spec/another_namespace/some_namespace.rb
|
30
|
+
- spec/class_loader_spec/basics/another_class.rb
|
31
|
+
- spec/class_loader_spec/basics/some_class.rb
|
32
|
+
- spec/class_loader_spec/basics/some_namespace/some_class.rb
|
33
|
+
- spec/class_loader_spec/basics/some_namespace.rb
|
34
|
+
- spec/class_loader_spec/infinity_loop/some_class.rb
|
35
|
+
- spec/class_loader_spec/namespace_resolving/some_namespace/some_class.rb
|
36
|
+
- spec/class_loader_spec/namespace_resolving/some_namespace.rb
|
37
|
+
- spec/class_loader_spec/only_once/some_class.rb
|
38
|
+
- spec/class_loader_spec/preloading/some_class.rb
|
39
|
+
- spec/class_loader_spec/preloading/some_namespace/another_class.rb
|
40
|
+
- spec/class_loader_spec/preloading/some_namespace.rb
|
41
|
+
- spec/class_loader_spec/reloading/some_class.rb
|
42
42
|
- spec/class_loader_spec/underscored/underscored_namespace/underscored_class.rb
|
43
43
|
- spec/class_loader_spec/unload_old_class/UnloadOldClass.rb
|
44
44
|
- spec/class_loader_spec.rb
|
45
|
-
- spec/file_system_adapter_spec/common/SomeNamespace/SomeClass.rb
|
46
|
-
- spec/file_system_adapter_spec/multiple_class_paths/path_a/ClassInPathA.rb
|
47
|
-
- spec/file_system_adapter_spec/multiple_class_paths/path_b/ClassInPathB.rb
|
48
|
-
- spec/file_system_adapter_spec/shouldnt_mess/CamelCaseClass.rb
|
49
|
-
- spec/file_system_adapter_spec/shouldnt_mess/underscored_class.rb
|
50
|
-
- spec/file_system_adapter_spec.rb
|
51
|
-
- spec/translators_spec.rb
|
52
45
|
homepage: http://github.com/alexeypetrushin/class_loader
|
53
46
|
licenses: []
|
54
47
|
post_install_message:
|
@@ -72,5 +65,5 @@ rubyforge_project:
|
|
72
65
|
rubygems_version: 1.8.6
|
73
66
|
signing_key:
|
74
67
|
specification_version: 3
|
75
|
-
summary: Automatically
|
68
|
+
summary: Automatically find, load and reload classes
|
76
69
|
test_files: []
|
@@ -1,48 +0,0 @@
|
|
1
|
-
class ClassLoader::ChainedAdapter
|
2
|
-
attr_accessor :adapters
|
3
|
-
|
4
|
-
def initialize
|
5
|
-
@adapters = []
|
6
|
-
end
|
7
|
-
|
8
|
-
%w(
|
9
|
-
exist?
|
10
|
-
read
|
11
|
-
to_file_path
|
12
|
-
to_class_name
|
13
|
-
).each do |method|
|
14
|
-
define_method method do |*args|
|
15
|
-
catch :found do
|
16
|
-
adapters.each do |a|
|
17
|
-
value = a.send method, *args
|
18
|
-
throw :found, value if value
|
19
|
-
end
|
20
|
-
nil
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def each_changed_class &block
|
26
|
-
adapters.each{|a| a.each_changed_class &block}
|
27
|
-
end
|
28
|
-
|
29
|
-
def each_class &block
|
30
|
-
adapters.each{|a| a.each_class &block}
|
31
|
-
end
|
32
|
-
|
33
|
-
def clear
|
34
|
-
adapters.each{|a| a.clear}
|
35
|
-
end
|
36
|
-
|
37
|
-
def add_path *args
|
38
|
-
adapters.each do |a|
|
39
|
-
a.add_path *args if a.respond_to? :add_path
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def delete_path *args
|
44
|
-
adapters.each do |a|
|
45
|
-
a.add_path *args if a.respond_to? :delete_path
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
class ClassLoader::CamelCaseTranslator
|
2
|
-
def self.to_class_name normalized_file_name
|
3
|
-
raise "internall error, invalid format for #{normalized_file_name}!" if normalized_file_name =~ /^\//
|
4
|
-
normalized_file_name.gsub('/', '::')
|
5
|
-
end
|
6
|
-
|
7
|
-
def self.to_file_path class_name
|
8
|
-
raise "internall error, invalid format for #{class_name}!" if class_name =~ /^::/
|
9
|
-
class_name.gsub('::', '/')
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.is_it_class? normalized_file_name
|
13
|
-
raise "internall error, invalid format for #{normalized_file_name}!" if normalized_file_name =~ /^\//
|
14
|
-
normalized_file_name[0..0] =~ /[A-Z]/
|
15
|
-
end
|
16
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module ClassLoader::UnderscoredTranslator
|
2
|
-
def self.to_class_name normalized_file_name
|
3
|
-
raise "internall error, invalid format for #{normalized_file_name}!" if normalized_file_name =~ /^\//
|
4
|
-
normalized_file_name.camelize
|
5
|
-
end
|
6
|
-
|
7
|
-
def self.to_file_path class_name
|
8
|
-
raise "internall error, invalid format for #{class_name}!" if class_name =~ /^::/
|
9
|
-
class_name.underscore
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.is_it_class? normalized_file_name
|
13
|
-
raise "internall error, invalid format for #{normalized_file_name}!" if normalized_file_name =~ /^\//
|
14
|
-
normalized_file_name[0..0] =~ /[a-z]/
|
15
|
-
end
|
16
|
-
end
|