alki 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/README.md +1 -1
  4. data/alki.gemspec +3 -0
  5. data/config/dsls.rb +4 -0
  6. data/lib/alki/assembly.rb +43 -0
  7. data/lib/alki/assembly_executor.rb +137 -0
  8. data/lib/alki/assembly_handler_base.rb +19 -0
  9. data/lib/alki/dsls/assembly.rb +24 -0
  10. data/lib/alki/dsls/assembly_type.rb +48 -0
  11. data/lib/alki/dsls/assembly_type_dsl.rb +21 -0
  12. data/lib/alki/dsls/assembly_types/assembly.rb +84 -0
  13. data/lib/alki/dsls/assembly_types/group.rb +46 -0
  14. data/lib/alki/dsls/assembly_types/load.rb +37 -0
  15. data/lib/alki/dsls/assembly_types/overlay.rb +9 -0
  16. data/lib/alki/dsls/assembly_types/service.rb +25 -0
  17. data/lib/alki/dsls/service.rb +22 -0
  18. data/lib/alki/test.rb +38 -18
  19. data/lib/alki/version.rb +1 -1
  20. data/lib/alki.rb +27 -21
  21. data/test/feature/create_package_test.rb +4 -3
  22. data/test/fixtures/example/config/{package.rb → assembly.rb} +5 -2
  23. data/test/fixtures/example/config/handlers.rb +1 -1
  24. data/test/fixtures/example/lib/example.rb +1 -1
  25. data/test/fixtures/example/lib/switch_handler.rb +2 -2
  26. data/test/fixtures/tlogger/config/assembly.rb +10 -0
  27. data/test/fixtures/tlogger/lib/tlogger.rb +3 -0
  28. data/test/integration/dsls/assembly_test.rb +28 -0
  29. data/test/integration/dsls/assembly_type_test.rb +58 -0
  30. data/test/integration/dsls/service_dsl_test.rb +57 -0
  31. metadata +69 -21
  32. data/lib/alki/class_builder.rb +0 -41
  33. data/lib/alki/dsl_builder.rb +0 -43
  34. data/lib/alki/group_builder.rb +0 -25
  35. data/lib/alki/group_dsl.rb +0 -98
  36. data/lib/alki/loader.rb +0 -32
  37. data/lib/alki/package.rb +0 -33
  38. data/lib/alki/package_builder.rb +0 -2
  39. data/lib/alki/package_executor.rb +0 -120
  40. data/lib/alki/package_processor.rb +0 -167
  41. data/lib/alki/standard_package.rb +0 -19
  42. data/lib/alki/util.rb +0 -35
  43. data/test/integration/class_builder_test.rb +0 -130
  44. data/test/integration/loader_test.rb +0 -36
  45. data/test/unit/package_processor_test.rb +0 -319
data/lib/alki.rb CHANGED
@@ -1,33 +1,39 @@
1
- module Alki
2
- def self.create_package!(name=nil,root=nil)
3
- require 'alki/util'
4
- require 'alki/standard_package'
1
+ require 'alki/support'
2
+ require 'alki/assembly'
3
+ require 'alki/class_builder'
4
+ require 'alki/dsl'
5
5
 
6
+ module Alki
7
+ def self.create_assembly!(name=nil,root=nil)
6
8
  if !root
7
- root = Alki::Util.find_pkg_root(caller_locations(1, 1)[0].absolute_path)
9
+ root = Alki::Support.find_root(caller_locations(1, 1)[0].absolute_path) do |dir|
10
+ File.exists?(File.join(dir,'config','assembly.rb'))
11
+ end
8
12
  end
9
13
  if !name
10
14
  path = caller_locations(1,1)[0].absolute_path
11
15
  lib_dir = File.join(root,'lib','')
12
16
  unless path.start_with?(lib_dir) && path.end_with?('.rb')
13
- raise "Can't auto-detect name of package"
17
+ raise "Can't auto-detect name of assembly"
14
18
  end
15
19
  name = path[lib_dir.size..-4]
16
20
  end
17
- unless name =~ /[A-Z]/
18
- name = Alki::Util.classify(name)
19
- end
20
- klass = Class.new(Alki::StandardPackage)
21
- klass.send :define_method, :initialize do
22
- super root
23
- end
24
-
25
- mod = Module.new
26
- mod.const_set :Package, klass
27
- mod.send :define_singleton_method, :new do
28
- klass.new
29
- end
30
-
31
- Alki::Util.create_class(name,mod)
21
+ config_root = File.join(root,'config')
22
+ Alki::ClassBuilder.build(
23
+ name: name,
24
+ class_modules: [Alki::Assembly],
25
+ type: :module,
26
+ class_methods: {
27
+ assembly_class: {
28
+ body: ->{
29
+ @assembly_class ||= Alki::Dsl.load(File.join(config_root,'assembly.rb'))[:class]
30
+ }
31
+ },
32
+ config_root: {
33
+ body: ->{ config_root }
34
+ }
35
+ }
36
+ )
37
+ Alki::Dsl.register_dir config_root, 'alki/dsls/assembly', prefix: File.join(name,'assembly')
32
38
  end
33
39
  end
@@ -4,13 +4,14 @@ describe 'Alki.create_package!' do
4
4
  describe 'example' do
5
5
  it 'should do fizzbuzz' do
6
6
  $LOAD_PATH << File.join(fixtures_path,'example','lib')
7
+ $LOAD_PATH << File.join(fixtures_path,'tlogger','lib')
7
8
  require 'example'
8
9
  app = Example.new
9
10
  app.range_handler.handle 1..20
10
11
  app.output.to_a.must_equal [
11
- "1","2","Fizz!","4","Buzz!","Fizz!","7", "8", "Fizz!",
12
- "Buzz!", "11", "Fizz!", "13", "14", "Fizzbuzz!", "16",
13
- "17", "Fizz!", "19", "Buzz!"
12
+ "1","2","Fizz!","4","Buzz!","Fizz!","7", "8", "Fizz!",
13
+ "Buzz!", "11", "Fizz!", "13", "14", "Fizzbuzz!", "16",
14
+ "17", "Fizz!", "19", "Buzz!"
14
15
  ]
15
16
  end
16
17
  end
@@ -22,9 +22,12 @@ Alki do
22
22
  ArrayOutput.new
23
23
  end
24
24
 
25
+ assembly :tlogger do
26
+ set :io, STDERR
27
+ end
28
+
25
29
  service :log do
26
- require 'logger'
27
- Logger.new STDERR
30
+ tlogger.log
28
31
  end
29
32
 
30
33
  service :message_proc do
@@ -25,6 +25,6 @@ Alki do
25
25
 
26
26
  overlay do
27
27
  require 'log_overlay'
28
- LogOverlay.new log
28
+ LogOverlay.new lazy('log')
29
29
  end
30
30
  end
@@ -1,3 +1,3 @@
1
1
  require 'alki'
2
2
 
3
- Alki.create_package!
3
+ Alki.create_assembly!
@@ -1,9 +1,9 @@
1
1
  class SwitchHandler
2
2
  def initialize(handlers)
3
- @handlers = handlers
3
+ @types = handlers
4
4
  end
5
5
 
6
6
  def handle(val)
7
- @handlers.find {|h| h.handle val }
7
+ @types.find {|h| h.handle val }
8
8
  end
9
9
  end
@@ -0,0 +1,10 @@
1
+ Alki do
2
+ set :io do
3
+ raise "Most override io service"
4
+ end
5
+
6
+ service :log do
7
+ require 'logger'
8
+ Logger.new io
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ require 'alki'
2
+
3
+ Alki.create_assembly!
@@ -0,0 +1,28 @@
1
+ require_relative '../../test_helper'
2
+ require 'alki/dsls/assembly'
3
+ require 'alki/assembly_processor'
4
+
5
+ describe Alki::Dsls::Assembly do
6
+ it 'should work' do
7
+ res = Alki::Dsls::Assembly.build do
8
+ service :test do
9
+ :val
10
+ end
11
+
12
+ load 'file'
13
+
14
+ group :group1 do
15
+ service :test2 do
16
+ :val2
17
+ end
18
+ end
19
+ end
20
+ p res[:class].assembly
21
+ res[:class].assembly.children[:file].name.must_equal 'file'
22
+ res[:class].assembly.children[:test].block.call.must_equal :val
23
+ res[:class].assembly.children[:group1].children[:test2].block.call.must_equal :val2
24
+
25
+ r = res[:class].assembly.lookup [:group1,:test2]
26
+ p r
27
+ end
28
+ end
@@ -0,0 +1,58 @@
1
+ require_relative '../../test_helper'
2
+ require 'alki/dsls/assembly_type'
3
+
4
+ describe Alki::Dsls::AssemblyType do
5
+ def build(&blk)
6
+ @klass = Alki::Dsls::AssemblyType.build(&blk)[:class]
7
+ end
8
+
9
+ def klass
10
+ @klass
11
+ end
12
+
13
+ describe :build do
14
+ it 'should create struct class with given attributes' do
15
+ build do
16
+ attr :attr1
17
+ attr :attr2
18
+ end
19
+ obj = klass.new(:val1,:val2)
20
+ obj.attr1.must_equal :val1
21
+ obj.attr2.must_equal :val2
22
+ end
23
+
24
+ it 'should create index and output methods using given blocks' do
25
+ build do
26
+ index do
27
+ :val1
28
+ end
29
+
30
+ output do
31
+ :val2
32
+ end
33
+ end
34
+
35
+ obj = klass.new
36
+ obj.index(:data,:key).must_equal :val1
37
+ obj.output(:data).must_equal :val2
38
+ end
39
+
40
+ it 'should allow accessing attrs and processor/data/key from index/output methods' do
41
+ build do
42
+ attr :attr1
43
+
44
+ index do
45
+ [attr1,data,key].map(&:to_s).join
46
+ end
47
+
48
+ output do
49
+ [attr1,data].map(&:to_s).join
50
+ end
51
+ end
52
+
53
+ obj = klass.new(1)
54
+ obj.index(2,3).must_equal "123"
55
+ obj.output(2).must_equal "12"
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,57 @@
1
+ require_relative '../../test_helper'
2
+ require 'alki/dsls/service'
3
+
4
+ describe Alki::Dsls::Service do
5
+ def build(&blk)
6
+ @c = Alki::Dsls::Service.build(&blk)[:class]
7
+ end
8
+
9
+ describe :use do
10
+ it 'should add second argument to ::uses' do
11
+ build do
12
+ use :test, 'test_service'
13
+ use :test2, :test_service2
14
+ end.uses.must_equal(['test_service','test_service2'])
15
+ end
16
+
17
+ it 'should set instance variable for each use from new arguments' do
18
+ build do
19
+ use :test, 'test_service'
20
+ use :test2, 'test_service2'
21
+ end
22
+ obj = @c.new :val1, :val2
23
+ obj.instance_variable_get(:@test).must_equal :val1
24
+ obj.instance_variable_get(:@test2).must_equal :val2
25
+ end
26
+
27
+ it 'should raise error if number of new arguments doesn\'t match number of use statements' do
28
+ build do
29
+ use :test, 'test_service'
30
+ use :test2, 'test_service2'
31
+ end
32
+ assert_raises ArgumentError do
33
+ @c.new
34
+ end
35
+ assert_raises ArgumentError do
36
+ @c.new :val1
37
+ end
38
+ assert_raises ArgumentError do
39
+ @c.new :val1, :val2, :val3
40
+ end
41
+ end
42
+
43
+ it 'should use first argument as service name if none provided' do
44
+ build do
45
+ use :test
46
+ use :test2
47
+ end.uses.must_equal(['test','test2'])
48
+ end
49
+
50
+ it 'should allow hash syntax for arguments' do
51
+ build do
52
+ use test: 'ts'
53
+ use test2: 'ts2'
54
+ end.uses.must_equal(['ts','ts2'])
55
+ end
56
+ end
57
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alki
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Edlefsen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-10-04 00:00:00.000000000 Z
11
+ date: 2016-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,48 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: alki-dsl
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: alki-support
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.4'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.4'
41
83
  description: Base library for building applications. Provides tools for organizing
42
84
  and connection application units.
43
85
  email:
@@ -52,26 +94,28 @@ files:
52
94
  - README.md
53
95
  - Rakefile
54
96
  - alki.gemspec
97
+ - config/dsls.rb
55
98
  - lib/alki.rb
56
- - lib/alki/class_builder.rb
57
- - lib/alki/dsl_builder.rb
58
- - lib/alki/group_builder.rb
59
- - lib/alki/group_dsl.rb
60
- - lib/alki/loader.rb
99
+ - lib/alki/assembly.rb
100
+ - lib/alki/assembly_executor.rb
101
+ - lib/alki/assembly_handler_base.rb
102
+ - lib/alki/dsls/assembly.rb
103
+ - lib/alki/dsls/assembly_type.rb
104
+ - lib/alki/dsls/assembly_type_dsl.rb
105
+ - lib/alki/dsls/assembly_types/assembly.rb
106
+ - lib/alki/dsls/assembly_types/group.rb
107
+ - lib/alki/dsls/assembly_types/load.rb
108
+ - lib/alki/dsls/assembly_types/overlay.rb
109
+ - lib/alki/dsls/assembly_types/service.rb
110
+ - lib/alki/dsls/service.rb
61
111
  - lib/alki/overlay_delegator.rb
62
- - lib/alki/package.rb
63
- - lib/alki/package_builder.rb
64
- - lib/alki/package_executor.rb
65
- - lib/alki/package_processor.rb
66
112
  - lib/alki/service_delegator.rb
67
- - lib/alki/standard_package.rb
68
113
  - lib/alki/test.rb
69
- - lib/alki/util.rb
70
114
  - lib/alki/version.rb
71
115
  - test/feature/create_package_test.rb
72
116
  - test/fixtures/config.rb
117
+ - test/fixtures/example/config/assembly.rb
73
118
  - test/fixtures/example/config/handlers.rb
74
- - test/fixtures/example/config/package.rb
75
119
  - test/fixtures/example/config/settings.rb
76
120
  - test/fixtures/example/lib/array_output.rb
77
121
  - test/fixtures/example/lib/echo_handler.rb
@@ -80,10 +124,12 @@ files:
80
124
  - test/fixtures/example/lib/num_handler.rb
81
125
  - test/fixtures/example/lib/range_handler.rb
82
126
  - test/fixtures/example/lib/switch_handler.rb
83
- - test/integration/class_builder_test.rb
84
- - test/integration/loader_test.rb
127
+ - test/fixtures/tlogger/config/assembly.rb
128
+ - test/fixtures/tlogger/lib/tlogger.rb
129
+ - test/integration/dsls/assembly_test.rb
130
+ - test/integration/dsls/assembly_type_test.rb
131
+ - test/integration/dsls/service_dsl_test.rb
85
132
  - test/test_helper.rb
86
- - test/unit/package_processor_test.rb
87
133
  homepage: https://github.com/medlefsen/alki
88
134
  licenses:
89
135
  - MIT
@@ -111,8 +157,8 @@ summary: Base library for building applications.
111
157
  test_files:
112
158
  - test/feature/create_package_test.rb
113
159
  - test/fixtures/config.rb
160
+ - test/fixtures/example/config/assembly.rb
114
161
  - test/fixtures/example/config/handlers.rb
115
- - test/fixtures/example/config/package.rb
116
162
  - test/fixtures/example/config/settings.rb
117
163
  - test/fixtures/example/lib/array_output.rb
118
164
  - test/fixtures/example/lib/echo_handler.rb
@@ -121,7 +167,9 @@ test_files:
121
167
  - test/fixtures/example/lib/num_handler.rb
122
168
  - test/fixtures/example/lib/range_handler.rb
123
169
  - test/fixtures/example/lib/switch_handler.rb
124
- - test/integration/class_builder_test.rb
125
- - test/integration/loader_test.rb
170
+ - test/fixtures/tlogger/config/assembly.rb
171
+ - test/fixtures/tlogger/lib/tlogger.rb
172
+ - test/integration/dsls/assembly_test.rb
173
+ - test/integration/dsls/assembly_type_test.rb
174
+ - test/integration/dsls/service_dsl_test.rb
126
175
  - test/test_helper.rb
127
- - test/unit/package_processor_test.rb
@@ -1,41 +0,0 @@
1
- require 'alki/dsl_builder'
2
-
3
- module Alki
4
- class ClassBuilder
5
- def initialize(*dsl_factories)
6
- @dsl_factories = dsl_factories.flatten
7
- end
8
-
9
- def build(name=nil,&blk)
10
- self.class.build(name,@dsl_factories,&blk)
11
- end
12
-
13
- def self.build(name=nil,dsl_factories,&blk)
14
- Class.new.tap do |c|
15
- builder = -> {
16
- Module.new.tap do |m|
17
- m.define_singleton_method :klass do
18
- c
19
- end
20
- end
21
- }
22
- m = DslBuilder.build(c,dsl_factories,
23
- builder: builder,exec: :class_exec,
24
- &blk)
25
- c.include m
26
- if name
27
- *ans, ln = name.to_s.split(/::/)
28
- parent = Object
29
- ans.each do |a|
30
- unless parent.const_defined? a
31
- parent.const_set a, Module.new
32
- end
33
- parent = parent.const_get a
34
- end
35
-
36
- parent.const_set ln, c
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,43 +0,0 @@
1
- module Alki
2
- class DslBuilder
3
- def initialize(*dsl_factories,builder: nil, exec: nil)
4
- @builder = builder
5
- @exec = exec
6
- @dsl_factories = dsl_factories.flatten
7
- end
8
-
9
- def build(obj,&blk)
10
- self.class.build(obj,@dsl_factories,
11
- builder: @builder,
12
- exec: @exec,
13
- &blk)
14
- end
15
-
16
- def self.build(obj,dsl_factories,builder: nil, exec: nil, &blk)
17
- builder ||= Object.method(:new)
18
- exec ||= :instance_exec
19
- unless dsl_factories.is_a?(Array)
20
- dsl_factories = [dsl_factories]
21
- end
22
- builder = builder.call
23
- dsls = []
24
- dsl_factories.each do |dsl_factory|
25
- if dsl_factory.respond_to? :new_dsl
26
- dsl = dsl_factory.new_dsl obj
27
- else
28
- dsl = dsl_factory.new obj
29
- end
30
- dsl.dsl_methods.each do |method_name|
31
- method = dsl.method(method_name)
32
- builder.define_singleton_method method_name do |*args,&blk|
33
- method.call *args, &blk
34
- end
35
- end
36
- dsls << dsl
37
- end
38
- builder.send(exec,&blk)
39
- dsls.each {|dsl| dsl.finalize if dsl.respond_to? :finalize }
40
- builder
41
- end
42
- end
43
- end
@@ -1,25 +0,0 @@
1
- require 'alki/group_dsl'
2
- require 'alki/dsl_builder'
3
-
4
- module Alki
5
- class GroupBuilder
6
- def self.build(loader,obj = {},&dsl)
7
- Alki::GroupBuilder.new(loader).build(obj,&dsl)
8
- obj
9
- end
10
-
11
- def initialize(loader)
12
- @loader = loader
13
- @builder = Alki::DslBuilder.new(self)
14
- end
15
-
16
- def new_dsl(obj)
17
- GroupDsl.new(obj,loader: @loader, group_builder: @builder)
18
- end
19
-
20
- def build(group={},&dsl)
21
- @builder.build(group,&dsl)
22
- group
23
- end
24
- end
25
- end
@@ -1,98 +0,0 @@
1
- require 'alki/util'
2
-
3
- module Alki
4
- class GroupDsl
5
- def initialize(root,group_builder:,loader:)
6
- @root = root
7
- @group_builder = group_builder
8
- @loader = loader
9
- end
10
-
11
- def dsl_methods
12
- [:set,:service,:factory,:load,:import,:group,:overlay,:clear_overlays]
13
- end
14
-
15
- def set(name,value=nil,&blk)
16
- service name, &(blk || -> { value })
17
- end
18
-
19
- def service(name,&blk)
20
- name = name.to_sym
21
- @root[name] = {
22
- type: :service,
23
- block: blk
24
- }
25
- end
26
-
27
- def factory(name,&blk)
28
- name = name.to_sym
29
- @root[name] = {
30
- type: :factory,
31
- block: blk
32
- }
33
- end
34
-
35
- def import(name)
36
- instance_exec &@loader.load(name.to_s)
37
- end
38
-
39
- def load(name)
40
- group(name.to_sym) do
41
- import(name)
42
- end
43
- end
44
-
45
- def package(name,pkg,klass=nil,&blk)
46
- if pkg.is_a? String
47
- require pkg
48
- if klass == nil
49
- pkg = Alki::Util.classify(pkg)
50
- else
51
- pkg = klass
52
- end
53
- end
54
- if pkg.is_a? Class
55
- pkg = pkg.new
56
- end
57
- if pkg.response_to? :package_definition
58
- pkg = pkg.package_definition
59
- end
60
- unless pkg.is_a? Hash
61
- raise "Invalid package: #{pkg.inspect}"
62
- end
63
- name = name.to_sym
64
- overrides = {}
65
- @group_builder.build(overrides,&blk) if blk
66
- overrides[:original] = {
67
- type: :package,
68
- children: pkg,
69
- overrides: {}
70
- }
71
- @root[name] = {
72
- type: :package,
73
- children: pkg,
74
- overrides: overrides
75
- }
76
- end
77
-
78
- def group(name,&blk)
79
- name = name.to_sym
80
- children = {}
81
- @group_builder.build(children,&blk)
82
- @root[name] = {
83
- type: :group,
84
- children: children
85
- }
86
- end
87
-
88
- def overlay(&blk)
89
- @root['overlays'] ||= []
90
- @root['overlays'] << blk
91
- end
92
-
93
- def clear_overlays
94
- @root['overlays'] ||= []
95
- @root['overlays'] << :clear
96
- end
97
- end
98
- end
data/lib/alki/loader.rb DELETED
@@ -1,32 +0,0 @@
1
- module Alki
2
- class Loader
3
- def self.load(config_file)
4
- Fiber.new do
5
- Kernel.load config_file
6
- Thread.current[:alki_loader_current]
7
- end.resume
8
- end
9
-
10
- def initialize(root_dir)
11
- @root_dir = root_dir
12
- end
13
-
14
- def load_all
15
- Dir[File.join(@root_dir,'**','*.rb')].inject({}) do |h,path|
16
- file = path.gsub(File.join(@root_dir,''),'').gsub(/\.rb$/,'')
17
- h.merge!(file => Loader.load(path))
18
- end
19
- end
20
-
21
- def load(file)
22
- Loader.load File.expand_path("#{file}.rb",@root_dir)
23
- end
24
- end
25
- end
26
-
27
- module Kernel
28
- def Alki(&blk)
29
- Thread.current[:alki_loader_current] = blk if blk
30
- ::Alki
31
- end
32
- end