nina 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
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