chrono_model 1.2.0 → 1.2.1

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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -1
  3. data/lib/chrono_model/time_machine.rb +1 -1
  4. data/lib/chrono_model/time_machine/history_model.rb +4 -0
  5. data/lib/chrono_model/version.rb +1 -1
  6. data/spec/chrono_model/adapter/base_spec.rb +157 -0
  7. data/spec/chrono_model/adapter/ddl_spec.rb +243 -0
  8. data/spec/chrono_model/adapter/indexes_spec.rb +72 -0
  9. data/spec/chrono_model/adapter/migrations_spec.rb +312 -0
  10. data/spec/chrono_model/history_models_spec.rb +32 -0
  11. data/spec/chrono_model/time_machine/as_of_spec.rb +188 -0
  12. data/spec/chrono_model/time_machine/changes_spec.rb +50 -0
  13. data/spec/chrono_model/{adapter → time_machine}/counter_cache_race_spec.rb +2 -2
  14. data/spec/chrono_model/time_machine/default_scope_spec.rb +37 -0
  15. data/spec/chrono_model/time_machine/history_spec.rb +104 -0
  16. data/spec/chrono_model/time_machine/keep_cool_spec.rb +27 -0
  17. data/spec/chrono_model/time_machine/manipulations_spec.rb +84 -0
  18. data/spec/chrono_model/time_machine/model_identification_spec.rb +46 -0
  19. data/spec/chrono_model/time_machine/sequence_spec.rb +74 -0
  20. data/spec/chrono_model/time_machine/sti_spec.rb +100 -0
  21. data/spec/chrono_model/{time_query_spec.rb → time_machine/time_query_spec.rb} +22 -5
  22. data/spec/chrono_model/time_machine/timeline_spec.rb +63 -0
  23. data/spec/chrono_model/time_machine/timestamps_spec.rb +43 -0
  24. data/spec/chrono_model/time_machine/transactions_spec.rb +69 -0
  25. data/spec/support/adapter/helpers.rb +53 -0
  26. data/spec/support/adapter/structure.rb +44 -0
  27. data/spec/support/time_machine/helpers.rb +47 -0
  28. data/spec/support/time_machine/structure.rb +111 -0
  29. metadata +48 -14
  30. data/spec/chrono_model/adapter/sti_bug_spec.rb +0 -49
  31. data/spec/chrono_model/adapter_spec.rb +0 -788
  32. data/spec/chrono_model/time_machine_spec.rb +0 -749
  33. data/spec/support/helpers.rb +0 -198
@@ -1,198 +0,0 @@
1
- module ChronoTest::Helpers
2
-
3
- module Adapter
4
- def self.included(base)
5
- base.extend DSL
6
- base.instance_eval do
7
- delegate :adapter, :to => ChronoTest
8
- delegate :columns, :table, :pk_type, :to => DSL
9
- end
10
- end
11
-
12
- module DSL
13
- def with_temporal_table(&block)
14
- context ':temporal => true' do
15
- before(:all) { adapter.create_table(table, :temporal => true, &DSL.columns) }
16
- after(:all) { adapter.drop_table table }
17
-
18
- instance_eval(&block)
19
- end
20
- end
21
-
22
- def with_plain_table(&block)
23
- context ':temporal => false' do
24
- before(:all) { adapter.create_table(table, :temporal => false, &DSL.columns) }
25
- after(:all) { adapter.drop_table table }
26
-
27
- instance_eval(&block)
28
- end
29
- end
30
-
31
- def self.table(table = nil)
32
- @table = table if table
33
- @table
34
- end
35
-
36
- def self.columns(&block)
37
- @columns = block.call if block
38
- @columns
39
- end
40
-
41
- def self.pk_type
42
- @pk_type ||= if ActiveRecord::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR >= 1
43
- 'bigint'
44
- else
45
- 'integer'
46
- end
47
- end
48
- delegate :columns, :table, :pk_type, :to => self
49
- end
50
- end
51
-
52
- module TimeMachine
53
- def self.included(base)
54
- base.extend(DSL)
55
- base.extend(self)
56
- end
57
-
58
- module DSL
59
- @@schema_setup = false
60
-
61
- def setup_schema!
62
- return if @@schema_setup
63
- @@schema_setup = true
64
-
65
- # Set up database structure
66
- #
67
- adapter.create_table 'foos', :temporal => true do |t|
68
- t.string :name
69
- t.integer :fooity
70
- end
71
-
72
- adapter.create_table 'bars', :temporal => true do |t|
73
- t.string :name
74
- t.references :foo
75
- end
76
-
77
- adapter.create_table 'sub_bars', :temporal => true do |t|
78
- t.string :name
79
- t.references :bar
80
- end
81
-
82
- adapter.create_table 'bazs' do |t|
83
- t.string :name
84
- t.references :bar
85
- end
86
-
87
- adapter.create_table 'defoos', :temporal => true do |t|
88
- t.string :name
89
- t.boolean :active
90
- end
91
-
92
- adapter.create_table 'elements', :temporal => true do |t|
93
- t.string :title
94
- t.string :type
95
- end
96
-
97
- adapter.create_table 'plains' do |t|
98
- t.string :foo
99
- end
100
-
101
- adapter.create_table 'events' do |t|
102
- t.string :name
103
- t.daterange :interval
104
- end
105
- end
106
-
107
- Models = lambda {
108
- class ::Foo < ActiveRecord::Base
109
- include ChronoModel::TimeMachine
110
-
111
- has_many :bars
112
- has_many :sub_bars, :through => :bars
113
- end
114
-
115
- class ::Bar < ActiveRecord::Base
116
- include ChronoModel::TimeMachine
117
-
118
- belongs_to :foo
119
- has_many :sub_bars
120
- has_one :baz
121
-
122
- has_timeline :with => :foo
123
- end
124
-
125
- class ::SubBar < ActiveRecord::Base
126
- include ChronoModel::TimeMachine
127
-
128
- belongs_to :bar
129
-
130
- has_timeline :with => :bar
131
- end
132
-
133
- class ::Baz < ActiveRecord::Base
134
- include ChronoModel::TimeGate
135
-
136
- belongs_to :bar
137
-
138
- has_timeline :with => :bar
139
- end
140
-
141
- class ::Defoo < ActiveRecord::Base
142
- include ChronoModel::TimeMachine
143
-
144
- default_scope proc { where(:active => true) }
145
- end
146
-
147
- # STI case (https://github.com/ifad/chronomodel/issues/5)
148
- class ::Element < ActiveRecord::Base
149
- include ChronoModel::TimeMachine
150
- end
151
-
152
- class ::Publication < Element
153
- end
154
-
155
- class ::Plain < ActiveRecord::Base
156
- end
157
-
158
- class ::Event < ActiveRecord::Base
159
- extend ChronoModel::TimeMachine::TimeQuery
160
- end
161
- }
162
-
163
- @@models_defined = false
164
- def define_models!
165
- return if @@models_defined
166
- @@models_defined = true
167
-
168
- Models.call
169
- end
170
-
171
- def adapter
172
- ChronoTest.connection
173
- end
174
- end
175
-
176
- # If a context object is given, evaluates the given
177
- # block in its instance context, then defines a `ts`
178
- # on it, backed by an Array, and adds the current
179
- # database timestamp to it.
180
- #
181
- # If a context object is not given, the block is
182
- # evaluated in the current context and the above
183
- # mangling is done on the blocks' return value.
184
- #
185
- def ts_eval(ctx = nil, &block)
186
- ret = (ctx || self).instance_eval(&block)
187
- (ctx || ret).tap do |obj|
188
- obj.singleton_class.instance_eval do
189
- define_method(:ts) { @_ts ||= [] }
190
- end unless obj.methods.include?(:ts)
191
-
192
- now = ChronoTest.connection.select_value('select now()::timestamp') + 'Z'
193
- obj.ts.push(Time.parse(now))
194
- end
195
- end
196
- end
197
-
198
- end