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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 28d86e0716c73ae59b0b6ac85076436ae54d1856d072e11114c576cd0b66365e
4
- data.tar.gz: 255f6b2b4ac6b2a6f56f0cbea4fdf38e991494c855cd373417ec99f95af174ac
3
+ metadata.gz: 2fa283d983d2df265fc4d74813c9abefb8f351c2582245d359a497514f4a61a5
4
+ data.tar.gz: 0e6ee2d867415efdec03f53d35be33a99ad202b4e2aa9f76ab9683b9657af999
5
5
  SHA512:
6
- metadata.gz: 745f85388243699c7a2143c8849039b46aad9e343bf3ec005d3f04025d21d4860a7e43969ce06a3ab0357d865bfc4a4efd9fc14c550f551b4aa455a0aa33ab38
7
- data.tar.gz: 6e1a5d9e21e28c3667a56e96b85c1e7c2e6a304ea377d607f1bc1b4b161af4a1e314f4dc28752c2ccc31e982b6cb9b3b0dbf077573dc02c4cd34376baaf4ef75
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.2)
5
- toritori (= 0.1.0)
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.0)
61
+ toritori (0.2.1)
62
62
  unicode-display_width (2.4.2)
63
63
 
64
64
  PLATFORMS
@@ -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
- self.class.def_accessor(build_order[idx], on: object, to: prev, delegate: delegate) if prev
35
- callbacks.to_h.fetch(name, []).each { |c| c.call(object) } if 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.send("#{name}_factory").create if initialization[name].nil?
22
+ return @abstract_factory.factories[name].create if initialization[name].nil?
44
23
 
45
24
  args, kwargs, block = initialization[name]
46
- @abstract_factory.send("#{name}_factory").create(*args, **kwargs, &block)
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.base_class(klass) if klass
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Nina
4
- VERSION = '0.1.2'
4
+ VERSION = '0.1.4'
5
5
  end
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.2
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: 2023-07-12 00:00:00.000000000 Z
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.0
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.0
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