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.
Files changed (44) hide show
  1. data/Rakefile +2 -1
  2. data/lib/class_loader/class_loader.rb +99 -207
  3. data/lib/class_loader/support.rb +0 -11
  4. data/lib/class_loader/watcher.rb +44 -0
  5. data/lib/class_loader.rb +6 -19
  6. data/readme.md +27 -28
  7. data/spec/class_loader_spec/anonymous_class/some_namespace/some_class.rb +2 -0
  8. data/spec/class_loader_spec/another_namespace/some_namespace/namespace_a.rb +2 -0
  9. data/spec/class_loader_spec/another_namespace/{AnotherNamespace/NamespaceB.rb → some_namespace/namespace_b.rb} +1 -1
  10. data/spec/class_loader_spec/another_namespace/some_namespace.rb +2 -0
  11. data/spec/class_loader_spec/basics/another_class.rb +2 -0
  12. data/spec/class_loader_spec/{basic/BasicSpec/SomeNamespace/SomeClass.rb → basics/some_class.rb} +0 -0
  13. data/spec/class_loader_spec/basics/some_namespace/some_class.rb +2 -0
  14. data/spec/class_loader_spec/basics/some_namespace.rb +2 -0
  15. data/spec/class_loader_spec/infinity_loop/some_class.rb +2 -0
  16. data/spec/class_loader_spec/namespace_resolving/some_namespace/some_class.rb +2 -0
  17. data/spec/class_loader_spec/namespace_resolving/some_namespace.rb +2 -0
  18. data/spec/class_loader_spec/{namespace_type_resolving/NamespaceIsAlreadyDefinedAsClass/SomeClass.rb → only_once/some_class.rb} +0 -0
  19. data/spec/class_loader_spec/{namespace_type_resolving/NamespaceTypeResolving/SomeClass.rb → preloading/some_class.rb} +0 -0
  20. data/spec/class_loader_spec/preloading/some_namespace/another_class.rb +2 -0
  21. data/spec/class_loader_spec/preloading/some_namespace.rb +2 -0
  22. data/spec/class_loader_spec/reloading/some_class.rb +3 -0
  23. data/spec/class_loader_spec.rb +96 -78
  24. metadata +20 -27
  25. data/lib/class_loader/chained_adapter.rb +0 -48
  26. data/lib/class_loader/file_system_adapter/camel_case_translator.rb +0 -16
  27. data/lib/class_loader/file_system_adapter/underscored_translator.rb +0 -16
  28. data/lib/class_loader/file_system_adapter.rb +0 -145
  29. data/lib/class_loader/spec.rb +0 -17
  30. data/lib/class_loader/tasks.rb +0 -8
  31. data/spec/class_loader_spec/anonymous_class/AnonymousSpec/ClassInsideOfAnonymousClass.rb +0 -2
  32. data/spec/class_loader_spec/another_namespace/AnotherNamespace/NamespaceA.rb +0 -2
  33. data/spec/class_loader_spec/basic/BasicSpec.rb +0 -2
  34. data/spec/class_loader_spec/infinity_loop/InfinityLoop.rb +0 -2
  35. data/spec/class_loader_spec/namespace_type_resolving/NamespaceTypeResolving.rb +0 -2
  36. data/spec/class_loader_spec/only_once/OnlyOnceSpec.rb +0 -2
  37. data/spec/class_loader_spec/preloading/PreloadingSpec.rb +0 -2
  38. data/spec/file_system_adapter_spec/common/SomeNamespace/SomeClass.rb +0 -1
  39. data/spec/file_system_adapter_spec/multiple_class_paths/path_a/ClassInPathA.rb +0 -2
  40. data/spec/file_system_adapter_spec/multiple_class_paths/path_b/ClassInPathB.rb +0 -2
  41. data/spec/file_system_adapter_spec/shouldnt_mess/CamelCaseClass.rb +0 -0
  42. data/spec/file_system_adapter_spec/shouldnt_mess/underscored_class.rb +0 -0
  43. data/spec/file_system_adapter_spec.rb +0 -112
  44. data/spec/translators_spec.rb +0 -35
@@ -0,0 +1,2 @@
1
+ class SomeNamespace::SomeClass
2
+ end
@@ -0,0 +1,2 @@
1
+ class SomeNamespace::NamespaceA
2
+ end
@@ -1,4 +1,4 @@
1
- class NamespaceB
1
+ class SomeNamespace::NamespaceB
2
2
  class InnerClass; end
3
3
 
4
4
  InnerClass::NamespaceA
@@ -0,0 +1,2 @@
1
+ module SomeNamespace
2
+ end
@@ -0,0 +1,2 @@
1
+ class AnotherClass
2
+ end
@@ -0,0 +1,2 @@
1
+ class SomeNamespace::SomeClass
2
+ end
@@ -0,0 +1,2 @@
1
+ module SomeNamespace
2
+ end
@@ -0,0 +1,2 @@
1
+ class InvalidNameOfSomeClass
2
+ end
@@ -0,0 +1,2 @@
1
+ class SomeNamespace::SomeClass
2
+ end
@@ -0,0 +1,2 @@
1
+ module SomeNamespace
2
+ end
@@ -0,0 +1,2 @@
1
+ class SomeNamespace::AnotherClass
2
+ end
@@ -0,0 +1,2 @@
1
+ module SomeNamespace
2
+ end
@@ -0,0 +1,3 @@
1
+ class SomeClass
2
+ def self.version; 1 end
3
+ end
@@ -1,11 +1,20 @@
1
1
  require 'rspec_ext'
2
2
  require "class_loader"
3
3
 
4
- describe ClassLoader do
4
+ describe 'Autoloading classes' do
5
5
  with_tmp_spec_dir
6
6
 
7
- after :all do
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
- after do
23
- ClassLoader.clear
24
- end
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
- it "should load classes from class path" do
27
- autoload_path "#{spec_dir}/basic"
37
+ SomeNamespace::SomeClass.name.should == 'SomeNamespace::SomeClass'
38
+ SomeNamespace.class.should == Module
28
39
 
29
- BasicSpec
30
- BasicSpec::SomeNamespace::SomeClass
40
+ SomeNamespace::AnotherClass
41
+ end
31
42
  end
32
43
 
33
44
  it "should load classes only once" do
34
- autoload_path "#{spec_dir}/only_once"
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
- check = mock
37
- check.should_receive(:loaded).once
38
- ClassLoader.add_observer do |klass|
39
- klass.name.should == "OnlyOnceSpec"
40
- check.loaded
41
- end
58
+ with_load_path "#{spec_dir}/only_once" do
59
+ SomeClass
60
+ SomeClass
61
+ end
42
62
 
43
- OnlyOnceSpec
44
- OnlyOnceSpec
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 is namespace a class or module" do
48
- autoload_path "#{spec_dir}/namespace_type_resolving"
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
- class NamespaceIsAlreadyDefinedAsClass; end
54
- NamespaceIsAlreadyDefinedAsClass::SomeClass
77
+ SomeNamespace.class.should == Module
78
+ SomeNamespace::SomeClass
79
+ end
55
80
  end
56
81
 
57
82
  it "should recognize infinity loop" do
58
- autoload_path "#{spec_dir}/infinity_loop"
59
-
60
- -> {InfinityLoop}.should raise_error(/Class Name .+ doesn't correspond to File Name/)
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
- autoload_path "#{spec_dir}/anonymous_class"
65
-
66
- module ::AnonymousSpec
67
- class << self
68
- def anonymous
69
- ClassInsideOfAnonymousClass
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
- AnonymousSpec.anonymous
98
+ SomeNamespace.anonymous
99
+ end
75
100
  end
76
101
 
77
102
  it "should raise exception if class defined in another namespace" do
78
- autoload_path "#{spec_dir}/another_namespace"
79
-
80
- AnotherNamespace::NamespaceA
81
- # ClassLoader.error_on_defined_constant = true
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
- describe "reloading" do
89
- it "should reload class files" do
90
- class_reloading_dir = "#{spec_dir}/class_reloading"
91
- fname = "#{class_reloading_dir}/ClassReloadingSpec.rb"
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
- code = <<-RUBY
95
- class ClassReloadingSpec
96
- def self.check; :value end
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
- File.open(fname, 'w'){|f| f.write code}
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 ClassReloadingSpec
106
- def self.check; :another_value end
123
+ class SomeClass
124
+ def self.version; 2 end
107
125
  end
108
126
  RUBY
109
127
 
110
- File.open(fname, 'w'){|f| f.write code}
128
+ class_path = "#{spec_dir}/reloading/some_class.rb"
129
+ File.open(class_path, 'w'){|f| f.write code}
111
130
 
112
- ClassLoader.reload_class(ClassReloadingSpec.name)
113
- ClassReloadingSpec.check.should == :another_value
114
- end
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
- # Outdated
117
- # it "should unload old classes before reloading" do
118
- # autoload_path "#{spec_dir}/unload_old_class"
119
- # UnloadOldClass.instance_variable_set "@value", :value
120
- # ClassLoader.reload_class(UnloadOldClass.name)
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
- autoload_path "#{spec_dir}/preloading"
127
- Object.const_defined?(:PreloadingSpec).should be_false
128
- ClassLoader.preload!
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
- it "underscored smoke test" do
133
- autoload_path "#{spec_dir}/underscored"
148
+ ClassLoader.preload "#{spec_dir}/preloading"
134
149
 
135
- UnderscoredNamespace::UnderscoredClass
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.15
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-09-22 00:00:00.000000000Z
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/tasks.rb
24
+ - lib/class_loader/watcher.rb
30
25
  - lib/class_loader.rb
31
- - spec/class_loader_spec/anonymous_class/AnonymousSpec/ClassInsideOfAnonymousClass.rb
32
- - spec/class_loader_spec/another_namespace/AnotherNamespace/NamespaceA.rb
33
- - spec/class_loader_spec/another_namespace/AnotherNamespace/NamespaceB.rb
34
- - spec/class_loader_spec/basic/BasicSpec/SomeNamespace/SomeClass.rb
35
- - spec/class_loader_spec/basic/BasicSpec.rb
36
- - spec/class_loader_spec/infinity_loop/InfinityLoop.rb
37
- - spec/class_loader_spec/namespace_type_resolving/NamespaceIsAlreadyDefinedAsClass/SomeClass.rb
38
- - spec/class_loader_spec/namespace_type_resolving/NamespaceTypeResolving/SomeClass.rb
39
- - spec/class_loader_spec/namespace_type_resolving/NamespaceTypeResolving.rb
40
- - spec/class_loader_spec/only_once/OnlyOnceSpec.rb
41
- - spec/class_loader_spec/preloading/PreloadingSpec.rb
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 finds, loads and reloads classes
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