core-state 0.0.0 → 0.1.3
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 +20 -0
- data/lib/core/state/version.rb +1 -1
- data/lib/is/stateful.rb +108 -12
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1256eb4ef3acf8b61a7754d8ea30ce644f7fc081132a3d9f107a40deca79ed0a
|
4
|
+
data.tar.gz: f65aa78f287f521a729723823f04339153d0a80cf8291e82e4a1c791cc57745e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1669bdf575ac48ed4abb7523383d2a8ae39a6f52fd6b08143b3ef48bd89698e9492f9f16ffff1538329a35989ec57bde2db1b77e2d67e1cafc89bd33896788e4
|
7
|
+
data.tar.gz: 1cda2c4017dccf2c9e9d9c935d48c95d6aeeda0c471f662d5618b723b54d08d921bae78849e3aa5fd7783716402edbc8d8726a5638c83992e318db45be4c2a27
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## [v0.1.3](https://github.com/metabahn/corerb/releases/tag/2021-09-28)
|
2
|
+
|
3
|
+
*released on 2021-09-28*
|
4
|
+
|
5
|
+
* `fix` [#84](https://github.com/metabahn/corerb/pull/84) Define core-local as a dependency of core-state ([bryanp](https://github.com/bryanp))
|
6
|
+
|
7
|
+
## [v0.1.1](https://github.com/metabahn/corerb/releases/tag/2021-07-15)
|
8
|
+
|
9
|
+
*released on 2021-07-15*
|
10
|
+
|
11
|
+
* `fix` [#62](https://github.com/metabahn/corerb/pull/62) Correctly isolate class-level state on access ([bryanp](https://github.com/bryanp))
|
12
|
+
* `fix` [#55](https://github.com/metabahn/corerb/pull/55) Correctly forward arguments to super initialize ([bryanp](https://github.com/bryanp))
|
13
|
+
|
14
|
+
## [v0.1.0](https://github.com/metabahn/corerb/releases/tag/2021-07-07)
|
15
|
+
|
16
|
+
*released on 2021-07-07*
|
17
|
+
|
18
|
+
* `fix` [#48](https://github.com/metabahn/corerb/pull/48) Correctly copy defined state when a stateful object is copied ([bryanp](https://github.com/bryanp))
|
19
|
+
* `chg` [#44](https://github.com/metabahn/corerb/pull/44) Drop Ruby 2.6 support from core-state ([bryanp](https://github.com/bryanp))
|
20
|
+
|
1
21
|
## [v0.0.0](https://github.com/metabahn/corerb/releases/tag/2021-05-22)
|
2
22
|
|
3
23
|
*released on 2021-05-22*
|
data/lib/core/state/version.rb
CHANGED
data/lib/is/stateful.rb
CHANGED
@@ -1,24 +1,94 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "core/extension"
|
4
|
-
|
5
|
-
require "refine/object/copy"
|
4
|
+
require "core/local"
|
6
5
|
|
7
6
|
module Is
|
8
7
|
# [public] Makes objects stateful.
|
9
8
|
#
|
10
9
|
module Stateful
|
10
|
+
# Adding core-copy as a dependency of core-state creates a recursive dependency, so just bundle it.
|
11
|
+
#
|
12
|
+
module Copy
|
13
|
+
DEFAULT = ::Object.new
|
14
|
+
|
15
|
+
refine ::Object do
|
16
|
+
# [public] Copies the object using `clone`.
|
17
|
+
#
|
18
|
+
if RbConfig::CONFIG["RUBY_PROGRAM_VERSION"] < "3"
|
19
|
+
def copy(freeze: DEFAULT)
|
20
|
+
should_freeze = resolve_freeze_argument(freeze)
|
21
|
+
|
22
|
+
value = clone(freeze: should_freeze)
|
23
|
+
value.freeze if should_freeze
|
24
|
+
value
|
25
|
+
end
|
26
|
+
else
|
27
|
+
def copy(freeze: DEFAULT)
|
28
|
+
clone(freeze: resolve_freeze_argument(freeze))
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private def resolve_freeze_argument(value)
|
33
|
+
case value
|
34
|
+
when DEFAULT
|
35
|
+
frozen?
|
36
|
+
else
|
37
|
+
!!value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
refine Array do
|
43
|
+
# [public] Copies the array, along with each value.
|
44
|
+
#
|
45
|
+
def copy(freeze: DEFAULT)
|
46
|
+
unless Stateful.copying?(self)
|
47
|
+
Stateful.prevent_recursion(self) do
|
48
|
+
array = map { |value|
|
49
|
+
value.copy(freeze: freeze)
|
50
|
+
}
|
51
|
+
|
52
|
+
array.freeze if resolve_freeze_argument(freeze)
|
53
|
+
|
54
|
+
array
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
refine Hash do
|
61
|
+
# [public] Copies the hash, along with each key and value.
|
62
|
+
#
|
63
|
+
def copy(freeze: DEFAULT)
|
64
|
+
unless Stateful.copying?(self)
|
65
|
+
Stateful.prevent_recursion(self) do
|
66
|
+
hash = {}
|
67
|
+
|
68
|
+
each_pair do |key, value|
|
69
|
+
hash[key.copy(freeze: freeze)] = value.copy(freeze: freeze)
|
70
|
+
end
|
71
|
+
|
72
|
+
hash.freeze if resolve_freeze_argument(freeze)
|
73
|
+
|
74
|
+
hash
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
11
81
|
extend Is::Extension
|
12
82
|
|
13
|
-
using
|
83
|
+
using Copy
|
14
84
|
|
15
85
|
ALLOWED_FLAGS = %i[class instance].freeze
|
16
86
|
|
17
|
-
|
87
|
+
applies do
|
18
88
|
prepend_defined_state_modules
|
19
89
|
end
|
20
90
|
|
21
|
-
extends :
|
91
|
+
extends :definition do
|
22
92
|
# [public] Defines state by name.
|
23
93
|
#
|
24
94
|
# flags - Changes how the state is defined. Possible values include:
|
@@ -62,9 +132,9 @@ module Is
|
|
62
132
|
if state[:class]
|
63
133
|
defined_state_class_module.module_eval <<~CODE, __FILE__, __LINE__ + 1
|
64
134
|
#{prefix}def #{method_name}
|
65
|
-
unless defined_state_isolations.include?(#{ivar_name})
|
135
|
+
unless defined_state_isolations.include?(#{ivar_name.inspect})
|
66
136
|
#{ivar_name} = #{ivar_name}.copy
|
67
|
-
defined_state_isolations << #{ivar_name}
|
137
|
+
defined_state_isolations << #{ivar_name.inspect}
|
68
138
|
end
|
69
139
|
|
70
140
|
#{ivar_name}
|
@@ -75,9 +145,9 @@ module Is
|
|
75
145
|
if state[:instance]
|
76
146
|
defined_state_instance_module.module_eval <<~CODE, __FILE__, __LINE__ + 1
|
77
147
|
#{prefix}def #{method_name}
|
78
|
-
unless defined_state_isolations.include?(#{ivar_name})
|
148
|
+
unless defined_state_isolations.include?(#{ivar_name.inspect})
|
79
149
|
#{ivar_name} = #{ivar_name}.copy
|
80
|
-
defined_state_isolations << #{ivar_name}
|
150
|
+
defined_state_isolations << #{ivar_name.inspect}
|
81
151
|
end
|
82
152
|
|
83
153
|
#{ivar_name}
|
@@ -167,8 +237,8 @@ module Is
|
|
167
237
|
end
|
168
238
|
end
|
169
239
|
|
170
|
-
extends :
|
171
|
-
def initialize(
|
240
|
+
extends :implementation, prepend: true do
|
241
|
+
def initialize(...)
|
172
242
|
self.class.send(:defined_state).each_pair do |name, state|
|
173
243
|
if state[:instance]
|
174
244
|
instance_variable_set(name, state[:value])
|
@@ -177,9 +247,15 @@ module Is
|
|
177
247
|
|
178
248
|
super
|
179
249
|
end
|
250
|
+
|
251
|
+
def initialize_copy(...)
|
252
|
+
@__defined_state_isolations = []
|
253
|
+
|
254
|
+
super
|
255
|
+
end
|
180
256
|
end
|
181
257
|
|
182
|
-
extends :
|
258
|
+
extends :definition, :implementation do
|
183
259
|
# [public] Safely mutates state by name, yielding a copy of the current value to the block.
|
184
260
|
#
|
185
261
|
def mutate_state(name, &block)
|
@@ -190,5 +266,25 @@ module Is
|
|
190
266
|
@__defined_state_isolations ||= []
|
191
267
|
end
|
192
268
|
end
|
269
|
+
|
270
|
+
class << self
|
271
|
+
include Is::Localized
|
272
|
+
|
273
|
+
def prevent_recursion(object)
|
274
|
+
object_id = object.object_id
|
275
|
+
copied_objects[object_id] = true
|
276
|
+
yield
|
277
|
+
ensure
|
278
|
+
copied_objects.delete(object_id)
|
279
|
+
end
|
280
|
+
|
281
|
+
def copying?(object)
|
282
|
+
copied_objects[object.object_id]
|
283
|
+
end
|
284
|
+
|
285
|
+
def copied_objects
|
286
|
+
localized(:__corerb_copied_objects) || localize(:__corerb_copied_objects, {})
|
287
|
+
end
|
288
|
+
end
|
193
289
|
end
|
194
290
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: core-state
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Powell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name: core-
|
14
|
+
name: core-extension
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.3'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
26
|
+
version: '0.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: core-
|
28
|
+
name: core-local
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.1'
|
41
41
|
description: Easily manage object state.
|
42
42
|
email: bryan@metabahn.com
|
43
43
|
executables: []
|
@@ -61,14 +61,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
61
61
|
requirements:
|
62
62
|
- - ">="
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version: 2.
|
64
|
+
version: '2.7'
|
65
65
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '0'
|
70
70
|
requirements: []
|
71
|
-
rubygems_version: 3.2.
|
71
|
+
rubygems_version: 3.2.22
|
72
72
|
signing_key:
|
73
73
|
specification_version: 4
|
74
74
|
summary: Easily manage object state.
|