ledger_accountable 0.1.4.pre → 0.1.10.pre

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: f94845e66b1f81f8b7897908a9c88fe5c12d63d91882045e721ade66851dca5b
4
- data.tar.gz: 32851e373387e7da3ad970b810cd4b445f9a033e72bf77883698939e1c2caeea
3
+ metadata.gz: ac88f44a2ed372e0fc36652d28f53d0071b097b4e10fc2b525b2a1160270aa8a
4
+ data.tar.gz: cc8e49541b0f74349cf529cdf603fcf605d58f2a4e70cb0ad025d30392fbcd3e
5
5
  SHA512:
6
- metadata.gz: c652558bbafd396ed31cf47c2f354c16d986b9f6a087f09c8601e7d93e12772feb850f103b2e265abf51184bba80e5c6af19089f71b431ea438cea1054883da2
7
- data.tar.gz: 2b9395f031cddb37a6392608f77c038382b8f6d45d625edebec41fb7248302a7d5d2ef1a6b8919b5bc58ea3708fcdda6111337fa9f0596b734bacaa445f4abf0
6
+ metadata.gz: 0c23089df526659562248f287324f3fea80510fc8abdd90afdcb6f74bf1100028b5b24c0c44e242d7eb1c48deb5ff874705e29f55d401858897d93b4810210ef
7
+ data.tar.gz: e41cd6c46bf0f74776af0918d3d8e8ae7da4436dc6e3703c755098c57d635aff0282c5addc4881d6489e4b02d973bea24899cd4c6d62dc39d9b3da50f92dfe76
data/CHANGELOG.md CHANGED
@@ -0,0 +1,21 @@
1
+ ## 0.1.8.pre
2
+
3
+ - Switch gem publish workflow to RubyGems Trusted Publishing (OIDC) via `rubygems/release-gem@v1`.
4
+ - Remove API-key/OTP-based push logic from release workflow.
5
+
6
+ ## 0.1.7.pre
7
+
8
+ - Add `spec.license = 'MIT'` to gemspec to satisfy RubyGems license metadata expectations.
9
+
10
+ ## 0.1.6.pre
11
+
12
+ - Pin GitHub Actions workflows to `ubuntu-22.04` to restore Ruby `3.0.6` compatibility for CI and gem publishing.
13
+
14
+ ## 0.1.5.pre
15
+
16
+ - Add default `ledger_entries` read-performance indexes to new-install generator migration.
17
+ - Add `rails generate ledger_accountable --add-indexes` upgrade path for existing installations.
18
+ - Add additive index migration template with idempotent guards (`index_exists?`) and adapter-aware behavior:
19
+ - PostgreSQL: `algorithm: :concurrently` with `disable_ddl_transaction!`
20
+ - Other adapters: standard `add_index`
21
+ - Document existing-install upgrade flow and default index set in README.
data/README.md CHANGED
@@ -24,6 +24,12 @@ To create the requisite migrations and models, run:
24
24
  $ rails generate ledger_accountable
25
25
  ```
26
26
 
27
+ For existing installations that already have `ledger_entries`, generate only the additive index migration:
28
+
29
+ ```bash
30
+ $ rails generate ledger_accountable --add-indexes
31
+ ```
32
+
27
33
  ## Usage
28
34
 
29
35
  ### `LedgerAccountable::LedgerOwner`
@@ -114,4 +120,21 @@ Ledger entries are automatically created in the following scenarios:
114
120
 
115
121
  When a LedgerItem changes owners, both a `deletion` entry for the old owner and an `addition` entry for the new owner are created in the same transaction
116
122
 
123
+ ## Upgrading Existing Installations
124
+
125
+ Existing apps should run:
126
+
127
+ ```bash
128
+ $ rails generate ledger_accountable --add-indexes
129
+ ```
130
+
131
+ This generates an additive migration that adds the default read-performance indexes for `ledger_entries`:
132
+
133
+ - `[:owner_type, :owner_id, :transaction_type]`
134
+ - `[:owner_type, :owner_id, :entry_type]`
135
+ - `[:owner_type, :owner_id, :created_at, :id]`
136
+ - `[:ledger_item_type, :ledger_item_id, :created_at, :id]`
137
+
138
+ For PostgreSQL, indexes are added with `algorithm: :concurrently`. Other adapters use standard `add_index`.
139
+
117
140
  <!-- TODO: documentation for alternate object destruction libraries: callbacks to trigger ledger removal for objects that aren't destroyed -->
@@ -5,20 +5,36 @@ class LedgerAccountableGenerator < Rails::Generators::Base
5
5
  include Rails::Generators::Migration
6
6
 
7
7
  source_root File.expand_path('templates', __dir__)
8
+ class_option :add_indexes, type: :boolean, default: false,
9
+ desc: 'Generate only an additive migration to add missing ledger_entries indexes'
8
10
 
9
11
  def create_model_file
12
+ return if options[:add_indexes]
13
+
10
14
  template 'ledger_entry.rb', 'app/models/ledger_entry.rb'
11
15
  end
12
16
 
13
17
  def create_migration_file
18
+ return if options[:add_indexes]
19
+
14
20
  migration_template 'migration.rb', 'db/migrate/create_ledger_entries.rb'
15
21
  end
16
22
 
23
+ def create_add_indexes_migration_file
24
+ return unless options[:add_indexes]
25
+
26
+ migration_template 'add_indexes_migration.rb', 'db/migrate/add_indexes_to_ledger_entries.rb'
27
+ end
28
+
17
29
  def create_initializer_file
30
+ return if options[:add_indexes]
31
+
18
32
  template 'initializer.rb', 'config/initializers/ledger_accountable.rb'
19
33
  end
20
34
 
21
35
  def copy_localization_file
36
+ return if options[:add_indexes]
37
+
22
38
  copy_file '../../../locale/en.yml', 'config/locales/ledger.en.yml'
23
39
  end
24
40
 
@@ -27,4 +43,4 @@ class LedgerAccountableGenerator < Rails::Generators::Base
27
43
  def self.next_migration_number(path)
28
44
  ActiveRecord::Generators::Base.next_migration_number(path)
29
45
  end
30
- end
46
+ end
@@ -0,0 +1,41 @@
1
+ class AddIndexesToLedgerEntries < ActiveRecord::Migration[6.1]
2
+ disable_ddl_transaction!
3
+
4
+ def up
5
+ add_index_unless_exists :ledger_entries, [:owner_type, :owner_id, :transaction_type],
6
+ name: 'index_ledger_entries_on_owner_and_transaction_type'
7
+ add_index_unless_exists :ledger_entries, [:owner_type, :owner_id, :entry_type],
8
+ name: 'index_ledger_entries_on_owner_and_entry_type'
9
+ add_index_unless_exists :ledger_entries, [:owner_type, :owner_id, :created_at, :id],
10
+ name: 'index_ledger_entries_on_owner_and_created_at_and_id'
11
+ add_index_unless_exists :ledger_entries, [:ledger_item_type, :ledger_item_id, :created_at, :id],
12
+ name: 'index_ledger_entries_on_item_and_created_at_and_id'
13
+ end
14
+
15
+ def down
16
+ remove_index_if_exists :ledger_entries, name: 'index_ledger_entries_on_owner_and_transaction_type'
17
+ remove_index_if_exists :ledger_entries, name: 'index_ledger_entries_on_owner_and_entry_type'
18
+ remove_index_if_exists :ledger_entries, name: 'index_ledger_entries_on_owner_and_created_at_and_id'
19
+ remove_index_if_exists :ledger_entries, name: 'index_ledger_entries_on_item_and_created_at_and_id'
20
+ end
21
+
22
+ private
23
+
24
+ def add_index_unless_exists(table_name, columns, name:)
25
+ return if index_exists?(table_name, columns, name: name)
26
+
27
+ options = { name: name }
28
+ options[:algorithm] = :concurrently if postgresql?
29
+ add_index(table_name, columns, **options)
30
+ end
31
+
32
+ def remove_index_if_exists(table_name, name:)
33
+ return unless index_exists?(table_name, name: name)
34
+
35
+ remove_index(table_name, name: name)
36
+ end
37
+
38
+ def postgresql?
39
+ connection.adapter_name.downcase.include?('postgres')
40
+ end
41
+ end
@@ -10,5 +10,14 @@ class CreateLedgerEntries < ActiveRecord::Migration[6.1]
10
10
 
11
11
  t.timestamps
12
12
  end
13
+
14
+ add_index :ledger_entries, [:owner_type, :owner_id, :transaction_type],
15
+ name: 'index_ledger_entries_on_owner_and_transaction_type'
16
+ add_index :ledger_entries, [:owner_type, :owner_id, :entry_type],
17
+ name: 'index_ledger_entries_on_owner_and_entry_type'
18
+ add_index :ledger_entries, [:owner_type, :owner_id, :created_at, :id],
19
+ name: 'index_ledger_entries_on_owner_and_created_at_and_id'
20
+ add_index :ledger_entries, [:ledger_item_type, :ledger_item_id, :created_at, :id],
21
+ name: 'index_ledger_entries_on_item_and_created_at_and_id'
13
22
  end
14
23
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LedgerAccountable
4
- VERSION = '0.1.4.pre'
4
+ VERSION = '0.1.10.pre'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ledger_accountable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4.pre
4
+ version: 0.1.10.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brendan Maclean
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-12-11 00:00:00.000000000 Z
12
+ date: 2026-05-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -105,6 +105,7 @@ files:
105
105
  - LICENSE
106
106
  - README.md
107
107
  - lib/generators/ledger_accountable/ledger_accountable_generator.rb
108
+ - lib/generators/ledger_accountable/templates/add_indexes_migration.rb
108
109
  - lib/generators/ledger_accountable/templates/initializer.rb
109
110
  - lib/generators/ledger_accountable/templates/ledger_entry.rb
110
111
  - lib/generators/ledger_accountable/templates/migration.rb
@@ -116,7 +117,8 @@ files:
116
117
  - lib/ledger_accountable/version.rb
117
118
  - lib/locale/en.yml
118
119
  homepage: https://github.com/bmaclean/ledger-accountable
119
- licenses: []
120
+ licenses:
121
+ - MIT
120
122
  metadata:
121
123
  homepage_uri: https://github.com/bmaclean/ledger-accountable
122
124
  source_code_uri: https://github.com/bmaclean/ledger-accountable
@@ -130,14 +132,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
132
  requirements:
131
133
  - - ">="
132
134
  - !ruby/object:Gem::Version
133
- version: 3.0.6
135
+ version: '3.3'
134
136
  required_rubygems_version: !ruby/object:Gem::Requirement
135
137
  requirements:
136
- - - ">"
138
+ - - ">="
137
139
  - !ruby/object:Gem::Version
138
- version: 1.3.1
140
+ version: '0'
139
141
  requirements: []
140
- rubygems_version: 3.2.33
142
+ rubygems_version: 3.5.22
141
143
  signing_key:
142
144
  specification_version: 4
143
145
  summary: Ledger accounting for Rails models