simple_facade 0.1.0 → 0.2.1

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: fccf94030568ae272bcf2b1f813a91c0dedcccb6
4
- data.tar.gz: 664c4d9b2b8ae07c9dec62e5c2da3624247cebef
3
+ metadata.gz: 0d0c779c14323342655ca52d754d9f2b31b37f3f
4
+ data.tar.gz: 828b22d0d6101b4dfdede1278c6f55abe6b25ee6
5
5
  SHA512:
6
- metadata.gz: 991ac783592ab47c7107309b142d071b05e7ed2e8ac32c3c836c57ac5a505f5cf4428f6c40bc5597aaf308649ff9e6a9593ffe6904b7d45a70e1b94f6697b4bb
7
- data.tar.gz: 966119c95ffde8e95522eec833fefd122315751f20c396a73fe9a207ec978dff6e50a068b16cc2699edb3a980a5a0036dd143bcc0dccb28f0bef9a5dabc59f9b
6
+ metadata.gz: a8992f79ec252664f77029ba84904bbad6e5b59be53d916235a2e42b007f6fd1bb8b617c5da86057d27499b003b0f77f4556abc26fb7adbb2b3043885b9d448f
7
+ data.tar.gz: cab3426f00b10da7ebacf61ced53d12a77c2c787773fa7a5a3712b9410d5e63acccb3b990ddca964786c9be99d9a1e4b0d6d32d6d736c33394df321ee18e2e91
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- simple_facade (0.1.0)
4
+ simple_facade (0.2.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -1,49 +1,53 @@
1
1
  require 'simple_facade/version'
2
+ require 'simple_facade/linking'
2
3
 
3
4
  module SimpleFacade
4
5
  class Error < StandardError; end
5
6
 
6
- class Base
7
- def initialize(*attrs)
8
- @subjects = []
9
- if attrs.size == 1 && attrs.first.is_a?(Hash)
10
- @subjects += attrs.first.to_a
11
- else
12
- @subjects += attrs.select {|el| el.is_a(Array) && el.size == 2}
13
- end
14
- super
15
- end
16
-
17
- def members
18
- subjects.to_h
7
+ module Mixin
8
+ def facade_push(k, v)
9
+ return if v.nil? || k.nil? || key_exists?(k)
10
+ @__members__ = nil
11
+ __subjects__.push([k, v])
19
12
  end
20
13
 
21
- def push(k, v)
22
- subjects.push([k, v])
14
+ def facade_pop
15
+ @__members__ = nil
16
+ __subjects__.pop
23
17
  end
24
18
 
25
- def pop
26
- subjects.pop
19
+ def facade_enqueue(k, v)
20
+ return if v.nil? || k.nil? || key_exists?(k)
21
+ @__members__ = nil
22
+ __subjects__.unshift([k, v])
27
23
  end
28
24
 
29
- def enqueue(k, v)
30
- subjects.unshift([k, v])
25
+ def facade_dequeue
26
+ @__members__ = nil
27
+ __subjects__.shift
31
28
  end
32
29
 
33
- def dequeue
34
- subjects.shift
30
+ def facade_insert(index, k, v)
31
+ return if v.nil? || k.nil? || index.nil? || key_exists?(k)
32
+ @__members__ = nil
33
+ __subjects__.insert(index, [k, v])
35
34
  end
36
35
 
37
- def insert(index, k, v)
38
- subjects.insert(index, [k, v])
36
+ def facade_delete(key)
37
+ return if key.nil?
38
+ @__members__ = nil
39
+ __subjects__.delete_at(__subjects__.index { |el| el.first == key })
39
40
  end
40
41
 
41
- def delete(key)
42
- subjects.delete_at(subjects.index { |el| el.first == key })
42
+ def facade_reverse
43
+ @__members__ = nil
44
+ __subjects__.reverse!
43
45
  end
44
46
 
45
47
  def method_missing(method_name, *attrs, &block)
46
- responder = members.values.detect { |obj| obj.respond_to?(method_name) }
48
+ member = __members__[method_name]
49
+ return member if member
50
+ responder = __members__.values.detect { |obj| obj.respond_to?(method_name) }
47
51
  if responder
48
52
  responder.public_send(method_name, *attrs, &block)
49
53
  else
@@ -52,11 +56,33 @@ module SimpleFacade
52
56
  end
53
57
 
54
58
  def respond_to_missing?(method_name, _include_private = false)
55
- members.values.any? { |obj| obj.respond_to?(method_name) }
59
+ !__members__[method_name].nil? || __members__.values.any? { |obj| obj.respond_to?(method_name) }
56
60
  end
57
61
 
58
62
  private
59
63
 
60
- attr_reader :subjects
64
+ def __subjects__
65
+ @__subjects__ ||= []
66
+ end
67
+
68
+ def __members__
69
+ @__members__ ||= __subjects__.to_h
70
+ end
71
+
72
+ def key_exists?(key)
73
+ __members__.keys.include?(key)
74
+ end
75
+ end
76
+
77
+ class Base
78
+ include Mixin
79
+
80
+ def initialize(*attrs, **options)
81
+ @__subjects__ = []
82
+ @__subjects__ += attrs.select {|el| el.is_a?(Array) && el.size == 2}
83
+ @__subjects__ += options.to_a
84
+ end
85
+
86
+ attr_reader :__subjects__
61
87
  end
62
88
  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.0"
2
+ VERSION = '0.2.1'.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.0
4
+ version: 0.2.1
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-02 00:00:00.000000000 Z
11
+ date: 2020-10-28 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