active_record_compose 0.1.5 → 0.1.7

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: 1638c67c9c0cebca26544e01db7b210a0bde69d581471d3fbe771ada25c124b9
4
- data.tar.gz: d7c43f6b81793f349a2f4e33132616b8dca2971a607d49ecedaa102fed1b1f5f
3
+ metadata.gz: bff1c2fd72a225a89ada1c0cab86b6d32f31c0052d8857e665eb2796f4a40883
4
+ data.tar.gz: 307e8ecf50282b9a19e224870796944de47d37f8802d0ffe63cca465eb663cc4
5
5
  SHA512:
6
- metadata.gz: 9b9aca1764d28fdeb52b0d32fdc6fb0ca13e6c1891efd47335f18660935b36ae64be28cb1a6db08bf1b8b0d3d65aa9daa94bccdea03982112fd59386e57e7e50
7
- data.tar.gz: 6888e57191546c7d698bde1f2741f280b930d8b8f1f648c02ec0cd025d54a8f89d88bb4dd1cbe0feaf0e37e5f1fd8d4885032259481536edcd73aad1d067aed8
6
+ metadata.gz: 12f503a644d60932a095a587e8152d37af25b8eccfb0cc5cd32dc5941eb896104880328ff6e3ed2b7fd53ee78fad9f7962e23b5ffc1070bbaa00518e482dccf4
7
+ data.tar.gz: 91d912f794a250e44e8ad5fea2694f00a52eb98df3f217364e8eb637a6971692998526e86c2d908dc28ce7b0ff99ada394ca287b39342714377af63a1869c4be
data/.rubocop.yml CHANGED
@@ -3,9 +3,6 @@ AllCops:
3
3
  NewCops: enable
4
4
  SuggestExtensions: false
5
5
 
6
- Gemspec/DevelopmentDependencies:
7
- Enabled: false
8
-
9
6
  Style/Documentation:
10
7
  Enabled: false
11
8
 
@@ -33,5 +30,8 @@ Layout/LineLength:
33
30
  Metrics/BlockLength:
34
31
  Enabled: false
35
32
 
33
+ Naming/BlockForwarding:
34
+ Enabled: false
35
+
36
36
  Naming/MemoizedInstanceVariableName:
37
37
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.1.7] - 2024-01-15
4
+
5
+ - remove `add_development_dependency` from gemspec
6
+ - add spec for DelegateAttribute module
7
+ - add and refactor doc.
8
+
9
+ ## [0.1.6] - 2024-01-14
10
+
11
+ - add doc for `#save` and `#save!`.
12
+ - implement `#save` for symmetry with `#save!`
13
+ - add `InnerModel#initialize` doc.
14
+
3
15
  ## [0.1.5] - 2024-01-11
4
16
 
5
17
  - when invalid, raises ActiveRecord::RecordInvalid on #save!
@@ -42,6 +42,8 @@ module ActiveRecordCompose
42
42
  end
43
43
 
44
44
  class_methods do
45
+ # Defines the reader and writer for the specified attribute.
46
+ #
45
47
  def delegate_attribute(*attributes, to:, **options)
46
48
  delegates = attributes.flat_map do |attribute|
47
49
  reader = attribute
@@ -56,8 +58,12 @@ module ActiveRecordCompose
56
58
  end
57
59
  end
58
60
 
61
+ # Returns a hash with the attribute name as key and the attribute value as value.
62
+ # Attributes declared with `delegate_attribute` are also merged.
63
+ #
64
+ # @return [Hash] hash with the attribute name as key and the attribute value as value.
59
65
  def attributes
60
- super.merge(delegated_attributes.to_h { [_1, public_send(_1)] })
66
+ (defined?(super) ? super : {}).merge(delegated_attributes.to_h { [_1, public_send(_1)] })
61
67
  end
62
68
  end
63
69
  end
@@ -6,6 +6,7 @@ module ActiveRecordCompose
6
6
  class InnerModel
7
7
  # @param model [Object] the model instance.
8
8
  # @param context [Symbol] :save or :destroy
9
+ # @param context [Proc] proc returning either :save or :destroy
9
10
  def initialize(model, context: :save)
10
11
  @model = model
11
12
  @context = context
@@ -19,7 +20,22 @@ module ActiveRecordCompose
19
20
  ret.presence_in(%i[save destroy]) || :save
20
21
  end
21
22
 
22
- # @return [InnerModel] self
23
+ # Execute save or destroy. Returns true on success, false on failure.
24
+ # Whether save or destroy is executed depends on the value of context.
25
+ #
26
+ # @return [Boolean] returns true on success, false on failure.
27
+ def save
28
+ case context
29
+ when :destroy
30
+ model.destroy
31
+ else
32
+ model.save
33
+ end
34
+ end
35
+
36
+ # Execute save or destroy. Unlike #save, an exception is raises on failure.
37
+ # Whether save or destroy is executed depends on the value of context.
38
+ #
23
39
  def save!
24
40
  case context
25
41
  when :destroy
@@ -44,7 +60,8 @@ module ActiveRecordCompose
44
60
 
45
61
  # Returns true if equivalent.
46
62
  #
47
- # @return [Object] other
63
+ # @param [Object] other
64
+ # @return [Boolean]
48
65
  def ==(other)
49
66
  return false unless self.class == other.class
50
67
  return false unless __raw_model == other.__raw_model
@@ -10,7 +10,7 @@ module ActiveRecordCompose
10
10
  #
11
11
  # @yieldparam [Object] the model instance
12
12
  # @return [Enumerator] when not block given.
13
- # @return [InnerModelCollection] self
13
+ # @return [self] when block given, returns itself.
14
14
  def each
15
15
  return enum_for(:each) unless block_given?
16
16
 
@@ -21,7 +21,7 @@ module ActiveRecordCompose
21
21
  # Appends model to collection.
22
22
  #
23
23
  # @param model [Object] the model instance
24
- # @return [InnerModelCollection] self
24
+ # @return [self] returns itself.
25
25
  def <<(model)
26
26
  models << wrap(model, context: :save)
27
27
  self
@@ -31,7 +31,7 @@ module ActiveRecordCompose
31
31
  #
32
32
  # @param model [Object] the model instance
33
33
  # @param context [Symbol] :save or :destroy
34
- # @return [InnerModelCollection] self
34
+ # @return [self] returns itself.
35
35
  def push(model, context: :save)
36
36
  models << wrap(model, context:)
37
37
  self
@@ -44,7 +44,7 @@ module ActiveRecordCompose
44
44
 
45
45
  # Set to empty.
46
46
  #
47
- # @return [InnerModelCollection] self
47
+ # @return [self] returns itself.
48
48
  def clear
49
49
  models.clear
50
50
  self
@@ -55,7 +55,7 @@ module ActiveRecordCompose
55
55
  #
56
56
  # @param model [Object] the model instance
57
57
  # @param context [Symbol] :save or :destroy
58
- # @return [InnerModelCollection] Successful deletion
58
+ # @return [self] Successful deletion
59
59
  # @return [nil] If deletion fails
60
60
  def delete(model, context: :save)
61
61
  wrapped = wrap(model, context:)
@@ -69,7 +69,7 @@ module ActiveRecordCompose
69
69
  #
70
70
  # @yieldparam [InnerModel] rawpped model instance.
71
71
  # @return [Enumerator] when not block given.
72
- # @return [InnerModelCollection] self
72
+ # @return [self] when block given, returns itself.
73
73
  def __each_by_wrapped
74
74
  return enum_for(:__each_by_wrapped) unless block_given?
75
75
 
@@ -22,16 +22,27 @@ module ActiveRecordCompose
22
22
  super(attributes)
23
23
  end
24
24
 
25
+ # Save the models that exist in models.
26
+ # Returns false if any of the targets fail, true if all succeed.
27
+ #
28
+ # The save is performed within a single transaction.
29
+ #
30
+ # @return [Boolean] returns true on success, false on failure.
25
31
  def save
26
32
  return false if invalid?
27
33
 
28
- save_in_transaction { run_callbacks(:save) { save_models } }
34
+ save_in_transaction { save_models }
29
35
  end
30
36
 
37
+ # Save the models that exist in models.
38
+ # Unlike #save, an exception is raises on failure.
39
+ #
40
+ # Saving, like `#save`, is performed within a single transaction.
41
+ #
31
42
  def save!
32
43
  valid? || raise_validation_error
33
44
 
34
- save_in_transaction { run_callbacks(:save) { save_models } } || raise_on_save_error
45
+ save_in_transaction { save_models } || raise_on_save_error
35
46
  end
36
47
 
37
48
  # Behavior is same to `#save`, but `before_create` and `after_create` hooks fires.
@@ -63,7 +74,7 @@ module ActiveRecordCompose
63
74
  assign_attributes(attributes)
64
75
  return false if invalid?
65
76
 
66
- save_in_transaction { run_callbacks(:save) { run_callbacks(:create) { save_models } } }
77
+ save_in_transaction { run_callbacks(:create) { save_models } }
67
78
  end
68
79
 
69
80
  # Behavior is same to `#create`, but raises an exception prematurely on failure.
@@ -72,7 +83,7 @@ module ActiveRecordCompose
72
83
  assign_attributes(attributes)
73
84
  valid? || raise_validation_error
74
85
 
75
- save_in_transaction { run_callbacks(:save) { run_callbacks(:create) { save_models } } } || raise_on_save_error
86
+ save_in_transaction { run_callbacks(:create) { save_models } } || raise_on_save_error
76
87
  end
77
88
 
78
89
  # Behavior is same to `#save`, but `before_update` and `after_update` hooks fires.
@@ -104,7 +115,7 @@ module ActiveRecordCompose
104
115
  assign_attributes(attributes)
105
116
  return false if invalid?
106
117
 
107
- save_in_transaction { run_callbacks(:save) { run_callbacks(:update) { save_models } } }
118
+ save_in_transaction { run_callbacks(:update) { save_models } }
108
119
  end
109
120
 
110
121
  # Behavior is same to `#update`, but raises an exception prematurely on failure.
@@ -113,7 +124,7 @@ module ActiveRecordCompose
113
124
  assign_attributes(attributes)
114
125
  valid? || raise_validation_error
115
126
 
116
- save_in_transaction { run_callbacks(:save) { run_callbacks(:update) { save_models } } } || raise_on_save_error
127
+ save_in_transaction { run_callbacks(:update) { save_models } } || raise_on_save_error
117
128
  end
118
129
 
119
130
  private
@@ -124,10 +135,10 @@ module ActiveRecordCompose
124
135
 
125
136
  def validate_models = wrapped_models.select { _1.invalid? }.each { errors.merge!(_1) }
126
137
 
127
- def save_in_transaction
138
+ def save_in_transaction(&block)
128
139
  run_callbacks(:commit) do
129
140
  result = ::ActiveRecord::Base.transaction do
130
- raise ActiveRecord::Rollback unless yield
141
+ raise ActiveRecord::Rollback unless run_callbacks(:save, &block)
131
142
 
132
143
  true
133
144
  end
@@ -142,6 +153,8 @@ module ActiveRecordCompose
142
153
 
143
154
  def raise_validation_error = raise ActiveRecord::RecordInvalid, self
144
155
 
145
- def raise_on_save_error = raise ActiveRecord::RecordNotSaved.new('Failed to save the model.', self)
156
+ def raise_on_save_error = raise ActiveRecord::RecordNotSaved.new(raise_on_save_error_message, self)
157
+
158
+ def raise_on_save_error_message = 'Failed to save the model.'
146
159
  end
147
160
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordCompose
4
- VERSION = '0.1.5'
4
+ VERSION = '0.1.7'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_compose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - hamajyotan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-01-11 00:00:00.000000000 Z
11
+ date: 2024-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '6.1'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
27
  description: activemodel form object pattern
42
28
  email:
43
29
  - hamajyotan@gmail.com
@@ -65,7 +51,7 @@ metadata:
65
51
  homepage_uri: https://github.com/hamajyotan/active_record_compose
66
52
  source_code_uri: https://github.com/hamajyotan/active_record_compose
67
53
  changelog_uri: https://github.com/hamajyotan/active_record_compose/blob/main/CHANGELOG.md
68
- documentation_uri: https://www.rubydoc.info/gems/active_record_compose/0.1.5
54
+ documentation_uri: https://www.rubydoc.info/gems/active_record_compose/0.1.7
69
55
  rubygems_mfa_required: 'true'
70
56
  post_install_message:
71
57
  rdoc_options: []