class_loader 0.4.15 → 3.0.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/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
|