awesome_loader 0.0.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 +7 -0
- data/LICENSE +20 -0
- data/README.md +49 -0
- data/lib/awesome_loader/autoloader.rb +67 -0
- data/lib/awesome_loader/utils.rb +9 -0
- data/lib/awesome_loader/version.rb +4 -0
- data/lib/awesome_loader.rb +3 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a5dc03dba0d176271e0c6c434bebb77c37839d6b
|
4
|
+
data.tar.gz: 7a0d3cffefadf3428d07a00284de1ec1cc85939d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2467eb61030682522223291cb5b6f1f43cbb446600a7831852375ed7cc0108798f99ca5cb1b46f442930d05d644c4f7cb72f30835fde00e541ea27bf7521a20c
|
7
|
+
data.tar.gz: 2dbeec359709d42235a86935ebb74982c95b7a602e37fb329934e837803bcb8ff52449e3eba1594b089d52052f2c25206d8cc4afcea2536de26d8bf952f72d2e
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2017 Jordan Hollinger
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
'Software'), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
17
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
18
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
19
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
20
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# awesome_loader
|
2
|
+
|
3
|
+
An awesome way to load your (non-Rails) Ruby application! Tired of tons of manual requires? Me too! So I made this little gem to augment Ruby's built-in `autoload` functionality. Works pretty much the same as in Rails. (NOTE Don't confuse this with auto-**re**loading.)
|
4
|
+
|
5
|
+
## Install
|
6
|
+
|
7
|
+
Just add to your Gemfile.
|
8
|
+
|
9
|
+
gem 'awesome_loader'
|
10
|
+
|
11
|
+
## Basic Usage
|
12
|
+
|
13
|
+
Let's say your (non-Rails) app has a very Rails-like layout. `app/models`, `app/helpers`, etc. And those might have some subdirectories that correspond to module names. This is all you have to do:
|
14
|
+
|
15
|
+
# The root_depth argument is saying "Start creating modules for dirs after the first 2 levels"
|
16
|
+
AwesomeLoader.autoload root_depth: 2 do
|
17
|
+
paths %w(app ** *.rb)
|
18
|
+
end
|
19
|
+
|
20
|
+
## Advanced Usage
|
21
|
+
|
22
|
+
Maybe your app structure is more complicated. That's fine too.
|
23
|
+
|
24
|
+
AwesomeLoader.autoload root_depth: 2 do
|
25
|
+
# These first few work just like above
|
26
|
+
paths %w(app models ** *.rb)
|
27
|
+
paths %w(app helpers ** *.rb)
|
28
|
+
|
29
|
+
# But the files in these dirs have top-level Routes and Entities modules
|
30
|
+
paths %w(app routes ** *.rb), root_depth: 1
|
31
|
+
paths %w(app entities ** *.rb), root_depth: 1
|
32
|
+
end
|
33
|
+
|
34
|
+
## Eager Loading
|
35
|
+
|
36
|
+
If you're running a threaded server like Puma or Thin, it's often considered best practice to load everything
|
37
|
+
up-front, instead of possibly loading something during a request Thread. At least in production.
|
38
|
+
|
39
|
+
AwesomeLoader.autoload root_depth: 2, eager_load: true do
|
40
|
+
...
|
41
|
+
end
|
42
|
+
|
43
|
+
## License
|
44
|
+
|
45
|
+
MIT License. See LICENSE for details.
|
46
|
+
|
47
|
+
## Copyright
|
48
|
+
|
49
|
+
Copyright (c) 2017 Jordan Hollinger
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module AwesomeLoader
|
4
|
+
def self.autoload(root_depth:, root: Dir.cwd, eager_load: false, &block)
|
5
|
+
autoloader = Autoloader.new(root: root, root_depth: root_depth, eager_load: eager_load)
|
6
|
+
if block
|
7
|
+
autoloader.instance_eval(&block)
|
8
|
+
autoloader.finialize
|
9
|
+
end
|
10
|
+
autoloader
|
11
|
+
end
|
12
|
+
|
13
|
+
class Autoloader
|
14
|
+
RB_EXT = /\.rb$/
|
15
|
+
|
16
|
+
attr_reader :root
|
17
|
+
attr_reader :default_root_depth
|
18
|
+
attr_reader :eager_load
|
19
|
+
attr_reader :all_files
|
20
|
+
|
21
|
+
def initialize(root_depth:, root: Dir.cwd, eager_load: false)
|
22
|
+
@root = Pathname.new(root.to_s)
|
23
|
+
@default_root_depth, @eager_load = root_depth, eager_load
|
24
|
+
@all_files = []
|
25
|
+
end
|
26
|
+
|
27
|
+
def paths(array, root_depth: default_root_depth)
|
28
|
+
files = Dir.glob File.join *array
|
29
|
+
root_regex = Regexp.new "^#{File.join *array[0, root_depth]}/?"
|
30
|
+
|
31
|
+
# Get an array of nested dirs (parent dir always comes before child dir)
|
32
|
+
nested_dirs = files.
|
33
|
+
map { |path| File.dirname(path).sub(root_regex, '') }.uniq.
|
34
|
+
reduce(Set.new) { |dirs, leaf_dir|
|
35
|
+
dirs + leaf_dir.split('/').reduce([]) { |a, dir|
|
36
|
+
a << File.join(*a, dir)
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
# Create modules for each dir. Set a Hash of dir path => Module.
|
41
|
+
modules = nested_dirs.reduce({'.' => Object}) { |a, dir|
|
42
|
+
parent_module = a.fetch File.dirname dir
|
43
|
+
new_module = parent_module.const_set Utils.camelize(File.basename dir), Module.new
|
44
|
+
a[dir] = new_module
|
45
|
+
a
|
46
|
+
}
|
47
|
+
|
48
|
+
# For each file, look up it's dir module and set autoload on the class/module in the file.
|
49
|
+
files.each do |full_path|
|
50
|
+
rel_dir = File.dirname full_path.sub(root_regex, '')
|
51
|
+
abs_path = self.root.join(full_path)
|
52
|
+
file_const_name = Utils.camelize File.basename(full_path).sub(RB_EXT, '')
|
53
|
+
mod = modules.fetch rel_dir
|
54
|
+
mod.autoload file_const_name, abs_path
|
55
|
+
self.all_files << abs_path if eager_load
|
56
|
+
end
|
57
|
+
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
def finialize
|
62
|
+
all_files.each { |f| require f } if eager_load
|
63
|
+
all_files.clear
|
64
|
+
self
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: awesome_loader
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jordan Hollinger
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-04-07 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: An awesome wrapper for Ruby's built-in autoload
|
14
|
+
email: jordan.hollinger@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- LICENSE
|
20
|
+
- README.md
|
21
|
+
- lib/awesome_loader.rb
|
22
|
+
- lib/awesome_loader/autoloader.rb
|
23
|
+
- lib/awesome_loader/utils.rb
|
24
|
+
- lib/awesome_loader/version.rb
|
25
|
+
homepage: https://github.com/jhollinger/awesome_loader
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 2.0.0
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.6.8
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: An awesome way to autoload your Ruby application
|
49
|
+
test_files: []
|