dry-behaviour 0.1.1 → 0.2.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: 080e9972673cdf92dbb1ebe72b097fe8faa05fca
4
- data.tar.gz: 7f62264785dda9bf3423bf5bc48176724d70a4db
3
+ metadata.gz: 822ccca7591e84e8f437fb9942ed3e2b0857ebbe
4
+ data.tar.gz: 80cc1b146e8caf3a3292c3ffc55cf0f88d64b9a6
5
5
  SHA512:
6
- metadata.gz: c0e50166e9843097a4147cd70924fcb3bae533cd3e38f8265795d4d1ee5087ebbaa363bf1df64f6f9ad81a1e0a5e4832d85cf05599463aea83f9ce85eba69aa5
7
- data.tar.gz: 6c39fcdcb28bb5b82648d993b9985ea9402505e72cf745d352270f53b11aa4405163afef5be68aefafd2bf85267270c7c1ce3e84a3c4785211ae7adce26ea08a
6
+ metadata.gz: 8fdff2c37197e6ea799e23618a33cb06f8fce388a67ad0a24f79b5e1cf2afe89ee6ab7d7fcfbb2cbab15789740e3ac7cdbc6ccf463644e6df7b85e6f8f8239c6
7
+ data.tar.gz: b52c34a6dc9d690f6807b6b810bb6b336b278b8ac039e23352a200f02fa526e093e118888bb0c8452098ffddbdbac01309b5768281e1c19b39e0de4780e964c1
@@ -1,5 +1,4 @@
1
1
  module Dry
2
- # rubocop:disable Style/VariableName
3
2
  # rubocop:disable Style/AsciiIdentifiers
4
3
  # rubocop:disable Style/MultilineBlockChain
5
4
  # rubocop:disable Style/EmptyCaseCondition
@@ -30,7 +29,7 @@ module Dry
30
29
  singleton_class.send :define_method, method do |receiver, *args|
31
30
  receiver.class.ancestors.lazy.map do |c|
32
31
  BlackTie.implementations[self].fetch(c, nil)
33
- end.reject(&:nil?).first[method].(receiver, *args)
32
+ end.reject(&:nil?).first[method].(*args.unshift(receiver))
34
33
  end
35
34
  end
36
35
  end
@@ -39,26 +38,34 @@ module Dry
39
38
  BlackTie.protocols[self][name] = params
40
39
  end
41
40
 
41
+ DELEGATE_METHOD = lambda do |klazz, (source, target)|
42
+ klazz.class_eval do
43
+ define_method source do |this, *args, **params, &λ|
44
+ case
45
+ when !args.empty? && !params.empty? then this.send(target, *args, **params, &λ)
46
+ when !args.empty? then this.send(target, *args, &λ)
47
+ when !params.empty? then this.send(target, **params, &λ)
48
+ else this.send(target, &λ)
49
+ end
50
+ end
51
+ end
52
+ end
53
+
42
54
  def defimpl(protocol = nil, target: nil, delegate: [], map: {})
43
55
  raise if target.nil? || !block_given? && delegate.empty? && map.empty?
44
56
 
45
57
  mds = normalize_map_delegates(delegate, map)
46
58
  Module.new do
47
- mds.each do |k, v|
48
- singleton_class.class_eval do
49
- define_method k do |this, *args, **params, &λ|
50
- case
51
- when !args.empty? && !params.empty? then this.send(v, *args, **params, &λ)
52
- when !args.empty? then this.send(v, *args, &λ)
53
- when !params.empty? then this.send(v, **params, &λ)
54
- else this.send(v, &λ)
55
- end
56
- end
57
- end
58
- end
59
+ mds.each(&DELEGATE_METHOD.curry[singleton_class])
59
60
  singleton_class.class_eval(&Proc.new) if block_given? # block takes precedence
60
61
  end.tap do |mod|
61
- mod.methods(false).each do |m|
62
+ mod.methods(false).tap do |meths|
63
+ (BlackTie.protocols[protocol || self].keys - meths).each_with_object(meths) do |m, acc|
64
+ safe_logger.warn("Implicit delegate #{(protocol || self).inspect}##{m} to #{target}")
65
+ DELEGATE_METHOD.(mod.singleton_class, [m] * 2)
66
+ acc << m
67
+ end
68
+ end.each do |m|
62
69
  BlackTie.implementations[protocol || self][target][m] = mod.method(m).to_proc
63
70
  end
64
71
  end
@@ -67,6 +74,15 @@ module Dry
67
74
 
68
75
  private
69
76
 
77
+ def safe_logger
78
+ if Kernel.const_defined?('::Rails')
79
+ Rails.logger
80
+ else
81
+ require 'logger'
82
+ Logger.new($stdout)
83
+ end
84
+ end
85
+
70
86
  def normalize_map_delegates(delegate, map)
71
87
  [*delegate, *map].map do |e|
72
88
  case e
@@ -83,5 +99,4 @@ module Dry
83
99
  # rubocop:enable Style/EmptyCaseCondition
84
100
  # rubocop:enable Style/MultilineBlockChain
85
101
  # rubocop:enable Style/AsciiIdentifiers
86
- # rubocop:enable Style/VariableName
87
102
  end
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Behaviour
3
- VERSION = '0.1.1'.freeze
3
+ VERSION = '0.2.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.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksei Matiushkin