class_loader 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,66 +1,10 @@
1
- require 'rake'
2
- require 'fileutils'
3
- current_dir = File.expand_path(File.dirname(__FILE__))
4
- Dir.chdir current_dir
1
+ require 'rake_ext'
5
2
 
6
-
7
- #
8
- # Specs
9
- #
10
- require 'spec/rake/spectask'
11
-
12
- task :default => :spec
13
-
14
- Spec::Rake::SpecTask.new('spec') do |t|
15
- t.spec_files = FileList["spec/**/*_spec.rb"].select{|f| f !~ /\/_/}
16
- t.libs = ["#{current_dir}/lib"]
17
- end
18
-
19
-
20
- #
21
- # Gem
22
- #
23
- require 'rake/clean'
24
- require 'rake/gempackagetask'
25
-
26
- gem_options = {
3
+ gem_spec(
27
4
  :name => "class_loader",
28
- :version => "0.3.5",
5
+ :version => "0.3.6",
29
6
  :summary => "Automatically finds and loads classes",
30
- :dependencies => %w()
31
- }
32
-
33
- gem_name = gem_options[:name]
34
- spec = Gem::Specification.new do |s|
35
- gem_options.delete(:dependencies).each{|d| s.add_dependency d}
36
- gem_options.each{|k, v| s.send "#{k}=", v}
37
-
38
- s.name = gem_name
39
- s.author = "Alexey Petrushin"
40
- s.homepage = "http://github.com/alexeypetrushin/#{gem_options[:name]}"
41
- s.require_path = "lib"
42
- s.files = (%w{Rakefile readme.md} + Dir.glob("{lib,spec}/**/*"))
43
-
44
- s.platform = Gem::Platform::RUBY
45
- s.has_rdoc = true
46
- end
47
-
48
- package_dir = "#{current_dir}/build"
49
- Rake::GemPackageTask.new(spec) do |p|
50
- p.need_tar = true if RUBY_PLATFORM !~ /mswin/
51
- p.need_zip = true
52
- p.package_dir = package_dir
53
- end
54
-
55
- task :push do
56
- # dir = Dir.chdir package_dir do
57
- gem_file = Dir.glob("#{package_dir}/#{gem_name}*.gem").first
58
- system "gem push #{gem_file}"
59
- # end
60
- end
61
-
62
- task :clean do
63
- system "rm -r #{package_dir}"
64
- end
65
7
 
66
- task :release => [:gem, :push, :clean]
8
+ :author => "Alexey Petrushin",
9
+ :homepage => "http://github.com/alexeypetrushin/class_loader"
10
+ )
@@ -132,8 +132,8 @@ module ClassLoader
132
132
  #
133
133
  attr_accessor :watch_interval
134
134
  def start_watching!
135
- unless watching_thread
136
- self.watching_thread = Thread.new do
135
+ unless @watching_thread
136
+ @watching_thread = Thread.new do
137
137
  while true
138
138
  sleep(watch_interval || 2)
139
139
  adapter.each_changed_class do |class_name|
@@ -146,9 +146,9 @@ module ClassLoader
146
146
  end
147
147
 
148
148
  def stop_watching!
149
- if watching_thread
150
- watching_thread.kill
151
- self.watching_thread = nil
149
+ if @watching_thread
150
+ @watching_thread.kill
151
+ @watching_thread = nil
152
152
  end
153
153
  end
154
154
 
@@ -27,11 +27,11 @@ module ClassLoader
27
27
  def to_file_path class_name
28
28
  file_path, exist = @file_name_cache[class_name] || []
29
29
  unless exist
30
- file_name = translator.to_file_path class_name
30
+ normalized_name = translator.to_file_path class_name
31
31
  file_path = catch :found do
32
32
  # files
33
33
  paths.each do |base|
34
- try = "#{base}/#{file_name}.rb"
34
+ try = "#{base}/#{normalized_name}.rb"
35
35
  if File.exist? try
36
36
  throw :found, try
37
37
  end
@@ -39,7 +39,7 @@ module ClassLoader
39
39
 
40
40
  # dirs
41
41
  paths.each do |base|
42
- try = "#{base}/#{file_name}"
42
+ try = "#{base}/#{normalized_name}"
43
43
  if File.exist? try
44
44
  throw :found, try
45
45
  end
@@ -57,19 +57,23 @@ module ClassLoader
57
57
  raise "Internal error, file_name should be absolute path (#{normalized_path})!" unless normalized_path =~ /^\//
58
58
  raise "Internal error, file_name should be without .rb suffix (#{normalized_path})!" if normalized_path =~ /\.rb$/
59
59
 
60
- if base_path = paths.find{|path| normalized_path.start_with? path}
61
- _to_class_name normalized_path, base_path
62
- else
63
- nil
60
+ paths.each do |base_path|
61
+ if normalized_path.start_with? base_path
62
+ normalized_name = normalized_path.sub(base_path, '')
63
+ if translator.is_it_class? normalized_name
64
+ return translator.to_class_name(normalized_name)
65
+ end
66
+ end
64
67
  end
68
+ nil
65
69
  end
66
70
 
67
- def add_path path, watch = false
68
- path = File.expand_path(path)
69
- raise "#{path} already added!" if paths.include? path
71
+ def add_path base_path, watch = false
72
+ base_path = File.expand_path(base_path)
73
+ raise "#{base_path} already added!" if paths.include? base_path
70
74
 
71
- paths << path
72
- watched_paths << path if watch
75
+ paths << base_path
76
+ watched_paths << base_path if watch
73
77
  end
74
78
 
75
79
  def clear
@@ -79,15 +83,15 @@ module ClassLoader
79
83
 
80
84
  def each_changed_class &block
81
85
  if @first_check
82
- each_watched_file{|base_path, file_path| remember_file file_path}
86
+ each_watched_file{|file_path, file_name| remember_file file_path}
83
87
  @first_check = false
84
88
  else
85
- each_watched_file do |base_path, file_path|
89
+ each_watched_file do |file_path, file_name|
86
90
  if file_changed? file_path
87
91
  remember_file file_path
88
92
 
89
- normalized_path = file_path.sub(/\.rb$/, "")
90
- block.call _to_class_name(normalized_path, base_path)
93
+ normalized_name = file_name.sub(/\.rb$/, "")
94
+ block.call translator.to_class_name(normalized_name)
91
95
  end
92
96
  end
93
97
  end
@@ -97,34 +101,36 @@ module ClassLoader
97
101
  @paths.each do |base_path|
98
102
  Dir.glob("#{base_path}/**/*.rb").each do |file_path|
99
103
  normalized_path = file_path.sub(/\.rb$/, "")
100
- block.call _to_class_name(normalized_path, base_path)
104
+
105
+ normalized_name = normalized_path.sub(base_path, '')
106
+ class_name = translator.to_class_name(normalized_name)
107
+ block.call class_name
101
108
  end
102
109
  end
103
110
  end
104
111
 
105
- protected
106
- attr_reader :paths, :watched_paths, :watcher, :watched_files
107
-
108
- def each_watched_file &block
109
- @watched_paths.each do |base_path|
110
- Dir.glob("#{base_path}/**/*.rb").each do |file_path|
111
- block.call base_path, file_path
112
+ def each_watched_file &block
113
+ @watched_paths.each do |base_path|
114
+ Dir.glob("#{base_path}/**/*.rb").each do |file_path|
115
+ file_name = file_path.sub(base_path, '')
116
+ if translator.is_it_class? file_name
117
+ block.call file_path, file_name
112
118
  end
113
119
  end
114
120
  end
121
+ end
122
+
123
+ protected
124
+ attr_reader :paths, :watched_paths, :watcher, :watched_files
115
125
 
116
- def file_changed? path
117
- old_time = watched_files[path]
118
- old_time == nil or old_time != File.mtime(path)
126
+ def file_changed? file_path
127
+ old_time = watched_files[file_path]
128
+ old_time == nil or old_time != File.mtime(file_path)
119
129
  end
120
130
 
121
- def remember_file path
122
- watched_files[path] = File.mtime(path)
131
+ def remember_file file_path
132
+ watched_files[file_path] = File.mtime(file_path)
123
133
  end
124
134
 
125
- def _to_class_name file_path, base_path
126
- relative_name = file_path.sub(base_path, '')
127
- translator.to_class_name(relative_name)
128
- end
129
135
  end
130
136
  end
@@ -7,5 +7,9 @@ module ClassLoader
7
7
  def self.to_file_path class_name
8
8
  class_name.sub(/^::/, '').gsub('::', '/')
9
9
  end
10
+
11
+ def self.is_it_class? file_name
12
+ file_name !~ /_/
13
+ end
10
14
  end
11
15
  end
@@ -7,5 +7,9 @@ module ClassLoader
7
7
  def self.to_file_path class_name
8
8
  class_name.sub(/^::/, '').underscore
9
9
  end
10
+
11
+ def self.is_it_class? file_name
12
+ file_name !~ /[A-Z]/
13
+ end
10
14
  end
11
15
  end
@@ -1,4 +1,4 @@
1
- require "#{File.expand_path(File.dirname(__FILE__))}/helper"
1
+ require 'rspec_ext'
2
2
  require "class_loader"
3
3
 
4
4
  describe ClassLoader do
@@ -1,5 +1,8 @@
1
- require "#{File.expand_path(File.dirname(__FILE__))}/helper"
1
+ require "rspec_ext"
2
+
3
+ require "class_loader/support"
2
4
  require "class_loader/file_system_adapter/camel_case_translator"
5
+ require "class_loader/file_system_adapter/underscored_translator"
3
6
  require "class_loader/file_system_adapter"
4
7
  require "class_loader/chained_adapter"
5
8
 
@@ -61,7 +64,7 @@ describe ClassLoader::FileSystemAdapter do
61
64
  lambda{@adapter.add_path "#{@dir}/common"}.should raise_error(/already added/)
62
65
  end
63
66
 
64
- describe "file watching" do
67
+ describe "file watching" do
65
68
  def changed_classes
66
69
  changed = []
67
70
  @adapter.each_changed_class{|c| changed << c}
@@ -80,12 +83,40 @@ describe ClassLoader::FileSystemAdapter do
80
83
  @adapter.add_path "#{@dir}/watching", true
81
84
 
82
85
  changed_classes.should == []
83
-
86
+
84
87
  sleep(1) && write_file("watching/SomeClass.rb", "SomeClass")
85
88
  changed_classes.should == ["SomeClass"]
86
89
 
87
90
  sleep(1) && write_file("watching/SomeClass.rb", "SomeClass")
88
91
  changed_classes.should == ["SomeClass"]
89
- end
92
+ end
93
+ end
94
+
95
+ describe "Underscored shouldn't mess with CamelCase" do
96
+ before :each do
97
+ @camel_case_adapter = ClassLoader::FileSystemAdapter.new(ClassLoader::CamelCaseTranslator)
98
+ @camel_case_adapter.add_path "#{@dir}/shouldnt_mess", true
99
+ @camel_case_file_path = "#{@dir}/shouldnt_mess/CamelCaseClass.rb"
100
+
101
+ @underscored_adapter = ClassLoader::FileSystemAdapter.new(ClassLoader::UnderscoredTranslator)
102
+ @underscored_adapter.add_path "#{@dir}/shouldnt_mess", true
103
+ @underscored_file_path = "#{@dir}/shouldnt_mess/underscored_class.rb"
104
+ end
105
+
106
+
107
+ it "should watch only files understable by it's translator (CamelCase shouldn't load Underscored)" do
108
+ watched = []
109
+ @camel_case_adapter.each_watched_file{|file_path, relative_name| watched << relative_name}
110
+ watched.should == ["/CamelCaseClass.rb"]
111
+
112
+ watched = []
113
+ @underscored_adapter.each_watched_file{|file_path, relative_name| watched << relative_name}
114
+ watched.should == ["/underscored_class.rb"]
115
+ end
116
+
117
+ it "CamelCase to_class_name shouldn't translate Underscored" do
118
+ @camel_case_adapter.to_class_name(@camel_case_file_path.sub(/\.rb$/, '')).should == "CamelCaseClass"
119
+ @underscored_adapter.to_class_name(@underscored_file_path.sub(/\.rb$/, '')).should == "UnderscoredClass"
120
+ end
90
121
  end
91
122
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: class_loader
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 5
10
- version: 0.3.5
9
+ - 6
10
+ version: 0.3.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Alexey Petrushin
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-10-11 00:00:00 +04:00
18
+ date: 2010-10-12 00:00:00 +04:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -55,8 +55,8 @@ files:
55
55
  - spec/file_system_adapter_spec_data/common/SomeNamespace/SomeClass.rb
56
56
  - spec/file_system_adapter_spec_data/multiple_class_paths/path_a/ClassInPathA.rb
57
57
  - spec/file_system_adapter_spec_data/multiple_class_paths/path_b/ClassInPathB.rb
58
- - spec/helper.rb
59
- - spec/spec.opts
58
+ - spec/file_system_adapter_spec_data/shouldnt_mess/CamelCaseClass.rb
59
+ - spec/file_system_adapter_spec_data/shouldnt_mess/underscored_class.rb
60
60
  has_rdoc: true
61
61
  homepage: http://github.com/alexeypetrushin/class_loader
62
62
  licenses: []
data/spec/helper.rb DELETED
@@ -1,22 +0,0 @@
1
- require 'spec'
2
- require 'fileutils'
3
-
4
- def prepare_spec_data spec_file_name
5
- dir = File.expand_path(spec_file_name.sub(/\.rb$/, ''))
6
- original_data_dir = dir + "_data"
7
-
8
- FileUtils.rm_r dir if File.exist? dir
9
- FileUtils.cp_r original_data_dir, dir
10
-
11
- dir
12
- end
13
-
14
- def clean_spec_data spec_file_name
15
- dir = spec_file_name.sub(/\.rb$/, '')
16
- FileUtils.rm_r dir if File.exist? dir
17
- end
18
-
19
- def remove_constants *args
20
- args = args.first if args.size == 1 and args.first.is_a?(Array)
21
- args.each{|c| Object.send :remove_const, c if Object.const_defined? c}
22
- end
data/spec/spec.opts DELETED
@@ -1,2 +0,0 @@
1
- --color
2
- --reverse