object_forge 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9481504e1456ec667e1c0182ecef5456cb2c9094b62ba6e09da62f0c1c79a00e
4
- data.tar.gz: d2c2fdcfd6807211ea82987c998f4d2d8c6e0b1bbc334178330f97dfd8d7df7b
3
+ metadata.gz: 94a44e43942c8ff51412a23c866e1f87984d9c2207b044492ea77d07150199d5
4
+ data.tar.gz: 2ca03af3ee44ce7005dd8e242266f7fb8409c54ebf560028ebbf8b6727ceaf0e
5
5
  SHA512:
6
- metadata.gz: 85b341cae5396f0eee11f00e6084bfbdc4561070c4657d3e7265570b48f195789c4a8763220d81f38f2dd4c31573a36064aecf346f9e6ffac8e07dbcbcf86720
7
- data.tar.gz: dc7faa45a80ce51ac2b4f57f7a88134b8c6a44ad3889f06b896962aa6de711c7fee36b70b7952ba80e19b95d036e838c169abebc375712a76b29e21e7ff54815
6
+ metadata.gz: 58221f62b2aef297f053030da5b766518dec5547285c57b8f0330e0e83c15d1a5ed6fba651790900e36d7674c4206a3e70e19d45900645ce633b545a1717509b
7
+ data.tar.gz: 39109437f0647115364b504d0d0bca8af66fc76f2c573870c3939c0aca2798c709a52ce920365290a767b30adae5a193271e32a17fd99e3de9eb6edc07b3f2ab
@@ -88,19 +88,10 @@ module ObjectForge
88
88
  # @return [Any]
89
89
  #
90
90
  # @raise [CircularAttributeDependencyError] if a dependency cycle is detected
91
- def method_missing(name) # rubocop:disable Metrics/MethodLength
91
+ def method_missing(name)
92
92
  if @attributes.key?(name)
93
- if @resolving_attributes.include?(name)
94
- raise_circular_dependency_error!(name)
95
- elsif !@resolved_attributes.include?(name) && (::Proc === @attributes[name])
96
- begin
97
- @resolving_attributes << name
98
- @attributes[name] = instance_exec(&@attributes[name])
99
- @resolved_attributes << name
100
- ensure
101
- @resolving_attributes.pop
102
- end
103
- end
93
+ raise_circular_dependency_error!(name) if @resolving_attributes.include?(name)
94
+ resolve_attribute!(name) unless @resolved_attributes.include?(name)
104
95
  @attributes[name]
105
96
  else
106
97
  super
@@ -119,5 +110,15 @@ module ObjectForge
119
110
  raise CircularAttributeDependencyError,
120
111
  "attribute depends on itself: #{loop.join(" -> ")} -> #{name}"
121
112
  end
113
+
114
+ def resolve_attribute!(name)
115
+ return unless (attribute_proc = @attributes[name]) && (::Proc === attribute_proc)
116
+
117
+ @resolving_attributes << name
118
+ @attributes[name] = instance_exec(&attribute_proc) # steep:ignore BlockTypeMismatch
119
+ @resolved_attributes << name
120
+ ensure
121
+ @resolving_attributes.pop
122
+ end
122
123
  end
123
124
  end
@@ -189,7 +189,8 @@ module ObjectForge
189
189
  "unknown traits for forge#{" #{name}" if name}: #{unknown_traits.join(", ")}"
190
190
  end
191
191
 
192
- attributes = @parameters.attributes.merge(*@parameters.traits.values_at(*traits), overrides)
192
+ trait_attributes = @parameters.traits.values_at(*traits) # : Array[Hash[Symbol, ObjectForge::attribute]]
193
+ attributes = @parameters.attributes.merge(*trait_attributes, overrides)
193
194
  @crucible.call(attributes)
194
195
  end
195
196
  end
@@ -103,8 +103,9 @@ module ObjectForge
103
103
  # @raise [TypeError] if +name+ is not a Symbol
104
104
  def option(name, value)
105
105
  unless ::Symbol === name
106
- raise ::TypeError, "option name must be a Symbol, #{name.class} given"
106
+ raise ::TypeError, "option name must be a Symbol, #{name.class} given (in #{name.inspect})"
107
107
  end
108
+ raise DSLError, "option definition does not take a block (in #{name.inspect})" if block_given?
108
109
 
109
110
  @options[name] = value
110
111
 
@@ -197,7 +198,7 @@ module ObjectForge
197
198
  seq = @sequences[name] ||= Sequence.new(initial)
198
199
 
199
200
  if block_given?
200
- attribute(name) { instance_exec(seq.next, &) }
201
+ attribute(name) { instance_exec(seq.next, &) } # steep:ignore BlockTypeMismatch
201
202
  else
202
203
  attribute(name) { seq.next }
203
204
  end
@@ -287,10 +288,13 @@ module ObjectForge
287
288
  # @raise [DSLError] if a reserved +name+ is used
288
289
  def method_missing(name, value = nil, **nil, &)
289
290
  return super(name) if frozen?
291
+
290
292
  if valid_option_method?(name)
291
- return option(name[...-1].to_sym, value) # steep:ignore NoMethod
293
+ # Intentionally passing block to `option` to trigger DSLError if it is present.
294
+ return option(name[...-1].to_sym, value, &) # steep:ignore NoMethod, UnexpectedBlockGiven
292
295
  end
293
- return attribute(name, &) if respond_to_missing?(name, false)
296
+ # Block can be missing, but `attribute` will raise if it is.
297
+ return attribute(name, &) if respond_to_missing?(name, false) # steep:ignore BlockTypeMismatch
294
298
 
295
299
  raise DSLError, "#{name.inspect} is a reserved name (in #{name.inspect})"
296
300
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module ObjectForge
4
4
  # Current version
5
- VERSION = "0.4.0"
5
+ VERSION = "0.4.1"
6
6
  end
@@ -3,15 +3,7 @@ module ObjectForge
3
3
  def self.wrap_mold
4
4
  : ((ObjectForge::mold | Class | nil) mold) -> ObjectForge::mold?
5
5
  def self.mold_for
6
- : (ObjectForge::_Forgable forge_target) -> ObjectForge::mold
7
-
8
- class SingleArgumentMold
9
- include ObjectForge::_Mold
10
- end
11
-
12
- class KeywordsMold
13
- include ObjectForge::_Mold
14
- end
6
+ : (ObjectForge::forge_target) -> ObjectForge::mold
15
7
 
16
8
  class WrappedMold
17
9
  interface _MoldClass[T]
@@ -25,43 +17,53 @@ module ObjectForge
25
17
  def initialize: (_MoldClass[ObjectForge::mold] wrapped_mold) -> void
26
18
  end
27
19
 
20
+ class SingleArgumentMold
21
+ include ObjectForge::_Mold
22
+ end
23
+
24
+ class KeywordsMold
25
+ include ObjectForge::_Mold
26
+ end
27
+
28
28
  class StructMold
29
29
  interface _StructSubclass[T]
30
30
  def new
31
31
  : (*untyped) -> T
32
32
  | (**untyped) -> T
33
- | (Hash[Symbol, untyped]) -> T
33
+ | (Hash[Symbol, ObjectForge::attribute]) -> T
34
34
  def members: -> Array[Symbol]
35
35
  def keyword_init?: -> bool?
36
36
  end
37
37
 
38
38
  RUBY_FEATURE_AUTO_KEYWORDS: bool
39
+
39
40
  attr_reader lax: bool
41
+ alias lax? lax
40
42
 
41
43
  def initialize: (?lax: bool) -> void
42
44
 
43
45
  def call
44
- : [T < Struct] (forge_target: _StructSubclass[T], attributes: Hash[Symbol, untyped], **untyped) -> T
46
+ : [T < Struct] (forge_target: _StructSubclass[T], attributes: Hash[Symbol, ObjectForge::attribute], **untyped) -> T
45
47
 
46
48
  private
47
49
 
48
50
  def build_struct_with_unspecified_keyword_init
49
- : [T < Struct] (_StructSubclass[T] forge_target, Hash[Symbol, untyped] attributes) -> T
51
+ : [T < Struct] (_StructSubclass[T] forge_target, Hash[Symbol, ObjectForge::attribute] attributes) -> T
50
52
  end
51
53
 
52
54
  class HashMold
53
55
  interface _HashSubclass[T]
54
- def []: (Hash[untyped, untyped]) -> T
56
+ def []: (Hash[Symbol, ObjectForge::attribute]) -> T
55
57
  end
56
58
 
57
- attr_reader default: untyped?
59
+ attr_reader default: ObjectForge::attribute
58
60
  attr_reader default_proc: Proc?
59
61
 
60
62
  def initialize
61
- : (?untyped? default_value) ?{ (Hash[untyped, untyped] hash, untyped key) -> untyped} -> void
63
+ : [T < Hash] (?ObjectForge::attribute default_value) ?{ (T hash, untyped key) -> ObjectForge::attribute} -> void
62
64
 
63
65
  def call
64
- : [T < Hash] (forge_target: _HashSubclass[T], attributes: Hash[Symbol, untyped], **untyped) -> T
66
+ : [T < Hash] (forge_target: _HashSubclass[T], attributes: Hash[Symbol, ObjectForge::attribute], **untyped) -> T
65
67
  end
66
68
  end
67
69
  end
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,25 +13,22 @@ 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]]
17
+ def attributes: () -> Hash[Symbol, ObjectForge::attribute]
18
+ def traits: () -> Hash[Symbol, Hash[Symbol, ObjectForge::attribute]]
18
19
  def options: () -> Hash[Symbol, untyped]
19
20
  end
20
21
  interface _Mold
21
22
  def call
22
- : (forge_target: untyped, attributes: Hash[Symbol, untyped], **untyped) -> untyped
23
+ : (forge_target: ObjectForge::forge_target, attributes: Hash[Symbol, ObjectForge::attribute], **untyped) -> ObjectForge::forge_result
23
24
  end
24
25
  interface _Crucible
25
26
  def call
26
- : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
27
+ : (Hash[Symbol, ObjectForge::attribute]) -> Hash[Symbol, ObjectForge::attribute]
27
28
  end
28
29
  interface _Hook
29
30
  def call
30
- : (ObjectForge::_Forgable) -> void
31
+ : (ObjectForge::forge_result) -> void
31
32
  end
32
33
 
33
34
  class Error < StandardError
@@ -36,30 +37,30 @@ module ObjectForge
36
37
  end
37
38
  class CircularAttributeDependencyError < Error
38
39
  end
39
- class ObjectInterfaceError < Error
40
+ class ObjectInterfaceError < ::TypeError
40
41
  end
41
42
 
42
- VERSION: String
43
+ VERSION: ::String
43
44
  DEFAULT_YARD: ObjectForge::Forgeyard
44
45
 
45
46
  def self.sequence
46
- : (?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
47
+ : ((ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
47
48
 
48
49
  def self.define
49
- : (Symbol name, ObjectForge::_Forgable forge_target) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
50
- | (Symbol name, ObjectForge::_Forgable forge_target) { [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
51
52
 
52
53
  def self.forge
53
- : (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
54
55
  def self.build
55
- : (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
56
57
  def self.call
57
- : (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
58
59
  end
59
60
 
60
61
  class ObjectForge::Sequence
61
62
  def self.new
62
- : (?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
63
+ : ((ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
63
64
 
64
65
  attr_reader initial: ObjectForge::sequenceable
65
66
 
@@ -78,8 +79,8 @@ class ObjectForge::Forgeyard
78
79
  : () -> void
79
80
 
80
81
  def define
81
- : (Symbol name, ObjectForge::_Forgable forge_target) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
82
- | (Symbol name, ObjectForge::_Forgable forge_target) { [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
83
84
 
84
85
  def register
85
86
  : (Symbol name, ObjectForge::Forge forge) -> ObjectForge::Forge
@@ -88,32 +89,40 @@ class ObjectForge::Forgeyard
88
89
  : (Symbol name) -> ObjectForge::Forge
89
90
 
90
91
  def forge
91
- : (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
92
93
  alias build forge
93
94
  alias call forge
94
95
  end
95
96
 
96
97
  class ObjectForge::Forge
97
- class Parameters
98
+ class Parameters < Struct[Hash[Symbol, untyped]]
98
99
  include ObjectForge::_ForgeParameters
99
100
 
101
+ # Struct allows skipping arguments, but in reality they are all required.
100
102
  def initialize
101
- : (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
102
104
  end
103
105
 
104
- attr_reader forge_target: ObjectForge::_Forgable
106
+ attr_reader forge_target: ObjectForge::forge_target
105
107
  alias target forge_target
106
- attr_reader name: Symbol
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?
107
116
 
108
117
  def self.define
109
- : (ObjectForge::_Forgable forge_target, ?name: Symbol?) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
110
- | (ObjectForge::_Forgable forge_target, ?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
111
120
 
112
121
  def initialize
113
- : (ObjectForge::_Forgable forge_target, ObjectForge::_ForgeParameters parameters, ?name: Symbol?) -> void
122
+ : (ObjectForge::forge_target, ObjectForge::_ForgeParameters parameters, ?name: Symbol?) -> void
114
123
 
115
124
  def forge
116
- : (*Symbol traits, **untyped overrides) ?{ (untyped) -> void } -> ObjectForge::_Forgable
125
+ : (*Symbol traits, **ObjectForge::attribute overrides) ?{ (ObjectForge::forge_result) -> void } -> ObjectForge::forge_result
117
126
  alias build forge
118
127
  alias call forge
119
128
 
@@ -123,13 +132,13 @@ class ObjectForge::Forge
123
132
  : (Hash[Symbol, untyped]) -> ObjectForge::_Crucible
124
133
 
125
134
  def determine_mold
126
- : (ObjectForge::_Forgable forge_target, Hash[Symbol, untyped]) -> ObjectForge::mold
135
+ : (ObjectForge::forge_target, Hash[Symbol, untyped]) -> ObjectForge::mold
127
136
 
128
137
  def determine_after_forge_hook
129
138
  : (Hash[Symbol, untyped] options) -> ObjectForge::_Hook?
130
139
 
131
140
  def resolve_attributes
132
- : (Array[Symbol] traits, Hash[Symbol, untyped] overrides) -> Hash[Symbol, untyped]
141
+ : (Array[Symbol] traits, Hash[Symbol, ObjectForge::attribute] overrides) -> Hash[Symbol, ObjectForge::attribute]
133
142
  end
134
143
 
135
144
  class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
@@ -152,11 +161,12 @@ class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
152
161
  : (Symbol name, untyped value) -> Symbol
153
162
 
154
163
  def attribute
155
- : (Symbol name) { [self: ObjectForge::Crucible] -> untyped } -> Symbol
164
+ : (Symbol name) { [self: ObjectForge::Crucible] -> ObjectForge::attribute } -> Symbol
156
165
  alias [] attribute
157
166
 
158
167
  def sequence
159
168
  : (Symbol name, ?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) { (ObjectForge::sequenceable) [self: ObjectForge::Crucible] -> untyped } -> Symbol
169
+ | (Symbol name, ?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> Symbol
160
170
 
161
171
  def trait
162
172
  : (Symbol name) { (self) -> void } -> Symbol
@@ -166,7 +176,10 @@ class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
166
176
  private
167
177
 
168
178
  def method_missing
179
+ # Attribute shortcut:
169
180
  : (Symbol name) { [self: ObjectForge::Crucible] -> untyped } -> Symbol
181
+ # Option shortcut:
182
+ | (Symbol name, untyped value) -> Symbol
170
183
  # After freezing:
171
184
  | (Symbol name) { -> untyped } -> void
172
185
 
@@ -183,20 +196,20 @@ class ObjectForge::Crucible < ObjectForge::UnBasicObject
183
196
  def self.resolve
184
197
  : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]
185
198
 
186
- @attributes: Hash[Symbol, untyped]
199
+ @attributes: Hash[Symbol, ObjectForge::attribute]
187
200
  @resolved_attributes: Set[Symbol]
188
201
  @resolving_attributes: Array[Symbol]
189
202
 
190
203
  def initialize
191
- : (Hash[Symbol, untyped] attributes) -> void
204
+ : (Hash[Symbol, ObjectForge::attribute] attributes) -> void
192
205
 
193
206
  def resolve!
194
- : -> Hash[Symbol, untyped]
207
+ : -> Hash[Symbol, ObjectForge::attribute]
195
208
 
196
209
  private
197
210
 
198
211
  def method_missing
199
- : (Symbol name) -> untyped
212
+ : (Symbol name) -> ObjectForge::attribute
200
213
  alias [] method_missing
201
214
 
202
215
  def respond_to_missing?
@@ -204,6 +217,9 @@ class ObjectForge::Crucible < ObjectForge::UnBasicObject
204
217
 
205
218
  def raise_circular_dependency_error!
206
219
  : (Symbol name) -> void
220
+
221
+ def resolve_attribute!
222
+ : (Symbol name) -> void
207
223
  end
208
224
 
209
225
  class ObjectForge::UnBasicObject < BasicObject
@@ -226,9 +242,9 @@ class ObjectForge::UnBasicObject < BasicObject
226
242
 
227
243
  def to_s: -> String
228
244
 
229
- def pretty_print: (untyped) -> void
245
+ def pretty_print: (PP) -> void
230
246
 
231
- def pretty_print_cycle: (untyped) -> void
247
+ def pretty_print_cycle: (PP) -> void
232
248
 
233
249
  private
234
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.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexander Bulancov
@@ -62,9 +62,9 @@ licenses:
62
62
  metadata:
63
63
  homepage_uri: https://github.com/trinistr/object_forge
64
64
  bug_tracker_uri: https://github.com/trinistr/object_forge/issues
65
- documentation_uri: https://rubydoc.info/gems/object_forge/0.4.0
66
- source_code_uri: https://github.com/trinistr/object_forge/tree/v0.4.0
67
- changelog_uri: https://github.com/trinistr/object_forge/blob/v0.4.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
68
68
  rubygems_mfa_required: 'true'
69
69
  rdoc_options:
70
70
  - "--tag"