brood 0.1.0 → 0.2.0

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: d4e77bbe38670ca8538b982351d8b074d5d0b628c27f451dca1c2ecc9f074c12
4
- data.tar.gz: 4cadd8c0f9469654e10d5f421f995e5775293839676d0da43c9dd24d955377a8
3
+ metadata.gz: 67a821f02646dcebab0406b3d433d07684aa885e15b0d4afaf949266b566e1b8
4
+ data.tar.gz: 90d006c03c5d65347e13054a049bc5fd72aeb504739253feb75cfb40b8c8eccb
5
5
  SHA512:
6
- metadata.gz: d5c211f84b89a85ec0b4ce3fd7636daee7fac38e84c0273aaa7b0c95a36c9df64c35ff9987a1a6b45df5e3b4a30d2dece4e6099b4dae1f71b25e8636d84aab6a
7
- data.tar.gz: 7e5da72bfcfbe387d21fec9847a13ce83d007612ef49013817696eed44aae7d3bfea0817cedb7ffe9405e9c34d47dc8b002baa87aa183a9f6f9f8117009d025b
6
+ metadata.gz: 1ad830243d5546ab2fc48fb399219d075b97b1f416d3f8b39bfb9dd2d4eb2468f402a8e30cacc8b30d1b730cd7ec93ccbfe5572656230dd3b92e49325dec0b91
7
+ data.tar.gz: e91dc6348451eb1d3f05707ccba10e18c155a76682b97e62306b49c9854c1c9c96a7cc624bf235f1d122ea93476fb532f97db21a99c893c34d9eb67f1c7a8586
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ ## [0.2.0] - 2024-07-18
2
+ ### Replace method :set with :create and :build
3
+
4
+ Features:
5
+
6
+ * Add method `Brood#create` (calls `Fabricate`)
7
+ * Add method `Brood#build` (calls `Fabricate.build`)
8
+
9
+ Breaking changes:
10
+
11
+ * Remove method `Brood#set`
12
+
13
+ Misc:
14
+
15
+ * Update README.md
16
+
1
17
  ## [0.1.0] - 2024-07-18
2
18
  ### Initial release
3
19
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- brood (0.1.0)
4
+ brood (0.2.0)
5
5
  fabrication (~> 2)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -50,20 +50,27 @@ end
50
50
  @brood = Brood.new
51
51
 
52
52
  # Fabricate objects:
53
- gizmos = @brood.set([:department, :gizmos], {name: "Gizmos"}) # => Department instance
54
- @brood.set([:user, :bar], {id: 12, name: "Bar"}) # => User instance
55
- @brood.set([:user, :baaz], {name: "Baaz"}) # => User instance
53
+ gizmos = @brood.create([:department, :gizmos], {name: "Gizmos"}) # => Department instance
54
+ @brood.create([:user, :bar], {id: 12, name: "Bar"}) # => User instance
55
+ @brood.create([:user, :baaz], {name: "Baaz"}) # => User instance
56
56
 
57
57
  # Pass a block to customize the object (forwarded to the Fabricator block argument):
58
- @brood.set([:user, :baar], {name: "Baar"}) do |user|
58
+ @brood.create([:user, :baar], {name: "Baar"}) do |user|
59
59
  user.department = gizmos
60
60
  end
61
61
 
62
+ # Skip persistence (calls Fabricate.build)
63
+ gadgets = @brood.build([:department, :gadgets], {name: "Gadgets"}) # => Department instance
64
+ foobar = @brood.build([:user, :foobar], {name: "Foobar"}) do |user|
65
+ user.department = gadgets
66
+ end # => User instance
67
+
62
68
  # Retrieve objects:
63
69
  @brood.get([:user, :bar]) # => User instance
64
70
  @brood.get([:user, :baaz]) # => User instance
71
+ @brood.get([:user, :foobar]) # => User instance
72
+ @brood.get([:bogus, :bar]) # raises Brood::UnknownObjectTypeError
65
73
  @brood.get([:user, :quux]) # raises Brood::ObjectNotFoundError
66
- @brood.get([:bogus, :bar]) # raises ArgumentError
67
74
 
68
75
  # Pass a block to customize and lock the object:
69
76
  @brood.get([:user, :bar]) do |user|
data/lib/brood/version.rb CHANGED
@@ -5,5 +5,5 @@
5
5
  ## SPDX-License-Identifier: Apache-2.0
6
6
 
7
7
  class Brood
8
- VERSION = "0.1.0"
8
+ VERSION = "0.2.0"
9
9
  end
data/lib/brood.rb CHANGED
@@ -16,15 +16,12 @@ class Brood
16
16
  # Error raised when attempting to re-define an object for the given key.
17
17
  class ObjectAlreadyDefinedError < Error; end
18
18
 
19
- # Error raised when an object is not found for the given key.
20
- class ObjectNotFoundError < Error; end
21
-
22
- # Error raised when an object does not match its specified type.
23
- class ObjectTypeError < Error; end
24
-
25
19
  # Error raised when attempting to retrieve an unknown object-type.
26
20
  class UnknownObjectTypeError < Error; end
27
21
 
22
+ # Error raised when an object is not found for the given key.
23
+ class ObjectNotFoundError < Error; end
24
+
28
25
  def initialize
29
26
  @store = {}
30
27
  @object_mutexes = {}
@@ -38,18 +35,34 @@ class Brood
38
35
  # @raise [ArgumentError] If the arguments are invalid.
39
36
  # @raise [ObjectAlreadyDefinedError] If an object is already defined for the key.
40
37
  # @return [Object] The fabricated object.
41
- def set(key, attributes, &)
38
+ def create(key, attributes, &)
42
39
  object_type, object_name = key
43
40
  validate_arguments(object_type, object_name)
44
41
 
45
42
  create_object(object_type, object_name, attributes, &)
46
43
  end
47
44
 
45
+ # Adds an object to the store, skipping persistence.
46
+ #
47
+ # @param key [Array<Symbol, Symbol>] The key representing the object type and name.
48
+ # @param attributes [Hash] Optional attributes for the object.
49
+ # @yield Optional block to customize the object.
50
+ # @raise [ArgumentError] If the arguments are invalid.
51
+ # @raise [ObjectAlreadyDefinedError] If an object is already defined for the key.
52
+ # @return [Object] The fabricated object.
53
+ def build(key, attributes, &)
54
+ object_type, object_name = key
55
+ validate_arguments(object_type, object_name)
56
+
57
+ build_object(object_type, object_name, attributes, &)
58
+ end
59
+
48
60
  # Retrieves an object from the store.
49
61
  #
50
62
  # @param key [Array<Symbol, Symbol>] The key representing the object type and name.
51
- # @yield Optional block to customize the object; the object is locked.
63
+ # @yield Optional block to customize the object; access to the object is protected by a thread lock.
52
64
  # @raise [ArgumentError] If the arguments are invalid.
65
+ # @raise [UnknownObjectTypeError] If the object-type keyword has no entries.
53
66
  # @raise [ObjectNotFoundError] If the object is not found.
54
67
  # @return [Object] The fabricated object.
55
68
  def get(key, &block)
@@ -89,6 +102,18 @@ class Brood
89
102
  )
90
103
  end
91
104
 
105
+ def build_object(object_type, object_name, attributes, &)
106
+ @store[object_type] ||= {}
107
+ @store[object_type][:objects] ||= {}
108
+ if @store[object_type][:objects].key?(object_name)
109
+ raise ObjectAlreadyDefinedError,
110
+ "A object is already defined: (#{object_type} #{object_name})"
111
+ end
112
+ @store[object_type][:objects][object_name] = Fabricate.build(
113
+ object_type, **attributes, &
114
+ )
115
+ end
116
+
92
117
  def retrieve_object(object_type, object_name, &block)
93
118
  unless @store.key?(object_type)
94
119
  raise UnknownObjectTypeError,
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brood
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Newton
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-07-18 00:00:00.000000000 Z
11
+ date: 2024-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fabrication