core-extension 0.4.2 → 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 +4 -4
- data/CHANGELOG.md +26 -18
- data/lib/core/extension/version.rb +1 -1
- data/lib/core/extension.rb +97 -2
- metadata +6 -7
- data/lib/is/extension.rb +0 -199
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45681dd9b4eb444ef89b1f1f9688a0f091c6bf1aab6554d084b2f3f71a6ef40c
|
4
|
+
data.tar.gz: a7611a830a7b0b6d29f60accf80034e6fc06c288471d96708c1b82e2fc86c436
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f14e4ece467c33af911e8bea83b424bf85ce15980f427f1a56326b7263f840a1cfd77a10aeea041950acda7f8fb2b321bc1e76470061b4ded945de7da2887db8
|
7
|
+
data.tar.gz: fe4d73140a8649f7ae8ec2236666a0b1c4316a2ca17d6287fa154939d008bc35d600421590d8e75b59e552bc52c4d1fc2142b47bd440596b2ba17cedf5e99781
|
data/CHANGELOG.md
CHANGED
@@ -1,47 +1,55 @@
|
|
1
|
-
## [v0.
|
1
|
+
## [v0.5.0](https://github.com/bryanp/corerb/releases/tag/2023-12-24)
|
2
|
+
|
3
|
+
*released on 2023-12-24*
|
4
|
+
|
5
|
+
* `dep` [#143](https://github.com/bryanp/corerb/pull/143) Deprecate `Is::*` and `Refine::*` namespaces ([bryanp](https://github.com/bryanp))
|
6
|
+
* `dep` [#142](https://github.com/bryanp/corerb/pull/142) Remove copy behavior from extensions ([bryanp](https://github.com/bryanp))
|
7
|
+
* `dep` [#135](https://github.com/bryanp/corerb/pull/135) Remove Ruby 2 support ([bryanp](https://github.com/bryanp))
|
8
|
+
|
9
|
+
## [v0.4.2](https://github.com/bryanp/corerb/releases/tag/2021-11-23)
|
2
10
|
|
3
11
|
*released on 2021-11-23*
|
4
12
|
|
5
|
-
* `fix` [#108](https://github.com/
|
13
|
+
* `fix` [#108](https://github.com/bryanp/corerb/pull/108) Prevent extension dependencies from extending an object twice ([bryanp](https://github.com/bryanp))
|
6
14
|
|
7
|
-
## [v0.4.1](https://github.com/
|
15
|
+
## [v0.4.1](https://github.com/bryanp/corerb/releases/tag/2021-11-02)
|
8
16
|
|
9
17
|
*released on 2021-11-02*
|
10
18
|
|
11
|
-
* `chg` [#97](https://github.com/
|
19
|
+
* `chg` [#97](https://github.com/bryanp/corerb/pull/97) Designate internal state with leading and trailing double underscores ([bryanp](https://github.com/bryanp))
|
12
20
|
|
13
|
-
## [v0.4.0](https://github.com/
|
21
|
+
## [v0.4.0](https://github.com/bryanp/corerb/releases/tag/2021-10-24)
|
14
22
|
|
15
23
|
*released on 2021-10-24*
|
16
24
|
|
17
|
-
* `add` [#86](https://github.com/
|
25
|
+
* `add` [#86](https://github.com/bryanp/corerb/pull/86) Copy instance variables when cloning an extension ([bryanp](https://github.com/bryanp))
|
18
26
|
|
19
|
-
## [v0.3.0](https://github.com/
|
27
|
+
## [v0.3.0](https://github.com/bryanp/corerb/releases/tag/2021-07-15)
|
20
28
|
|
21
29
|
*released on 2021-07-15*
|
22
30
|
|
23
|
-
* `chg` [#72](https://github.com/
|
24
|
-
* `chg` [#71](https://github.com/
|
25
|
-
* `chg` [#68](https://github.com/
|
26
|
-
* `chg` [#67](https://github.com/
|
27
|
-
* `chg` [#66](https://github.com/
|
31
|
+
* `chg` [#72](https://github.com/bryanp/corerb/pull/72) Rename extension dependency flags ([bryanp](https://github.com/bryanp))
|
32
|
+
* `chg` [#71](https://github.com/bryanp/corerb/pull/71) Rename Is::Extension::applied to applies ([bryanp](https://github.com/bryanp))
|
33
|
+
* `chg` [#68](https://github.com/bryanp/corerb/pull/68) Pass the extension scope to apply blocks ([bryanp](https://github.com/bryanp))
|
34
|
+
* `chg` [#67](https://github.com/bryanp/corerb/pull/67) Refactor extend support for extensions ([bryanp](https://github.com/bryanp))
|
35
|
+
* `chg` [#66](https://github.com/bryanp/corerb/pull/66) Support extending classes with extensions ([bryanp](https://github.com/bryanp))
|
28
36
|
|
29
|
-
## [v0.2.0](https://github.com/
|
37
|
+
## [v0.2.0](https://github.com/bryanp/corerb/releases/tag/2021-07-07)
|
30
38
|
|
31
39
|
*released on 2021-07-07*
|
32
40
|
|
33
|
-
* `chg` [#40](https://github.com/
|
41
|
+
* `chg` [#40](https://github.com/bryanp/corerb/pull/40) Drop Ruby 2.6 support from core-extension ([bryanp](https://github.com/bryanp))
|
34
42
|
|
35
|
-
## [v0.1.0](https://github.com/
|
43
|
+
## [v0.1.0](https://github.com/bryanp/corerb/releases/tag/2021-02-10)
|
36
44
|
|
37
45
|
*released on 2021-02-10*
|
38
46
|
|
39
|
-
* `chg` [#3](https://github.com/
|
47
|
+
* `chg` [#3](https://github.com/bryanp/corerb/pull/3) Apply extension dependencies before behavior ([bryanp](https://github.com/bryanp))
|
40
48
|
|
41
|
-
## [v0.0.0](https://github.com/
|
49
|
+
## [v0.0.0](https://github.com/bryanp/corerb/releases/tag/2020-12-29)
|
42
50
|
|
43
51
|
*released on 2020-12-29*
|
44
52
|
|
45
|
-
* `add` [#1](https://github.com/
|
53
|
+
* `add` [#1](https://github.com/bryanp/corerb/pull/2) Initial core-extension behavior ([bryanp](https://github.com/bryanp))
|
46
54
|
|
47
55
|
|
data/lib/core/extension.rb
CHANGED
@@ -1,10 +1,105 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Core
|
4
|
+
# [public] Turn a module into a mixin with superpowers.
|
5
|
+
#
|
4
6
|
module Extension
|
5
7
|
require_relative "extension/behavior"
|
8
|
+
require_relative "extension/dependency"
|
6
9
|
require_relative "extension/version"
|
10
|
+
|
11
|
+
# [public] Restrict the extension to one or more object types.
|
12
|
+
#
|
13
|
+
def restrict(*types)
|
14
|
+
allowed_types.concat(types).uniq!
|
15
|
+
end
|
16
|
+
|
17
|
+
# [public] Define a module to be extended or included into objects that include this extension.
|
18
|
+
#
|
19
|
+
def extends(*flags, dependencies: [], prepend: false, &block)
|
20
|
+
dependencies.each do |dependency|
|
21
|
+
defined_dependencies << Core::Extension::Dependency.new(*flags, dependency: dependency, prepend: prepend)
|
22
|
+
end
|
23
|
+
|
24
|
+
if block
|
25
|
+
defined_dependencies << Core::Extension::Dependency.new(*flags, dependency: Module.new(&block), prepend: prepend)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# [public] Define behavior to be evaled on objects that include this extension.
|
30
|
+
#
|
31
|
+
def applies(force: false, &block)
|
32
|
+
defined_behaviors << Core::Extension::Behavior.new(force: force, &block)
|
33
|
+
end
|
34
|
+
|
35
|
+
def extended(base)
|
36
|
+
enforce_allowed_types(base)
|
37
|
+
extend_defined_dependencies(base)
|
38
|
+
extend_defined_behaviors(base)
|
39
|
+
|
40
|
+
super
|
41
|
+
end
|
42
|
+
|
43
|
+
def included(base)
|
44
|
+
enforce_allowed_types(base)
|
45
|
+
include_defined_dependencies(base)
|
46
|
+
include_defined_behaviors(base)
|
47
|
+
|
48
|
+
super
|
49
|
+
end
|
50
|
+
|
51
|
+
private def enforce_allowed_types(object)
|
52
|
+
return if allowed?(object)
|
53
|
+
|
54
|
+
raise TypeError, "Expected `#{object}' to be a decendent of an allowed type: #{allowed_types_string}"
|
55
|
+
end
|
56
|
+
|
57
|
+
private def allowed_types_string
|
58
|
+
allowed_types.map { |allowed_type|
|
59
|
+
"`#{allowed_type.inspect}'"
|
60
|
+
}.join(", ")
|
61
|
+
end
|
62
|
+
|
63
|
+
private def allowed?(object)
|
64
|
+
allowed_types.empty? || allowed_types.any? { |allowed_type|
|
65
|
+
object <= allowed_type
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
private def extend_defined_behaviors(object)
|
70
|
+
defined_behaviors.each do |behavior|
|
71
|
+
behavior.apply_extend(object)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private def extend_defined_dependencies(object)
|
76
|
+
defined_dependencies.each do |dependency|
|
77
|
+
dependency.apply_extend(object)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
private def include_defined_behaviors(object)
|
82
|
+
defined_behaviors.each do |behavior|
|
83
|
+
behavior.apply_include(object)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
private def include_defined_dependencies(object)
|
88
|
+
defined_dependencies.each do |dependency|
|
89
|
+
dependency.apply_include(object)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
private def allowed_types
|
94
|
+
@__allowed_types__ ||= []
|
95
|
+
end
|
96
|
+
|
97
|
+
private def defined_behaviors
|
98
|
+
@__defined_behaviors__ ||= []
|
99
|
+
end
|
100
|
+
|
101
|
+
private def defined_dependencies
|
102
|
+
@__defined_dependencies__ ||= []
|
103
|
+
end
|
7
104
|
end
|
8
105
|
end
|
9
|
-
|
10
|
-
require_relative "../is/extension"
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: core-extension
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Powell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Create mixins with superpowers.
|
14
|
-
email: bryan@
|
14
|
+
email: bryan@bryanp.org
|
15
15
|
executables: []
|
16
16
|
extensions: []
|
17
17
|
extra_rdoc_files: []
|
@@ -22,8 +22,7 @@ files:
|
|
22
22
|
- lib/core/extension/behavior.rb
|
23
23
|
- lib/core/extension/dependency.rb
|
24
24
|
- lib/core/extension/version.rb
|
25
|
-
|
26
|
-
homepage: https://github.com/metabahn/corerb/
|
25
|
+
homepage: https://github.com/bryanp/corerb/
|
27
26
|
licenses:
|
28
27
|
- MPL-2.0
|
29
28
|
metadata: {}
|
@@ -35,14 +34,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
35
34
|
requirements:
|
36
35
|
- - ">="
|
37
36
|
- !ruby/object:Gem::Version
|
38
|
-
version: '
|
37
|
+
version: '3.0'
|
39
38
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
39
|
requirements:
|
41
40
|
- - ">="
|
42
41
|
- !ruby/object:Gem::Version
|
43
42
|
version: '0'
|
44
43
|
requirements: []
|
45
|
-
rubygems_version: 3.
|
44
|
+
rubygems_version: 3.5.1
|
46
45
|
signing_key:
|
47
46
|
specification_version: 4
|
48
47
|
summary: Create mixins with superpowers.
|
data/lib/is/extension.rb
DELETED
@@ -1,199 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative "../core/extension/behavior"
|
4
|
-
require_relative "../core/extension/dependency"
|
5
|
-
|
6
|
-
module Is
|
7
|
-
# [public] Turn a module into a mixin with superpowers.
|
8
|
-
#
|
9
|
-
module Extension
|
10
|
-
# Adding core-copy as a dependency creates a recursive dependency, so just bundle it.
|
11
|
-
#
|
12
|
-
module Copy
|
13
|
-
DEFAULT = ::Object.new
|
14
|
-
|
15
|
-
refine ::Object do
|
16
|
-
if RbConfig::CONFIG["RUBY_PROGRAM_VERSION"] < "3"
|
17
|
-
def copy(freeze: DEFAULT)
|
18
|
-
should_freeze = resolve_freeze_argument(freeze)
|
19
|
-
|
20
|
-
value = clone(freeze: should_freeze)
|
21
|
-
value.freeze if should_freeze
|
22
|
-
value
|
23
|
-
end
|
24
|
-
else
|
25
|
-
def copy(freeze: DEFAULT)
|
26
|
-
clone(freeze: resolve_freeze_argument(freeze))
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
private def resolve_freeze_argument(value)
|
31
|
-
case value
|
32
|
-
when DEFAULT
|
33
|
-
frozen?
|
34
|
-
else
|
35
|
-
!!value
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
refine Array do
|
41
|
-
def copy(freeze: DEFAULT)
|
42
|
-
unless Extension.copying?(self)
|
43
|
-
Extension.prevent_recursion(self) do
|
44
|
-
array = map { |value|
|
45
|
-
value.copy(freeze: freeze)
|
46
|
-
}
|
47
|
-
|
48
|
-
array.freeze if resolve_freeze_argument(freeze)
|
49
|
-
|
50
|
-
array
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
refine Hash do
|
57
|
-
def copy(freeze: DEFAULT)
|
58
|
-
unless Extension.copying?(self)
|
59
|
-
Extension.prevent_recursion(self) do
|
60
|
-
hash = {}
|
61
|
-
|
62
|
-
each_pair do |key, value|
|
63
|
-
hash[key.copy(freeze: freeze)] = value.copy(freeze: freeze)
|
64
|
-
end
|
65
|
-
|
66
|
-
hash.freeze if resolve_freeze_argument(freeze)
|
67
|
-
|
68
|
-
hash
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
class << self
|
76
|
-
def prevent_recursion(object)
|
77
|
-
object_id = object.object_id
|
78
|
-
copied_objects[object_id] = true
|
79
|
-
yield
|
80
|
-
ensure
|
81
|
-
copied_objects.delete(object_id)
|
82
|
-
end
|
83
|
-
|
84
|
-
def copying?(object)
|
85
|
-
copied_objects[object.object_id]
|
86
|
-
end
|
87
|
-
|
88
|
-
def copied_objects
|
89
|
-
# We can't use core-local because it would create a recursive dependency.
|
90
|
-
#
|
91
|
-
Thread.current["__corerb_localized_#{object_id}__corerb_copied_objects__"] ||= {}
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
using Copy
|
96
|
-
|
97
|
-
def initialize_copy(...)
|
98
|
-
super
|
99
|
-
|
100
|
-
instance_variables.each do |instance_variable|
|
101
|
-
instance_variable_set(instance_variable, instance_variable_get(instance_variable).copy)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
# [public] Restrict the extension to one or more object types.
|
106
|
-
#
|
107
|
-
def restrict(*types)
|
108
|
-
allowed_types.concat(types).uniq!
|
109
|
-
end
|
110
|
-
|
111
|
-
# [public] Define a module to be extended or included into objects that include this extension.
|
112
|
-
#
|
113
|
-
def extends(*flags, dependencies: [], prepend: false, &block)
|
114
|
-
dependencies.each do |dependency|
|
115
|
-
defined_dependencies << Core::Extension::Dependency.new(*flags, dependency: dependency, prepend: prepend)
|
116
|
-
end
|
117
|
-
|
118
|
-
if block
|
119
|
-
defined_dependencies << Core::Extension::Dependency.new(*flags, dependency: Module.new(&block), prepend: prepend)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
# [public] Define behavior to be evaled on objects that include this extension.
|
124
|
-
#
|
125
|
-
def applies(force: false, &block)
|
126
|
-
defined_behaviors << Core::Extension::Behavior.new(force: force, &block)
|
127
|
-
end
|
128
|
-
|
129
|
-
def extended(base)
|
130
|
-
enforce_allowed_types(base)
|
131
|
-
extend_defined_dependencies(base)
|
132
|
-
extend_defined_behaviors(base)
|
133
|
-
|
134
|
-
super
|
135
|
-
end
|
136
|
-
|
137
|
-
def included(base)
|
138
|
-
enforce_allowed_types(base)
|
139
|
-
include_defined_dependencies(base)
|
140
|
-
include_defined_behaviors(base)
|
141
|
-
|
142
|
-
super
|
143
|
-
end
|
144
|
-
|
145
|
-
private def enforce_allowed_types(object)
|
146
|
-
return if allowed?(object)
|
147
|
-
|
148
|
-
raise TypeError, "Expected `#{object}' to be a decendent of an allowed type: #{allowed_types_string}"
|
149
|
-
end
|
150
|
-
|
151
|
-
private def allowed_types_string
|
152
|
-
allowed_types.map { |allowed_type|
|
153
|
-
"`#{allowed_type.inspect}'"
|
154
|
-
}.join(", ")
|
155
|
-
end
|
156
|
-
|
157
|
-
private def allowed?(object)
|
158
|
-
allowed_types.empty? || allowed_types.any? { |allowed_type|
|
159
|
-
object <= allowed_type
|
160
|
-
}
|
161
|
-
end
|
162
|
-
|
163
|
-
private def extend_defined_behaviors(object)
|
164
|
-
defined_behaviors.each do |behavior|
|
165
|
-
behavior.apply_extend(object)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
private def extend_defined_dependencies(object)
|
170
|
-
defined_dependencies.each do |dependency|
|
171
|
-
dependency.apply_extend(object)
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
private def include_defined_behaviors(object)
|
176
|
-
defined_behaviors.each do |behavior|
|
177
|
-
behavior.apply_include(object)
|
178
|
-
end
|
179
|
-
end
|
180
|
-
|
181
|
-
private def include_defined_dependencies(object)
|
182
|
-
defined_dependencies.each do |dependency|
|
183
|
-
dependency.apply_include(object)
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
private def allowed_types
|
188
|
-
@__allowed_types__ ||= []
|
189
|
-
end
|
190
|
-
|
191
|
-
private def defined_behaviors
|
192
|
-
@__defined_behaviors__ ||= []
|
193
|
-
end
|
194
|
-
|
195
|
-
private def defined_dependencies
|
196
|
-
@__defined_dependencies__ ||= []
|
197
|
-
end
|
198
|
-
end
|
199
|
-
end
|