opal-autoloader 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/lib/opal/autoloader/version.rb +5 -0
- data/lib/opal/autoloader.rb +138 -0
- data/lib/opal/autoloader_starter.rb +13 -0
- data/lib/opal-autoloader.rb +13 -0
- metadata +61 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 2a6ccf6e7cfe26d50c96806fafc5ad51354bf41778d7600181204b6516028752
|
4
|
+
data.tar.gz: 3d90aba9e44de31065a0948c6317f5babd9a10099ebaccd812bcf69ac9278d97
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 824cb86823fbfa2aec90341450845890ea110549087554c46060bd588e0751338051aba2aebaac8bd4ab7f78a577eeb4099d706851e4174ae71f069ba2132a79
|
7
|
+
data.tar.gz: 4db90c06448385fec10dffb6d6e6e1aaa6f1e9baf49090fa48b3c01b2d37fd426f0462d8373df7073ba5334906f5c16cf2d02221de4f7077be74c2593d7a9f32
|
@@ -0,0 +1,138 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
module Opal
|
4
|
+
class Autoloader
|
5
|
+
# All files ever loaded.
|
6
|
+
def self.history=(a)
|
7
|
+
@@history = a
|
8
|
+
end
|
9
|
+
def self.history
|
10
|
+
@@history
|
11
|
+
end
|
12
|
+
self.history = Set.new
|
13
|
+
|
14
|
+
def self.load_paths=(a)
|
15
|
+
@@load_paths = a
|
16
|
+
end
|
17
|
+
def self.load_paths
|
18
|
+
@@load_paths
|
19
|
+
end
|
20
|
+
self.load_paths = []
|
21
|
+
|
22
|
+
def self.loaded=(a)
|
23
|
+
@@loaded = a
|
24
|
+
end
|
25
|
+
def self.loaded
|
26
|
+
@@loaded
|
27
|
+
end
|
28
|
+
self.loaded = Set.new
|
29
|
+
|
30
|
+
def self.loading=(a)
|
31
|
+
@@loading = a
|
32
|
+
end
|
33
|
+
def self.loading
|
34
|
+
@@loading
|
35
|
+
end
|
36
|
+
self.loading = []
|
37
|
+
|
38
|
+
def self.const_missing(const_name, mod)
|
39
|
+
# name.nil? is testing for anonymous
|
40
|
+
from_mod = mod.name.nil? ? guess_for_anonymous(const_name) : mod
|
41
|
+
load_missing_constant(from_mod, const_name)
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.guess_for_anonymous(const_name)
|
45
|
+
if Object.const_defined?(const_name)
|
46
|
+
raise NameError.new "#{const_name} cannot be autoloaded from an anonymous class or module", const_name
|
47
|
+
else
|
48
|
+
Object
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.load_missing_constant(from_mod, const_name)
|
53
|
+
# see active_support/dependencies.rb in case of reloading on how to handle
|
54
|
+
qualified_name = qualified_name_for(from_mod, const_name)
|
55
|
+
qualified_path = underscore(qualified_name)
|
56
|
+
|
57
|
+
module_path = search_for_module(qualified_path)
|
58
|
+
if module_path
|
59
|
+
if loading.include?(module_path)
|
60
|
+
raise "Circular dependency detected while autoloading constant #{qualified_name}"
|
61
|
+
else
|
62
|
+
require_or_load(from_mod, module_path)
|
63
|
+
raise LoadError, "Unable to autoload constant #{qualified_name}, expected #{module_path} to define it" unless from_mod.const_defined?(const_name, false)
|
64
|
+
return from_mod.const_get(const_name)
|
65
|
+
end
|
66
|
+
elsif (parent = from_mod.parent) && parent != from_mod &&
|
67
|
+
! from_mod.parents.any? { |p| p.const_defined?(const_name, false) }
|
68
|
+
begin
|
69
|
+
return parent.const_missing(const_name)
|
70
|
+
rescue NameError => e
|
71
|
+
raise unless missing_name?(e, qualified_name_for(parent, const_name))
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.missing_name?(e, name)
|
77
|
+
mn = if /undefined/ !~ e.message
|
78
|
+
$1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ e.message
|
79
|
+
end
|
80
|
+
mn == name
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns the constant path for the provided parent and constant name.
|
84
|
+
def self.qualified_name_for(mod, name)
|
85
|
+
mod_name = to_constant_name(mod)
|
86
|
+
mod_name == 'Object' ? name.to_s : "#{mod_name}::#{name}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def self.require_or_load(from_mod, module_path)
|
90
|
+
return if loaded.include?(module_path)
|
91
|
+
loaded << module_path
|
92
|
+
loading << module_path
|
93
|
+
|
94
|
+
begin
|
95
|
+
result = require module_path
|
96
|
+
rescue Exception
|
97
|
+
loaded.delete module_path
|
98
|
+
raise LoadError, "Unable to autoload: require_or_load #{module_path} failed"
|
99
|
+
ensure
|
100
|
+
loading.pop
|
101
|
+
end
|
102
|
+
|
103
|
+
# Record history *after* loading so first load gets warnings.
|
104
|
+
history << module_path
|
105
|
+
result
|
106
|
+
# end
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.search_for_module(path)
|
110
|
+
# oh my! imagine Bart Simpson, writing on the board:
|
111
|
+
# "javascript is not ruby, javascript is not ruby, javascript is not ruby, ..."
|
112
|
+
# then running home, starting irb, on the fly developing a chat client and opening a session with Homer at his workplace: "Hi Dad ..."
|
113
|
+
load_paths.each do |load_path|
|
114
|
+
mod_path = load_path + '/' + path
|
115
|
+
return mod_path if `Opal.modules.hasOwnProperty(#{mod_path})`
|
116
|
+
end
|
117
|
+
return path if `Opal.modules.hasOwnProperty(#{path})`
|
118
|
+
nil # Gee, I sure wish we had first_match ;-)
|
119
|
+
end
|
120
|
+
|
121
|
+
# Convert the provided const desc to a qualified constant name (as a string).
|
122
|
+
# A module, class, symbol, or string may be provided.
|
123
|
+
def self.to_constant_name(desc) #:nodoc:
|
124
|
+
case desc
|
125
|
+
when String then desc.sub(/^::/, '')
|
126
|
+
when Symbol then desc.to_s
|
127
|
+
when Module
|
128
|
+
desc.name ||
|
129
|
+
raise(ArgumentError, 'Anonymous modules have no name to be referenced by')
|
130
|
+
else raise TypeError, "Not a valid constant descriptor: #{desc.inspect}"
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.underscore(string)
|
135
|
+
string.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("-", "_").downcase
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Object
|
2
|
+
class << self
|
3
|
+
alias _autoloader_original_const_missing const_missing
|
4
|
+
|
5
|
+
def const_missing(const_name)
|
6
|
+
# need to call original code because some things are set up there
|
7
|
+
# original code may also be overloaded by reactrb, for example
|
8
|
+
_autoloader_original_const_missing(const_name)
|
9
|
+
rescue StandardError => e
|
10
|
+
Opal::Autoloader.const_missing(const_name, self) || raise(e)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
if RUBY_ENGINE == 'opal'
|
2
|
+
require 'opal/autoloader'
|
3
|
+
require 'opal/autoloader_starter'
|
4
|
+
require 'opal/autoloader/version'
|
5
|
+
|
6
|
+
Opal::Autoloader.load_paths = %w[components models operations stores]
|
7
|
+
else
|
8
|
+
require 'opal'
|
9
|
+
require 'opal/autoloader/version'
|
10
|
+
|
11
|
+
Opal.append_path File.expand_path('../lib', __FILE__).untaint
|
12
|
+
end
|
13
|
+
|
metadata
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: opal-autoloader
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jan Biedermann
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-06-16 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: opal
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.11.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.11.0
|
27
|
+
description: Autoload modules so its not necessary to "require" everything
|
28
|
+
email: jan@kursator.de
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- lib/opal-autoloader.rb
|
34
|
+
- lib/opal/autoloader.rb
|
35
|
+
- lib/opal/autoloader/version.rb
|
36
|
+
- lib/opal/autoloader_starter.rb
|
37
|
+
homepage: https://github.com/janbiedermann/opal-autoloader
|
38
|
+
licenses:
|
39
|
+
- MIT
|
40
|
+
metadata: {}
|
41
|
+
post_install_message:
|
42
|
+
rdoc_options: []
|
43
|
+
require_paths:
|
44
|
+
- lib
|
45
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
requirements: []
|
56
|
+
rubyforge_project:
|
57
|
+
rubygems_version: 2.7.6
|
58
|
+
signing_key:
|
59
|
+
specification_version: 4
|
60
|
+
summary: A autoloader for opal
|
61
|
+
test_files: []
|