active_record_compose 0.3.0 → 0.3.2

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: 9253aaba5ac1cc24965caf5b0cd683c7e910b693f91290626318208f3d35f079
4
- data.tar.gz: 57c187fe08e94cdac9a5fd1dc690dea98af686e898be1acaab0ad6a529ca54f6
3
+ metadata.gz: 9d71146cd07fcae3e2ba02f5a3130d3eab0cba06dc405584793fa30d4add22ad
4
+ data.tar.gz: 88e70c5d2c6f8327c03c658304d6b036636f9b9ef4f342a45dd2afc7cc1cda4f
5
5
  SHA512:
6
- metadata.gz: f66509b473e1ddbd2c17ff7f566b684d512e234874178f0cd123bea7eed09877e9198bb4d779f2de0dd0b68f63c675a4a9f2bf529f93d14f531b777a8519f437
7
- data.tar.gz: 0fca4a8c7712faea8eaae1326591059a53684feece7f79ad68eb66a231ed37d635b77d082c7e1590da44c785c7b4c90f8d9cbbbc1665368e826d1c30fa0b5c71
6
+ metadata.gz: 76b5dd94c5246ca424564721a9f185488c1d51dcb12177a08c1d103110e05fd510b87f1cb2811256ab1d0d30425f327e8e1179e4c7e62ea3377fd155a708be9e
7
+ data.tar.gz: 7e03b2ea7f423047f5eda1ea89b80b586d7ab3c4ad7d616562a6aa9a555e846336f67f30e5e4b45a28e68913091ea5f3e00aee360f22c0689263380b734d0f3f
data/.rubocop.yml CHANGED
@@ -6,9 +6,15 @@ AllCops:
6
6
  Style/ArgumentsForwarding:
7
7
  Enabled: false
8
8
 
9
+ Style/CommentedKeyword:
10
+ Enabled: false
11
+
9
12
  Style/Documentation:
10
13
  Enabled: false
11
14
 
15
+ Style/NumericPredicate:
16
+ Enabled: false
17
+
12
18
  Style/StringLiterals:
13
19
  Enabled: true
14
20
 
@@ -27,6 +33,9 @@ Style/TrailingCommaInArrayLiteral:
27
33
  Style/TrailingCommaInHashLiteral:
28
34
  EnforcedStyleForMultiline: comma
29
35
 
36
+ Layout/LeadingCommentSpace:
37
+ Enabled: false
38
+
30
39
  Layout/LineLength:
31
40
  Max: 120
32
41
 
data/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.2] - 2024-04-10
4
+
5
+ - support `ActiveRecord::Base#with_connection`
6
+ - rbs maintained.
7
+ - relax context proc arity.
8
+
9
+ ## [0.3.1] - 2024-03-17
10
+
11
+ - purge nodoc definitions from type signature
12
+ - support `ActiveRecord::Base#lease_connection`
13
+
3
14
  ## [0.3.0] - 2024-02-24
4
15
 
5
16
  - strictify type checking
@@ -38,23 +38,26 @@ module ActiveRecordCompose
38
38
  extend ActiveSupport::Concern
39
39
 
40
40
  included do
41
- class_attribute :delegated_attributes, instance_writer: false
41
+ __skip__ = class_attribute :delegated_attributes, instance_writer: false
42
42
  end
43
43
 
44
- class_methods do
44
+ module ClassMethods
45
45
  # Defines the reader and writer for the specified attribute.
46
46
  #
47
47
  def delegate_attribute(*attributes, to:, **options)
48
48
  delegates = attributes.flat_map do |attribute|
49
- reader = attribute
49
+ reader = attribute.to_s
50
50
  writer = "#{attribute}="
51
51
 
52
52
  [reader, writer]
53
53
  end
54
54
 
55
- delegate(*delegates, to:, **options)
56
- delegated_attributes = (self.delegated_attributes ||= [])
57
- attributes.each { delegated_attributes.push(_1.to_s) }
55
+ __skip__ =
56
+ begin
57
+ delegate(*delegates, to:, **options)
58
+ delegated_attributes = (self.delegated_attributes ||= [])
59
+ attributes.each { delegated_attributes.push(_1.to_s) }
60
+ end
58
61
  end
59
62
  end
60
63
 
@@ -64,7 +67,11 @@ module ActiveRecordCompose
64
67
  # @return [Hash] hash with the attribute name as key and the attribute value as value.
65
68
  def attributes
66
69
  attrs = __skip__ = defined?(super) ? super : {}
67
- attrs.merge(delegated_attributes.to_h { [_1, public_send(_1)] })
70
+ delegates = __skip__ = delegated_attributes
71
+
72
+ # @type var attrs: Hash[String, untyped]
73
+ # @type var delegates: Array[String]
74
+ attrs.merge(delegates.to_h { [_1, public_send(_1)] })
68
75
  end
69
76
  end
70
77
  end
@@ -15,9 +15,20 @@ module ActiveRecordCompose
15
15
  delegate :errors, to: :model
16
16
 
17
17
  # @return [Symbol] :save or :destroy
18
- def context
18
+ def context #: ActiveRecordCompose::context
19
19
  c = @context
20
- ret = c.is_a?(Proc) ? c.call(model) : c
20
+ ret =
21
+ if c.is_a?(Proc)
22
+ if c.arity == 0
23
+ # @type var c: ^() -> context
24
+ c.call
25
+ else
26
+ # @type var c: ^(_ARLike) -> context
27
+ c.call(model)
28
+ end
29
+ else
30
+ c
31
+ end
21
32
  ret.presence_in(%i[save destroy]) || :save
22
33
  end
23
34
 
@@ -65,7 +76,7 @@ module ActiveRecordCompose
65
76
  # @return [Boolean]
66
77
  def ==(other)
67
78
  return false unless self.class == other.class
68
- return false unless __raw_model == other.__raw_model
79
+ return false unless (__skip__ = (__raw_model == other.__raw_model))
69
80
  return false unless context == other.context
70
81
 
71
82
  true
@@ -14,7 +14,7 @@ module ActiveRecordCompose
14
14
  def each
15
15
  return enum_for(:each) unless block_given?
16
16
 
17
- models.each { yield _1.__raw_model }
17
+ __skip__ = models.each { yield _1.__raw_model }
18
18
  self
19
19
  end
20
20
 
@@ -73,7 +73,7 @@ module ActiveRecordCompose
73
73
  def __each_by_wrapped
74
74
  return enum_for(:__each_by_wrapped) unless block_given?
75
75
 
76
- models.each { yield _1 if _1.__raw_model }
76
+ __skip__ = models.each { yield _1 if _1.__raw_model }
77
77
  self
78
78
  end
79
79
 
@@ -82,9 +82,11 @@ module ActiveRecordCompose
82
82
  def models = @models ||= []
83
83
 
84
84
  def wrap(model, context:)
85
- if model.is_a?(ActiveRecordCompose::InnerModel)
85
+ if (__skip__ = model.is_a?(ActiveRecordCompose::InnerModel))
86
+ # @type var model: ActiveRecordCompose::InnerModel
86
87
  model
87
88
  else
89
+ # @type var model: ActiveRecordCompose::_ARLike
88
90
  ActiveRecordCompose::InnerModel.new(model, context:)
89
91
  end
90
92
  end
@@ -2,15 +2,16 @@
2
2
 
3
3
  require 'active_record_compose/delegate_attribute'
4
4
  require 'active_record_compose/inner_model_collection'
5
+ require 'active_record_compose/transaction_support'
5
6
 
6
7
  module ActiveRecordCompose
7
8
  class Model
8
9
  include ActiveModel::Model
9
10
  include ActiveModel::Validations::Callbacks
10
11
  include ActiveModel::Attributes
11
- include ActiveRecord::Transactions
12
12
 
13
13
  include ActiveRecordCompose::DelegateAttribute
14
+ include ActiveRecordCompose::TransactionSupport
14
15
 
15
16
  define_model_callbacks :save
16
17
  define_model_callbacks :create
@@ -18,12 +19,6 @@ module ActiveRecordCompose
18
19
 
19
20
  validate :validate_models
20
21
 
21
- # for ActiveRecord::Transactions
22
- class << self
23
- def connection = ActiveRecord::Base.connection
24
- __skip__ = def composite_primary_key? = false
25
- end
26
-
27
22
  def initialize(attributes = {})
28
23
  __skip__ = super(attributes)
29
24
  end
@@ -151,20 +146,11 @@ module ActiveRecordCompose
151
146
  end || raise_on_save_error
152
147
  end
153
148
 
154
- # for ActiveRecord::Transactions
155
- __skip__ = def id = nil
156
-
157
- # for ActiveRecord::Transactions
158
- __skip__ = def trigger_transactional_callbacks? = true
159
-
160
- # for ActiveRecord::Transactions
161
- __skip__ = def restore_transaction_record_state(_force_restore_state) = nil
162
-
163
149
  private
164
150
 
165
151
  def models = @__models ||= ActiveRecordCompose::InnerModelCollection.new
166
152
 
167
- def wrapped_models = models.__each_by_wrapped
153
+ def wrapped_models = (__skip__ = models.__each_by_wrapped)
168
154
 
169
155
  def validate_models = wrapped_models.select { _1.invalid? }.each { errors.merge!(_1) }
170
156
 
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecordCompose
4
+ module TransactionSupport
5
+ extend ActiveSupport::Concern
6
+ include ActiveRecord::Transactions
7
+
8
+ module ClassMethods
9
+ def lease_connection
10
+ if ar_class.respond_to?(:lease_connection)
11
+ __skip__ = ar_class.lease_connection
12
+ else
13
+ ar_class.connection
14
+ end
15
+ end
16
+
17
+ def connection = ar_class.connection
18
+
19
+ def with_connection(&) = __skip__ = ar_class.with_connection(&)
20
+
21
+ def composite_primary_key? = false
22
+
23
+ private
24
+
25
+ def ar_class = ActiveRecord::Base
26
+ end
27
+
28
+ def id = nil
29
+
30
+ def trigger_transactional_callbacks? = true
31
+ def restore_transaction_record_state(_force_restore_state = false) = nil # rubocop:disable Style/OptionalBooleanParameter
32
+ end
33
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveRecordCompose
4
- VERSION = '0.3.0'
4
+ VERSION = '0.3.2'
5
5
  end
@@ -5,7 +5,6 @@ module ActiveRecordCompose
5
5
  VERSION: String
6
6
 
7
7
  interface _ARLike
8
- def is_a?: (untyped) -> bool
9
8
  def save: -> bool
10
9
  def save!: -> untyped
11
10
  def destroy: -> bool
@@ -13,24 +12,20 @@ module ActiveRecordCompose
13
12
  def invalid?: -> bool
14
13
  def valid?: -> bool
15
14
  def errors: -> untyped
16
- def ==: (untyped) -> bool
17
15
  end
18
16
 
19
17
  type attribute_name = (String | Symbol)
20
- type context_types = (:save | :destroy)
21
- type context_proc = ^(_ARLike) -> context_types
22
- type context = context_types | context_proc
18
+ type context = (:save | :destroy)
19
+ type context_proc = ((^() -> context) | (^(_ARLike) -> context))
23
20
 
24
21
  module DelegateAttribute
25
22
  extend ActiveSupport::Concern
26
23
 
27
- def delegated_attribute: -> Array[untyped]
28
24
  def attributes: -> Hash[String, untyped]
29
- def delegated_attributes: -> Array[untyped]
30
- def delegated_attributes=: (Array[untyped]) -> void
31
25
 
32
- def self.class_attribute: (untyped, ?untyped) -> untyped
33
- def delegate: (*untyped) -> untyped
26
+ module ClassMethods
27
+ def delegate_attribute: (*untyped methods, to: untyped?, **untyped) -> untyped
28
+ end
34
29
  end
35
30
 
36
31
  class InnerModelCollection
@@ -39,28 +34,26 @@ module ActiveRecordCompose
39
34
 
40
35
  def each: () { (_ARLike) -> void } -> InnerModelCollection | () -> Enumerator[_ARLike, self]
41
36
  def <<: (_ARLike) -> self
42
- def push: (_ARLike, ?context: context) -> self
37
+ def push: (_ARLike, ?context: (context | context_proc)) -> self
43
38
  def empty?: -> bool
44
39
  def clear: -> self
45
- def delete: (_ARLike | InnerModel, ?context: context_types) -> InnerModelCollection?
46
- def __each_by_wrapped: () { (InnerModel) -> void } -> InnerModelCollection | () -> Enumerator[InnerModel, self]
40
+ def delete: (_ARLike | InnerModel, ?context: (context | context_proc)) -> InnerModelCollection?
47
41
 
48
42
  private
49
43
  def models: -> Array[InnerModel]
50
- def wrap: (_ARLike | InnerModel, context: context) -> InnerModel
44
+ def wrap: (_ARLike | InnerModel, context: (context | context_proc)) -> InnerModel
51
45
  end
52
46
 
53
47
  class InnerModel
54
- @context: context
48
+ @context: (context | context_proc)
55
49
 
56
- def initialize: (_ARLike, ?context: context) -> void
50
+ def initialize: (_ARLike, ?context: (context | context_proc)) -> void
57
51
  def context: -> context
58
52
  def save: -> bool
59
53
  def save!: -> untyped
60
54
  def invalid?: -> bool
61
55
  def valid?: -> bool
62
56
  def ==: (untyped) -> bool
63
- def __raw_model: -> _ARLike
64
57
 
65
58
  private
66
59
  attr_reader model: _ARLike
@@ -70,9 +63,12 @@ module ActiveRecordCompose
70
63
  extend ActiveModel::Callbacks
71
64
  include ActiveModel::Model
72
65
  include ActiveModel::Validations::Callbacks
66
+ extend ActiveModel::Validations::ClassMethods
73
67
  include ActiveModel::Attributes
74
- include ActiveRecord::Transactions
75
68
  include DelegateAttribute
69
+ extend DelegateAttribute::ClassMethods
70
+ include TransactionSupport
71
+ extend TransactionSupport::ClassMethods
76
72
 
77
73
  @__models: InnerModelCollection
78
74
 
@@ -92,8 +88,20 @@ module ActiveRecordCompose
92
88
  def raise_validation_error: -> bot
93
89
  def raise_on_save_error: -> bot
94
90
  def raise_on_save_error_message: -> String
91
+ end
92
+
93
+ module TransactionSupport
94
+ include ActiveRecord::Transactions
95
+
96
+ def id: -> untyped
97
+
98
+ module ClassMethods
99
+ def connection: -> ActiveRecord::ConnectionAdapters::AbstractAdapter
100
+ def lease_connection: -> ActiveRecord::ConnectionAdapters::AbstractAdapter
101
+ def with_connection: [T] () { () -> T } -> T
95
102
 
96
- def self.validate: (*untyped) -> untyped
97
- def run_callbacks: (untyped kind) ?{ () -> untyped } -> untyped
103
+ private
104
+ def ar_class: -> singleton(ActiveRecord::Base)
105
+ end
98
106
  end
99
107
  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.3.0
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - hamajyotan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-24 00:00:00.000000000 Z
11
+ date: 2024-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -42,6 +42,7 @@ files:
42
42
  - lib/active_record_compose/inner_model.rb
43
43
  - lib/active_record_compose/inner_model_collection.rb
44
44
  - lib/active_record_compose/model.rb
45
+ - lib/active_record_compose/transaction_support.rb
45
46
  - lib/active_record_compose/version.rb
46
47
  - sig/active_record_compose.rbs
47
48
  homepage: https://github.com/hamajyotan/active_record_compose
@@ -51,7 +52,7 @@ metadata:
51
52
  homepage_uri: https://github.com/hamajyotan/active_record_compose
52
53
  source_code_uri: https://github.com/hamajyotan/active_record_compose
53
54
  changelog_uri: https://github.com/hamajyotan/active_record_compose/blob/main/CHANGELOG.md
54
- documentation_uri: https://www.rubydoc.info/gems/active_record_compose/0.3.0
55
+ documentation_uri: https://www.rubydoc.info/gems/active_record_compose/0.3.2
55
56
  rubygems_mfa_required: 'true'
56
57
  post_install_message:
57
58
  rdoc_options: []