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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2fa283d983d2df265fc4d74813c9abefb8f351c2582245d359a497514f4a61a5
4
- data.tar.gz: 0e6ee2d867415efdec03f53d35be33a99ad202b4e2aa9f76ab9683b9657af999
3
+ metadata.gz: 6a252130b2ce26b317359fa4566edf12fba94042ddb9863fc8c71148a283c718
4
+ data.tar.gz: bb24fa2d53ef3ba45b921cc7a2af366b9e54cd2703681f0cd14210362fe5b473
5
5
  SHA512:
6
- metadata.gz: 822d7360687494fefea19be97898eefa121c3aff71ba579d1030730b9a3b97e5409d6fe53990f43f2b175e132ff78a7184c79956e2545647aeaccd1c0a8c8c2a
7
- data.tar.gz: fc42924b259b4c68ceca3e14b951ae45aadd61214b8ac7944294a283d183cd5bfedc6b4248287b55364e175ef9bfcb7fbfaad8e5c564a33fcbbc0acd9b851aaf
6
+ metadata.gz: fb97e0c1d28b7dc902366368f770dc3ed7c6f677dd98260dac0caa0a97c16a5d89a09ece6bac74125f7f3a266f4a98baa7a14ff72d163e331b1aa2cb206b0a25
7
+ data.tar.gz: fb26ae5dfac451918af68b16b3f45081559e2e546338fdf8eb0a4b48dcee0f79d4314b3d670b65ac066a472c96ae8c579686ae8f562546a71c2dc81d0bd43f99
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- nina (0.1.4)
4
+ nina (0.1.5)
5
5
  toritori (= 0.2.1)
6
6
 
7
7
  GEM
@@ -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
- def initialize(abstract_factory)
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, initialization = {}, callbacks: nil, delegate: false)
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
- 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)
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.factories[name].create if initialization[name].nil?
37
+ return @abstract_factory.create(name) if initialization.to_h[name].nil?
23
38
 
24
- args, kwargs, block = initialization[name]
25
- @abstract_factory.factories[name].create(*args, **kwargs, &block)
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
- @initialization = Initialization.new(@abstract_factory.factories.keys)
46
- @assembler = Assembler.new(@abstract_factory)
47
- @callbacks = callbacks
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
- c = callbacks&.copy || Callbacks.new(abstract_factory.factories.keys)
56
- yield c if block
58
+ yield @assembler.callbacks if block
57
59
 
58
- self.class.new(name, abstract_factory: abstract_factory, callbacks: c)
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
- @initialization = Initialization.new(@abstract_factory.factories.keys)
90
- @assembler = Assembler.new(@abstract_factory)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nina
4
- VERSION = '0.1.4'
4
+ VERSION = '0.1.5'
5
5
  end
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 == :predecessor_name } || super
46
+ public_methods.detect { |m| m == :predecessor } || super
46
47
  end
47
48
 
48
49
  def predecessors
49
- @predecessors ||= begin
50
+ Enumerator.new do |y|
50
51
  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
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
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-01 00:00:00.000000000 Z
11
+ date: 2024-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: toritori