hoardable 0.12.2 → 0.12.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: eec6cda69bb2bbb1aeec6a0c460881c33abbe1de123ef9178d2c16378374b2bd
4
- data.tar.gz: f3f57007e08f958017483dfffd0275b5b70c0ef1522984ea78da4c595a9e5506
3
+ metadata.gz: 931223031ac56883e27e5f11da07eae3b59793ca8a2c77ce4e20f67cdb730174
4
+ data.tar.gz: 452472091834577883a5d56ea8b1af4375120648eaff066119edc2459c2cf035
5
5
  SHA512:
6
- metadata.gz: 04a13fec8198d4c4fda05b5364a7925755e7f2708004e15a564f243b64836577f4393cb502e7dd7d88ea123df29909ccb36a1d603cae8b2e711958250dc45763
7
- data.tar.gz: 34a59cb91ed643784e4aa6ab88abac2d3e7a59a59945bcdce6e849aa441bc1490a6870c2661f65c31d246e4cb87bb39c4502e6cb8ce05cb3c42a6ad0e56f1140
6
+ metadata.gz: 414a407c30d2aa0f504cd89773a83dd0b775bbbed51c8f7dbaa4225141aa34d301aac6167b6ce3553af02f03e8e2d1a053b58b4f9946814d5fb1b17282f86817
7
+ data.tar.gz: 995256175f51743332171ec32e232bdf01abb7288df8987d75b4e164499cf99610dc8605a9956fed3eb0edbb736b46ae24906fdf00cf5c14fa9ec99d752647d2
@@ -13,6 +13,7 @@ class InstallHoardable < ActiveRecord::Migration[<%= ActiveRecord::Migration.cur
13
13
  END IF;
14
14
  END
15
15
  $$;
16
+
16
17
  CREATE OR REPLACE FUNCTION hoardable_source_set_id() RETURNS trigger
17
18
  LANGUAGE plpgsql AS
18
19
  $$
@@ -31,6 +32,16 @@ class InstallHoardable < ActiveRecord::Migration[<%= ActiveRecord::Migration.cur
31
32
  NEW.hoardable_id = _id;
32
33
  RETURN NEW;
33
34
  END;$$;
35
+
36
+ CREATE OR REPLACE FUNCTION hoardable_prevent_update_id() RETURNS trigger
37
+ LANGUAGE plpgsql AS
38
+ $$BEGIN
39
+ IF NEW.hoardable_id <> OLD.hoardable_id THEN
40
+ RAISE EXCEPTION 'hoardable id cannot be updated';
41
+ END IF;
42
+ RETURN NEW;
43
+ END;$$;
44
+
34
45
  CREATE OR REPLACE FUNCTION hoardable_version_prevent_update() RETURNS trigger
35
46
  LANGUAGE plpgsql AS
36
47
  $$BEGIN
@@ -46,6 +57,7 @@ class InstallHoardable < ActiveRecord::Migration[<%= ActiveRecord::Migration.cur
46
57
  DROP TYPE IF EXISTS hoardable_operation;
47
58
  DROP FUNCTION IF EXISTS hoardable_version_prevent_update();
48
59
  DROP FUNCTION IF EXISTS hoardable_source_set_id();
60
+ DROP FUNCTION IF EXISTS hoardable_prevent_update_id();
49
61
  SQL
50
62
  )
51
63
  end
@@ -21,6 +21,9 @@ class Create<%= class_name.singularize.delete(':') %>Versions < ActiveRecord::Mi
21
21
  CREATE TRIGGER <%= table_name %>_set_hoardable_id
22
22
  BEFORE INSERT ON <%= table_name %> FOR EACH ROW
23
23
  EXECUTE PROCEDURE hoardable_source_set_id();
24
+ CREATE TRIGGER <%= table_name %>_prevent_update_hoardable_id
25
+ BEFORE UPDATE ON <%= table_name %> FOR EACH ROW
26
+ EXECUTE PROCEDURE hoardable_prevent_update_id();
24
27
  SQL
25
28
  )
26
29
  end
@@ -31,16 +34,15 @@ class Create<%= class_name.singularize.delete(':') %>Versions < ActiveRecord::Mi
31
34
  ON <%= singularized_table_name %>_versions;
32
35
  DROP TRIGGER <%= table_name %>_set_hoardable_id
33
36
  ON <%= table_name %>;
37
+ DROP TRIGGER <%= table_name %>_prevent_update_hoardable_id
38
+ ON <%= table_name %>;
34
39
  SQL
35
40
  )
36
41
  end
37
42
  end
38
43
  change_column_null :<%= table_name %>, :hoardable_id, false
39
- add_index(:<%= singularized_table_name %>_versions, :<%= primary_key %>, unique: true)
40
- add_index(
41
- :<%= singularized_table_name %>_versions,
42
- %i[_during hoardable_id],
43
- name: 'idx_<%= singularized_table_name %>_versions_temporally'
44
- )
44
+ add_index :<%= singularized_table_name %>_versions, :<%= primary_key %>, unique: true
45
+ add_index :<%= singularized_table_name %>_versions, :hoardable_id
46
+ add_index :<%= singularized_table_name %>_versions, :_during
45
47
  end
46
48
  end
@@ -15,4 +15,16 @@ module Hoardable
15
15
  )
16
16
  end
17
17
  end
18
+
19
+ # An error to be raised when 'updated_at' columns are missing for {Hoardable::Model}s.
20
+ class UpdatedAtColumnMissingError < Error
21
+ def initialize(source_table_name)
22
+ super(
23
+ <<~LOG
24
+ '#{source_table_name}' does not have an 'updated_at' column, so Hoardable cannot look up
25
+ associated record versions with it. Add an 'updated_at' column to '#{source_table_name}'.
26
+ LOG
27
+ )
28
+ end
29
+ end
18
30
  end
@@ -15,14 +15,30 @@ module Hoardable
15
15
 
16
16
  class_eval <<-RUBY, __FILE__, __LINE__ + 1
17
17
  def #{name}
18
- return super unless (at = Hoardable.instance_variable_get('@at'))
18
+ reflection = _reflections['#{name}']
19
+ return super if reflection.klass.name.match?(/^ActionText/)
19
20
 
20
- super&.version_at(at) ||
21
- _reflections['profile'].klass.where(_reflections['profile'].foreign_key => id).first
21
+ super&.at(hoardable_at_timestamp) ||
22
+ reflection.klass.at(hoardable_at_timestamp).find_by(
23
+ {
24
+ reflection.type => self.class.name.sub(/Version$/, ''),
25
+ reflection.foreign_key => hoardable_id
26
+ }.reject { |key, _| key.blank? }
27
+ )
22
28
  end
23
29
  RUBY
24
30
  end
25
31
  end
32
+
33
+ included do
34
+ private
35
+
36
+ def hoardable_at_timestamp
37
+ Hoardable.instance_variable_get('@at') || updated_at
38
+ rescue NameError
39
+ raise(UpdatedAtColumnMissingError, self.class.table_name)
40
+ end
41
+ end
26
42
  end
27
43
  private_constant :HasOne
28
44
  end
@@ -14,6 +14,7 @@ module Hoardable
14
14
  end
15
15
  return unless hoardable
16
16
 
17
+ 'ActionText::RichText'.constantize # forces ActionText::RichText to load if it has not
17
18
  reflection_options = reflections["rich_text_#{name}"].options
18
19
  reflection_options[:class_name] = reflection_options[:class_name].sub(/ActionText/, 'Hoardable')
19
20
  end
@@ -46,6 +46,7 @@ module Hoardable
46
46
 
47
47
  included do
48
48
  include Associations
49
+ attr_readonly :hoardable_id
49
50
  define_model_callbacks :versioned, only: :after
50
51
  define_model_callbacks :reverted, only: :after
51
52
  define_model_callbacks :untrashed, only: :after
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Hoardable
4
- VERSION = '0.12.2'
4
+ VERSION = '0.12.5'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hoardable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.12.2
4
+ version: 0.12.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - justin talbott
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-10-11 00:00:00.000000000 Z
11
+ date: 2022-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord