activeitem 0.0.4 → 0.0.5

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: b4a582341eb5177faf5ba9b5f9cc6883eea2040075d373d4e2ede609be7d6ec0
4
- data.tar.gz: 506579d0a2a6489a786255a912f008f2866f51171607552143fce35bc8a25dd0
3
+ metadata.gz: eb93b14273a49d3d4c7fa9c9ffb51164eaa504f031f66cafeec853cabda2742d
4
+ data.tar.gz: b94e92229ce16523f029d7695a70cfcb1db2c90b6e4d0641ccb865b5e84a5301
5
5
  SHA512:
6
- metadata.gz: bba9b51bb78625e884f5902f6428c319f98ade1898a6c738911f4c960c45b9fe3833ce8f1f49cd90a571653988ad7da1868064f579f515f31572d2cf769df1b2
7
- data.tar.gz: 5400dd3538af63d2f128d7a11d20045513e148a93c3513280281cdde5a7b4f5c5bdab6030902e7014a840066b8c1f3dd0588ea75a744ca9b2e0f7f5cb003ecac
6
+ metadata.gz: 4c5a15aa9fdfd5b8079f53d3a57225ed3622559256f6df129a44c1d822b6d0cdf5b380e130f28cd34ba328baa4113bda48dfcf4c0e9949a4f5d1bbab922060ad
7
+ data.tar.gz: 2d66cf596eb64088d2e0758e9d967947e26708188e7b1fe4d0dddded8290a2e0b03c4a691668414b7e29a2b4310f25cb592b77430c6855e9bc5af87e2b1fb86f
checksums.yaml.gz.sig ADDED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.0.5
4
+
5
+ ### Fixed
6
+
7
+ - Fix RuboCop offenses: merge nested conditional in `Base`, remove trailing newline in `version.rb`
8
+
9
+ ### Infrastructure
10
+
11
+ - Fix CI workflow to trigger on `master` branch (was incorrectly set to `main`)
12
+ - Add bundler-audit security scanning to CI pipeline
13
+ - Add gem signing with certificate chain for consumer verification
14
+
3
15
  ## 0.0.4
4
16
 
5
17
  ### Fixed
data/README.md CHANGED
@@ -8,6 +8,13 @@ ActiveRecord-like ORM for AWS DynamoDB.
8
8
  gem 'activeitem'
9
9
  ```
10
10
 
11
+ To install with signature verification:
12
+
13
+ ```bash
14
+ gem cert --add <(curl -Ls https://raw.githubusercontent.com/stowzilla/activeitem/master/certs/stowzilla.pem)
15
+ gem install activeitem -P MediumSecurity
16
+ ```
17
+
11
18
  ## Configuration
12
19
 
13
20
  ```ruby
@@ -0,0 +1,31 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ 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
31
+ -----END CERTIFICATE-----
@@ -105,9 +105,7 @@ module ActiveItem
105
105
 
106
106
  define_method("#{attr_name}=") do |value|
107
107
  old_value = instance_variable_get("@#{attr_name}")
108
- if old_value != value
109
- send("#{attr_name}_will_change!") unless changed_attributes.key?(attr_name)
110
- end
108
+ send("#{attr_name}_will_change!") if (old_value != value) && !changed_attributes.key?(attr_name)
111
109
  instance_variable_set("@#{attr_name}", value)
112
110
  end
113
111
  end
@@ -1346,6 +1346,10 @@ module ActiveItem
1346
1346
  # Each query is a lightweight indexed count — no data transfer, just a number.
1347
1347
  # Uses thread pool for parallel execution when multiple parent IDs exist.
1348
1348
  #
1349
+ # Thread safety: Aws::DynamoDB::Client is thread-safe — it uses internal
1350
+ # connection pooling (Net::HTTP persistent connections per thread). The Mutex
1351
+ # here protects only the shared `counts` hash, not the client itself.
1352
+ #
1349
1353
  # @param assoc_class [Class] The associated model class
1350
1354
  # @param index_name [String] GSI index name
1351
1355
  # @param dynamo_fk [String] The DynamoDB attribute name for the foreign key
@@ -5,6 +5,13 @@ require 'active_model'
5
5
  module ActiveItem
6
6
  # ActiveModel validator that checks attribute uniqueness by querying
7
7
  # DynamoDB, with optional scope and custom condition support.
8
+ #
9
+ # IMPORTANT LIMITATIONS:
10
+ # - TOCTOU race condition: DynamoDB is eventually consistent, so a check-then-write
11
+ # cannot guarantee uniqueness under concurrent writes. For strong uniqueness, use
12
+ # a DynamoDB conditional put (attribute_not_exists) at the persistence layer instead.
13
+ # - DoS vector: without an index, uniqueness checks fall back to table scans. Always
14
+ # ensure validated attributes have a GSI to avoid full-table scans on write paths.
8
15
  class UniquenessValidator < ActiveModel::EachValidator
9
16
  def validate_each(record, attribute, value)
10
17
  return if value.nil? || value.to_s.empty?
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ActiveItem
4
- VERSION = '0.0.4'
4
+ VERSION = '0.0.5'
5
5
  end
6
-
data.tar.gz.sig ADDED
Binary file
metadata CHANGED
@@ -1,15 +1,47 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeitem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andy Davis
8
8
  - Adam Dalton
9
9
  autorequire:
10
10
  bindir: bin
11
- cert_chain: []
12
- date: 2026-05-23 00:00:00.000000000 Z
11
+ cert_chain:
12
+ - |
13
+ -----BEGIN CERTIFICATE-----
14
+ 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
43
+ -----END CERTIFICATE-----
44
+ date: 2026-05-26 00:00:00.000000000 Z
13
45
  dependencies:
14
46
  - !ruby/object:Gem::Dependency
15
47
  name: activemodel
@@ -135,6 +167,7 @@ files:
135
167
  - CHANGELOG.md
136
168
  - LICENSE.txt
137
169
  - README.md
170
+ - certs/stowzilla.pem
138
171
  - lib/active_item/associations.rb
139
172
  - lib/active_item/base.rb
140
173
  - lib/active_item/composed_of.rb
metadata.gz.sig ADDED
Binary file