requirium 0.0.2 → 0.0.3

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: 593b6e06dc07239dd7cc9051101bc8f01335cef6
4
- data.tar.gz: 2155e503347b54640fe77b3877db80b033ebb9d6
3
+ metadata.gz: dea42646908a945fb4fa22ca909c6fe0c51bb28c
4
+ data.tar.gz: 29f6c119d45605fce3f7505abc1b07ad122b4c92
5
5
  SHA512:
6
- metadata.gz: 7a74e063cbb3dd9d070e3041d53d3b3b372991ce0b4d42c82e089e9ca9761fdd2b9fa291a7603808facf3d68ef69dc72577bd88e5d10096b636238480bf95fba
7
- data.tar.gz: ab262703c89fbc6e40ae32d288cad96a552354e6c6e22f19e9bcd52f3e059929eb29f2d0bb9c27123b0de1ee4beafbd271b4410327b4eb172f7688acf254457d
6
+ metadata.gz: 24549e4c742ece2fc12efe9dc5d10f890074c92c6a1896a9fb2f3845bd0e3c2fede558d9e1dd2dc0c4a7dbe5754e6118d864d460eadc7ad85ce6e74d043e3f30
7
+ data.tar.gz: 49c6ad6a458f7eb484e58f53c4c6c35a572458c6a21c1e71536e4c9242b4d1841365a86e407d251ab37dd87d5e602056a8e592aab37db226962a5d68b9c96c8f
data/lib/const_info.rb ADDED
@@ -0,0 +1,22 @@
1
+ class Requirium::ConstInfo
2
+ attr_accessor :mod, :sym
3
+
4
+ def initialize(mod, sym)
5
+ @mod, @sym, @cond, @mutex = mod, sym, ConditionVariable.new, Mutex.new
6
+ end
7
+
8
+ def internal_load
9
+ mod.send(:internal_load, sym)
10
+ end
11
+
12
+ def ready!
13
+ @ready = true
14
+ @mutex.synchronize { @cond.signal }
15
+ nil
16
+ end
17
+
18
+ def wait_ready
19
+ @mutex.synchronize { until @ready; @cond.wait(@mutex) end }
20
+ nil
21
+ end
22
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'require_loader'
2
+
3
+ class Requirium::LoadLoader < Requirium::RequireLoader
4
+
5
+ private
6
+
7
+ def clean_paths(paths, dirname)
8
+ paths = super
9
+
10
+ # append possible suffix
11
+ paths.map! { |p| Dir[*Gem.suffixes.map { |e| p + e }].first }.compact!
12
+
13
+ paths
14
+ end
15
+
16
+ def method
17
+ :load
18
+ end
19
+ end
@@ -0,0 +1,31 @@
1
+ class Requirium::RequireLoader
2
+ attr_reader :sym
3
+
4
+ def initialize(sym, paths, dirname = nil)
5
+ @sym = sym
6
+ @paths = clean_paths(paths, dirname)
7
+ end
8
+
9
+ def call(mod)
10
+ @paths.each { |filename| mod.send(method, filename) }
11
+ nil
12
+ end
13
+
14
+ private
15
+
16
+ def clean_paths(paths, dirname)
17
+ paths = [*paths]
18
+ paths = [sym.to_s.snakecase] if paths.empty?
19
+
20
+ if dirname
21
+ dirname = Pathname(dirname)
22
+ paths.map! { |path| (dirname + path).to_s }
23
+ end
24
+
25
+ paths
26
+ end
27
+
28
+ def method
29
+ :require
30
+ end
31
+ end
data/lib/requirium.rb CHANGED
@@ -4,6 +4,11 @@ require 'facets/string/snakecase'
4
4
  require 'facets/module/home'
5
5
  require 'facets/module/ancestor'
6
6
 
7
+ require_relative 'version'
8
+ require_relative 'const_info'
9
+ require_relative 'require_loader'
10
+ require_relative 'load_loader'
11
+
7
12
  #Automatically calls <code>Kernel#load</code> or <code>Kernel#require</code> on first use.
8
13
  #Example usage:
9
14
  #
@@ -25,33 +30,6 @@ require 'facets/module/ancestor'
25
30
  # autorequire_relative X: nil, Y: ['y', 'y1', 'y2']
26
31
  # end
27
32
  module Requirium
28
- VERSION = '0.0.2'.freeze
29
-
30
- class Info
31
- attr_accessor :sym
32
- attr_accessor :mod
33
- attr_reader :cond, :mutex
34
-
35
- def initialize(mod, sym)
36
- @mod, @sym, @cond, @mutex = mod, sym, ConditionVariable.new, Mutex.new
37
- end
38
-
39
- def internal_load
40
- self.sym = mod.send(:internal_load, sym)
41
- end
42
-
43
- def ready!
44
- @ready = true
45
- mutex.synchronize { cond.signal }
46
- nil
47
- end
48
-
49
- def wait_ready
50
- mutex.synchronize { until @ready; cond.wait(mutex) end }
51
- nil
52
- end
53
- end
54
-
55
33
  @queue = Queue.new
56
34
  @loader_thread = Thread.new do
57
35
  loop do
@@ -72,20 +50,20 @@ module Requirium
72
50
  attr_reader :loader_thread, :queue
73
51
  end
74
52
 
75
- def autoload(*args) #TODO sync const_defined? ?
76
- common_auto :load, args
53
+ def autoload(*args)
54
+ add_loader LoadLoader, args
77
55
  end
78
56
 
79
- def autoload_relative(*args) #TODO sync const_defined? ?
80
- common_auto :load, args, File.dirname(caller(1, 1)[0][/^(.+):\d+:in `.+'$/, 1])
57
+ def autoload_relative(*args)
58
+ add_loader LoadLoader, args, File.dirname(caller(1, 1)[0][/^(.+):\d+:in `.+'$/, 1])
81
59
  end
82
60
 
83
- def autorequire(*args) #TODO sync const_defined? ?
84
- common_auto :require, args
61
+ def autorequire(*args)
62
+ add_loader RequireLoader, args
85
63
  end
86
64
 
87
- def autorequire_relative(*args) #TODO sync const_defined? ?
88
- common_auto :require, args, File.dirname(caller(1, 1)[0][/^(.+):\d+:in `.+'$/, 1])
65
+ def autorequire_relative(*args)
66
+ add_loader RequireLoader, args, File.dirname(caller(1, 1)[0][/^(.+):\d+:in `.+'$/, 1])
89
67
  end
90
68
 
91
69
  #def const_defined?(*args)
@@ -95,61 +73,27 @@ module Requirium
95
73
  def const_missing(sym)
96
74
  return internal_load(sym) if Thread.current == Requirium.loader_thread
97
75
 
98
- Requirium.queue.push(info = Info.new(self, sym))
76
+ Requirium.queue.push(info = ConstInfo.new(self, sym))
99
77
  info.wait_ready
100
- const_defined?(sym) ? info.sym : super
78
+ const_defined?(sym) ? const_get(sym) : super
101
79
  end
102
80
 
103
81
  private
104
82
 
105
- def common_auto(method, args, dirname = nil)
106
- if args.length == 1 && args.first.is_a?(Hash)
107
- args.first.each { |sym, paths| add_load_item method, sym, paths, dirname }
108
- return
109
- end
110
-
111
- sym, paths = args
112
- add_load_item method, sym, paths, dirname
113
- end
114
-
115
- def add_load_item(method, sym, paths, dirname)
116
- return if const_defined?(sym)
117
-
118
- paths = clean_paths(method, sym, paths, dirname)
119
-
120
- #puts "auto#{method}#{dirname ? '_relative' : ''} #{sym.inspect}, #{paths.map(&:inspect).join(', ')}"
121
- load_list { |l| l[sym.to_s] = [method, paths] }
122
- nil
123
- end
124
-
125
- def clean_paths(method, sym, paths, dirname)
126
- paths = [*paths]
127
- paths = [sym.to_s.snakecase] if paths.empty?
128
-
129
- if dirname
130
- dirname = Pathname(dirname)
131
- paths.map! { |path| (dirname + path).to_s }
83
+ def add_loader(method, args, dirname = nil)
84
+ with_args(args) do |sym, paths|
85
+ load_list { |l| l[sym.to_s] = method.new(sym, paths, dirname) }
132
86
  end
133
-
134
- # append possible suffix
135
- paths.map! { |p| Dir[*Gem.suffixes.map { |e| p + e }].first }.compact! if method == :load
136
-
137
- paths
138
87
  end
139
88
 
140
89
  def internal_load(sym)
141
90
  return const_get(sym) if const_defined?(sym)
142
91
  str_sym = sym.to_s
143
- has_sym, method, paths = load_list { |l| [l.has_key?(str_sym), *l[str_sym]] }
144
-
145
- return parent.const_missing(sym) unless has_sym # go to parent
92
+ loader = load_list { |l| l[str_sym] }
146
93
 
147
- raise NoMethodError, "invalid method type: #{method.inspect}" unless [:load, :require].include?(method)
94
+ return home.const_missing(sym) unless loader # go to parent
148
95
 
149
- paths.each do |filename|
150
- #puts "#{method} #{sym.inspect}, #{filename.inspect}"
151
- send(method, filename)
152
- end
96
+ loader.call(self)
153
97
 
154
98
  if const_defined?(sym)
155
99
  load_list { |l| l.delete(sym.to_s) }
@@ -163,7 +107,16 @@ module Requirium
163
107
  @mutex.synchronize { yield(@load_list) }
164
108
  end
165
109
 
166
- def parent
167
- name.split('::')[0..-2].inject(Object) { |mod, name| mod.const_get(name) }
110
+ def with_args(args)
111
+ if args.length == 1 && args.first.is_a?(Hash)
112
+ args.first.each do |sym, paths|
113
+ next if const_defined?(sym)
114
+ yield sym, paths
115
+ end
116
+ elsif !const_defined?(args.first)
117
+ yield args.first, args[1..-1]
118
+ end
119
+
120
+ nil
168
121
  end
169
122
  end
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ module Requirium
2
+ VERSION = '0.0.3'.freeze
3
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: requirium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - SilverPhoenix99
@@ -31,7 +31,11 @@ executables: []
31
31
  extensions: []
32
32
  extra_rdoc_files: []
33
33
  files:
34
+ - lib/const_info.rb
35
+ - lib/load_loader.rb
36
+ - lib/require_loader.rb
34
37
  - lib/requirium.rb
38
+ - lib/version.rb
35
39
  - README.md
36
40
  homepage: https://github.com/SilverPhoenix99/requirium
37
41
  licenses: