simple_facade 0.1.3 → 0.2.0

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
  SHA1:
3
- metadata.gz: 9a3b97b20c0d5d25c6b93aac6a21f47a10bba41b
4
- data.tar.gz: 7a79ce4587f508dd0130eb8292cb9e8d6f7c97e5
3
+ metadata.gz: 98b40c93e2ca44d489e5a78be91f67ee30c44a0a
4
+ data.tar.gz: 3b9a762f13d9216102971cba97d9a22a54a5796a
5
5
  SHA512:
6
- metadata.gz: 32b1b970f368adeae96b3c37125eb344c30e6788341d739c949b81376225c532a6e7b69246c4112dc944303d508a23e00bb680506e5689285bc39b48e21d31de
7
- data.tar.gz: ee9dddcd9688775e0327d825e8bd5566588bee26ac7177983d81f7bab167f86dbb4994ccbe570ee3014693564d629f2bfa0fb21c7a559d9e2b939fdc1b36cbbb
6
+ metadata.gz: 4eca7ea95b0a4676c8e799fd4363f48c47e235007191a609b5e2e1d9e7f037a86b6b4189a08452b3f898b2187a204492d684011cf3669726eadb451beae79390
7
+ data.tar.gz: 6e7ec31700521482dd31ae8d10ce3b1399db2eb99b240d2cc2102ae2bb3cc1cd9461d312202943f11dc2cd8ae0372520b28c0ec1e0c53330a321e589a1c74dab
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_facade (0.1.3)
4
+ simple_facade (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,4 +1,5 @@
1
1
  require 'simple_facade/version'
2
+ require 'simple_facade/linking'
2
3
 
3
4
  module SimpleFacade
4
5
  class Error < StandardError; end
@@ -0,0 +1,88 @@
1
+ module SimpleFacade
2
+ module Linking
3
+ READERS = [
4
+ SUCCESSOR = :successor,
5
+ PREDECESSOR = :predecessor,
6
+ ]
7
+
8
+ class LinkingObserver
9
+ attr_reader :current_object, :previous_step, :reader
10
+
11
+ def initialize(reader = nil)
12
+ @reader = reader
13
+ end
14
+
15
+ def double?
16
+ reader.nil?
17
+ end
18
+
19
+ def single?
20
+ !double?
21
+ end
22
+
23
+ def reverse?
24
+ reader == SimpleFacade::Linking::PREDECESSOR
25
+ end
26
+
27
+ def direct?
28
+ reader == SimpleFacade::Linking::SUCCESSOR
29
+ end
30
+
31
+ def on_new_object(accessor, object)
32
+ @current_object = link(@current_object, object, @previous_step, accessor)
33
+ @previous_step = accessor
34
+ end
35
+
36
+ def link(current_object, next_object, predecessor, successor)
37
+ return next_object if predecessor.nil? || current_object.nil?
38
+
39
+ link_predecessor(current_object, next_object, predecessor)
40
+ link_successor(current_object, next_object, successor)
41
+
42
+ next_object
43
+ end
44
+
45
+ def link_predecessor(current_object, next_object, predecessor)
46
+ return if single? && direct?
47
+ next_object.singleton_class.class_eval do
48
+ attr_accessor :predecessor
49
+ end
50
+ next_object.predecessor = predecessor
51
+ next_object.singleton_class.class_eval do
52
+ attr_accessor next_object.predecessor
53
+ end
54
+ next_object.public_send(:"#{next_object.predecessor}=", current_object)
55
+ end
56
+
57
+ def link_successor(current_object, next_object, successor)
58
+ return if single? && reverse?
59
+ current_object.singleton_class.class_eval do
60
+ attr_accessor :successor
61
+ end
62
+ current_object.successor = successor
63
+ current_object.singleton_class.class_eval do
64
+ attr_accessor current_object.successor
65
+ end
66
+ current_object.public_send(:"#{current_object.successor}=", next_object)
67
+ end
68
+ end
69
+
70
+ def link_members
71
+ link(PREDECESSOR)
72
+ end
73
+
74
+ def double_link_members
75
+ link(nil)
76
+ end
77
+
78
+ private
79
+
80
+ def link(reader)
81
+ observer = LinkingObserver.new(reader)
82
+ __subjects__.each do |k, v|
83
+ observer.on_new_object(k, v)
84
+ end
85
+ observer.current_object
86
+ end
87
+ end
88
+ end
@@ -1,3 +1,3 @@
1
1
  module SimpleFacade
2
- VERSION = '0.1.3'.freeze
2
+ VERSION = '0.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_facade
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrii Baran
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-08-29 00:00:00.000000000 Z
11
+ date: 2020-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,6 +86,7 @@ files:
86
86
  - bin/console
87
87
  - bin/setup
88
88
  - lib/simple_facade.rb
89
+ - lib/simple_facade/linking.rb
89
90
  - lib/simple_facade/version.rb
90
91
  - simple_facade.gemspec
91
92
  homepage: https://github.com/andriy-baran/simple_facade