sequel_bitemporal 0.9.1 → 0.10.0
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/.travis.yml +14 -7
- data/README.md +33 -15
- data/lib/sequel/plugins/bitemporal.rb +23 -22
- data/sequel_bitemporal.gemspec +1 -1
- data/spec/bitemporal_serialization_spec.rb +38 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d522ca4aed441f88c808ee0af6f54aa18bd873fc4742f11fd0e890b2c611b01
|
4
|
+
data.tar.gz: eb3f8873178c6db5b69f6c5a2b2cc42582c21777ae92e94bda268b25873ea254
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f16ee4864135847b45f8782b5926329dad9a21d150da5c9bd4d4e1ac4f568046595f768bad38a716b4316113e498fffd7eb91ccb94918dceba3724a073281cfb
|
7
|
+
data.tar.gz: 737bac4d58bca9f678ef95fb0851fc82dc49f33eef19e91beb3c87ff34be2c2f2d5edb0417aac9ac709114e3d3b97bc1dbe32a0017cbf1d9adcc1d6dce81e119
|
data/.travis.yml
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
language: ruby
|
2
|
+
|
2
3
|
cache:
|
3
4
|
bundler: true
|
4
|
-
|
5
|
+
|
5
6
|
rvm:
|
6
|
-
- 2.
|
7
|
-
- 2.
|
8
|
-
- 2.
|
9
|
-
-
|
7
|
+
- 2.3.8
|
8
|
+
- 2.4.5
|
9
|
+
- 2.5.3
|
10
|
+
- 2.6.0
|
11
|
+
- jruby-9.1.17.0
|
12
|
+
- jruby-9.2.5.0
|
10
13
|
before_script:
|
11
14
|
- psql -c 'create database sequel_bitemporal_test;' -U postgres
|
12
15
|
env:
|
@@ -18,7 +21,11 @@ gemfile:
|
|
18
21
|
- ci/sequel.gemfile
|
19
22
|
matrix:
|
20
23
|
allow_failures:
|
21
|
-
- rvm: jruby-9.1.
|
24
|
+
- rvm: jruby-9.1.17.0
|
22
25
|
env: PG=1 SEQUEL='~> 4.0'
|
23
|
-
- rvm: jruby-9.1.
|
26
|
+
- rvm: jruby-9.1.17.0
|
27
|
+
env: PG=1 SEQUEL='~> 5.0'
|
28
|
+
- rvm: jruby-9.2.5.0
|
29
|
+
env: PG=1 SEQUEL='~> 4.0'
|
30
|
+
- rvm: jruby-9.2.5.0
|
24
31
|
env: PG=1 SEQUEL='~> 5.0'
|
data/README.md
CHANGED
@@ -14,29 +14,37 @@ Dependencies
|
|
14
14
|
Usage
|
15
15
|
-----
|
16
16
|
|
17
|
-
|
17
|
+
Declare bitemporality inside your model:
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
```ruby
|
20
|
+
class HotelPriceVersion < Sequel::Model
|
21
|
+
end
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
23
|
+
class HotelPrice < Sequel::Model
|
24
|
+
plugin :bitemporal, version_class: HotelPriceVersion
|
25
|
+
end
|
26
|
+
```
|
25
27
|
|
26
|
-
|
28
|
+
You can now create a hotel price with bitemporal versions:
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
+
```ruby
|
31
|
+
price = HotelPrice.new
|
32
|
+
price.update_attributes price: 18
|
33
|
+
```
|
30
34
|
|
31
|
-
|
35
|
+
To show all versions:
|
32
36
|
|
33
|
-
|
37
|
+
```ruby
|
38
|
+
price.versions
|
39
|
+
```
|
34
40
|
|
35
|
-
|
41
|
+
To show current version:
|
36
42
|
|
37
|
-
|
43
|
+
```ruby
|
44
|
+
price.current_version
|
45
|
+
```
|
38
46
|
|
39
|
-
|
47
|
+
Look at the specs for more usage patterns.
|
40
48
|
|
41
49
|
Thanks
|
42
50
|
------
|
@@ -48,7 +56,17 @@ Thanks to Ksenia Zalesnaya (@ksenia-zalesnaya) for her contributions:
|
|
48
56
|
- define setter methods for versioned columns
|
49
57
|
|
50
58
|
Thanks to Denis Kalesnikov (@DenisKem) for his contributions:
|
51
|
-
-
|
59
|
+
- add support for composite primary key
|
60
|
+
[#8](https://github.com/TalentBox/sequel_bitemporal/pull/8)
|
61
|
+
|
62
|
+
Thanks to Olle Jonsson (@olleolleolle) for his contributions:
|
63
|
+
- update specs to work with RSpec: `config.disable_monkey_patching!`
|
64
|
+
[#10](https://github.com/TalentBox/sequel_bitemporal/pull/10)
|
65
|
+
- update TravisCI matrix to include more Ruby versions
|
66
|
+
[#11](https://github.com/TalentBox/sequel_bitemporal/pull/10)
|
67
|
+
- README improvements
|
68
|
+
[#9](https://github.com/TalentBox/sequel_bitemporal/pull/9)
|
69
|
+
[#12](https://github.com/TalentBox/sequel_bitemporal/pull/12)
|
52
70
|
|
53
71
|
License
|
54
72
|
-------
|
@@ -334,7 +334,7 @@ module Sequel
|
|
334
334
|
|
335
335
|
current_version.keys.each do |key|
|
336
336
|
next if excluded_columns.include? key
|
337
|
-
current_attributes[key] = current_version.
|
337
|
+
current_attributes[key] = current_version.public_send key
|
338
338
|
end if current_version?
|
339
339
|
model.version_class.new current_attributes
|
340
340
|
end
|
@@ -469,7 +469,7 @@ module Sequel
|
|
469
469
|
last_version_attributes = if last_version
|
470
470
|
last_version.columns.each_with_object({}) do |column, hash|
|
471
471
|
unless excluded_columns.include? column
|
472
|
-
hash[column] = last_version.
|
472
|
+
hash[column] = last_version.public_send column
|
473
473
|
end
|
474
474
|
end
|
475
475
|
else
|
@@ -539,33 +539,28 @@ module Sequel
|
|
539
539
|
to_check_columns = self.class.version_class.columns - excluded_columns
|
540
540
|
updated_by = (send(self.class.audit_updated_by_method) if audited?)
|
541
541
|
previous_values = @current_version_values || {}
|
542
|
-
|
543
|
-
columns = pending_version.columns - excluded_columns_for_changes
|
544
|
-
columns.each do |column|
|
545
|
-
current_version_values[column] = pending_version.public_send(column)
|
546
|
-
end
|
547
|
-
|
542
|
+
current_values = values_for_changes pending_version
|
548
543
|
futures.each do |future_version|
|
549
544
|
attrs = {}
|
550
545
|
to_check_columns.each do |col|
|
551
546
|
if previous_values[col]==future_version[col] &&
|
552
|
-
previous_values[col]!=
|
553
|
-
attrs[col] =
|
547
|
+
previous_values[col]!=current_values[col]
|
548
|
+
attrs[col] = current_values[col]
|
554
549
|
end
|
555
550
|
end
|
556
551
|
if attrs.any?
|
557
552
|
propagated = save_propagated future_version, attrs
|
553
|
+
previous_values = values_for_changes future_version
|
554
|
+
current_values = values_for_changes propagated
|
558
555
|
if !propagated.new? && audited? && updated_by
|
559
556
|
self.class.audit_class.audit(
|
560
557
|
self,
|
561
|
-
|
562
|
-
|
558
|
+
previous_values,
|
559
|
+
current_values,
|
563
560
|
propagated.valid_from,
|
564
561
|
updated_by
|
565
562
|
)
|
566
563
|
end
|
567
|
-
previous_values = future_version.values.dup
|
568
|
-
current_version_values = propagated.values
|
569
564
|
future_version.this.update :expired_at => Sequel::Plugins::Bitemporal.point_in_time
|
570
565
|
else
|
571
566
|
break
|
@@ -583,7 +578,7 @@ module Sequel
|
|
583
578
|
self.class.audit_class.audit(
|
584
579
|
self,
|
585
580
|
current_values_for_audit,
|
586
|
-
pending_version
|
581
|
+
values_for_changes(pending_version),
|
587
582
|
pending_version.valid_from,
|
588
583
|
updated_by
|
589
584
|
) if updated_by
|
@@ -598,7 +593,7 @@ module Sequel
|
|
598
593
|
def save_fossil(expired, attributes={})
|
599
594
|
fossil = model.version_class.new
|
600
595
|
expired_attributes = expired.keys.each_with_object({}) do |key, hash|
|
601
|
-
hash[key] = expired.
|
596
|
+
hash[key] = expired.public_send key
|
602
597
|
end
|
603
598
|
expired_attributes.delete :id
|
604
599
|
fossil.set_all expired_attributes.merge(attributes)
|
@@ -609,7 +604,7 @@ module Sequel
|
|
609
604
|
def save_propagated(version, attributes={})
|
610
605
|
propagated = model.version_class.new
|
611
606
|
version_attributes = version.keys.each_with_object({}) do |key, hash|
|
612
|
-
hash[key] = version.
|
607
|
+
hash[key] = version.public_send key
|
613
608
|
end
|
614
609
|
version_attributes.delete :id
|
615
610
|
version_attributes[:created_at] = Sequel::Plugins::Bitemporal.point_in_time
|
@@ -627,10 +622,8 @@ module Sequel
|
|
627
622
|
def pending_version_holds_changes?
|
628
623
|
return false unless @pending_version
|
629
624
|
return true unless current_version?
|
630
|
-
@current_version_values = current_version
|
631
|
-
|
632
|
-
columns.detect do |column|
|
633
|
-
new_value = pending_version.send column
|
625
|
+
@current_version_values = values_for_changes current_version
|
626
|
+
values_for_changes(pending_version).any? do |column, new_value|
|
634
627
|
case column
|
635
628
|
when :id, :created_at, :expired_at, *version_foreign_keys
|
636
629
|
false
|
@@ -653,7 +646,7 @@ module Sequel
|
|
653
646
|
new_value = model.version_class.input_transformers[:string_nilifier].call(new_value)
|
654
647
|
end
|
655
648
|
end
|
656
|
-
current_version.
|
649
|
+
current_version.public_send(column)!=new_value
|
657
650
|
end
|
658
651
|
end
|
659
652
|
end
|
@@ -670,6 +663,14 @@ module Sequel
|
|
670
663
|
@initial_version ||= model.version_class.new
|
671
664
|
end
|
672
665
|
|
666
|
+
def values_for_changes(version)
|
667
|
+
values = {}
|
668
|
+
(version.columns - excluded_columns_for_changes).each do |column|
|
669
|
+
values[column] = version.public_send column
|
670
|
+
end
|
671
|
+
values
|
672
|
+
end
|
673
|
+
|
673
674
|
end
|
674
675
|
end
|
675
676
|
end
|
data/sequel_bitemporal.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "sequel_bitemporal"
|
6
|
-
s.version = "0.
|
6
|
+
s.version = "0.10.0"
|
7
7
|
s.authors = ["Joseph HALTER", "Jonathan TRON"]
|
8
8
|
s.email = ["joseph.halter@thetalentbox.com", "jonathan.tron@thetalentbox.com"]
|
9
9
|
s.homepage = "https://github.com/TalentBox/sequel_bitemporal"
|
@@ -72,4 +72,42 @@ RSpec.describe "Sequel::Plugins::Bitemporal", :skip_jdbc_sqlite do
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
+
it "can propage changes to future version per column with defaults" do
|
76
|
+
propagate_per_column = @master_class.propagate_per_column
|
77
|
+
begin
|
78
|
+
@master_class.instance_variable_set :@propagate_per_column, true
|
79
|
+
@version_class.class_eval do
|
80
|
+
define_method :name do
|
81
|
+
super() || {}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
master = @master_class.new
|
85
|
+
expect( master.name ).to eql({})
|
86
|
+
expect( master.save ).to be_truthy
|
87
|
+
@version_class.create master_id: master.id, valid_from: Date.parse("2016-01-01"), valid_to: Date.parse("2017-01-01"), price: 0
|
88
|
+
@version_class.create master_id: master.id, valid_from: Date.parse("2017-01-01"), valid_to: Date.parse("2018-01-01"), price: 0, length: 10
|
89
|
+
@version_class.create master_id: master.id, valid_from: Date.parse("2018-01-01"), valid_to: Date.parse("2019-01-01"), price: 0, length: 20
|
90
|
+
@version_class.create master_id: master.id, valid_from: Date.parse("2019-01-01"), valid_to: Date.parse("2020-01-01"), price: 10, length: 20
|
91
|
+
expect(
|
92
|
+
master.update_attributes valid_from: Date.parse("2016-01-01"), price: 10
|
93
|
+
).to be_truthy
|
94
|
+
result = master.versions_dataset.order(:expired_at, :valid_from).all.map do |version|
|
95
|
+
[!!version.expired_at, version.valid_from.year, version.valid_to.year, version.price, version.length, version.width, version[:name]]
|
96
|
+
end
|
97
|
+
expect(result).to eql [
|
98
|
+
[false, 2016, 2017, 10, nil, nil, nil],
|
99
|
+
[false, 2017, 2018, 0, 10, nil, "{}"],
|
100
|
+
[false, 2018, 2019, 0, 20, nil, nil],
|
101
|
+
[false, 2019, 2020, 10, 20, nil, nil],
|
102
|
+
[true, 2016, 2017, 0, nil, nil, nil],
|
103
|
+
[true, 2017, 2018, 0, 10, nil, nil],
|
104
|
+
]
|
105
|
+
ensure
|
106
|
+
@version_class.class_eval do
|
107
|
+
undef_method :name
|
108
|
+
end
|
109
|
+
@master_class.instance_variable_set :@propagate_per_column, propagate_per_column
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
75
113
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel_bitemporal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph HALTER
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-03-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sequel
|