nina 0.1.2 → 0.1.4
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 +4 -4
- data/Gemfile.lock +3 -3
- data/lib/nina/assembler.rb +4 -25
- data/lib/nina/builder.rb +3 -4
- data/lib/nina/version.rb +1 -1
- data/lib/nina.rb +40 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2fa283d983d2df265fc4d74813c9abefb8f351c2582245d359a497514f4a61a5
|
4
|
+
data.tar.gz: 0e6ee2d867415efdec03f53d35be33a99ad202b4e2aa9f76ab9683b9657af999
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 822d7360687494fefea19be97898eefa121c3aff71ba579d1030730b9a3b97e5409d6fe53990f43f2b175e132ff78a7184c79956e2545647aeaccd1c0a8c8c2a
|
7
|
+
data.tar.gz: fc42924b259b4c68ceca3e14b951ae45aadd61214b8ac7944294a283d183cd5bfedc6b4248287b55364e175ef9bfcb7fbfaad8e5c564a33fcbbc0acd9b851aaf
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
nina (0.1.
|
5
|
-
toritori (= 0.1
|
4
|
+
nina (0.1.4)
|
5
|
+
toritori (= 0.2.1)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
@@ -58,7 +58,7 @@ GEM
|
|
58
58
|
json (>= 1.8, < 3)
|
59
59
|
simplecov-html (~> 0.10.0)
|
60
60
|
simplecov-html (0.10.2)
|
61
|
-
toritori (0.1
|
61
|
+
toritori (0.2.1)
|
62
62
|
unicode-display_width (2.4.2)
|
63
63
|
|
64
64
|
PLATFORMS
|
data/lib/nina/assembler.rb
CHANGED
@@ -3,27 +3,6 @@
|
|
3
3
|
module Nina
|
4
4
|
# Generates module that adds support for objects creation
|
5
5
|
class Assembler
|
6
|
-
# Adds ability to delegeate methods via method_missing
|
7
|
-
module MethodMissingDelegation
|
8
|
-
def method_missing(name, *attrs, &block)
|
9
|
-
return super unless methods.detect { |m| m == :__predecessor }
|
10
|
-
|
11
|
-
public_send(__predecessor).public_send(name, *attrs, &block)
|
12
|
-
end
|
13
|
-
|
14
|
-
def respond_to_missing?(method_name, _include_private = false)
|
15
|
-
return super unless methods.detect { |m| m == :__predecessor }
|
16
|
-
|
17
|
-
public_send(__predecessor).respond_to?(method_name)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.def_accessor(accessor, on:, to:, delegate: false)
|
22
|
-
on.define_singleton_method(:__predecessor) { accessor }
|
23
|
-
on.define_singleton_method(accessor) { to }
|
24
|
-
on.extend(MethodMissingDelegation) if delegate
|
25
|
-
end
|
26
|
-
|
27
6
|
def initialize(abstract_factory)
|
28
7
|
@abstract_factory = abstract_factory
|
29
8
|
end
|
@@ -31,8 +10,8 @@ module Nina
|
|
31
10
|
def inject(build_order, initialization = {}, callbacks: nil, delegate: false)
|
32
11
|
build_order.each.with_index(-1).inject(nil) do |prev, (name, idx)|
|
33
12
|
object = create_object(name, initialization)
|
34
|
-
|
35
|
-
callbacks
|
13
|
+
Nina.def_accessor(build_order[idx], on: object, to: prev, delegate: delegate) if prev
|
14
|
+
callbacks[name].each { |c| c.call(object) } if callbacks&.key?(name)
|
36
15
|
object
|
37
16
|
end
|
38
17
|
end
|
@@ -40,10 +19,10 @@ module Nina
|
|
40
19
|
private
|
41
20
|
|
42
21
|
def create_object(name, initialization = {})
|
43
|
-
return @abstract_factory.
|
22
|
+
return @abstract_factory.factories[name].create if initialization[name].nil?
|
44
23
|
|
45
24
|
args, kwargs, block = initialization[name]
|
46
|
-
@abstract_factory.
|
25
|
+
@abstract_factory.factories[name].create(*args, **kwargs, &block)
|
47
26
|
end
|
48
27
|
end
|
49
28
|
end
|
data/lib/nina/builder.rb
CHANGED
@@ -31,8 +31,7 @@ module Nina
|
|
31
31
|
build_order_list << name
|
32
32
|
super
|
33
33
|
define_singleton_method(name) do |klass = nil, &definition|
|
34
|
-
factories[__method__].subclass
|
35
|
-
factories[__method__].subclass(&definition) if definition
|
34
|
+
factories[__method__].subclass(produces: klass, &definition)
|
36
35
|
end
|
37
36
|
end
|
38
37
|
end
|
@@ -65,7 +64,7 @@ module Nina
|
|
65
64
|
@assembler.inject(
|
66
65
|
@abstract_factory.build_order_list,
|
67
66
|
@initialization.to_h,
|
68
|
-
callbacks: callbacks,
|
67
|
+
callbacks: callbacks.to_h,
|
69
68
|
delegate: delegate
|
70
69
|
)
|
71
70
|
end
|
@@ -76,7 +75,7 @@ module Nina
|
|
76
75
|
@assembler.inject(
|
77
76
|
@abstract_factory.build_order_list.reverse,
|
78
77
|
@initialization.to_h,
|
79
|
-
callbacks: callbacks,
|
78
|
+
callbacks: callbacks.to_h,
|
80
79
|
delegate: delegate
|
81
80
|
)
|
82
81
|
end
|
data/lib/nina/version.rb
CHANGED
data/lib/nina.rb
CHANGED
@@ -31,7 +31,47 @@ module Nina
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
# Adds ability to delegeate methods via method_missing
|
35
|
+
module MethodMissingDelegation
|
36
|
+
def method_missing(name, *attrs, **kwargs, &block)
|
37
|
+
if (prev = predecessors.detect { |o| o.public_methods.include?(name) })
|
38
|
+
prev.public_send(name, *attrs, **kwargs, &block)
|
39
|
+
else
|
40
|
+
super
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def respond_to_missing?(method_name, _include_private = false)
|
45
|
+
public_methods.detect { |m| m == :predecessor_name } || super
|
46
|
+
end
|
47
|
+
|
48
|
+
def predecessors
|
49
|
+
@predecessors ||= begin
|
50
|
+
obj = self
|
51
|
+
[].tap do |list|
|
52
|
+
list << obj = obj.public_send(obj.predecessor_name) while obj.methods.detect { |m| m == :predecessor_name }
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
34
58
|
def self.included(receiver)
|
35
59
|
receiver.extend ClassMethods
|
36
60
|
end
|
61
|
+
|
62
|
+
def self.def_accessor(accessor, on:, to:, delegate: false)
|
63
|
+
on.define_singleton_method(accessor) { to }
|
64
|
+
return unless delegate
|
65
|
+
|
66
|
+
on.define_singleton_method(:predecessor_name) { accessor }
|
67
|
+
on.extend(MethodMissingDelegation)
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.linked_list(build_config, delegate: false)
|
71
|
+
build_order = build_config.keys
|
72
|
+
build_config.each.with_index(-1).inject(nil) do |prev, ((_, object), idx)|
|
73
|
+
Nina.def_accessor(build_order[idx], on: object, to: prev, delegate: delegate) if prev
|
74
|
+
object
|
75
|
+
end
|
76
|
+
end
|
37
77
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nina
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrii Baran
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: toritori
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1
|
19
|
+
version: 0.2.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.1
|
26
|
+
version: 0.2.1
|
27
27
|
description: Reduce biolerplate code when you need to create complex OOD composition
|
28
28
|
email:
|
29
29
|
- andriy.baran.v@gmail.com
|