dry-core 0.4.10 → 0.5.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
  SHA256:
3
- metadata.gz: 538785d6f230fed2829eb31c2eed7b4f878db06f3d69703329e571327abea700
4
- data.tar.gz: 6df94708151283cf120d590581171931141f999d8bdace6a825d80f61ac220e4
3
+ metadata.gz: 455db6bceb946acab5dbe431c4ba7edf9a7344f09c2b2af9e38c0b8788e3d600
4
+ data.tar.gz: c460402f0b99fbe8ad488463cebd828a6a814d0a45f5200fbf1c90302fa66649
5
5
  SHA512:
6
- metadata.gz: 4ab27069408443161d3bed839e061e35ff0c683d3d9023d6834b1d45e48d44eb13eba350b3c7760312ace4eac3d83b8c008eada7878338fa017c96b195c02acc
7
- data.tar.gz: 73c828d5271872b6b5a2b0cbf1d53075b3845ad36e82a90c7d12e35f7154a807c1320de5233eb9c26eeba35cf4078ed0b3fa5deb2b9bc7306adb26c10174d13a
6
+ metadata.gz: c07482895edfb498acc414cc6672c2fa271cbd892f59393b4baa6b3b7ec4e115b29474be85fe42e40660fe06f926442608d693816594bdfcd910411185acad9c
7
+ data.tar.gz: c3d0966d660f09a26007e226b57e1cc2c124a420606b4de5d104730c6f5d9c54492a89788fb601722eab10f42dac4cda5d6689c79fe6c53a3df9c6510569fa7e
@@ -1,3 +1,15 @@
1
+ <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
+
3
+ ## unreleased
4
+
5
+
6
+ ### Added
7
+
8
+ - dry-equalizer has been imported into dry-core as `Dry::Core::Equalizer` but the interface remains the same, which is `include Dry.Equalizer(...)` - we'll be porting all other gems that depend on dry-equalizer to the latest dry-core with equalizer included *gradually*. Eventually dry-equalizer usage will be gone completely in rom-rb/dry-rb/hanami projects (@solnic)
9
+
10
+
11
+ [Compare v0.4.10...master](https://github.com/dry-rb/dry-core/compare/v0.4.10...master)
12
+
1
13
  ## 0.4.10 2020-11-19
2
14
 
3
15
 
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/core'
3
+ require "dry/core"
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/core/version'
3
+ require "dry/core/version"
4
4
 
5
5
  # :nodoc:
6
6
  module Dry
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/map'
3
+ require "concurrent/map"
4
4
 
5
5
  module Dry
6
6
  module Core
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'dry/core/constants'
4
- require 'dry/core/errors'
3
+ require "dry/core/constants"
4
+ require "dry/core/errors"
5
5
 
6
6
  module Dry
7
7
  module Core
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
3
+ require "set"
4
4
 
5
5
  module Dry
6
6
  module Core
@@ -25,7 +25,7 @@ module Dry
25
25
  # An empty set
26
26
  EMPTY_SET = ::Set.new.freeze
27
27
  # An empty string
28
- EMPTY_STRING = ''.freeze
28
+ EMPTY_STRING = "".freeze
29
29
  # Identity function
30
30
  IDENTITY = (-> x { x }).freeze
31
31
 
@@ -46,12 +46,12 @@ module Dry
46
46
 
47
47
  # @api public
48
48
  def undefined.to_s
49
- 'Undefined'
49
+ "Undefined"
50
50
  end
51
51
 
52
52
  # @api public
53
53
  def undefined.inspect
54
- 'Undefined'
54
+ "Undefined"
55
55
  end
56
56
 
57
57
  # Pick a value, if the first argument is not Undefined, return it back,
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'logger'
3
+ require "logger"
4
4
 
5
5
  module Dry
6
6
  module Core
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/array'
3
+ require "concurrent/array"
4
4
 
5
5
  module Dry
6
6
  module Core
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dry
4
+ # Build an equalizer module for the inclusion in other class
5
+ #
6
+ # ## Credits
7
+ #
8
+ # Equalizer has been originally imported from the equalizer gem created by Dan Kubb
9
+ #
10
+ # @api public
11
+ def self.Equalizer(*keys, **options)
12
+ Dry::Core::Equalizer.new(*keys, **options)
13
+ end
14
+
15
+ module Core
16
+ # Define equality, equivalence and inspection methods
17
+ class Equalizer < Module
18
+ # Initialize an Equalizer with the given keys
19
+ #
20
+ # Will use the keys with which it is initialized to define #cmp?,
21
+ # #hash, and #inspect
22
+ #
23
+ # @param [Array<Symbol>] keys
24
+ # @param [Hash] options
25
+ # @option options [Boolean] :inspect whether to define #inspect method
26
+ # @option options [Boolean] :immutable whether to memoize #hash method
27
+ #
28
+ # @return [undefined]
29
+ #
30
+ # @api private
31
+ def initialize(*keys, **options)
32
+ @keys = keys.uniq
33
+ define_methods(**options)
34
+ freeze
35
+ end
36
+
37
+ private
38
+
39
+ # Hook called when module is included
40
+ #
41
+ # @param [Module] descendant
42
+ # the module or class including Equalizer
43
+ #
44
+ # @return [self]
45
+ #
46
+ # @api private
47
+ def included(descendant)
48
+ super
49
+ descendant.include Methods
50
+ end
51
+
52
+ # Define the equalizer methods based on #keys
53
+ #
54
+ # @param [Boolean] inspect whether to define #inspect method
55
+ # @param [Boolean] immutable whether to memoize #hash method
56
+ #
57
+ # @return [undefined]
58
+ #
59
+ # @api private
60
+ def define_methods(inspect: true, immutable: false)
61
+ define_cmp_method
62
+ define_hash_method(immutable: immutable)
63
+ define_inspect_method if inspect
64
+ end
65
+
66
+ # Define an #cmp? method based on the instance's values identified by #keys
67
+ #
68
+ # @return [undefined]
69
+ #
70
+ # @api private
71
+ def define_cmp_method
72
+ keys = @keys
73
+ define_method(:cmp?) do |comparator, other|
74
+ keys.all? do |key|
75
+ __send__(key).public_send(comparator, other.__send__(key))
76
+ end
77
+ end
78
+ private :cmp?
79
+ end
80
+
81
+ # Define a #hash method based on the instance's values identified by #keys
82
+ #
83
+ # @return [undefined]
84
+ #
85
+ # @api private
86
+ def define_hash_method(immutable:)
87
+ calculate_hash = ->(obj) { @keys.map { |key| obj.__send__(key) }.push(obj.class).hash }
88
+ if immutable
89
+ define_method(:hash) do
90
+ @__hash__ ||= calculate_hash.call(self)
91
+ end
92
+ define_method(:freeze) do
93
+ hash
94
+ super()
95
+ end
96
+ else
97
+ define_method(:hash) do
98
+ calculate_hash.call(self)
99
+ end
100
+ end
101
+ end
102
+
103
+ # Define an inspect method that reports the values of the instance's keys
104
+ #
105
+ # @return [undefined]
106
+ #
107
+ # @api private
108
+ def define_inspect_method
109
+ keys = @keys
110
+ define_method(:inspect) do
111
+ klass = self.class
112
+ name = klass.name || klass.inspect
113
+ "#<#{name}#{keys.map { |key| " #{key}=#{__send__(key).inspect}" }.join}>"
114
+ end
115
+ end
116
+
117
+ # The comparison methods
118
+ module Methods
119
+ # Compare the object with other object for equality
120
+ #
121
+ # @example
122
+ # object.eql?(other) # => true or false
123
+ #
124
+ # @param [Object] other
125
+ # the other object to compare with
126
+ #
127
+ # @return [Boolean]
128
+ #
129
+ # @api public
130
+ def eql?(other)
131
+ instance_of?(other.class) && cmp?(__method__, other)
132
+ end
133
+
134
+ # Compare the object with other object for equivalency
135
+ #
136
+ # @example
137
+ # object == other # => true or false
138
+ #
139
+ # @param [Object] other
140
+ # the other object to compare with
141
+ #
142
+ # @return [Boolean]
143
+ #
144
+ # @api public
145
+ def ==(other)
146
+ other.is_a?(self.class) && cmp?(__method__, other)
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
3
+ require "set"
4
4
 
5
5
  module Dry
6
6
  module Core
@@ -7,15 +7,15 @@ module Dry
7
7
  # List of supported backends
8
8
  BACKENDS = {
9
9
  activesupport: [
10
- 'active_support/inflector',
10
+ "active_support/inflector",
11
11
  proc { ::ActiveSupport::Inflector }
12
12
  ],
13
13
  dry_inflector: [
14
- 'dry/inflector',
14
+ "dry/inflector",
15
15
  proc { Dry::Inflector.new }
16
16
  ],
17
17
  inflecto: [
18
- 'inflecto',
18
+ "inflecto",
19
19
  proc { ::Inflecto }
20
20
  ]
21
21
  }.freeze
@@ -38,8 +38,8 @@ module Dry
38
38
  BACKENDS.inject(nil) do |backend, (_, (path, factory))|
39
39
  backend || realize_backend(path, factory)
40
40
  end || raise(LoadError,
41
- 'No inflector library could be found: '\
42
- 'please install either the `inflecto` or `activesupport` gem.')
41
+ "No inflector library could be found: "\
42
+ "please install either the `inflecto` or `activesupport` gem.")
43
43
  end
44
44
 
45
45
  # Set preferred backend
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module Core
5
- VERSION = '0.4.10'.freeze
5
+ VERSION = "0.5.0".freeze
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.10
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Shilnikov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-19 00:00:00.000000000 Z
11
+ date: 2020-12-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -85,6 +85,7 @@ files:
85
85
  - lib/dry/core/constants.rb
86
86
  - lib/dry/core/deprecations.rb
87
87
  - lib/dry/core/descendants_tracker.rb
88
+ - lib/dry/core/equalizer.rb
88
89
  - lib/dry/core/errors.rb
89
90
  - lib/dry/core/extensions.rb
90
91
  - lib/dry/core/inflector.rb