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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4a166f19773e33836c9c2a8bf2440166c735a55b
4
- data.tar.gz: 80deda3626f5a67ccbbb317e0595f4a86981cf40
3
+ metadata.gz: 597908ea5e4f168109a48128ea4992cd86652edc
4
+ data.tar.gz: 3945b08a31f1f62784dd9873d1f7a6ded0f94072
5
5
  SHA512:
6
- metadata.gz: 5bceef51d78eff3bc1f738cab5ce30baa3215d4507a3c7ec5ff080166b98974cc11b3be47db8694ae4aad290d3d7b3a9633a0d0396cdeb7e7987792ac43eb0d6
7
- data.tar.gz: ea08dff7a62904ebcfde0799c50218ebc0f43b51fc98cf09f15b1a0163eccdcae4fa965e5c7622563a0e2aa73b5db015dc92ac67591f785ba6230811717821f9
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, *args|
28
- raise Dry::Protocol::NotImplemented.new(:method, self.inspect, 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, self.inspect, receiver.class) unless impl
42
- impl[method].(*args.unshift(receiver))
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 || self].keys - meths).each_with_object(meths) do |m, acc|
74
- safe_logger.warn("Implicit delegate #{(protocol || self).inspect}##{m} to #{target}")
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 || self][tgt][m] = mod.method(m).to_proc
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
- private
88
-
89
- def safe_logger
90
- if Kernel.const_defined?('::Rails')
91
- Rails.logger
92
- else
93
- require 'logger'
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
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Behaviour
3
- VERSION = '0.3.1'.freeze
3
+ VERSION = '0.4.0'.freeze
4
4
  end
5
5
  end
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.3.1
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-08 00:00:00.000000000 Z
13
+ date: 2017-01-13 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler