dry-core 0.7.1 → 0.8.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 +4 -4
- data/CHANGELOG.md +15 -1
- data/README.md +3 -3
- data/dry-core.gemspec +2 -2
- data/lib/dry/core/basic_object.rb +144 -0
- data/lib/dry/core/cache.rb +2 -2
- data/lib/dry/core/class_attributes.rb +1 -1
- data/lib/dry/core/constants.rb +1 -1
- data/lib/dry/core/deprecations.rb +1 -1
- data/lib/dry/core/memoizable.rb +50 -12
- data/lib/dry/core/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f8c83e96398be4753d6ac800d164612021350dcabb3b2cdd3caa448984bb6cc
|
4
|
+
data.tar.gz: 1fa35af111908ebf221e6c494b53c253172df017a5ffcb2f4fe16ff0b0c29649
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09529feae5672f027a2da7d0c9e3172f0575813fda68f689f1cdf3dfd5b0301686539bd6d843aef0c862c14831af1a166a2caf9f6f44e68521903d835195018b'
|
7
|
+
data.tar.gz: e5a2d5fa7d7c7ffca14b5fec56fe495627fb829beb9ca6b20014e9a9b66f6bbce1506df72edbc481db3816839b011be3a9c144f8e3f62f764b392b30e37fbce5
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,19 @@
|
|
1
1
|
<!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
|
2
2
|
|
3
|
+
## 0.8.0
|
4
|
+
|
5
|
+
### Added
|
6
|
+
|
7
|
+
- `Dry::Core::BasicObject` ported from hanami-utils (@jodosha)
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
|
11
|
+
- [BREAKING] [descendants tracker] switch to using `Class#subclasses` on Ruby 3.1+.
|
12
|
+
This changes the order of returned subclasses (immediate subclasses now go first) (@flash-gordon)
|
13
|
+
|
14
|
+
|
15
|
+
[Compare v0.7.1...v0.8.0](https://github.com/dry-rb/dry-core/compare/v0.7.1...master)
|
16
|
+
|
3
17
|
## 0.7.1 2021-07-10
|
4
18
|
|
5
19
|
|
@@ -43,7 +57,7 @@ has unnamed params (e.g. happens when the new `...` syntax is used) (@flash-gord
|
|
43
57
|
|
44
58
|
[Compare v0.5.0...v0.6.0](https://github.com/dry-rb/dry-core/compare/v0.5.0...v0.6.0)
|
45
59
|
|
46
|
-
## 0.5.0
|
60
|
+
## 0.5.0 2020-12-12
|
47
61
|
|
48
62
|
|
49
63
|
### Added
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
[][actions]
|
12
12
|
[][codacy]
|
13
13
|
[][codacy]
|
14
|
-
[][inchpages]
|
15
15
|
|
16
16
|
## Links
|
17
17
|
|
@@ -22,8 +22,8 @@
|
|
22
22
|
|
23
23
|
This library officially supports the following Ruby versions:
|
24
24
|
|
25
|
-
* MRI `>= 2.
|
26
|
-
*
|
25
|
+
* MRI `>= 2.7.0`
|
26
|
+
* jruby `>= 9.3` (postponed until 2.7 is supported)
|
27
27
|
|
28
28
|
## License
|
29
29
|
|
data/dry-core.gemspec
CHANGED
@@ -22,11 +22,11 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
24
|
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
25
|
-
spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-core/blob/
|
25
|
+
spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-core/blob/main/CHANGELOG.md"
|
26
26
|
spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-core"
|
27
27
|
spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-core/issues"
|
28
28
|
|
29
|
-
spec.required_ruby_version = ">= 2.
|
29
|
+
spec.required_ruby_version = ">= 2.7.0"
|
30
30
|
|
31
31
|
# to update dependencies edit project.yml
|
32
32
|
spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
|
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# This implementation was imported from `hanami-utils` gem.
|
4
|
+
module Dry
|
5
|
+
module Core
|
6
|
+
# BasicObject
|
7
|
+
#
|
8
|
+
# @since 0.8.0
|
9
|
+
class BasicObject < ::BasicObject
|
10
|
+
# Lookups constants at the top-level namespace, if they are missing in the
|
11
|
+
# current context.
|
12
|
+
#
|
13
|
+
# @param name [Symbol] the constant name
|
14
|
+
#
|
15
|
+
# @return [Object, Module] the constant
|
16
|
+
#
|
17
|
+
# @raise [NameError] if the constant cannot be found
|
18
|
+
#
|
19
|
+
# @since 0.8.0
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
# @see https://ruby-doc.org/core/Module.html#method-i-const_missing
|
23
|
+
def self.const_missing(name)
|
24
|
+
::Object.const_get(name)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the class for debugging purposes.
|
28
|
+
#
|
29
|
+
# @since 0.8.0
|
30
|
+
#
|
31
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-class
|
32
|
+
def class
|
33
|
+
(class << self; self; end).superclass
|
34
|
+
end
|
35
|
+
|
36
|
+
# Bare minimum inspect for debugging purposes.
|
37
|
+
#
|
38
|
+
# @return [String] the inspect string
|
39
|
+
#
|
40
|
+
# @since 0.8.0
|
41
|
+
#
|
42
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-inspect
|
43
|
+
inspect_method = ::Kernel.instance_method(:inspect)
|
44
|
+
define_method(:inspect) do
|
45
|
+
original = inspect_method.bind_call(self)
|
46
|
+
"#{original[0...-1]}#{__inspect}>"
|
47
|
+
end
|
48
|
+
|
49
|
+
# @!macro [attach] instance_of?(class)
|
50
|
+
#
|
51
|
+
# Determines if self is an instance of given class or module
|
52
|
+
#
|
53
|
+
# @param class [Class,Module] the class of module to verify
|
54
|
+
#
|
55
|
+
# @return [TrueClass,FalseClass] the result of the check
|
56
|
+
#
|
57
|
+
# @raise [TypeError] if the given argument is not of the expected types
|
58
|
+
#
|
59
|
+
# @since 0.8.0
|
60
|
+
#
|
61
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-instance_of-3F
|
62
|
+
define_method :instance_of?, ::Object.instance_method(:instance_of?)
|
63
|
+
|
64
|
+
# @!macro [attach] is_a?(class)
|
65
|
+
#
|
66
|
+
# Determines if self is of the type of the object class or module
|
67
|
+
#
|
68
|
+
# @param class [Class,Module] the class of module to verify
|
69
|
+
#
|
70
|
+
# @return [TrueClass,FalseClass] the result of the check
|
71
|
+
#
|
72
|
+
# @raise [TypeError] if the given argument is not of the expected types
|
73
|
+
#
|
74
|
+
# @since 0.8.0
|
75
|
+
#
|
76
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-is_a-3F
|
77
|
+
define_method :is_a?, ::Object.instance_method(:is_a?)
|
78
|
+
|
79
|
+
# @!macro [attach] kind_of?(class)
|
80
|
+
#
|
81
|
+
# Determines if self is of the kind of the object class or module
|
82
|
+
#
|
83
|
+
# @param class [Class,Module] the class of module to verify
|
84
|
+
#
|
85
|
+
# @return [TrueClass,FalseClass] the result of the check
|
86
|
+
#
|
87
|
+
# @raise [TypeError] if the given argument is not of the expected types
|
88
|
+
#
|
89
|
+
# @since 0.8.0
|
90
|
+
#
|
91
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-kind_of-3F
|
92
|
+
define_method :kind_of?, ::Object.instance_method(:kind_of?)
|
93
|
+
|
94
|
+
# Alias for __id__
|
95
|
+
#
|
96
|
+
# @return [Fixnum] the object id
|
97
|
+
#
|
98
|
+
# @since 0.8.0
|
99
|
+
#
|
100
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-object_id
|
101
|
+
def object_id
|
102
|
+
__id__
|
103
|
+
end
|
104
|
+
|
105
|
+
# Interface for pp
|
106
|
+
#
|
107
|
+
# @param printer [PP] the Pretty Printable printer
|
108
|
+
# @return [String] the pretty-printable inspection of the object
|
109
|
+
#
|
110
|
+
# @since 0.8.0
|
111
|
+
#
|
112
|
+
# @see https://ruby-doc.org/stdlib/libdoc/pp/rdoc/PP.html
|
113
|
+
def pretty_print(printer)
|
114
|
+
printer.text(inspect)
|
115
|
+
end
|
116
|
+
|
117
|
+
# Returns true if responds to the given method.
|
118
|
+
#
|
119
|
+
# @return [TrueClass,FalseClass] the result of the check
|
120
|
+
#
|
121
|
+
# @since 0.8.0
|
122
|
+
#
|
123
|
+
# @see http://ruby-doc.org/core/Object.html#method-i-respond_to-3F
|
124
|
+
def respond_to?(method_name, include_all = false) # rubocop:disable Style/OptionalBooleanParameter
|
125
|
+
respond_to_missing?(method_name, include_all)
|
126
|
+
end
|
127
|
+
|
128
|
+
private
|
129
|
+
|
130
|
+
# Must be overridden by descendants
|
131
|
+
#
|
132
|
+
# @since 0.8.0
|
133
|
+
# @api private
|
134
|
+
def respond_to_missing?(_method_name, _include_all)
|
135
|
+
::Kernel.raise ::NotImplementedError
|
136
|
+
end
|
137
|
+
|
138
|
+
# @since 0.8.0
|
139
|
+
# @api private
|
140
|
+
def __inspect # rubocop:disable Style/EmptyMethod
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
data/lib/dry/core/cache.rb
CHANGED
data/lib/dry/core/constants.rb
CHANGED
data/lib/dry/core/memoizable.rb
CHANGED
@@ -52,6 +52,12 @@ module Dry
|
|
52
52
|
|
53
53
|
# @api private
|
54
54
|
class Memoizer < ::Module
|
55
|
+
KERNEL = {
|
56
|
+
singleton: ::Kernel.instance_method(:singleton_class),
|
57
|
+
ivar_set: ::Kernel.instance_method(:instance_variable_set),
|
58
|
+
frozen: ::Kernel.instance_method(:frozen?)
|
59
|
+
}.freeze
|
60
|
+
|
55
61
|
# @api private
|
56
62
|
def initialize(klass, names)
|
57
63
|
super()
|
@@ -65,20 +71,50 @@ module Dry
|
|
65
71
|
private
|
66
72
|
|
67
73
|
# @api private
|
68
|
-
|
74
|
+
# rubocop:disable Metrics/AbcSize
|
75
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
76
|
+
def define_memoizable(method:)
|
69
77
|
parameters = method.parameters
|
78
|
+
mod = self
|
79
|
+
kernel = KERNEL
|
70
80
|
|
71
81
|
if parameters.empty?
|
72
|
-
key = method.name.hash
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
+
key = method.name.hash.abs
|
83
|
+
|
84
|
+
define_method(method.name) do
|
85
|
+
value = super()
|
86
|
+
|
87
|
+
if kernel[:frozen].bind(self).call
|
88
|
+
# It's not possible to modify singleton classes
|
89
|
+
# of frozen objects
|
90
|
+
mod.remove_method(method.name)
|
91
|
+
mod.module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
92
|
+
def #{method.name} # def slow_calc
|
93
|
+
cached = @__memoized__[#{key}] # cached = @__memoized__[12345678]
|
94
|
+
#
|
95
|
+
if cached || @__memoized__.key?(#{key}) # if cached || @__memoized__.key?(12345678)
|
96
|
+
cached # cached
|
97
|
+
else # else
|
98
|
+
@__memoized__[#{key}] = super # @__memoized__[12345678] = super
|
99
|
+
end # end
|
100
|
+
end # end
|
101
|
+
RUBY
|
102
|
+
else
|
103
|
+
# We make an attr_reader for computed value.
|
104
|
+
# Readers are "special-cased" in ruby so such
|
105
|
+
# access will be the fastest way, faster than you'd
|
106
|
+
# expect :)
|
107
|
+
attr_name = :"__memozed_#{key}__"
|
108
|
+
ivar_name = :"@#{attr_name}"
|
109
|
+
kernel[:ivar_set].bind(self).(ivar_name, value)
|
110
|
+
eigenclass = kernel[:singleton].bind(self).call
|
111
|
+
eigenclass.attr_reader(attr_name)
|
112
|
+
eigenclass.alias_method(method.name, attr_name)
|
113
|
+
eigenclass.remove_method(attr_name)
|
114
|
+
end
|
115
|
+
|
116
|
+
value
|
117
|
+
end
|
82
118
|
else
|
83
119
|
mapping = parameters.to_h { |k, v = nil| [k, v] }
|
84
120
|
params, binds = declaration(parameters, mapping)
|
@@ -95,7 +131,7 @@ module Dry
|
|
95
131
|
|
96
132
|
m = module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
97
133
|
def #{method.name}(#{params.join(", ")}) # def slow_calc(arg1, arg2, arg3)
|
98
|
-
key = [:"#{method.name}", #{binds.join(", ")}].hash # [:slow_calc, arg1, arg2, arg3].hash
|
134
|
+
key = [:"#{method.name}", #{binds.join(", ")}].hash # key = [:slow_calc, arg1, arg2, arg3].hash
|
99
135
|
#
|
100
136
|
if @__memoized__.key?(key) # if @__memoized__.key?(key)
|
101
137
|
@__memoized__[key] # @__memoized__[key]
|
@@ -112,6 +148,8 @@ module Dry
|
|
112
148
|
m
|
113
149
|
end
|
114
150
|
end
|
151
|
+
# rubocop:enable Metrics/AbcSize
|
152
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
115
153
|
|
116
154
|
# @api private
|
117
155
|
def declaration(definition, lookup)
|
data/lib/dry/core/version.rb
CHANGED
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
|
+
version: 0.8.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:
|
11
|
+
date: 2022-07-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -79,6 +79,7 @@ files:
|
|
79
79
|
- dry-core.gemspec
|
80
80
|
- lib/dry-core.rb
|
81
81
|
- lib/dry/core.rb
|
82
|
+
- lib/dry/core/basic_object.rb
|
82
83
|
- lib/dry/core/cache.rb
|
83
84
|
- lib/dry/core/class_attributes.rb
|
84
85
|
- lib/dry/core/class_builder.rb
|
@@ -96,7 +97,7 @@ licenses:
|
|
96
97
|
- MIT
|
97
98
|
metadata:
|
98
99
|
allowed_push_host: https://rubygems.org
|
99
|
-
changelog_uri: https://github.com/dry-rb/dry-core/blob/
|
100
|
+
changelog_uri: https://github.com/dry-rb/dry-core/blob/main/CHANGELOG.md
|
100
101
|
source_code_uri: https://github.com/dry-rb/dry-core
|
101
102
|
bug_tracker_uri: https://github.com/dry-rb/dry-core/issues
|
102
103
|
post_install_message:
|
@@ -107,7 +108,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
107
108
|
requirements:
|
108
109
|
- - ">="
|
109
110
|
- !ruby/object:Gem::Version
|
110
|
-
version: 2.
|
111
|
+
version: 2.7.0
|
111
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
113
|
requirements:
|
113
114
|
- - ">="
|