object_forge 0.1.0 → 0.1.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: 13df90e0eb14f3fb52c1b9be5706a3b2da6c844369005f0500fe31f67ced6091
4
- data.tar.gz: 6ce301c70ae87b0e46662482cd46af63d8e282aca65f92e220dc02e4a6b3e2b6
3
+ metadata.gz: 05dce89141257f37f8b8af6a7f0cdfb1d7ee785a37ad119d0c13ff28c58d9245
4
+ data.tar.gz: e171f2f3d504d0edadfdb5f2ba2f87d9d9edd1a0f175a0be366b12dc528182a0
5
5
  SHA512:
6
- metadata.gz: b75f0d0ddacd4f102a02bbb74bd0189e8b2759eb4e9a4f3f62de84a028356800908d3313ec5361299078e49a2101abcedda91358601cfc03cf76ac2bb3fb05b7
7
- data.tar.gz: 76231dd798153526c679874b3528d120a7f3562c8dfc540001be54465b46f53a50afa46f04d17f8bc2ddfcb152708d9003e417fd4d8c6d220890c62597930104
6
+ metadata.gz: c8a330629ce325a8bf78930a3025d5c1d75305e80c970cb5217e9d4ae6f93659d3fc9d3fdd89884920b5843c8c1bfb787bdfc6be8ce220db29124a2d73a749da
7
+ data.tar.gz: a0515b9f4111c0e3bcd1b9bbb4f5cb3011bb12bba62750a2ca0f49b702f55a459be7877fb540cf16c6a40503a5c2294e962352408345e67bbb7179bc79f2539b
@@ -55,8 +55,8 @@ module ObjectForge
55
55
 
56
56
  # Forge a new instance.
57
57
  #
58
- # @overload forge(*traits, **overrides)
59
- # @overload forge(traits, overrides)
58
+ # @overload forge(*traits, **overrides, &)
59
+ # @overload forge(traits, overrides, &)
60
60
  #
61
61
  # Positional arguments are taken as trait names, keyword arguments as attribute overrides,
62
62
  # unless there are exactly two positional arguments: an array and a hash.
@@ -64,19 +64,21 @@ module ObjectForge
64
64
  # All traits and overrides are applied in argument order,
65
65
  # with overrides always applied after traits.
66
66
  #
67
+ # If a block is given, forged instance is yielded to it after being built.
68
+ #
67
69
  # @thread_safety Forging is thread-safe if {#parameters},
68
70
  # +traits+ and +overrides+ are thread-safe.
69
71
  #
70
72
  # @param traits [Array<Symbol>] traits to apply
71
73
  # @param overrides [Hash{Symbol => Any}] attribute overrides
74
+ # @yieldparam object [Any] forged instance
75
+ # @yieldreturn [void]
72
76
  # @return [Any] built instance
73
77
  def forge(*traits, **overrides)
74
- # @type var traits: Array[(Array[Symbol] | Hash[Symbol, untyped])]
75
- traits, overrides = check_traits_and_overrides(traits, overrides)
76
- attributes = @parameters.attributes.merge(*@parameters.traits.values_at(*traits), overrides)
77
- attributes = Crucible.new(attributes).resolve!
78
-
79
- forged.new(attributes)
78
+ resolved_attributes = resolve_attributes(traits, overrides)
79
+ instance = build_instance(resolved_attributes)
80
+ yield instance if block_given?
81
+ instance
80
82
  end
81
83
 
82
84
  alias build forge
@@ -84,19 +86,13 @@ module ObjectForge
84
86
 
85
87
  private
86
88
 
87
- def check_traits_and_overrides(traits, overrides)
88
- unless traits.size == 2 && overrides.empty?
89
- # @type var traits: Array[Symbol]
90
- # @type var overrides: Hash[Symbol, untyped]
91
- return [traits, overrides]
92
- end
89
+ def resolve_attributes(traits, overrides)
90
+ attributes = @parameters.attributes.merge(*@parameters.traits.values_at(*traits), overrides)
91
+ Crucible.new(attributes).resolve!
92
+ end
93
93
 
94
- case traits
95
- in [Array => real_traits, Hash => real_overrides]
96
- [real_traits, real_overrides]
97
- else
98
- [traits, overrides]
99
- end
94
+ def build_instance(attributes)
95
+ forged.new(attributes)
100
96
  end
101
97
  end
102
98
  end
@@ -50,11 +50,13 @@ module ObjectForge
50
50
  # @param name [Symbol] name of the forge
51
51
  # @param traits [Array<Symbol>] traits to apply
52
52
  # @param overrides [Hash{Symbol => Any}] attribute overrides
53
+ # @yieldparam object [Any] forged instance
54
+ # @yieldreturn [void]
53
55
  # @return [Any] built instance
54
56
  #
55
57
  # @raise [KeyError] if forge with the specified name is not registered
56
- def forge(name, *traits, **overrides)
57
- @forges.fetch(name)[traits, overrides]
58
+ def forge(name, *traits, **overrides, &)
59
+ @forges.fetch(name)[*traits, **overrides, &]
58
60
  end
59
61
 
60
62
  alias build forge
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # module ObjectForge
4
+ # module Molds
5
+ # # Mold which calls +forged.new(**attributes)+.
6
+ # #
7
+ # # @since 0.1.1
8
+ # class KeywordsMold
9
+ # # Instantiate +forged+ with a hash of attributes.
10
+ # #
11
+ # # @param forged [Class]
12
+ # # @param attributes [Hash{Symbol => Any}]
13
+ # # @return [Any]
14
+ # def call(forged:, attributes:, **)
15
+ # forged.new(**attributes)
16
+ # end
17
+ # end
18
+ # end
19
+ # end
@@ -32,7 +32,7 @@ module ObjectForge
32
32
  end
33
33
 
34
34
  @initial = initial
35
- @container = Concurrent::MVar.new(initial)
35
+ @container = Concurrent::MVar.new(initial) # steep:ignore UnknownConstant
36
36
  end
37
37
 
38
38
  # Get the next value in the sequence, starting with the initial value.
@@ -2,5 +2,5 @@
2
2
 
3
3
  module ObjectForge
4
4
  # Current version
5
- VERSION = "0.1.0"
5
+ VERSION = "0.1.1"
6
6
  end
data/lib/object_forge.rb CHANGED
@@ -84,7 +84,7 @@ module ObjectForge
84
84
  DEFAULT_YARD.define(...)
85
85
  end
86
86
 
87
- # @overload forge(name, *traits, **overrides)
87
+ # @overload forge(name, *traits, **overrides, &)
88
88
  # Build an instance using a forge from {DEFAULT_YARD}.
89
89
  #
90
90
  # @!macro default_forgeyard
@@ -94,6 +94,8 @@ module ObjectForge
94
94
  # @param name [Symbol] name of the forge
95
95
  # @param traits [Array<Symbol>] traits to apply
96
96
  # @param overrides [Hash{Symbol => Any}] attribute overrides
97
+ # @yieldparam object [Any] forged instance
98
+ # @yieldreturn [void]
97
99
  # @return [Any] built instance
98
100
  def self.forge(...)
99
101
  DEFAULT_YARD.forge(...)
data/sig/object_forge.rbs CHANGED
@@ -1,14 +1,13 @@
1
1
  module ObjectForge
2
- class Error < StandardError
3
- end
4
- class DSLError < Error
5
- end
2
+ type sequenceable = ObjectForge::_RespondTo & ObjectForge::_Sequenceable
6
3
 
7
- interface _Sequenceable
8
- def succ: -> self
4
+ interface _RespondTo
9
5
  def respond_to?: (Symbol name, ?bool include_private) -> bool
10
6
  def class: -> Class
11
7
  end
8
+ interface _Sequenceable
9
+ def succ: -> self
10
+ end
12
11
  interface _Forgable
13
12
  def new: (Hash[Symbol, untyped]) -> self
14
13
  end
@@ -17,31 +16,36 @@ module ObjectForge
17
16
  def traits: () -> Hash[Symbol, Hash[Symbol, untyped]]
18
17
  end
19
18
 
19
+ class Error < StandardError
20
+ end
21
+ class DSLError < Error
22
+ end
23
+
20
24
  VERSION: String
21
25
  DEFAULT_YARD: ObjectForge::Forgeyard
22
26
 
23
27
  def self.sequence
24
- : (?(ObjectForge::_Sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
28
+ : (?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
25
29
 
26
30
  def self.define
27
31
  : (Symbol name, ObjectForge::_Forgable forged) { (ObjectForge::ForgeDSL) -> void } -> ObjectForge::Forge
28
32
  | (Symbol name, ObjectForge::_Forgable forged) { [self: ObjectForge::ForgeDSL] -> void } -> ObjectForge::Forge
29
33
 
30
34
  def self.forge
31
- : (Symbol name, *Symbol traits, **untyped overrides) -> ObjectForge::_Forgable
35
+ : (Symbol name, *Symbol traits, **untyped overrides) ?{ (untyped) -> void } -> ObjectForge::_Forgable
32
36
  end
33
37
 
34
38
  class ObjectForge::Sequence
35
39
  def self.new
36
- : (?(ObjectForge::_Sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
40
+ : (?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
37
41
 
38
- attr_reader initial: ObjectForge::_Sequenceable
42
+ attr_reader initial: ObjectForge::sequenceable
39
43
 
40
- def initialize: (ObjectForge::_Sequenceable initial) -> void
44
+ def initialize: (ObjectForge::sequenceable initial) -> void
41
45
 
42
- def next: -> ObjectForge::_Sequenceable
46
+ def next: -> ObjectForge::sequenceable
43
47
 
44
- def reset: -> ObjectForge::_Sequenceable
48
+ def reset: -> ObjectForge::sequenceable
45
49
  alias rewind reset
46
50
  end
47
51
 
@@ -59,7 +63,7 @@ class ObjectForge::Forgeyard
59
63
  : (Symbol name, ObjectForge::Forge forge) -> ObjectForge::Forge
60
64
 
61
65
  def forge
62
- : (Symbol name, *Symbol traits, **untyped overrides) -> ObjectForge::_Forgable
66
+ : (Symbol name, *Symbol traits, **untyped overrides) ?{ (untyped) -> void } -> ObjectForge::_Forgable
63
67
  alias build forge
64
68
  alias [] forge
65
69
  end
@@ -68,7 +72,7 @@ class ObjectForge::Forge
68
72
  class Parameters
69
73
  include ObjectForge::_ForgeParameters
70
74
 
71
- def intitialize
75
+ def initialize
72
76
  : (attributes: Hash[Symbol, untyped], traits: Hash[Symbol, Hash[Symbol, untyped]]) -> void
73
77
  end
74
78
 
@@ -83,20 +87,22 @@ class ObjectForge::Forge
83
87
  : (ObjectForge::_Forgable forged, ObjectForge::_ForgeParameters parameters, ?name: Symbol?) -> void
84
88
 
85
89
  def forge
86
- : (*Symbol traits, **untyped overrides) -> ObjectForge::_Forgable
87
- | (Array[Symbol] traits, Hash[Symbol, untyped] overrides) -> ObjectForge::_Forgable
90
+ : (*Symbol traits, **untyped overrides) ?{ (untyped) -> void } -> ObjectForge::_Forgable
88
91
  alias build forge
89
92
  alias [] forge
90
93
 
91
94
  private
92
95
 
93
- def check_traits_and_overrides
94
- : (Array[Symbol] traits, Hash[Symbol, untyped] overrides) -> [Array[Symbol], Hash[Symbol, untyped]]
95
- | (Array[(Array[Symbol] | Hash[Symbol, untyped])], Hash[Symbol, untyped]) -> [Array[Symbol], Hash[Symbol, untyped]]
96
+ def resolve_attributes
97
+ : (Array[Symbol] traits, Hash[Symbol, untyped] overrides) -> Hash[Symbol, untyped]
98
+
99
+ def build_instance
100
+ : (Hash[Symbol, untyped] attributes) -> ObjectForge::_Forgable
96
101
  end
97
102
 
98
103
  class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
99
104
  include ObjectForge::_ForgeParameters
105
+
100
106
  attr_reader sequences: Hash[Symbol, ObjectForge::Sequence]
101
107
 
102
108
  @attributes: Hash[Symbol, Proc]
@@ -110,12 +116,11 @@ class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
110
116
  def freeze: -> self
111
117
 
112
118
  def attribute
113
- : (Symbol name) { -> untyped } -> Symbol
114
- | (Symbol name) { (ObjectForge::_Sequenceable) -> untyped } -> Symbol
119
+ : (Symbol name) { [self: ObjectForge::Crucible] -> untyped } -> Symbol
115
120
  alias [] attribute
116
121
 
117
122
  def sequence
118
- : (Symbol name, ?(ObjectForge::_Sequenceable | ObjectForge::Sequence) initial) { (ObjectForge::_Sequenceable) -> untyped } -> Symbol
123
+ : (Symbol name, ?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) { (ObjectForge::sequenceable) [self: ObjectForge::Crucible] -> untyped } -> Symbol
119
124
 
120
125
  def trait
121
126
  : (Symbol name) { (self) -> void } -> Symbol
@@ -125,7 +130,7 @@ class ObjectForge::ForgeDSL < ObjectForge::UnBasicObject
125
130
  private
126
131
 
127
132
  def method_missing
128
- : (Symbol name) { -> untyped } -> Symbol
133
+ : (Symbol name) { [self: ObjectForge::Crucible] -> untyped } -> Symbol
129
134
  # After freezing:
130
135
  | (Symbol name) { -> untyped } -> void
131
136
 
@@ -182,5 +187,5 @@ class ObjectForge::UnBasicObject < BasicObject
182
187
 
183
188
  def block_given?: -> bool
184
189
 
185
- def raise: (_Exception exception, ?String message) -> void
190
+ def raise: (_Exception exception, ?String message, ?Array[String] backtrace, ?cause: _Exception) -> void
186
191
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: object_forge
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandr Bulancov
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2025-07-30 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: concurrent-ruby
@@ -30,7 +29,7 @@ description: |
30
29
  It has no connection to any framework and, indeed, has nothing to do with a database.
31
30
  To use, just define some factories and call them wherever you need,
32
31
  be it in tests, console, or application code.
33
- email:
32
+ If needed, almost any part of the process can be easily replaced with a custom solution.
34
33
  executables: []
35
34
  extensions: []
36
35
  extra_rdoc_files: []
@@ -40,6 +39,7 @@ files:
40
39
  - lib/object_forge/forge.rb
41
40
  - lib/object_forge/forge_dsl.rb
42
41
  - lib/object_forge/forgeyard.rb
42
+ - lib/object_forge/molds/keywords_mold.rb
43
43
  - lib/object_forge/sequence.rb
44
44
  - lib/object_forge/un_basic_object.rb
45
45
  - lib/object_forge/version.rb
@@ -50,11 +50,10 @@ licenses:
50
50
  metadata:
51
51
  homepage_uri: https://github.com/trinistr/object_forge
52
52
  bug_tracker_uri: https://github.com/trinistr/object_forge/issues
53
- documentation_uri: https://rubydoc.info/gems/object_forge/0.1.0
54
- source_code_uri: https://github.com/trinistr/object_forge/tree/v0.1.0
55
- changelog_uri: https://github.com/trinistr/object_forge/blob/v0.1.0/CHANGELOG.md
53
+ documentation_uri: https://rubydoc.info/gems/object_forge/0.1.1
54
+ source_code_uri: https://github.com/trinistr/object_forge/tree/v0.1.1
55
+ changelog_uri: https://github.com/trinistr/object_forge/blob/v0.1.1/CHANGELOG.md
56
56
  rubygems_mfa_required: 'true'
57
- post_install_message:
58
57
  rdoc_options:
59
58
  - "--tag"
60
59
  - thread_safety:Thread safety
@@ -71,8 +70,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
71
70
  - !ruby/object:Gem::Version
72
71
  version: '0'
73
72
  requirements: []
74
- rubygems_version: 3.3.27
75
- signing_key:
73
+ rubygems_version: 3.7.1
76
74
  specification_version: 4
77
75
  summary: A simple factory for objects with minimal assumptions.
78
76
  test_files: []