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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/simple_facade.rb +54 -28
- data/lib/simple_facade/linking.rb +88 -0
- data/lib/simple_facade/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0d0c779c14323342655ca52d754d9f2b31b37f3f
|
4
|
+
data.tar.gz: 828b22d0d6101b4dfdede1278c6f55abe6b25ee6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8992f79ec252664f77029ba84904bbad6e5b59be53d916235a2e42b007f6fd1bb8b617c5da86057d27499b003b0f77f4556abc26fb7adbb2b3043885b9d448f
|
7
|
+
data.tar.gz: cab3426f00b10da7ebacf61ced53d12a77c2c787773fa7a5a3712b9410d5e63acccb3b990ddca964786c9be99d9a1e4b0d6d32d6d736c33394df321ee18e2e91
|
data/Gemfile.lock
CHANGED
data/lib/simple_facade.rb
CHANGED
@@ -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
|
-
|
7
|
-
def
|
8
|
-
|
9
|
-
|
10
|
-
|
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
|
22
|
-
|
14
|
+
def facade_pop
|
15
|
+
@__members__ = nil
|
16
|
+
__subjects__.pop
|
23
17
|
end
|
24
18
|
|
25
|
-
def
|
26
|
-
|
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
|
30
|
-
|
25
|
+
def facade_dequeue
|
26
|
+
@__members__ = nil
|
27
|
+
__subjects__.shift
|
31
28
|
end
|
32
29
|
|
33
|
-
def
|
34
|
-
|
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
|
38
|
-
|
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
|
42
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
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-
|
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
|