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.
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