loader 2.1.0 → 2.2.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7ad3783bf1820c1767808c4f18415a836a3886d1
4
- data.tar.gz: e249da6f02da8f4ad0fd54b9d56b5856c6687a06
3
+ metadata.gz: 02599efb933b64f6bd6b100181f487c1dc7bf78d
4
+ data.tar.gz: ddd99341ee26528275ab5e833e86557f1c4f28a2
5
5
  SHA512:
6
- metadata.gz: 985dae6027aec5cd31181e046ccec617a9365e2415af9554b47b2644b8b6344e106968a13ad0c374864b3f803778e784834e55290cc7f38c94b2580e39b2e4b1
7
- data.tar.gz: 55d8ebc7f30b4814ae6ea36d361069f6dc230f99720654bb791dcad77640c77b59e5df2bce938612fc101df005eba146fbdef8955d9e7cff7a792c50b55b4c66
6
+ metadata.gz: fc9b57c5be9f33c5655293f1126233583fca686d63729bd42c5581c8c1b084dfa743bb46605fcd64e4678c74ebe47dddad2f45ab50646121c54c9211052e8d8f
7
+ data.tar.gz: 530795f8061e254d6507eb4de1d0d086e818e769849ddd80cedaee4799a93aaf029f43548f6495f48d2c4e3143f7dfaef72f2c17ce0523784828bce1336247d7
data/VERSION CHANGED
@@ -1 +1 @@
1
- 2.1.0
1
+ 2.2.1
@@ -1,8 +1,8 @@
1
1
  #encoding: UTF-8
2
-
3
2
  module Loader
4
3
  end
5
4
 
6
5
  require 'loader/meta'
6
+ require 'loader/helpers'
7
7
  require 'loader/require'
8
8
  require 'loader/autoload'
@@ -1,95 +1,7 @@
1
- module Loader
2
-
3
- module AutoLoad
4
- module Support
5
- class << self
6
-
7
- def pwd
8
- if !!ENV['BUNDLE_GEMFILE']
9
- ENV['BUNDLE_GEMFILE'].split(File::Separator)[0..-2].join(File::Separator)
10
- elsif defined?(Rails) && Rails.respond_to?(:root) && Rails.root
11
- Rails.root.to_s
12
- else
13
- Dir.pwd
14
- end
15
- end
16
-
17
- def try_load_by(caller_class,name)
18
- levels = generate_levels(caller_class, name)
19
- [
20
- nil,
21
- 'lib',
22
- File.join('{application,app,api}','*'),
23
- File.join('**','*')
24
- ].each do |folder|
25
- return if load_by_folder(levels,folder)
26
- end
27
- end
28
-
29
- def load_by_folder(levels,folder=nil)
30
-
31
- desc_ary(levels.map{|str| File.join(*[pwd,folder,"#{underscore(str)}.rb"].compact)}).each do |path_constructor|
32
- desc_ary(Dir.glob(path_constructor)).each do |path|
33
- return true if File.exist?(path) && require(path)
34
- end
35
- end
36
-
37
- return false
38
-
39
- end
40
-
41
- def desc_ary(array)
42
- array.sort{|a,b| b.length <=> a.length }
43
- end
44
-
45
- def generate_levels(klass, name)
46
- levels = klass.to_s.split('::').reduce([]) { |m, c|
47
- m << [(last_obj = m.last), c].compact.join('::');m
48
- }.map { |str| [str, name].join('::') }
49
- levels.unshift(name.to_s)
50
- return levels
51
- end
52
-
53
- def try_fetch_constant(caller_class, name)
54
- levels = Support.generate_levels(caller_class, name).map { |str| Regexp.escape(str) }
55
- ObjectSpace.each_object(Module) { |obj|
56
- if !!(obj.to_s =~ /^(#{levels.join('|')})$/)
57
- return obj
58
- end
59
- };nil
60
- end
61
-
62
- # Based on ActiveSupport, removed inflections.
63
- # https://github.com/rails/rails/blob/v4.1.0.rc1/activesupport/lib/active_support/inflector/methods.rb
64
- def underscore(camel_cased_word)
65
- word = camel_cased_word.to_s.gsub('::', '/')
66
- word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
67
- word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
68
- word.tr!("-", "_")
69
- word.downcase!
70
- word
71
- end
72
-
73
- end
74
- end
75
-
76
- def const_missing(name)
77
-
78
- Support.try_load_by(self,name)
79
- constant = Support.try_fetch_constant(self, name)
80
-
81
- if constant
82
- return constant
83
- else
84
- super
85
- end
86
-
87
- end
88
-
89
- end
90
-
91
- def self.autoload
92
- ::Module.__send__(:prepend,Loader::AutoLoad)
93
- end
94
-
1
+ require 'loader'
2
+ module Loader::AutoLoad
3
+ require 'loader/autoload/module_patch'
4
+ require 'loader/autoload/loader_patch'
5
+ require 'loader/autoload/fetcher'
6
+ Loader.__send__(:extend,Loader::AutoLoad::LoaderPatch)
95
7
  end
@@ -0,0 +1,55 @@
1
+ module Loader::AutoLoad::Fetcher
2
+
3
+ extend self
4
+ extend ::Loader::Helpers
5
+
6
+ def try_load_by(caller_class, name)
7
+ levels = generate_levels(caller_class, name)
8
+ [
9
+ nil,
10
+ 'lib',
11
+ File.join('{application,app,api}', '*'),
12
+ File.join('**', '*')
13
+ ].each do |folder|
14
+ return if load_by_folder(levels, folder)
15
+ end
16
+ end
17
+
18
+ def load_by_folder(levels, folder=nil)
19
+
20
+ Loader.project_folders.each do |project_folder|
21
+
22
+ desc_ary(levels.map { |str| File.join(*[project_folder, folder, "#{underscore(str)}.rb"].compact) }).each do |path_constructor|
23
+ desc_ary(Dir.glob(path_constructor)).each do |path|
24
+ return true if File.exist?(path) && require(path)
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+ return false
31
+
32
+ end
33
+
34
+ def desc_ary(array)
35
+ array.sort { |a, b| b.length <=> a.length }
36
+ end
37
+
38
+ def generate_levels(klass, name)
39
+ levels = klass.to_s.split('::').reduce([]) { |m, c|
40
+ m << [(last_obj = m.last), c].compact.join('::'); m
41
+ }.map { |str| [str, name].join('::') }
42
+ levels.unshift(name.to_s)
43
+ return levels
44
+ end
45
+
46
+ def try_fetch_constant(caller_class, name)
47
+ levels = generate_levels(caller_class, name).map { |str| Regexp.escape(str) }
48
+ ObjectSpace.each_object(Module) { |obj|
49
+ if !!(obj.to_s =~ /^(#{levels.join('|')})$/)
50
+ return obj
51
+ end
52
+ }; nil
53
+ end
54
+
55
+ end
@@ -0,0 +1,12 @@
1
+ module Loader::AutoLoad::LoaderPatch
2
+
3
+ def project_folders
4
+ @project_folders ||= []
5
+ end
6
+
7
+ def autoload(project_folder=Loader::Helpers.pwd)
8
+ project_folders.push(project_folder)
9
+ ::Module.__send__(:prepend, Loader::AutoLoad::ModulePatch)
10
+ end
11
+
12
+ end
@@ -0,0 +1,10 @@
1
+ module Loader::AutoLoad::ModulePatch
2
+
3
+ def const_missing(name)
4
+ c = Loader::AutoLoad::Fetcher
5
+ c.try_load_by(self,name)
6
+ constant = c.try_fetch_constant(self, name)
7
+ constant ? constant : super
8
+ end
9
+
10
+ end
@@ -0,0 +1,27 @@
1
+ require 'loader'
2
+ module Loader::Helpers
3
+
4
+ extend self
5
+
6
+ def pwd
7
+ if !!ENV['BUNDLE_GEMFILE']
8
+ ENV['BUNDLE_GEMFILE'].split(File::Separator)[0..-2].join(File::Separator)
9
+ elsif defined?(Rails) && Rails.respond_to?(:root) && Rails.root
10
+ Rails.root.to_s
11
+ else
12
+ Dir.pwd
13
+ end
14
+ end
15
+
16
+ # Based on ActiveSupport, removed inflections.
17
+ # https://github.com/rails/rails/blob/v4.1.0.rc1/activesupport/lib/active_support/inflector/methods.rb
18
+ def underscore(camel_cased_word)
19
+ word = camel_cased_word.to_s.gsub('::', '/')
20
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
21
+ word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
22
+ word.tr!("-", "_")
23
+ word.downcase!
24
+ word
25
+ end
26
+
27
+ end
@@ -1,76 +1,74 @@
1
- module Loader
1
+ require 'loader'
2
+ module Loader::ObjectExtension
2
3
 
3
- module ObjectRequireEXT
4
+ # require sender relative directory's files
5
+ # return the directory and the sub directories file names (rb/ru)
6
+ def require_relative_directory(*args)
4
7
 
5
- # require sender relative directory's files
6
- # return the directory and the sub directories file names (rb/ru)
7
- def require_relative_directory *args
8
+ folder= args.select { |e| (e.class <= ::String) }.join(File::Separator)
9
+ opts= {}
10
+ args.select { |e| (e.class <= ::Hash) }.each { |hash| hash.each { |sk, sv| opts[sk]=sv } }
11
+ args.select! { |e| (e.class <= ::Symbol) }
8
12
 
9
- folder= args.select{|e|(e.class <= ::String)}.join(File::Separator)
10
- opts= {}
11
- args.select{|e|(e.class <= ::Hash)}.each{|hash| hash.each{|sk,sv| opts[sk]=sv } }
12
- args.select!{|e|(e.class <= ::Symbol)}
13
+ opts[:recursive] ||= opts.delete(:r) || opts.delete(:R) || !([:recursive, :r, :R,].select { |e| args.include?(e) }.empty?)
14
+ opts[:recursive] = !!opts[:recursive]
13
15
 
14
- opts[:recursive] ||= opts.delete(:r) || opts.delete(:R) || !([:recursive,:r, :R,].select{|e| args.include?(e)}.empty?)
15
- opts[:recursive] = !!opts[:recursive]
16
+ # inclusion and exclusion
17
+ [[:exclude, [:ex, :e, :EX, :E]], [:include, [:in, :i, :IN, :I]]].each do |name, aliases|
16
18
 
17
- # inclusion and exclusion
18
- [[:exclude,[:ex,:e,:EX,:E]],[:include,[:in,:i,:IN,:I]]].each do |name,aliases|
19
-
20
- aliases.each do |one_alias|
21
- opts[name] ||= opts.delete(one_alias)
22
- end
19
+ aliases.each do |one_alias|
20
+ opts[name] ||= opts.delete(one_alias)
21
+ end
23
22
 
24
- opts[name] ||= []
23
+ opts[name] ||= []
25
24
 
26
- # should be REGEXP collection
27
- opts[name] = [*opts[name]].map{|e| !(e.class <= ::Regexp) ? Regexp.new(e.to_s) : e }
25
+ # should be REGEXP collection
26
+ opts[name] = [*opts[name]].map { |e| !(e.class <= ::Regexp) ? Regexp.new(e.to_s) : e }
28
27
 
29
- end
28
+ end
30
29
 
31
30
 
32
- opts[:caller_folder] ||= opts.delete(:f) || opts.delete(:folder) || ::Loader.caller_folder
31
+ opts[:caller_folder] ||= opts.delete(:f) || opts.delete(:folder) || ::Loader.caller_folder
33
32
 
34
- unless folder.to_s[0] == File::Separator
35
- folder= [opts[:caller_folder],folder]
36
- end
33
+ unless folder.to_s[0] == File::Separator
34
+ folder= [opts[:caller_folder], folder]
35
+ end
37
36
 
38
- #> recursive option
39
- begin
40
- path_parts= [*folder]
41
- if opts[:recursive]
42
- path_parts.push("**")
43
- end
44
- path_parts.push("*.{rb,ru}")
37
+ #> recursive option
38
+ begin
39
+ path_parts= [*folder]
40
+ if opts[:recursive]
41
+ path_parts.push("**")
45
42
  end
43
+ path_parts.push("*.{rb,ru}")
44
+ end
46
45
 
47
- return Dir.glob(File.join(*path_parts)).sort_by{|e| e.split(File::Separator).size }.map { |one_path|
46
+ return Dir.glob(File.join(*path_parts)).sort_by { |e| e.split(File::Separator).size }.map { |one_path|
48
47
 
49
- next unless opts[:exclude].select{|regex| one_path =~ regex ? true : false }.empty?
48
+ next unless opts[:exclude].select { |regex| one_path =~ regex ? true : false }.empty?
50
49
 
51
- if opts[:include].empty?
52
- require(one_path);one_path
53
- else
54
- opts[:include].each do |regex|
55
- if one_path =~ regex
56
- require(one_path);one_path
57
- end
50
+ if opts[:include].empty?
51
+ require(one_path); one_path
52
+ else
53
+ opts[:include].each do |regex|
54
+ if one_path =~ regex
55
+ require(one_path); one_path
58
56
  end
59
57
  end
58
+ end
60
59
 
61
- }.compact
62
-
63
- end
60
+ }.compact
64
61
 
65
- alias :require_directory :require_relative_directory
62
+ end
66
63
 
67
- def require_relative_directory_r *args
68
- require_relative_directory *args, r: true, f: Loader.caller_folder
69
- end
70
- alias :require_directory_r :require_relative_directory_r
64
+ alias :require_directory :require_relative_directory
71
65
 
66
+ def require_relative_directory_r(*args)
67
+ require_relative_directory *args, r: true, f: Loader.caller_folder
72
68
  end
73
69
 
70
+ alias :require_directory_r :require_relative_directory_r
71
+
74
72
  end
75
73
 
76
- Object.__send__ :include, Loader::ObjectRequireEXT
74
+ Object.__send__ :include, Loader::ObjectExtension
@@ -20,4 +20,7 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.require_paths = ['lib']
22
22
 
23
+ spec.add_development_dependency('rspec')
24
+ spec.add_development_dependency('rake')
25
+
23
26
  end
@@ -0,0 +1,51 @@
1
+ require_relative '../spec_helper'
2
+ describe Loader::Helpers do
3
+
4
+ let(:project_folder) { 'Path/To/Project/Folder' }
5
+ subject { Loader::Helpers }
6
+
7
+ describe '#pwd' do
8
+
9
+ before do
10
+ allow(ENV).to receive(:[]).with('BUNDLE_GEMFILE').and_return(nil)
11
+ end
12
+
13
+ context 'bundler envernioment variable set' do
14
+
15
+ before do
16
+ allow(ENV).to receive(:[]).with('BUNDLE_GEMFILE').and_return(File.join(project_folder,'Gemfile'))
17
+ end
18
+
19
+ it 'should return the project root folder by bundler gemfile env' do
20
+ expect(subject.pwd).to eq project_folder
21
+ end
22
+
23
+ end
24
+
25
+ context 'Rails is present and the root methot return not nil object' do
26
+
27
+ let(:rails) { double('rails', root: project_folder) }
28
+ before { stub_const('Rails', rails) }
29
+
30
+ it 'should fetch rails root path' do
31
+ expect(subject.pwd).to eq project_folder
32
+ end
33
+
34
+ end
35
+
36
+ context 'when everything fails, fall back use build in Dir module' do
37
+
38
+ it 'should use dir pwd on fallback' do
39
+
40
+ expect(Dir).to receive(:pwd).and_return(project_folder)
41
+ expect(subject.pwd).to eq project_folder
42
+
43
+ end
44
+
45
+ end
46
+
47
+ end
48
+
49
+
50
+
51
+ end
@@ -0,0 +1,4 @@
1
+ $LOAD_PATH.unshift(File.join(__dir__,'..','lib'))
2
+
3
+ require 'rspec'
4
+ require 'loader'
@@ -0,0 +1,7 @@
1
+ $LOAD_PATH.unshift(File.join(__dir__,'..','lib'))
2
+ require 'loader'
3
+
4
+ Loader.autoload __dir__
5
+
6
+ p Cat
7
+
@@ -2,7 +2,7 @@ require_relative 'helper'
2
2
  describe Loader::AutoLoad do
3
3
 
4
4
  before do
5
- Loader::AutoLoad::Support.__send__(:define_singleton_method,:pwd){ __dir__ }
5
+ Loader::Helpers.__send__(:define_singleton_method,:pwd){ __dir__ }
6
6
  end
7
7
 
8
8
  it 'should raise an constant missing error than' do
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loader
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Luzsi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-01 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2015-04-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
13
41
  description: " easy to use File loader that allow directories/project both Lazy Load
14
42
  and Eager load for files and constants. The Eager load for relative directory made
15
43
  for gems by default "
@@ -21,9 +49,7 @@ extra_rdoc_files: []
21
49
  files:
22
50
  - ".gitignore"
23
51
  - ".idea/.name"
24
- - ".idea/.rakeTasks"
25
52
  - ".idea/encodings.xml"
26
- - ".idea/loader.iml"
27
53
  - ".idea/misc.xml"
28
54
  - ".idea/modules.xml"
29
55
  - ".idea/scopes/scope_settings.xml"
@@ -44,15 +70,22 @@ files:
44
70
  - files.rb
45
71
  - lib/loader.rb
46
72
  - lib/loader/autoload.rb
73
+ - lib/loader/autoload/fetcher.rb
74
+ - lib/loader/autoload/loader_patch.rb
75
+ - lib/loader/autoload/module_patch.rb
76
+ - lib/loader/helpers.rb
47
77
  - lib/loader/meta.rb
48
78
  - lib/loader/require.rb
49
79
  - loader.gemspec
80
+ - spec/loader/helpers_spec.rb
81
+ - spec/spec_helper.rb
50
82
  - test/app/controllers/samples_controller.rb
51
83
  - test/helper.rb
52
84
  - test/lib/cat.rb
53
85
  - test/lib/cat/sup.rb
54
86
  - test/lib/cat/tail.rb
55
87
  - test/lib/dog.rb
88
+ - test/manual_test.rb
56
89
  - test/sub/test2.rb
57
90
  - test/test.rb
58
91
  - test/test_autoload.rb
@@ -75,19 +108,22 @@ required_rubygems_version: !ruby/object:Gem::Requirement
75
108
  version: '0'
76
109
  requirements: []
77
110
  rubyforge_project:
78
- rubygems_version: 2.4.5
111
+ rubygems_version: 2.2.2
79
112
  signing_key:
80
113
  specification_version: 4
81
114
  summary: easy to use File loader that allow directories/project both Lazy Load and
82
115
  Eager load for files and constants. The Eager load for relative directory made for
83
116
  gems by default
84
117
  test_files:
118
+ - spec/loader/helpers_spec.rb
119
+ - spec/spec_helper.rb
85
120
  - test/app/controllers/samples_controller.rb
86
121
  - test/helper.rb
87
122
  - test/lib/cat.rb
88
123
  - test/lib/cat/sup.rb
89
124
  - test/lib/cat/tail.rb
90
125
  - test/lib/dog.rb
126
+ - test/manual_test.rb
91
127
  - test/sub/test2.rb
92
128
  - test/test.rb
93
129
  - test/test_autoload.rb
@@ -1,7 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <Settings><!--This file was automatically generated by Ruby plugin.
3
- You are allowed to:
4
- 1. Remove rake task
5
- 2. Add existing rake tasks
6
- To add existing rake tasks automatically delete this file and reload the project.
7
- --><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build loader-1.4.2.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Build and install loader-1.4.2.gem into system gems" fullCmd="install" taksId="install" /><RakeTask description="Create tag v1.4.2 and build and push loader-1.4.2.gem to Rubygems" fullCmd="release" taksId="release" /></RakeGroup></Settings>
@@ -1,20 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="RUBY_MODULE" version="4">
3
- <component name="FacetManager">
4
- <facet type="gem" name="Ruby Gem">
5
- <configuration>
6
- <option name="GEM_APP_ROOT_PATH" value="$MODULE_DIR$" />
7
- <option name="GEM_APP_TEST_PATH" value="$MODULE_DIR$/test" />
8
- <option name="GEM_APP_LIB_PATH" value="$MODULE_DIR$/lib" />
9
- </configuration>
10
- </facet>
11
- </component>
12
- <component name="NewModuleRootManager">
13
- <content url="file://$MODULE_DIR$">
14
- <sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
15
- </content>
16
- <orderEntry type="inheritedJdk" />
17
- <orderEntry type="sourceFolder" forTests="false" />
18
- <orderEntry type="library" scope="PROVIDED" name="bundler (v1.7.12, RVM: ruby-2.1.2) [gem]" level="application" />
19
- </component>
20
- </module>