object_forge 0.3.0 → 0.4.1
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/README.md +139 -60
- data/lib/object_forge/crucible.rb +50 -13
- data/lib/object_forge/forge.rb +112 -41
- data/lib/object_forge/forge_dsl.rb +48 -39
- data/lib/object_forge/forgeyard.rb +13 -12
- data/lib/object_forge/molds/hash_mold.rb +4 -4
- data/lib/object_forge/molds/keywords_mold.rb +5 -5
- data/lib/object_forge/molds/single_argument_mold.rb +5 -5
- data/lib/object_forge/molds/struct_mold.rb +17 -13
- data/lib/object_forge/molds/wrapped_mold.rb +2 -2
- data/lib/object_forge/molds.rb +78 -25
- data/lib/object_forge/sequence.rb +2 -2
- data/lib/object_forge/version.rb +1 -1
- data/lib/object_forge.rb +96 -34
- data/sig/object_forge/molds.rbs +18 -16
- data/sig/object_forge.rbs +83 -41
- metadata +16 -11
data/sig/object_forge.rbs
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
module ObjectForge
|
|
2
|
-
type
|
|
3
|
-
type
|
|
2
|
+
type forge_target = untyped
|
|
3
|
+
type forge_result = untyped
|
|
4
|
+
type attribute = untyped
|
|
5
|
+
|
|
6
|
+
type mold = ::Object & _Mold
|
|
7
|
+
type sequenceable = _RespondTo & _Sequenceable
|
|
4
8
|
|
|
5
9
|
interface _RespondTo
|
|
6
10
|
def respond_to?: (Symbol name, ?bool include_private) -> bool
|
|
@@ -9,47 +13,54 @@ module ObjectForge
|
|
|
9
13
|
interface _Sequenceable
|
|
10
14
|
def succ: -> self
|
|
11
15
|
end
|
|
12
|
-
interface _Forgable
|
|
13
|
-
def new: (Hash[Symbol, untyped]) -> self
|
|
14
|
-
end
|
|
15
16
|
interface _ForgeParameters
|
|
16
|
-
def attributes: () -> Hash[Symbol,
|
|
17
|
-
def traits: () -> Hash[Symbol, Hash[Symbol,
|
|
18
|
-
def
|
|
17
|
+
def attributes: () -> Hash[Symbol, ObjectForge::attribute]
|
|
18
|
+
def traits: () -> Hash[Symbol, Hash[Symbol, ObjectForge::attribute]]
|
|
19
|
+
def options: () -> Hash[Symbol, untyped]
|
|
19
20
|
end
|
|
20
21
|
interface _Mold
|
|
21
22
|
def call
|
|
22
|
-
: (
|
|
23
|
+
: (forge_target: ObjectForge::forge_target, attributes: Hash[Symbol, ObjectForge::attribute], **untyped) -> ObjectForge::forge_result
|
|
24
|
+
end
|
|
25
|
+
interface _Crucible
|
|
26
|
+
def call
|
|
27
|
+
: (Hash[Symbol, ObjectForge::attribute]) -> Hash[Symbol, ObjectForge::attribute]
|
|
28
|
+
end
|
|
29
|
+
interface _Hook
|
|
30
|
+
def call
|
|
31
|
+
: (ObjectForge::forge_result) -> void
|
|
23
32
|
end
|
|
24
33
|
|
|
25
34
|
class Error < StandardError
|
|
26
35
|
end
|
|
27
36
|
class DSLError < Error
|
|
28
37
|
end
|
|
29
|
-
class
|
|
38
|
+
class CircularAttributeDependencyError < Error
|
|
39
|
+
end
|
|
40
|
+
class ObjectInterfaceError < ::TypeError
|
|
30
41
|
end
|
|
31
42
|
|
|
32
|
-
VERSION: String
|
|
43
|
+
VERSION: ::String
|
|
33
44
|
DEFAULT_YARD: ObjectForge::Forgeyard
|
|
34
45
|
|
|
35
46
|
def self.sequence
|
|
36
|
-
: (
|
|
47
|
+
: ((ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
|
|
37
48
|
|
|
38
49
|
def self.define
|
|
39
|
-
: (Symbol name, ObjectForge::
|
|
40
|
-
| (Symbol name, ObjectForge::
|
|
50
|
+
: (Symbol name, ObjectForge::forge_target) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
|
|
51
|
+
| (Symbol name, ObjectForge::forge_target) { [self: ObjectForge::ForgeDSL] -> void } -> ObjectForge::Forge
|
|
41
52
|
|
|
42
53
|
def self.forge
|
|
43
|
-
: (Symbol name, *Symbol traits, **
|
|
54
|
+
: (Symbol name, *Symbol traits, **ObjectForge::attribute overrides) ?{ (ObjectForge::forge_result) -> void } -> ObjectForge::forge_result
|
|
44
55
|
def self.build
|
|
45
|
-
: (Symbol name, *Symbol traits, **
|
|
56
|
+
: (Symbol name, *Symbol traits, **ObjectForge::attribute overrides) ?{ (ObjectForge::forge_result) -> void } -> ObjectForge::forge_result
|
|
46
57
|
def self.call
|
|
47
|
-
: (Symbol name, *Symbol traits, **
|
|
58
|
+
: (Symbol name, *Symbol traits, **ObjectForge::attribute overrides) ?{ (ObjectForge::forge_result) -> void } -> ObjectForge::forge_result
|
|
48
59
|
end
|
|
49
60
|
|
|
50
61
|
class ObjectForge::Sequence
|
|
51
62
|
def self.new
|
|
52
|
-
: (
|
|
63
|
+
: ((ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
|
|
53
64
|
|
|
54
65
|
attr_reader initial: ObjectForge::sequenceable
|
|
55
66
|
|
|
@@ -68,8 +79,8 @@ class ObjectForge::Forgeyard
|
|
|
68
79
|
: () -> void
|
|
69
80
|
|
|
70
81
|
def define
|
|
71
|
-
: (Symbol name, ObjectForge::
|
|
72
|
-
| (Symbol name, ObjectForge::
|
|
82
|
+
: (Symbol name, ObjectForge::forge_target) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
|
|
83
|
+
| (Symbol name, ObjectForge::forge_target) { [self: ObjectForge::ForgeDSL] -> void } -> ObjectForge::Forge
|
|
73
84
|
|
|
74
85
|
def register
|
|
75
86
|
: (Symbol name, ObjectForge::Forge forge) -> ObjectForge::Forge
|
|
@@ -78,41 +89,56 @@ class ObjectForge::Forgeyard
|
|
|
78
89
|
: (Symbol name) -> ObjectForge::Forge
|
|
79
90
|
|
|
80
91
|
def forge
|
|
81
|
-
: (Symbol name, *Symbol traits, **
|
|
92
|
+
: (Symbol name, *Symbol traits, **ObjectForge::attribute overrides) ?{ (ObjectForge::forge_result) -> void } -> ObjectForge::forge_result
|
|
82
93
|
alias build forge
|
|
83
94
|
alias call forge
|
|
84
95
|
end
|
|
85
96
|
|
|
86
97
|
class ObjectForge::Forge
|
|
87
|
-
class Parameters
|
|
98
|
+
class Parameters < Struct[Hash[Symbol, untyped]]
|
|
88
99
|
include ObjectForge::_ForgeParameters
|
|
89
100
|
|
|
101
|
+
# Struct allows skipping arguments, but in reality they are all required.
|
|
90
102
|
def initialize
|
|
91
|
-
: (attributes: Hash[Symbol,
|
|
103
|
+
: (attributes: Hash[Symbol, ObjectForge::attribute], traits: Hash[Symbol, Hash[Symbol, ObjectForge::attribute]], options: Hash[Symbol, untyped]) -> void
|
|
92
104
|
end
|
|
93
105
|
|
|
94
|
-
attr_reader
|
|
95
|
-
|
|
106
|
+
attr_reader forge_target: ObjectForge::forge_target
|
|
107
|
+
alias target forge_target
|
|
108
|
+
|
|
109
|
+
attr_reader name: Symbol?
|
|
110
|
+
|
|
111
|
+
attr_reader parameters: ObjectForge::_ForgeParameters
|
|
112
|
+
|
|
113
|
+
@crucible: ObjectForge::_Crucible
|
|
114
|
+
@mold: ObjectForge::_Mold
|
|
115
|
+
@after_forge_hook: ObjectForge::_Hook?
|
|
96
116
|
|
|
97
117
|
def self.define
|
|
98
|
-
: (ObjectForge::
|
|
99
|
-
| (ObjectForge::
|
|
118
|
+
: (ObjectForge::forge_target, ?name: Symbol?) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
|
|
119
|
+
| (ObjectForge::forge_target, ?name: Symbol?) { [self: ObjectForge::ForgeDSL] -> void } -> ObjectForge::Forge
|
|
100
120
|
|
|
101
121
|
def initialize
|
|
102
|
-
: (ObjectForge::
|
|
122
|
+
: (ObjectForge::forge_target, ObjectForge::_ForgeParameters parameters, ?name: Symbol?) -> void
|
|
103
123
|
|
|
104
124
|
def forge
|
|
105
|
-
: (*Symbol traits, **
|
|
125
|
+
: (*Symbol traits, **ObjectForge::attribute overrides) ?{ (ObjectForge::forge_result) -> void } -> ObjectForge::forge_result
|
|
106
126
|
alias build forge
|
|
107
127
|
alias call forge
|
|
108
128
|
|
|
109
129
|
private
|
|
130
|
+
|
|
131
|
+
def determine_crucible
|
|
132
|
+
: (Hash[Symbol, untyped]) -> ObjectForge::_Crucible
|
|
110
133
|
|
|
111
134
|
def determine_mold
|
|
112
|
-
: (ObjectForge::
|
|
135
|
+
: (ObjectForge::forge_target, Hash[Symbol, untyped]) -> ObjectForge::mold
|
|
136
|
+
|
|
137
|
+
def determine_after_forge_hook
|
|
138
|
+
: (Hash[Symbol, untyped] options) -> ObjectForge::_Hook?
|
|
113
139
|
|
|
114
140
|
def resolve_attributes
|
|
115
|
-
: (Array[Symbol] traits, Hash[Symbol,
|
|
141
|
+
: (Array[Symbol] traits, Hash[Symbol, ObjectForge::attribute] overrides) -> Hash[Symbol, ObjectForge::attribute]
|
|
116
142
|
end
|
|
117
143
|
|
|
118
144
|
class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
|
|
@@ -123,7 +149,7 @@ class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
|
|
|
123
149
|
@attributes: Hash[Symbol, Proc]
|
|
124
150
|
@sequences: Hash[Symbol, ObjectForge::Sequence]
|
|
125
151
|
@traits: Hash[Symbol, Hash[Symbol, Proc]]
|
|
126
|
-
@
|
|
152
|
+
@options: Hash[Symbol, untyped]
|
|
127
153
|
|
|
128
154
|
def initialize
|
|
129
155
|
: () { (ObjectForge::ForgeDSL) -> void } -> void
|
|
@@ -131,15 +157,16 @@ class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
|
|
|
131
157
|
|
|
132
158
|
def freeze: -> self
|
|
133
159
|
|
|
134
|
-
def
|
|
160
|
+
def option
|
|
135
161
|
: (Symbol name, untyped value) -> Symbol
|
|
136
162
|
|
|
137
163
|
def attribute
|
|
138
|
-
: (Symbol name) { [self: ObjectForge::Crucible] ->
|
|
164
|
+
: (Symbol name) { [self: ObjectForge::Crucible] -> ObjectForge::attribute } -> Symbol
|
|
139
165
|
alias [] attribute
|
|
140
166
|
|
|
141
167
|
def sequence
|
|
142
168
|
: (Symbol name, ?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) { (ObjectForge::sequenceable) [self: ObjectForge::Crucible] -> untyped } -> Symbol
|
|
169
|
+
| (Symbol name, ?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> Symbol
|
|
143
170
|
|
|
144
171
|
def trait
|
|
145
172
|
: (Symbol name) { (self) -> void } -> Symbol
|
|
@@ -149,35 +176,50 @@ class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
|
|
|
149
176
|
private
|
|
150
177
|
|
|
151
178
|
def method_missing
|
|
179
|
+
# Attribute shortcut:
|
|
152
180
|
: (Symbol name) { [self: ObjectForge::Crucible] -> untyped } -> Symbol
|
|
181
|
+
# Option shortcut:
|
|
182
|
+
| (Symbol name, untyped value) -> Symbol
|
|
153
183
|
# After freezing:
|
|
154
184
|
| (Symbol name) { -> untyped } -> void
|
|
155
185
|
|
|
156
186
|
def respond_to_missing?
|
|
157
187
|
: (Symbol name, bool include_all) -> bool
|
|
158
188
|
|
|
159
|
-
def
|
|
189
|
+
def valid_option_method?
|
|
160
190
|
: (Symbol name) -> bool
|
|
161
191
|
end
|
|
162
192
|
|
|
163
193
|
class ObjectForge::Crucible < ObjectForge::UnBasicObject
|
|
164
|
-
|
|
194
|
+
def self.call
|
|
195
|
+
: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
196
|
+
def self.resolve
|
|
197
|
+
: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
|
|
198
|
+
|
|
199
|
+
@attributes: Hash[Symbol, ObjectForge::attribute]
|
|
165
200
|
@resolved_attributes: Set[Symbol]
|
|
201
|
+
@resolving_attributes: Array[Symbol]
|
|
166
202
|
|
|
167
203
|
def initialize
|
|
168
|
-
: (Hash[Symbol,
|
|
204
|
+
: (Hash[Symbol, ObjectForge::attribute] attributes) -> void
|
|
169
205
|
|
|
170
206
|
def resolve!
|
|
171
|
-
: -> Hash[Symbol,
|
|
207
|
+
: -> Hash[Symbol, ObjectForge::attribute]
|
|
172
208
|
|
|
173
209
|
private
|
|
174
210
|
|
|
175
211
|
def method_missing
|
|
176
|
-
: (Symbol name) ->
|
|
212
|
+
: (Symbol name) -> ObjectForge::attribute
|
|
177
213
|
alias [] method_missing
|
|
178
214
|
|
|
179
215
|
def respond_to_missing?
|
|
180
216
|
: (Symbol name, bool include_all) -> bool
|
|
217
|
+
|
|
218
|
+
def raise_circular_dependency_error!
|
|
219
|
+
: (Symbol name) -> void
|
|
220
|
+
|
|
221
|
+
def resolve_attribute!
|
|
222
|
+
: (Symbol name) -> void
|
|
181
223
|
end
|
|
182
224
|
|
|
183
225
|
class ObjectForge::UnBasicObject < BasicObject
|
|
@@ -200,9 +242,9 @@ class ObjectForge::UnBasicObject < BasicObject
|
|
|
200
242
|
|
|
201
243
|
def to_s: -> String
|
|
202
244
|
|
|
203
|
-
def pretty_print: (
|
|
245
|
+
def pretty_print: (PP) -> void
|
|
204
246
|
|
|
205
|
-
def pretty_print_cycle: (
|
|
247
|
+
def pretty_print_cycle: (PP) -> void
|
|
206
248
|
|
|
207
249
|
private
|
|
208
250
|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: object_forge
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Alexander Bulancov
|
|
@@ -24,12 +24,16 @@ dependencies:
|
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
25
|
version: '1.2'
|
|
26
26
|
description: |
|
|
27
|
-
ObjectForge
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
27
|
+
ObjectForge is a small factory library for Ruby objects with minimal assumptions
|
|
28
|
+
about framework, persistence, or runtime environment.
|
|
29
|
+
|
|
30
|
+
It is designed for cases where factory-style object construction is useful,
|
|
31
|
+
but Rails-oriented or database-oriented tooling is a poor fit. ObjectForge
|
|
32
|
+
works well with plain Ruby objects, hashes, structs, and custom build flows.
|
|
33
|
+
|
|
34
|
+
The library focuses on explicit configuration, independent registries and factories,
|
|
35
|
+
and replaceable components. It aims to provide a familiar workflow without
|
|
36
|
+
coupling object generation to a framework or persistence layer.
|
|
33
37
|
executables: []
|
|
34
38
|
extensions: []
|
|
35
39
|
extra_rdoc_files:
|
|
@@ -58,9 +62,9 @@ licenses:
|
|
|
58
62
|
metadata:
|
|
59
63
|
homepage_uri: https://github.com/trinistr/object_forge
|
|
60
64
|
bug_tracker_uri: https://github.com/trinistr/object_forge/issues
|
|
61
|
-
documentation_uri: https://rubydoc.info/gems/object_forge/0.
|
|
62
|
-
source_code_uri: https://github.com/trinistr/object_forge/tree/v0.
|
|
63
|
-
changelog_uri: https://github.com/trinistr/object_forge/blob/v0.
|
|
65
|
+
documentation_uri: https://rubydoc.info/gems/object_forge/0.4.1
|
|
66
|
+
source_code_uri: https://github.com/trinistr/object_forge/tree/v0.4.1
|
|
67
|
+
changelog_uri: https://github.com/trinistr/object_forge/blob/v0.4.1/CHANGELOG.md
|
|
64
68
|
rubygems_mfa_required: 'true'
|
|
65
69
|
rdoc_options:
|
|
66
70
|
- "--tag"
|
|
@@ -82,5 +86,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
82
86
|
requirements: []
|
|
83
87
|
rubygems_version: 3.6.9
|
|
84
88
|
specification_version: 4
|
|
85
|
-
summary: A
|
|
89
|
+
summary: A small, flexible factory library for plain Ruby objects, hashes, structs
|
|
90
|
+
and custom build flows.
|
|
86
91
|
test_files: []
|