dry-behaviour 0.3.1 → 0.4.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 +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
|