nina 0.1.4 → 0.1.5
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 +1 -1
- data/lib/nina/assembler.rb +22 -7
- data/lib/nina/builder.rb +25 -28
- data/lib/nina/version.rb +1 -1
- data/lib/nina.rb +6 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a252130b2ce26b317359fa4566edf12fba94042ddb9863fc8c71148a283c718
|
4
|
+
data.tar.gz: bb24fa2d53ef3ba45b921cc7a2af366b9e54cd2703681f0cd14210362fe5b473
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fb97e0c1d28b7dc902366368f770dc3ed7c6f677dd98260dac0caa0a97c16a5d89a09ece6bac74125f7f3a266f4a98baa7a14ff72d163e331b1aa2cb206b0a25
|
7
|
+
data.tar.gz: fb26ae5dfac451918af68b16b3f45081559e2e546338fdf8eb0a4b48dcee0f79d4314b3d670b65ac066a472c96ae8c579686ae8f562546a71c2dc81d0bd43f99
|
data/Gemfile.lock
CHANGED
data/lib/nina/assembler.rb
CHANGED
@@ -1,28 +1,43 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'nina/builder/initialization'
|
4
|
+
require 'nina/builder/callbacks'
|
5
|
+
|
3
6
|
module Nina
|
4
7
|
# Generates module that adds support for objects creation
|
5
8
|
class Assembler
|
6
|
-
|
9
|
+
include Observable
|
10
|
+
|
11
|
+
attr_reader :initialization, :callbacks
|
12
|
+
|
13
|
+
def initialize(abstract_factory, callbacks = nil)
|
7
14
|
@abstract_factory = abstract_factory
|
15
|
+
@initialization = Builder::Initialization.new(@abstract_factory.build_order_list)
|
16
|
+
@callbacks = callbacks&.copy || Builder::Callbacks.new(@abstract_factory.build_order_list)
|
8
17
|
end
|
9
18
|
|
10
|
-
def inject(build_order,
|
19
|
+
def inject(build_order, delegate: false)
|
11
20
|
build_order.each.with_index(-1).inject(nil) do |prev, (name, idx)|
|
12
21
|
object = create_object(name, initialization)
|
13
|
-
|
14
|
-
|
22
|
+
setup_relation(object, prev, name, build_order[idx], delegate)
|
23
|
+
changed
|
24
|
+
notify_observers(name, object)
|
15
25
|
object
|
16
26
|
end
|
17
27
|
end
|
18
28
|
|
19
29
|
private
|
20
30
|
|
31
|
+
def setup_relation(object, prev, name, accessor, delegate)
|
32
|
+
Nina.def_accessor(accessor, on: object, to: prev, delegate: delegate) if prev
|
33
|
+
callbacks.to_h[name].each { |c| c.call(object) } if callbacks&.to_h&.key?(name)
|
34
|
+
end
|
35
|
+
|
21
36
|
def create_object(name, initialization = {})
|
22
|
-
return @abstract_factory.
|
37
|
+
return @abstract_factory.create(name) if initialization.to_h[name].nil?
|
23
38
|
|
24
|
-
args, kwargs, block = initialization[name]
|
25
|
-
@abstract_factory.
|
39
|
+
args, kwargs, block = initialization.to_h[name]
|
40
|
+
@abstract_factory.create(name, *args, **kwargs, &block)
|
26
41
|
end
|
27
42
|
end
|
28
43
|
end
|
data/lib/nina/builder.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'nina/builder/initialization'
|
4
|
-
require 'nina/builder/callbacks'
|
5
|
-
|
6
3
|
# This should be a kind of factory that creates complex objects
|
7
4
|
# from simple ones. It should use torirori to create objects.
|
8
5
|
# It also enriches objects with some methods that make them more
|
@@ -42,42 +39,37 @@ module Nina
|
|
42
39
|
@abstract_factory = abstract_factory.include(Toritori).extend(ClassMethods)
|
43
40
|
@abstract_factory.class_eval(&def_block) if def_block
|
44
41
|
@abstract_factory.build_order_list.freeze
|
45
|
-
@
|
46
|
-
@assembler
|
47
|
-
@
|
42
|
+
@assembler = Assembler.new(@abstract_factory, callbacks)
|
43
|
+
@assembler.add_observer(self)
|
44
|
+
@observers = []
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_observer(observer)
|
48
|
+
@observers << observer
|
48
49
|
end
|
49
50
|
|
50
51
|
def copy
|
51
|
-
self.class.new(name, abstract_factory: abstract_factory)
|
52
|
+
new_builder = self.class.new(name, abstract_factory: abstract_factory, callbacks: @assembler.callbacks)
|
53
|
+
@observers.each { |observer| new_builder.add_observer(observer) }
|
54
|
+
new_builder
|
52
55
|
end
|
53
56
|
|
54
57
|
def with_callbacks(&block)
|
55
|
-
|
56
|
-
yield c if block
|
58
|
+
yield @assembler.callbacks if block
|
57
59
|
|
58
|
-
|
60
|
+
copy
|
59
61
|
end
|
60
62
|
|
61
63
|
def wrap(delegate: false, &block)
|
62
|
-
yield @initialization if block
|
63
|
-
|
64
|
-
@assembler.inject(
|
65
|
-
@abstract_factory.build_order_list,
|
66
|
-
@initialization.to_h,
|
67
|
-
callbacks: callbacks.to_h,
|
68
|
-
delegate: delegate
|
69
|
-
)
|
64
|
+
yield @assembler.initialization if block
|
65
|
+
|
66
|
+
@assembler.inject(@abstract_factory.build_order_list, delegate: delegate)
|
70
67
|
end
|
71
68
|
|
72
69
|
def nest(delegate: false, &block)
|
73
|
-
yield @initialization if block
|
74
|
-
|
75
|
-
@assembler.inject(
|
76
|
-
@abstract_factory.build_order_list.reverse,
|
77
|
-
@initialization.to_h,
|
78
|
-
callbacks: callbacks.to_h,
|
79
|
-
delegate: delegate
|
80
|
-
)
|
70
|
+
yield @assembler.initialization if block
|
71
|
+
|
72
|
+
@assembler.inject(@abstract_factory.build_order_list.reverse, delegate: delegate)
|
81
73
|
end
|
82
74
|
|
83
75
|
def subclass(&def_block)
|
@@ -86,8 +78,13 @@ module Nina
|
|
86
78
|
@abstract_factory = Class.new(abstract_factory)
|
87
79
|
@abstract_factory.class_eval(&def_block)
|
88
80
|
@abstract_factory.build_order_list.freeze
|
89
|
-
@
|
90
|
-
|
81
|
+
@assembler = Assembler.new(@abstract_factory, @assembler.callbacks)
|
82
|
+
end
|
83
|
+
|
84
|
+
def update(name, object)
|
85
|
+
@observers.each do |observer|
|
86
|
+
observer.public_send(:"on_#{name}_created", object) if observer.respond_to?(:"on_#{name}_created")
|
87
|
+
end
|
91
88
|
end
|
92
89
|
end
|
93
90
|
end
|
data/lib/nina/version.rb
CHANGED
data/lib/nina.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'toritori'
|
4
|
+
require 'observer'
|
4
5
|
require 'nina/assembler'
|
5
6
|
require 'nina/builder'
|
6
7
|
|
@@ -34,7 +35,7 @@ module Nina
|
|
34
35
|
# Adds ability to delegeate methods via method_missing
|
35
36
|
module MethodMissingDelegation
|
36
37
|
def method_missing(name, *attrs, **kwargs, &block)
|
37
|
-
if (prev = predecessors.detect { |o| o.public_methods.include?(name) })
|
38
|
+
if (prev = predecessors.lazy.detect { |o| o.public_methods.include?(name) })
|
38
39
|
prev.public_send(name, *attrs, **kwargs, &block)
|
39
40
|
else
|
40
41
|
super
|
@@ -42,15 +43,13 @@ module Nina
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def respond_to_missing?(method_name, _include_private = false)
|
45
|
-
public_methods.detect { |m| m == :
|
46
|
+
public_methods.detect { |m| m == :predecessor } || super
|
46
47
|
end
|
47
48
|
|
48
49
|
def predecessors
|
49
|
-
|
50
|
+
Enumerator.new do |y|
|
50
51
|
obj = self
|
51
|
-
|
52
|
-
list << obj = obj.public_send(obj.predecessor_name) while obj.methods.detect { |m| m == :predecessor_name }
|
53
|
-
end
|
52
|
+
y << obj = obj.predecessor while obj.methods.detect { |m| m == :predecessor }
|
54
53
|
end
|
55
54
|
end
|
56
55
|
end
|
@@ -61,9 +60,9 @@ module Nina
|
|
61
60
|
|
62
61
|
def self.def_accessor(accessor, on:, to:, delegate: false)
|
63
62
|
on.define_singleton_method(accessor) { to }
|
63
|
+
on.define_singleton_method(:predecessor) { to }
|
64
64
|
return unless delegate
|
65
65
|
|
66
|
-
on.define_singleton_method(:predecessor_name) { accessor }
|
67
66
|
on.extend(MethodMissingDelegation)
|
68
67
|
end
|
69
68
|
|
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.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrii Baran
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: toritori
|