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.
data/sig/object_forge.rbs CHANGED
@@ -1,6 +1,10 @@
1
1
  module ObjectForge
2
- type mold = Object & ObjectForge::_Mold
3
- type sequenceable = ObjectForge::_RespondTo & ObjectForge::_Sequenceable
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, untyped]
17
- def traits: () -> Hash[Symbol, Hash[Symbol, untyped]]
18
- def settings: () -> Hash[Symbol, untyped]
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
- : (forged: untyped, attributes: Hash[Symbol, untyped], **untyped) -> untyped
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 MoldError < Error
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
- : (?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
47
+ : ((ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
37
48
 
38
49
  def self.define
39
- : (Symbol name, ObjectForge::_Forgable forged) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
40
- | (Symbol name, ObjectForge::_Forgable forged) { [self: ObjectForge::ForgeDSL] -> void } -> ObjectForge::Forge
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, **untyped overrides) ?{ (untyped) -> void } -> ObjectForge::_Forgable
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, **untyped overrides) ?{ (untyped) -> void } -> ObjectForge::_Forgable
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, **untyped overrides) ?{ (untyped) -> void } -> ObjectForge::_Forgable
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
- : (?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
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::_Forgable forged) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
72
- | (Symbol name, ObjectForge::_Forgable forged) { [self: ObjectForge::ForgeDSL] -> void } -> ObjectForge::Forge
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, **untyped overrides) ?{ (untyped) -> void } -> ObjectForge::_Forgable
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, untyped], traits: Hash[Symbol, Hash[Symbol, untyped]]) -> void
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 forged: ObjectForge::_Forgable
95
- attr_reader name: Symbol
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::_Forgable forged, ?name: Symbol?) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
99
- | (ObjectForge::_Forgable forged, ?name: Symbol?) { [self: ObjectForge::ForgeDSL] -> void } -> ObjectForge::Forge
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::_Forgable forged, ObjectForge::_ForgeParameters parameters, ?name: Symbol?) -> void
122
+ : (ObjectForge::forge_target, ObjectForge::_ForgeParameters parameters, ?name: Symbol?) -> void
103
123
 
104
124
  def forge
105
- : (*Symbol traits, **untyped overrides) ?{ (untyped) -> void } -> ObjectForge::_Forgable
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::_Forgable forged, ObjectForge::mold mold) -> ObjectForge::mold
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, untyped] overrides) -> Hash[Symbol, untyped]
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
- @settings: Hash[Symbol, untyped]
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 setting
160
+ def option
135
161
  : (Symbol name, untyped value) -> Symbol
136
162
 
137
163
  def attribute
138
- : (Symbol name) { [self: ObjectForge::Crucible] -> untyped } -> Symbol
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 valid_setting_method?
189
+ def valid_option_method?
160
190
  : (Symbol name) -> bool
161
191
  end
162
192
 
163
193
  class ObjectForge::Crucible < ObjectForge::UnBasicObject
164
- @attributes: Hash[Symbol, untyped]
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, untyped] attributes) -> void
204
+ : (Hash[Symbol, ObjectForge::attribute] attributes) -> void
169
205
 
170
206
  def resolve!
171
- : -> Hash[Symbol, untyped]
207
+ : -> Hash[Symbol, ObjectForge::attribute]
172
208
 
173
209
  private
174
210
 
175
211
  def method_missing
176
- : (Symbol name) -> untyped
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: (untyped) -> void
245
+ def pretty_print: (PP) -> void
204
246
 
205
- def pretty_print_cycle: (untyped) -> void
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.3.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 provides a familiar way to build objects in any context
28
- with minimal assumptions about usage environment.
29
- It has no connection to any framework and, indeed, has nothing to do with a database.
30
- To use, just define some factories and call them wherever you need,
31
- be it in tests, console, or application code.
32
- If needed, almost any part of the process can be easily replaced with a custom solution.
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.3.0
62
- source_code_uri: https://github.com/trinistr/object_forge/tree/v0.3.0
63
- changelog_uri: https://github.com/trinistr/object_forge/blob/v0.3.0/CHANGELOG.md
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 simple factory for objects with minimal assumptions.
89
+ summary: A small, flexible factory library for plain Ruby objects, hashes, structs
90
+ and custom build flows.
86
91
  test_files: []