sequel_bitemporal 0.9.1 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|