- Add block-less versions of
with_responsibleandwith_metata. (@atomaka)
- Don't drop functions in the upgrade migration. (@palkan)
-
Support Rails 7.2 (@atomaka)
-
Add
--detachedoption to storelog_datain a separatelogidze_datatable to avoid table bloat.
-
Fix
rails destroy logidze:model SomeModelnot deleting thefxtrigger file file. (@tylerhunt) -
Support sorting of trigger names alphabetically (defaults to false)
Logdize.sort_triggers_by_name = true- Add retrieving list of versions support. (@tagirahmad)
post.logidze_versions # => Enumerator
post.logidze_versions.find do
_1.title == "old title"
end-
Add
--after-triggeroption to generate after triggers for partitioned tables in older PostgreSQL versions. (@SparLaimor, @prog-supdex, @palkan) -
Breaking. Ruby 2.7, Rails 6.0, PostgreSQL 10.0+ are required.
- [Fixes #217] Fix switch_to with
append: truewhen there are changes on JSONB columns. (@miharekar)
- [Fixes #209] Fix tracking JSONB column changes. (@baygeldin)
-
[Fixes #207] Add support for the use of
table_name_prefixortable_name_suffix. (@cavi21) -
[Fixes #205] Allow
rails destroy logidze:model SomeModelto delete the migration file. (@danielmklein)
- Add user-defined exception handling (@skryukov)
By default, Logidze raises an exception which causes the entire transaction to fail.
To change this behavior, it's now possible to override logidze_capture_exception(error_data jsonb) function.
-
[Fixes #69] Fallback on NUMERIC_VALUE_OUT_OF_RANGE exception (@skryukov)
-
[Fixes #192] Skip
log_datacolumn duringapply_column_diff(@skryukov)
- Add pending upgrade checks [Experimental]. (@skryukov)
Now Logidze can check for a pending upgrade. Use Logidze.pending_upgrade = :warn to be notified by warning, or Logidze.pending_upgrade = :error if you want Logidze to raise an error.
-
[Fixes #171] Stringify jsonb column values within snapshots. (@skryukov)
-
[Fixes #175] Set dynamic ActiveRecord version for migrations. (@skryukov)
- Add
--nameoption to model generator to specify the migration name. (@palkan)
When you update Logidze installation for a model multiple times, you might hit the DuplicateMigrationNameError (see #167).
- Add
.with_full_snapshotto add full snapshots to the log instead of diffs. (@palkan)
Useful in combination with .without_logging: first, you perform multiple updates without logging, then
you do something like with_full_snapshot { record.touch } to create a log entry with the current state.
-
Add
#create_logidze_snapshot!and.create_logidze_snapshotmethods. (@palkan) -
Add integration with
fxgem. (@palkan)
Now it's possible to use Logidze with schema.rb. Add fx gem to the project, and new migrations will be
using Fx create_function / create_trigger functions.
- Refactored columns filtering. (@palkan)
Renamed --whitelist/--blacklist to --only/--except correspondingly.
The only-logic has been changed: previously we collected the list of columns to ignore at the migration generation time, now we filter the columns within the trigger function (thus, schema changes do not affect the columns being tracked).
- Dropped support for Rails 4.2, Ruby 2.4 and PostgreSQL 9.5. (@palkan)
- PR #143 Add
:transactionaloption to#with_metaand#with_responsible(@oleg-kiviljov)
Now it's possible to set meta and responsible without wrapping the block into a DB transaction. For backward compatibility :transactional option by default is set to true.
Usage:
Logidze.with_meta({ip: request.ip}, transactional: false) do
post.save!
endor
Logidze.with_responsible(user.id, transactional: false) do
post.save!
end- Breaking Return
nilwhenlog_datais not loaded instead of raising an exception. (@palkan)
We cannot distinguish between not loaded log_data and not-yet-created (i.e. for new records).
The latter could be used in frameworks/gems (example).
- Breaking Only allow specifying
ignore_log_dataat boot time without runtime modifications. (@palkan)
Playing with ActiveRecord default scopes wasn't a good idea. We fallback to a more explicit way of telling AR
when to load or ignore the log_data column.
This change removes Logidze.with_log_data method.
-
Ruby >= 2.4 is required
-
PR #111 Global configuration for
:ignore_log_dataoption (@dmitrytsepelev)
Now it's possible to avoid loading log_data from the DB by default with
Logidze.ignore_log_data_by_default = trueIn cases when ignore_log_data: false is explicitly passed to the ignore_log_data the default setting is being overriden. Also, it's possible to change it inside the block:
Logidze.with_log_data do
Post.find(params[:id]).log_data
end- PR #110 Add
reset_log_dataAPI to nullify log_data column ([@Arkweid][])
Usage:
Reset the history for a record (or records):
# for single record
record.reset_log_data
# for relation
User.where(active: true).reset_log_data- PR #98 Add
:ignore_log_dataoption to#has_logidze(@dmitrytsepelev)
Usage:
class User < ActiveRecord::Base
has_logidze ignore_log_data: true
end
User.all #=> SELECT id, name FROM users
User.with_log_data #=> SELECT id, name, log_data FROM users
user = User.find(params[:id])
user.log_data #=> ActiveModel::MissingAttributeError
user.reload_log_data #=> Logidze::HistoryUsage:
# 5000ms
rails generate logidze:model story --debounce_time=5000You see the following in generated migration
CREATE TRIGGER logidze_on_stories
BEFORE UPDATE OR INSERT ON stories FOR EACH ROW
WHEN (coalesce(#{current_setting('logidze.disabled')}, '') <> 'on')
EXECUTE PROCEDURE logidze_logger(null, 'updated_at', null, 5000);How to upgrade.
Please run rails generate logidze:install --update to regenerate stored functions.
This feature checks if several logs came in within a debounce time period then only keep the latest one by merging the latest in previous others.
The concept is similar to https://underscorejs.org/#debounce.
without debounce_time
{
"h": [
{
"c": {
"content": "Content 1"
},
"v": 1,
"ts": 0
},
{
"c": {
"content": "content 2",
"active": true
},
"v": 2,
"ts": 100
},
{
"c": {
"content": "content 3",
},
"v": 3,
"ts": 101
}
],
"v": 3
}with debounce_time of 10ms
{
"h": [
{
"c": {
"content": "Content 1"
},
"v": 1,
"ts": 0
},
{
"c": {
"content": "content 3",
"active": true
},
"v": 2,
"ts": 101
}
],
"v": 3
}-
[Fixes #75] Fix association versioning with an optional belongs to (@amalagaura)
-
[PR #79] Allow adding meta information to versions using
with_meta(addressed Issue [#60]). (@DmitryTsepelev)
Usage:
Logidze.with_meta(ip: request.ip) { post.save }
puts post.meta # => { 'ip' => '95.66.157.226' }How to upgrade.
Please run rails generate logidze:install --update to regenerate stored functions.
This feature replaces the implementation of with_responsible, now responsible_id is stored inside of the meta hash with the key _r.
There is fallback to the old data structure ({ 'r' => 42 } opposed to { 'm' => { '_r' => 42 } } in the current implementation), so responsible_id should work as usual for the existing data.
If you've accessed the value manually (e.g. post.log_data.current_version.data['r']), you'll have to add the fallback too.
- Make compatible with Rails 5.2.1 (@palkan)
This is a quick fix for a more general problem (see #59).
-
[Fixes #57] Support associations versioning for
at(version:). (@palkan) -
Add
rubocop-md
- [Fixes #53] Fix storing empty log entries with blacklisting. (@charlie-wasp)
-
[Fixes #33] Support attributes types. (@palkan)
Added deserialization of complex types (such as
jsonb, arrays, whatever). -
Use positional arguments in
at/diff_frommethods and allow passing version. (@palkan)Now you can write
post.diff_from(time: ts),post.diff_from(version: x), Post.at(time: 1.day.ago)`, etc.NOTE: the previous behaviour is still supported (but gonna be deprecated), i.e. you still can use
post.diff_from(ts)if you don't mind the deprecation warning.
- Add
--updateflag to model migration. (@palkan)
- Use versioned migrations in Rails 5+. (@palkan)
- (Fix) Drop all created functions upon rolling back (commit). (@vassilevsky)
-
Add an option to preserve future versions. (@akxcv)
-
Add
--timestamp_columnoption to model migration generator. (@akxcv) -
Default version timestamp to timestamp column. (@akxcv)
-
Associations versioning. (@charlie-wasp)
- Add
--pathoption to model migration generator. (@palkan)
- Add
--blacklistand--whitelistoptions to model migration generator. (@charlie-wasp)
-
Add
--updateoption to install migration generator. (@palkan) -
Add
--only-triggeroption to model migration generator. (@palkan) -
Add Responsibility feature. (@palkan)
- Support Ruby >= 2.1. (@palkan)
-
Add
--backfilloption to model migration. (@palkan) -
Handle legacy data (that doesn't have log data). (@palkan)
- Support both Rails 4 and 5. (@palkan)
- Rails 5 support. (@palkan)