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 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