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 +4 -4
- data/CHANGELOG.md +21 -0
- data/README.md +23 -0
- data/lib/generators/ledger_accountable/ledger_accountable_generator.rb +17 -1
- data/lib/generators/ledger_accountable/templates/add_indexes_migration.rb +41 -0
- data/lib/generators/ledger_accountable/templates/migration.rb +9 -0
- data/lib/ledger_accountable/version.rb +1 -1
- metadata +9 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ac88f44a2ed372e0fc36652d28f53d0071b097b4e10fc2b525b2a1160270aa8a
|
|
4
|
+
data.tar.gz: cc8e49541b0f74349cf529cdf603fcf605d58f2a4e70cb0ad025d30392fbcd3e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
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
|
+
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:
|
|
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.
|
|
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:
|
|
140
|
+
version: '0'
|
|
139
141
|
requirements: []
|
|
140
|
-
rubygems_version: 3.
|
|
142
|
+
rubygems_version: 3.5.22
|
|
141
143
|
signing_key:
|
|
142
144
|
specification_version: 4
|
|
143
145
|
summary: Ledger accounting for Rails models
|