Completed
Pull Request — master (#14)
by Marcelo
01:29
created

Base   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 63
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 17
c 1
b 0
f 0
dl 0
loc 63
rs 10

9 Methods

Rating   Name   Duplication   Size   Complexity  
A coerce() 0 5 2
A default_value() 0 5 1
A secure() 0 9 3
A coerce_not_nil() 0 3 1
A initialize() 0 3 1
A with_default_value() 0 5 2
A with_nil_value() 0 6 2
A coerce_nil() 0 7 3
A wrap_errors() 0 5 2
1
module Koine
2
  module Attributes
3
    module Adapter
4
      class Base
5
        attr_accessor :attribute_name
6
7
        def initialize
8
          @attribute_name = 'AnonymousAttribute'
9
        end
10
11
        def coerce(value)
12
          return coerce_nil if value.nil?
13
14
          coerce_not_nil(value)
15
        end
16
17
        def default_value
18
          @default_value.respond_to?(:call) &&
19
            @default_value.call ||
20
            @default_value
21
        end
22
23
        def with_nil_value(value = nil, &block)
24
          @nil_value_set = true
25
          @nil_value = value
26
          @nil_value = block if block
27
          self
28
        end
29
30
        def with_default_value(value = nil, &block)
31
          @default_value = value
32
          @default_value = block if block
33
          self
34
        end
35
36
        private
37
38
        def coerce_nil
39
          if @nil_value_set
40
            return @nil_value.respond_to?(:call) ? @nil_value.call : @nil_value
41
          end
42
43
          raise ArgumentError, 'Cannot be nil', attribute_name
44
        end
45
46
        def coerce_not_nil(_value)
47
          raise NotImplementedError
48
        end
49
50
        # duplicates if possible and freezes object
51
        def secure
52
          value = yield
53
54
          unless value.is_a?(::Symbol)
55
            value = value.dup if value.respond_to?(:dup)
56
          end
57
58
          value.freeze
59
        end
60
61
        def wrap_errors
62
          yield
63
        rescue StandardError => error
64
          raise Koine::Attributes::ArgumentError.new(error, attribute_name)
65
        end
66
      end
67
    end
68
  end
69
end
70