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 +4 -4
- data/lib/object_forge/forge.rb +16 -20
- data/lib/object_forge/forgeyard.rb +4 -2
- data/lib/object_forge/molds/keywords_mold.rb +19 -0
- data/lib/object_forge/sequence.rb +1 -1
- data/lib/object_forge/version.rb +1 -1
- data/lib/object_forge.rb +3 -1
- data/sig/object_forge.rbs +30 -25
- metadata +8 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 05dce89141257f37f8b8af6a7f0cdfb1d7ee785a37ad119d0c13ff28c58d9245
|
|
4
|
+
data.tar.gz: e171f2f3d504d0edadfdb5f2ba2f87d9d9edd1a0f175a0be366b12dc528182a0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c8a330629ce325a8bf78930a3025d5c1d75305e80c970cb5217e9d4ae6f93659d3fc9d3fdd89884920b5843c8c1bfb787bdfc6be8ce220db29124a2d73a749da
|
|
7
|
+
data.tar.gz: a0515b9f4111c0e3bcd1b9bbb4f5cb3011bb12bba62750a2ca0f49b702f55a459be7877fb540cf16c6a40503a5c2294e962352408345e67bbb7179bc79f2539b
|
data/lib/object_forge/forge.rb
CHANGED
|
@@ -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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
95
|
-
|
|
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
|
data/lib/object_forge/version.rb
CHANGED
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
|
-
|
|
3
|
-
end
|
|
4
|
-
class DSLError < Error
|
|
5
|
-
end
|
|
2
|
+
type sequenceable = ObjectForge::_RespondTo & ObjectForge::_Sequenceable
|
|
6
3
|
|
|
7
|
-
interface
|
|
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::
|
|
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::
|
|
40
|
+
: (?(ObjectForge::sequenceable | ObjectForge::Sequence) initial) -> ObjectForge::Sequence
|
|
37
41
|
|
|
38
|
-
attr_reader initial: ObjectForge::
|
|
42
|
+
attr_reader initial: ObjectForge::sequenceable
|
|
39
43
|
|
|
40
|
-
def initialize: (ObjectForge::
|
|
44
|
+
def initialize: (ObjectForge::sequenceable initial) -> void
|
|
41
45
|
|
|
42
|
-
def next: -> ObjectForge::
|
|
46
|
+
def next: -> ObjectForge::sequenceable
|
|
43
47
|
|
|
44
|
-
def reset: -> ObjectForge::
|
|
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
|
|
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
|
|
94
|
-
: (Array[Symbol] traits, Hash[Symbol, untyped] overrides) ->
|
|
95
|
-
|
|
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::
|
|
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.
|
|
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:
|
|
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
|
-
|
|
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.
|
|
54
|
-
source_code_uri: https://github.com/trinistr/object_forge/tree/v0.1.
|
|
55
|
-
changelog_uri: https://github.com/trinistr/object_forge/blob/v0.1.
|
|
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.
|
|
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: []
|