dry-behaviour 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +23 -0
- data/lib/dry/behaviour/black_tie.rb +31 -16
- data/lib/dry/behaviour/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 597908ea5e4f168109a48128ea4992cd86652edc
|
4
|
+
data.tar.gz: 3945b08a31f1f62784dd9873d1f7a6ded0f94072
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f205f7f1427902ab7b55713496b4da292c0a31f887db84127ae672347fa0fc23ff9fb113e80b029b366e84bc71adcdf33011ce2cca82bc1118ef4a4da2d88de
|
7
|
+
data.tar.gz: 820ff1120fd32773cd93a2e1efe879b56205a6e0104b0c53df5a72743d362203fa6367f3000400effc6f81748603bb17634286ec7e92829458ef462469a35d2c
|
data/README.md
CHANGED
@@ -64,6 +64,29 @@ expect(Protocols::Adder.add_default(1)).to eq(6)
|
|
64
64
|
|
65
65
|
## Changelog
|
66
66
|
|
67
|
+
### `0.4.0` :: Protocol-wide methods are allowed to call from inside implementation
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
module Protocols::Adder
|
71
|
+
include Dry::Protocol
|
72
|
+
|
73
|
+
defprotocol do
|
74
|
+
defmethod :add, :this, :other
|
75
|
+
def default
|
76
|
+
42
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
Dry::Protocol.defimpl target: Integer do
|
82
|
+
def add(this)
|
83
|
+
this + default #⇒ 47 when called as Protocols::Adder.add(5)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
```
|
87
|
+
|
88
|
+
**NB** At the moment works only for external `defimpl`.
|
89
|
+
|
67
90
|
### `0.3.1` :: `implemented_for?` and `implementation_for`
|
68
91
|
|
69
92
|
### `0.3.0` :: version bump
|
@@ -5,6 +5,7 @@ module Dry
|
|
5
5
|
# rubocop:disable Metrics/PerceivedComplexity
|
6
6
|
# rubocop:disable Metrics/CyclomaticComplexity
|
7
7
|
# rubocop:disable Metrics/AbcSize
|
8
|
+
# rubocop:disable Style/MethodName
|
8
9
|
module BlackTie
|
9
10
|
class << self
|
10
11
|
def protocols
|
@@ -24,8 +25,8 @@ module Dry
|
|
24
25
|
class_eval(&Proc.new)
|
25
26
|
(instance_methods(false) - ims).each { |m| class_eval { module_function m } }
|
26
27
|
|
27
|
-
singleton_class.send :define_method, :method_missing do |method, *
|
28
|
-
raise Dry::Protocol::NotImplemented.new(:method,
|
28
|
+
singleton_class.send :define_method, :method_missing do |method, *_args|
|
29
|
+
raise Dry::Protocol::NotImplemented.new(:method, inspect, method)
|
29
30
|
end
|
30
31
|
|
31
32
|
singleton_class.send :define_method, :implementation_for do |receiver|
|
@@ -38,8 +39,14 @@ module Dry
|
|
38
39
|
singleton_class.send :define_method, method do |receiver = nil, *args|
|
39
40
|
impl = implementation_for(receiver)
|
40
41
|
|
41
|
-
raise Dry::Protocol::NotImplemented.new(:protocol,
|
42
|
-
|
42
|
+
raise Dry::Protocol::NotImplemented.new(:protocol, inspect, receiver.class) unless impl
|
43
|
+
begin
|
44
|
+
impl[method].(*args.unshift(receiver))
|
45
|
+
rescue NoMethodError => e
|
46
|
+
raise Dry::Protocol::NotImplemented.new(:method, inspect, e.message)
|
47
|
+
rescue ArgumentError => e
|
48
|
+
raise Dry::Protocol::NotImplemented.new(:method, inspect, "#{method} (#{e.message})")
|
49
|
+
end
|
43
50
|
end
|
44
51
|
end
|
45
52
|
end
|
@@ -68,33 +75,40 @@ module Dry
|
|
68
75
|
Module.new do
|
69
76
|
mds.each(&DELEGATE_METHOD.curry[singleton_class])
|
70
77
|
singleton_class.class_eval(&Proc.new) if block_given? # block takes precedence
|
78
|
+
if protocol
|
79
|
+
extend protocol
|
80
|
+
else # FIXME:
|
81
|
+
BlackTie.Logger.warn('Cross-calling protocol methods is not yet implemented for inplace declarated implementations.')
|
82
|
+
end
|
71
83
|
end.tap do |mod|
|
84
|
+
protocol ||= self
|
85
|
+
|
72
86
|
mod.methods(false).tap do |meths|
|
73
|
-
(BlackTie.protocols[protocol
|
74
|
-
|
87
|
+
(BlackTie.protocols[protocol].keys - meths).each_with_object(meths) do |m, acc|
|
88
|
+
BlackTie.Logger.warn("Implicit delegate #{protocol.inspect}##{m} to #{target}")
|
75
89
|
DELEGATE_METHOD.(mod.singleton_class, [m] * 2)
|
76
90
|
acc << m
|
77
91
|
end
|
78
92
|
end.each do |m|
|
79
93
|
[*target].each do |tgt|
|
80
|
-
BlackTie.implementations[protocol
|
94
|
+
BlackTie.implementations[protocol][tgt][m] = mod.method(m).to_proc
|
81
95
|
end
|
82
96
|
end
|
83
97
|
end
|
84
98
|
end
|
85
99
|
module_function :defimpl
|
86
100
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
Logger.new($stdout)
|
95
|
-
end
|
101
|
+
def self.Logger
|
102
|
+
@logger ||= if Kernel.const_defined?('::Rails')
|
103
|
+
Rails.logger
|
104
|
+
else
|
105
|
+
require 'logger'
|
106
|
+
Logger.new($stdout)
|
107
|
+
end
|
96
108
|
end
|
97
109
|
|
110
|
+
private
|
111
|
+
|
98
112
|
def normalize_map_delegates(delegate, map)
|
99
113
|
[*delegate, *map].map do |e|
|
100
114
|
case e
|
@@ -105,6 +119,7 @@ module Dry
|
|
105
119
|
end
|
106
120
|
module_function :normalize_map_delegates
|
107
121
|
end
|
122
|
+
# rubocop:enable Style/MethodName
|
108
123
|
# rubocop:enable Metrics/AbcSize
|
109
124
|
# rubocop:enable Metrics/CyclomaticComplexity
|
110
125
|
# rubocop:enable Metrics/PerceivedComplexity
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dry-behaviour
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aleksei Matiushkin
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2017-01-
|
13
|
+
date: 2017-01-13 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|