active_record_compose 0.6.0 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 701c396babd7d30d3e13779c5237bd1fbaf2fb719a75439154d17a167dc645dc
4
- data.tar.gz: 72cf835561b903fc913e9feadff380f8ca986f621320b1fdd1ebd7dc341539cb
3
+ metadata.gz: 88e574f327847973e3b931ee6663de0d395fa6ff26de5830f92ac21d1445fe20
4
+ data.tar.gz: bb50aa19e200f15c3b16d6b7fe65dc4e94afc7e44eec3c94ef37ab18fc610b88
5
5
  SHA512:
6
- metadata.gz: fddabb884fb62e215cc5a67abe823b563cf5be201f2e05b8057871e2c188025e04d46b5953b84f23e7cdc064840291882cb3f77a93efb221bed3b0c99a6dfe71
7
- data.tar.gz: 7b550abe98e5391de53a9b017b8ae214270844f8d6536dadb012587c1d553e4e01cab99f480ec59ae01eaf3d0b742c612ea676546cc7ce82ea945d0e99e0168d
6
+ metadata.gz: 77a492aea1e8c5aec20bea84dbbd242c2f94d9d5674a705cacea4ad4b8b3991b54630009fb78ed425a6dee5f10d28dd5f473b7b581a92711701de07472d7a88f
7
+ data.tar.gz: a8386a77e58cb7db6c2478137af7bf24e606448987009257b151c695b746be9818de2d963b65672cc60e23b9a8dc7d0b29790087ea3a8271152c0115d2212bdf
data/.rubocop.yml CHANGED
@@ -9,6 +9,9 @@ Style/ArgumentsForwarding:
9
9
  Style/CommentedKeyword:
10
10
  Enabled: false
11
11
 
12
+ Style/ClassAndModuleChildren:
13
+ Enabled: false
14
+
12
15
  Style/Documentation:
13
16
  Enabled: false
14
17
 
@@ -51,6 +54,9 @@ Metrics/AbcSize:
51
54
  Metrics/BlockLength:
52
55
  Enabled: false
53
56
 
57
+ Metrics/ClassLength:
58
+ Enabled: false
59
+
54
60
  Metrics/MethodLength:
55
61
  Enabled: false
56
62
 
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.6.2] - 2025-01-04
4
+
5
+ - fix: `delegate_attribute` defined in a subclass had an unintended side effect on the superclass.
6
+ - support ruby 3.4.x
7
+ - refactor: remove some `steep:ignore` by private rbs.
8
+ - refactor: place definitions that you don't want to be used much in private rbs.
9
+ - make `DelegateAttribute` dependent on `ActiveModel::Attributes` since it will not change in practice.
10
+
11
+ ## [0.6.1] - 2024-12-23
12
+
13
+ - refactor: reorganize the overall structure of the test. Change from rspec to minitest
14
+ - ci: fix CI for rails new version.
15
+
3
16
  ## [0.6.0] - 2024-11-11
4
17
 
5
18
  - refactor: limit the scope of methods needed only for internal library purposes.
data/README.md CHANGED
@@ -37,7 +37,7 @@ If the callbacks are written in a class that inherits from `ActiveRecordCompose:
37
37
  class AccountRegistration < ActiveRecordCompose::Model
38
38
  def initialize(account = Account.new, attributes = {})
39
39
  @account = account
40
- super(attributes)
40
+ super(attributes) # When overrides `#initialize`, be sure to call `super`.
41
41
 
42
42
  # By including AR instance in models, AR instance itself is saved when this model is saved.
43
43
  models.push(account)
@@ -38,7 +38,8 @@ module ActiveRecordCompose
38
38
  extend ActiveSupport::Concern
39
39
 
40
40
  included do
41
- class_attribute :delegated_attributes, instance_writer: false # steep:ignore
41
+ # @type self: Class
42
+ class_attribute :delegated_attributes, instance_writer: false
42
43
  end
43
44
 
44
45
  module ClassMethods
@@ -52,9 +53,8 @@ module ActiveRecordCompose
52
53
  [reader, writer]
53
54
  end
54
55
 
55
- delegate(*delegates, to:, allow_nil:, private:) # steep:ignore
56
- delegated_attributes = (self.delegated_attributes ||= []) # steep:ignore
57
- attributes.each { delegated_attributes.push(_1.to_s) }
56
+ delegate(*delegates, to:, allow_nil:, private:)
57
+ self.delegated_attributes = delegated_attributes.to_a + attributes.map { _1.to_s }
58
58
  end
59
59
  end
60
60
 
@@ -63,12 +63,7 @@ module ActiveRecordCompose
63
63
  #
64
64
  # @return [Hash] hash with the attribute name as key and the attribute value as value.
65
65
  def attributes
66
- attrs = defined?(super) ? super : {} # steep:ignore
67
- delegates = delegated_attributes # steep:ignore
68
-
69
- # @type var attrs: Hash[String, untyped]
70
- # @type var delegates: Array[String]
71
- attrs.merge(delegates.to_h { [_1, public_send(_1)] })
66
+ super.merge(delegated_attributes.to_h { [_1, public_send(_1)] })
72
67
  end
73
68
  end
74
69
  end
@@ -93,7 +93,6 @@ module ActiveRecordCompose
93
93
  attr_reader :destroy_context_type, :if_option
94
94
 
95
95
  # @private
96
- # steep:ignore:start
97
96
  module PackagePrivate
98
97
  refine InnerModel do
99
98
  # @private
@@ -104,6 +103,5 @@ module ActiveRecordCompose
104
103
  def __raw_model = model
105
104
  end
106
105
  end
107
- # steep:ignore:end
108
106
  end
109
107
  end
@@ -3,7 +3,7 @@
3
3
  require 'active_record_compose/inner_model'
4
4
 
5
5
  module ActiveRecordCompose
6
- using InnerModel::PackagePrivate # steep:ignore
6
+ using InnerModel::PackagePrivate
7
7
 
8
8
  class InnerModelCollection
9
9
  include Enumerable
@@ -21,7 +21,7 @@ module ActiveRecordCompose
21
21
  def each
22
22
  return enum_for(:each) unless block_given?
23
23
 
24
- models.each { yield _1.__raw_model } # steep:ignore
24
+ models.each { yield _1.__raw_model }
25
25
  self
26
26
  end
27
27
 
@@ -79,7 +79,7 @@ module ActiveRecordCompose
79
79
  attr_reader :owner, :models
80
80
 
81
81
  def wrap(model, destroy: false, if: nil)
82
- if model.is_a?(ActiveRecordCompose::InnerModel) # steep:ignore
82
+ if model.is_a?(ActiveRecordCompose::InnerModel)
83
83
  # @type var model: ActiveRecordCompose::InnerModel
84
84
  model
85
85
  else
@@ -97,7 +97,6 @@ module ActiveRecordCompose
97
97
  end
98
98
 
99
99
  # @private
100
- # steep:ignore:start
101
100
  module PackagePrivate
102
101
  refine InnerModelCollection do
103
102
  # Returns array of wrapped model instance.
@@ -107,6 +106,5 @@ module ActiveRecordCompose
107
106
  def __wrapped_models = models.reject { _1.ignore? }.select { _1.__raw_model }
108
107
  end
109
108
  end
110
- # steep:ignore:end
111
109
  end
112
110
  end
@@ -5,7 +5,7 @@ require 'active_record_compose/inner_model_collection'
5
5
  require 'active_record_compose/transaction_support'
6
6
 
7
7
  module ActiveRecordCompose
8
- using InnerModelCollection::PackagePrivate # steep:ignore
8
+ using InnerModelCollection::PackagePrivate
9
9
 
10
10
  class Model
11
11
  include ActiveModel::Model
@@ -153,12 +153,12 @@ module ActiveRecordCompose
153
153
  def models = @__models ||= ActiveRecordCompose::InnerModelCollection.new(self)
154
154
 
155
155
  def validate_models
156
- wms = models.__wrapped_models # steep:ignore
156
+ wms = models.__wrapped_models
157
157
  wms.select { _1.invalid? }.each { errors.merge!(_1) }
158
158
  end
159
159
 
160
160
  def save_models(bang:)
161
- wms = models.__wrapped_models # steep:ignore
161
+ wms = models.__wrapped_models
162
162
  wms.all? { bang ? _1.save! : _1.save }
163
163
  end
164
164
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordCompose
4
- VERSION = '0.6.0'
4
+ VERSION = '0.6.2'
5
5
  end
@@ -0,0 +1,82 @@
1
+ module ActiveRecordCompose
2
+ module DelegateAttribute : ActiveModel::Attributes
3
+ extend ActiveSupport::Concern
4
+
5
+ def attributes: -> Hash[String, untyped]
6
+ def delegated_attributes: () -> Array[String]
7
+
8
+ module ClassMethods : Module
9
+ def delegate_attribute: (*untyped methods, to: untyped, ?allow_nil: untyped?, ?private: untyped?) -> untyped
10
+ def delegated_attributes: () -> Array[String]
11
+ def delegated_attributes=: (Array[String]) -> untyped
12
+ end
13
+ end
14
+
15
+ class InnerModelCollection
16
+ def initialize: (Model) -> void
17
+
18
+ private
19
+ attr_reader owner: Model
20
+ attr_reader models: Array[InnerModel]
21
+ def wrap: (_ARLike | InnerModel, ?destroy: (bool | Symbol | destroy_context_type), ?if: (nil | Symbol | condition_type)) -> InnerModel
22
+
23
+ module PackagePrivate
24
+ def __wrapped_models: () -> Array[InnerModel]
25
+
26
+ private
27
+ def models: () -> Array[InnerModel]
28
+ end
29
+
30
+ include PackagePrivate
31
+ end
32
+
33
+ class InnerModel
34
+ def initialize: (_ARLike, ?destroy: (bool | destroy_context_type), ?if: (nil | condition_type)) -> void
35
+ def destroy_context?: -> bool
36
+ def ignore?: -> bool
37
+ def save: -> bool
38
+ def save!: -> untyped
39
+ def invalid?: -> bool
40
+ def valid?: -> bool
41
+ def is_a?: (untyped) -> bool
42
+ def ==: (untyped) -> bool
43
+
44
+ private
45
+ attr_reader model: _ARLike
46
+ attr_reader destroy_context_type: (bool | destroy_context_type)
47
+ attr_reader if_option: (nil | condition_type)
48
+
49
+ module PackagePrivate
50
+ def __raw_model: () -> _ARLike
51
+
52
+ private
53
+ def model: () -> _ARLike
54
+ end
55
+
56
+ include PackagePrivate
57
+ end
58
+
59
+ class Model
60
+ include DelegateAttribute
61
+ extend DelegateAttribute::ClassMethods
62
+ include TransactionSupport
63
+ extend TransactionSupport::ClassMethods
64
+
65
+ @__models: InnerModelCollection
66
+ end
67
+
68
+ module TransactionSupport
69
+ include ActiveRecord::Transactions
70
+
71
+ def id: -> untyped
72
+
73
+ module ClassMethods
74
+ def connection: -> ActiveRecord::ConnectionAdapters::AbstractAdapter
75
+ def lease_connection: -> ActiveRecord::ConnectionAdapters::AbstractAdapter
76
+ def with_connection: [T] () { () -> T } -> T
77
+
78
+ private
79
+ def ar_class: -> singleton(ActiveRecord::Base)
80
+ end
81
+ end
82
+ end
@@ -12,54 +12,23 @@ module ActiveRecordCompose
12
12
  def invalid?: -> bool
13
13
  def valid?: -> bool
14
14
  def errors: -> untyped
15
+ def is_a?: (untyped) -> bool
15
16
  def ==: (untyped) -> bool
16
17
  end
17
18
 
18
19
  type attribute_name = (String | Symbol)
19
- type destroy_context_type = (bool | Symbol | (^() -> boolish) | (^(_ARLike) -> boolish))
20
+ type destroy_context_type = ((^() -> boolish) | (^(_ARLike) -> boolish))
20
21
  type condition_type = ((^() -> boolish) | (^(_ARLike) -> boolish))
21
22
 
22
- module DelegateAttribute
23
- extend ActiveSupport::Concern
24
-
25
- def attributes: -> Hash[String, untyped]
26
-
27
- module ClassMethods
28
- def delegate_attribute: (*untyped methods, to: untyped?, ?allow_nil: untyped?, ?private: untyped?) -> untyped
29
- end
30
- end
31
-
32
23
  class InnerModelCollection
33
24
  include ::Enumerable[_ARLike]
34
25
 
35
- def initialize: (Model) -> void
36
26
  def each: () { (_ARLike) -> void } -> InnerModelCollection | () -> Enumerator[_ARLike, self]
37
27
  def <<: (_ARLike) -> self
38
- def push: (_ARLike, ?destroy: destroy_context_type, ?if: (nil | Symbol | condition_type)) -> self
28
+ def push: (_ARLike, ?destroy: (bool | Symbol | destroy_context_type), ?if: (nil | Symbol | condition_type)) -> self
39
29
  def empty?: -> bool
40
30
  def clear: -> self
41
- def delete: (_ARLike | InnerModel) -> InnerModelCollection?
42
-
43
- private
44
- attr_reader owner: Model
45
- attr_reader models: Array[InnerModel]
46
- def wrap: (_ARLike | InnerModel, ?destroy: destroy_context_type, ?if: (nil | Symbol | condition_type)) -> InnerModel
47
- end
48
-
49
- class InnerModel
50
- def initialize: (_ARLike, ?destroy: destroy_context_type, ?if: (nil | condition_type)) -> void
51
- def destroy_context?: -> bool
52
- def ignore?: -> bool
53
- def save: -> bool
54
- def save!: -> untyped
55
- def invalid?: -> bool
56
- def valid?: -> bool
57
- def ==: (untyped) -> bool
58
-
59
- private
60
- attr_reader model: _ARLike
61
- attr_reader destroy_context_type: destroy_context_type
62
- attr_reader if_option: (nil | condition_type)
31
+ def delete: (_ARLike) -> InnerModelCollection?
63
32
  end
64
33
 
65
34
  class Model
@@ -68,12 +37,11 @@ module ActiveRecordCompose
68
37
  include ActiveModel::Validations::Callbacks
69
38
  extend ActiveModel::Validations::ClassMethods
70
39
  include ActiveModel::Attributes
71
- include DelegateAttribute
72
- extend DelegateAttribute::ClassMethods
73
- include TransactionSupport
74
- extend TransactionSupport::ClassMethods
75
40
 
76
- @__models: InnerModelCollection
41
+ def self.delegate_attribute: (*untyped methods, to: untyped, ?allow_nil: untyped?, ?private: untyped?) -> untyped
42
+ def self.connection: -> ActiveRecord::ConnectionAdapters::AbstractAdapter
43
+ def self.lease_connection: -> ActiveRecord::ConnectionAdapters::AbstractAdapter
44
+ def self.with_connection: [T] () { () -> T } -> T
77
45
 
78
46
  def initialize: (?Hash[attribute_name, untyped]) -> void
79
47
  def save: -> bool
@@ -82,6 +50,7 @@ module ActiveRecordCompose
82
50
  def create!: (?Hash[attribute_name, untyped]) -> untyped
83
51
  def update: (?Hash[attribute_name, untyped]) -> bool
84
52
  def update!: (?Hash[attribute_name, untyped]) -> untyped
53
+ def id: -> untyped
85
54
 
86
55
  private
87
56
  def models: -> InnerModelCollection
@@ -91,19 +60,4 @@ module ActiveRecordCompose
91
60
  def raise_on_save_error: -> bot
92
61
  def raise_on_save_error_message: -> String
93
62
  end
94
-
95
- module TransactionSupport
96
- include ActiveRecord::Transactions
97
-
98
- def id: -> untyped
99
-
100
- module ClassMethods
101
- def connection: -> ActiveRecord::ConnectionAdapters::AbstractAdapter
102
- def lease_connection: -> ActiveRecord::ConnectionAdapters::AbstractAdapter
103
- def with_connection: [T] () { () -> T } -> T
104
-
105
- private
106
- def ar_class: -> singleton(ActiveRecord::Base)
107
- end
108
- end
109
63
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_compose
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - hamajyotan
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2024-11-11 00:00:00.000000000 Z
10
+ date: 2025-01-04 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activerecord
@@ -31,7 +30,6 @@ executables: []
31
30
  extensions: []
32
31
  extra_rdoc_files: []
33
32
  files:
34
- - ".rspec"
35
33
  - ".rubocop.yml"
36
34
  - CHANGELOG.md
37
35
  - CODE_OF_CONDUCT.md
@@ -44,6 +42,7 @@ files:
44
42
  - lib/active_record_compose/model.rb
45
43
  - lib/active_record_compose/transaction_support.rb
46
44
  - lib/active_record_compose/version.rb
45
+ - sig/_internal/package_private.rbs
47
46
  - sig/active_record_compose.rbs
48
47
  homepage: https://github.com/hamajyotan/active_record_compose
49
48
  licenses:
@@ -52,9 +51,8 @@ metadata:
52
51
  homepage_uri: https://github.com/hamajyotan/active_record_compose
53
52
  source_code_uri: https://github.com/hamajyotan/active_record_compose
54
53
  changelog_uri: https://github.com/hamajyotan/active_record_compose/blob/main/CHANGELOG.md
55
- documentation_uri: https://www.rubydoc.info/gems/active_record_compose/0.6.0
54
+ documentation_uri: https://www.rubydoc.info/gems/active_record_compose/0.6.2
56
55
  rubygems_mfa_required: 'true'
57
- post_install_message:
58
56
  rdoc_options: []
59
57
  require_paths:
60
58
  - lib
@@ -69,8 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
67
  - !ruby/object:Gem::Version
70
68
  version: '0'
71
69
  requirements: []
72
- rubygems_version: 3.5.21
73
- signing_key:
70
+ rubygems_version: 3.6.2
74
71
  specification_version: 4
75
72
  summary: activemodel form object pattern
76
73
  test_files: []
data/.rspec DELETED
@@ -1,3 +0,0 @@
1
- --format documentation
2
- --color
3
- --require spec_helper