requirium 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/const_info.rb +8 -2
- data/lib/requirium.rb +31 -15
- data/lib/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eaeb02dd4c979c7c0d610fca588f890f22bbb40d
|
4
|
+
data.tar.gz: d7a7acb203652154316a9f79ad91a380d32493a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff0e9ba46cd44ca282958b86e450d33d3b666c0a7307e96a5ede7290ce8299ca57a6834e452dd051fc142f063a3a45bf01c2d3d5458fdd323b952cdde1dbc7cf
|
7
|
+
data.tar.gz: 2f5b961015812a391151513c79ff687c300f4093da11a34ac79fcd18839c27e3dbe62b005570e58e5ce6b39d9c142f24a5292cf6e82d6ece7fcb9050d2881447
|
data/lib/const_info.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
class Requirium::ConstInfo
|
2
|
-
attr_accessor :mod, :sym
|
2
|
+
attr_accessor :mod, :sym, :error, :value
|
3
3
|
|
4
4
|
def initialize(mod, sym)
|
5
5
|
@mod, @sym, @cond, @mutex = mod, sym, ConditionVariable.new, Mutex.new
|
6
6
|
end
|
7
7
|
|
8
|
+
def has_value?
|
9
|
+
!!(defined? @value)
|
10
|
+
end
|
11
|
+
|
8
12
|
def internal_load
|
9
|
-
mod.send(:internal_load, sym)
|
13
|
+
has, value = mod.send(:internal_load, sym)
|
14
|
+
@value = value if has
|
15
|
+
nil
|
10
16
|
end
|
11
17
|
|
12
18
|
def ready!
|
data/lib/requirium.rb
CHANGED
@@ -37,9 +37,9 @@ module Requirium
|
|
37
37
|
begin
|
38
38
|
info.internal_load
|
39
39
|
rescue ScriptError => e
|
40
|
-
|
40
|
+
info.error = e
|
41
41
|
rescue => e
|
42
|
-
|
42
|
+
info.error = e
|
43
43
|
ensure
|
44
44
|
info.ready!
|
45
45
|
end
|
@@ -71,11 +71,16 @@ module Requirium
|
|
71
71
|
#end
|
72
72
|
|
73
73
|
def const_missing(sym)
|
74
|
-
|
74
|
+
if Thread.current == Requirium.loader_thread
|
75
|
+
# this avoids deadlocks. it uses the current loading to load the remaining dependencies
|
76
|
+
has, value = internal_load(sym)
|
77
|
+
return has ? value : super
|
78
|
+
end
|
75
79
|
|
76
80
|
Requirium.queue.push(info = ConstInfo.new(self, sym))
|
77
81
|
info.wait_ready
|
78
|
-
|
82
|
+
raise info.error if info.error
|
83
|
+
info.has_value? ? info.value : super
|
79
84
|
end
|
80
85
|
|
81
86
|
private
|
@@ -87,18 +92,12 @@ module Requirium
|
|
87
92
|
end
|
88
93
|
|
89
94
|
def internal_load(sym)
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
return home.const_missing(sym) unless loader # go to parent
|
95
|
-
|
96
|
-
loader.call(self)
|
97
|
-
|
98
|
-
if const_defined?(sym)
|
99
|
-
load_list { |l| l.delete(sym.to_s) }
|
100
|
-
const_get(sym)
|
95
|
+
lookup_list.find do |klass|
|
96
|
+
klass.send(:try_load, sym) if klass.singleton_class.include?(Requirium)
|
97
|
+
return [true, klass.const_get(sym)] if klass.const_defined?(sym)
|
101
98
|
end
|
99
|
+
|
100
|
+
[false, nil]
|
102
101
|
end
|
103
102
|
|
104
103
|
def load_list
|
@@ -107,6 +106,15 @@ module Requirium
|
|
107
106
|
@mutex.synchronize { yield(@load_list) }
|
108
107
|
end
|
109
108
|
|
109
|
+
def try_load(sym)
|
110
|
+
str_sym = sym.to_s
|
111
|
+
loader = load_list { |l| l[str_sym] }
|
112
|
+
return unless loader
|
113
|
+
loader.call(self)
|
114
|
+
load_list { |l| l.delete(sym.to_s) }
|
115
|
+
nil
|
116
|
+
end
|
117
|
+
|
110
118
|
def with_args(args)
|
111
119
|
if args.length == 1 && args.first.is_a?(Hash)
|
112
120
|
args.first.each do |sym, paths|
|
@@ -119,4 +127,12 @@ module Requirium
|
|
119
127
|
|
120
128
|
nil
|
121
129
|
end
|
130
|
+
|
131
|
+
def lookup_list
|
132
|
+
list = name.split('::').reduce([Object]) { |a, n| a << a.last.const_get(n) }.reverse!
|
133
|
+
list.push(*ancestors)
|
134
|
+
list.uniq!
|
135
|
+
list
|
136
|
+
end
|
137
|
+
|
122
138
|
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: requirium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SilverPhoenix99
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: facets
|