state_of_the_nation 1.1.3 → 1.1.4
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 +5 -5
- data/.circleci/config.yml +26 -0
- data/.ruby-version +1 -0
- data/Gemfile +0 -2
- data/README.md +4 -4
- data/lib/state_of_the_nation.rb +29 -20
- data/lib/state_of_the_nation/query_string.rb +3 -1
- data/lib/state_of_the_nation/version.rb +1 -1
- data/state_of_the_nation.gemspec +5 -6
- metadata +20 -18
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 97a7482f3c135b954fe912e2bb6b8948f4ba14596e282a91687aec9cbcb06b3d
|
|
4
|
+
data.tar.gz: 4577435dca22e84ded9236bc52b94cc24d02681973697623d5bca3c884034d6b
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d00dd78d49cd44f1c79ad9c316d1e4843bb255f5b7728f0cb813bd656d8b3ff794c3d5dffa4013bf3d9e4805dda858f01bace09557c241e0b69d3869b06fd3f7
|
|
7
|
+
data.tar.gz: 11dbf26dbddd36bc93c408f6679c9980044c990c4ba4990298dd86ca1633687d5bfc0df9b13b38ad067d12645a3b001989e2356a175405ea3ed34a1cc354f5ed
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
jobs:
|
|
3
|
+
build:
|
|
4
|
+
environment:
|
|
5
|
+
RAILS_ENV: test
|
|
6
|
+
|
|
7
|
+
docker:
|
|
8
|
+
- image: circleci/ruby:2.5.5
|
|
9
|
+
|
|
10
|
+
steps:
|
|
11
|
+
- checkout
|
|
12
|
+
|
|
13
|
+
- restore_cache:
|
|
14
|
+
keys:
|
|
15
|
+
- v2-dependencies-{{ .Branch }}
|
|
16
|
+
- v2-dependencies-master
|
|
17
|
+
- v2-dependencies-
|
|
18
|
+
|
|
19
|
+
- run: bundle install --path=vendor/bundle
|
|
20
|
+
|
|
21
|
+
- save_cache:
|
|
22
|
+
key: v2-dependencies-{{ .Branch }}
|
|
23
|
+
paths:
|
|
24
|
+
- vendor/bundle
|
|
25
|
+
|
|
26
|
+
- run: bundle exec rspec --format progress spec
|
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.5.5
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -40,7 +40,7 @@ usa.senators.create!(name: "Ron Wyden", entered_office_at: Date.new(1996, 2, 6))
|
|
|
40
40
|
usa.senators.create!(name: "Barbara Boxer", entered_office_at: Date.new(1993, 1, 3))
|
|
41
41
|
usa.senators.create!(name: "Alan Cranston", entered_office_at: Date.new(1969, 1, 3), left_office_at: Date.new(1993, 1, 3))
|
|
42
42
|
|
|
43
|
-
usa.active_president(Date.new(2015))
|
|
43
|
+
usa.active_president(Date.new(2015))
|
|
44
44
|
# => President(id: 1, name: "Barack Obama", …)
|
|
45
45
|
|
|
46
46
|
obama.active?
|
|
@@ -52,10 +52,9 @@ usa.active_senators(Date.new(2015))
|
|
|
52
52
|
usa.presidents.create!(name: "Mitt Romney", entered_office_at: Date.new(2013, 1, 20))
|
|
53
53
|
# => StateOfTheNation::ConflictError
|
|
54
54
|
```
|
|
55
|
-
|
|
56
55
|
## IdentityCache Support
|
|
57
56
|
|
|
58
|
-
StateOfTheNation optionally supports fetching records through [IdentityCache](https://github.com/Shopify/identity_cache)
|
|
57
|
+
StateOfTheNation optionally supports fetching records through [IdentityCache](https://github.com/Shopify/identity_cache) instead of reading directly from the database.
|
|
59
58
|
|
|
60
59
|
For example if the `Country` model uses IdentityCache to cache the `has_many` relationship to `President`, you can instruct StateOfTheNation to fetch from the cache by calling `.with_identity_cache` on your `has_active` or `has_uniquely_active` definitions:
|
|
61
60
|
|
|
@@ -63,7 +62,7 @@ For example if the `Country` model uses IdentityCache to cache the `has_many` re
|
|
|
63
62
|
class Country
|
|
64
63
|
include IdentityCache
|
|
65
64
|
include StateOfTheNation
|
|
66
|
-
|
|
65
|
+
|
|
67
66
|
has_many(:presidents)
|
|
68
67
|
cache_has_many(:presidents)
|
|
69
68
|
has_uniquely_active(:president).with_identity_cache
|
|
@@ -95,3 +94,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
|
95
94
|
## Contributing
|
|
96
95
|
|
|
97
96
|
Bug reports and pull requests are welcome on GitHub at https://github.com/intercom/state_of_the_nation. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org/) code of conduct.
|
|
97
|
+
|
data/lib/state_of_the_nation.rb
CHANGED
|
@@ -13,9 +13,11 @@ module StateOfTheNation
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
module ClassMethods
|
|
16
|
-
attr_accessor :prevent_multiple_active, :parent_association, :start_key, :finish_key
|
|
16
|
+
attr_accessor :prevent_multiple_active, :parent_association, :start_key, :finish_key, :ignore_empty
|
|
17
|
+
|
|
18
|
+
def considered_active(ignore_empty: false)
|
|
19
|
+
@ignore_empty = ignore_empty
|
|
17
20
|
|
|
18
|
-
def considered_active
|
|
19
21
|
def from(start_key)
|
|
20
22
|
@start_key = start_key
|
|
21
23
|
self
|
|
@@ -33,6 +35,24 @@ module StateOfTheNation
|
|
|
33
35
|
}
|
|
34
36
|
end
|
|
35
37
|
|
|
38
|
+
private def round_if_should(time)
|
|
39
|
+
return time if !should_round_timestamps?
|
|
40
|
+
time.respond_to?(:round) ? time.round : time
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private def should_round_timestamps?
|
|
44
|
+
# MySQL datetime fields do not support millisecond resolution while
|
|
45
|
+
# PostgreSQL's do. To prevent issues with near identical timestamps not
|
|
46
|
+
# comparing as expected in .active? methods we'll choose the resolution
|
|
47
|
+
# appropriate for the database adapter backing the model.
|
|
48
|
+
case self.connection.adapter_name
|
|
49
|
+
when /PostgreSQL/
|
|
50
|
+
false
|
|
51
|
+
else
|
|
52
|
+
true
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
36
56
|
self
|
|
37
57
|
end
|
|
38
58
|
|
|
@@ -76,24 +96,6 @@ module StateOfTheNation
|
|
|
76
96
|
single ? collection.first : collection
|
|
77
97
|
end
|
|
78
98
|
end
|
|
79
|
-
|
|
80
|
-
def round_if_should(time)
|
|
81
|
-
return time if !should_round_timestamps?
|
|
82
|
-
time.respond_to?(:round) ? time.round : time
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def should_round_timestamps?
|
|
86
|
-
# MySQL datetime fields do not support millisecond resolution while
|
|
87
|
-
# PostgreSQL's do. To prevent issues with near identical timestamps not
|
|
88
|
-
# comparing as expected in .active? methods we'll choose the resolution
|
|
89
|
-
# appropriate for the database adapter backing the model.
|
|
90
|
-
case self.connection.adapter_name
|
|
91
|
-
when /PostgreSQL/
|
|
92
|
-
false
|
|
93
|
-
else
|
|
94
|
-
true
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
99
|
end
|
|
98
100
|
|
|
99
101
|
private
|
|
@@ -127,6 +129,9 @@ module StateOfTheNation
|
|
|
127
129
|
# find competing records which *finish* being active AFTER this record *starts* being active
|
|
128
130
|
# (or ones which are not set to finish being active)
|
|
129
131
|
|
|
132
|
+
records = records.where(QueryString.query_for(:start_and_finish_not_equal, self.class)) if ignore_empty
|
|
133
|
+
# exclude records where there is no difference between start and finish dates
|
|
134
|
+
|
|
130
135
|
records
|
|
131
136
|
end
|
|
132
137
|
|
|
@@ -167,6 +172,10 @@ module StateOfTheNation
|
|
|
167
172
|
self.class.finish_key
|
|
168
173
|
end
|
|
169
174
|
|
|
175
|
+
def ignore_empty
|
|
176
|
+
self.class.ignore_empty
|
|
177
|
+
end
|
|
178
|
+
|
|
170
179
|
def should_round_timestamps?
|
|
171
180
|
self.class.send(:should_round_timestamps?)
|
|
172
181
|
end
|
|
@@ -10,11 +10,13 @@ module StateOfTheNation
|
|
|
10
10
|
active_scope: "(%{finish_key} IS NULL OR %{finish_key} > ?::timestamp) AND %{start_key} <= ?::timestamp",
|
|
11
11
|
less_than: "(%{start_key} < ?::timestamp)",
|
|
12
12
|
greater_than_or_null: "(%{finish_key} > ?::timestamp) OR (%{finish_key} IS NULL)",
|
|
13
|
+
start_and_finish_not_equal: "(%{start_key} != %{finish_key})",
|
|
13
14
|
},
|
|
14
15
|
mysql: {
|
|
15
16
|
active_scope: "(%{finish_key} IS NULL OR %{finish_key} > ?) AND %{start_key} <= ?",
|
|
16
17
|
less_than: "(%{start_key} < ?)",
|
|
17
|
-
greater_than_or_null: "(%{finish_key} > ?) OR (%{finish_key} IS NULL)"
|
|
18
|
+
greater_than_or_null: "(%{finish_key} > ?) OR (%{finish_key} IS NULL)",
|
|
19
|
+
start_and_finish_not_equal: "(%{start_key} != %{finish_key})"
|
|
18
20
|
}
|
|
19
21
|
}[appropriate_db_type(klass)]
|
|
20
22
|
end
|
data/state_of_the_nation.gemspec
CHANGED
|
@@ -24,16 +24,15 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
|
|
25
25
|
spec.add_development_dependency "bundler"
|
|
26
26
|
spec.add_development_dependency "database_cleaner"
|
|
27
|
-
|
|
27
|
+
spec.add_development_dependency "mysql2"
|
|
28
28
|
spec.add_development_dependency "pg"
|
|
29
|
-
spec.add_development_dependency "pry"
|
|
30
|
-
spec.add_development_dependency "rb-readline"
|
|
29
|
+
spec.add_development_dependency "pry"
|
|
31
30
|
spec.add_development_dependency "rake", "~> 10.0"
|
|
32
31
|
spec.add_development_dependency "rspec", "~> 3.0"
|
|
33
32
|
spec.add_development_dependency "rspec-rails"
|
|
34
33
|
spec.add_development_dependency "shoulda-matchers"
|
|
35
|
-
spec.add_development_dependency "sqlite3"
|
|
34
|
+
spec.add_development_dependency "sqlite3"
|
|
36
35
|
|
|
37
|
-
spec.add_runtime_dependency "activesupport", ">=
|
|
38
|
-
spec.add_runtime_dependency "activerecord", ">=
|
|
36
|
+
spec.add_runtime_dependency "activesupport", ">= 4.0.0"
|
|
37
|
+
spec.add_runtime_dependency "activerecord", ">= 4.0.0"
|
|
39
38
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: state_of_the_nation
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1.
|
|
4
|
+
version: 1.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Patrick O'Doherty
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date:
|
|
12
|
+
date: 2020-02-19 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: bundler
|
|
@@ -40,7 +40,7 @@ dependencies:
|
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
41
|
version: '0'
|
|
42
42
|
- !ruby/object:Gem::Dependency
|
|
43
|
-
name:
|
|
43
|
+
name: mysql2
|
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
|
45
45
|
requirements:
|
|
46
46
|
- - ">="
|
|
@@ -54,21 +54,21 @@ dependencies:
|
|
|
54
54
|
- !ruby/object:Gem::Version
|
|
55
55
|
version: '0'
|
|
56
56
|
- !ruby/object:Gem::Dependency
|
|
57
|
-
name:
|
|
57
|
+
name: pg
|
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
|
59
59
|
requirements:
|
|
60
|
-
- -
|
|
60
|
+
- - ">="
|
|
61
61
|
- !ruby/object:Gem::Version
|
|
62
|
-
version: 0
|
|
62
|
+
version: '0'
|
|
63
63
|
type: :development
|
|
64
64
|
prerelease: false
|
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
|
66
66
|
requirements:
|
|
67
|
-
- -
|
|
67
|
+
- - ">="
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: 0
|
|
69
|
+
version: '0'
|
|
70
70
|
- !ruby/object:Gem::Dependency
|
|
71
|
-
name:
|
|
71
|
+
name: pry
|
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
|
73
73
|
requirements:
|
|
74
74
|
- - ">="
|
|
@@ -141,44 +141,44 @@ dependencies:
|
|
|
141
141
|
name: sqlite3
|
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
|
143
143
|
requirements:
|
|
144
|
-
- -
|
|
144
|
+
- - ">="
|
|
145
145
|
- !ruby/object:Gem::Version
|
|
146
|
-
version:
|
|
146
|
+
version: '0'
|
|
147
147
|
type: :development
|
|
148
148
|
prerelease: false
|
|
149
149
|
version_requirements: !ruby/object:Gem::Requirement
|
|
150
150
|
requirements:
|
|
151
|
-
- -
|
|
151
|
+
- - ">="
|
|
152
152
|
- !ruby/object:Gem::Version
|
|
153
|
-
version:
|
|
153
|
+
version: '0'
|
|
154
154
|
- !ruby/object:Gem::Dependency
|
|
155
155
|
name: activesupport
|
|
156
156
|
requirement: !ruby/object:Gem::Requirement
|
|
157
157
|
requirements:
|
|
158
158
|
- - ">="
|
|
159
159
|
- !ruby/object:Gem::Version
|
|
160
|
-
version:
|
|
160
|
+
version: 4.0.0
|
|
161
161
|
type: :runtime
|
|
162
162
|
prerelease: false
|
|
163
163
|
version_requirements: !ruby/object:Gem::Requirement
|
|
164
164
|
requirements:
|
|
165
165
|
- - ">="
|
|
166
166
|
- !ruby/object:Gem::Version
|
|
167
|
-
version:
|
|
167
|
+
version: 4.0.0
|
|
168
168
|
- !ruby/object:Gem::Dependency
|
|
169
169
|
name: activerecord
|
|
170
170
|
requirement: !ruby/object:Gem::Requirement
|
|
171
171
|
requirements:
|
|
172
172
|
- - ">="
|
|
173
173
|
- !ruby/object:Gem::Version
|
|
174
|
-
version:
|
|
174
|
+
version: 4.0.0
|
|
175
175
|
type: :runtime
|
|
176
176
|
prerelease: false
|
|
177
177
|
version_requirements: !ruby/object:Gem::Requirement
|
|
178
178
|
requirements:
|
|
179
179
|
- - ">="
|
|
180
180
|
- !ruby/object:Gem::Version
|
|
181
|
-
version:
|
|
181
|
+
version: 4.0.0
|
|
182
182
|
description: State of the Nation makes modeling object history easy.
|
|
183
183
|
email:
|
|
184
184
|
- patrick@intercom.io
|
|
@@ -187,7 +187,9 @@ executables: []
|
|
|
187
187
|
extensions: []
|
|
188
188
|
extra_rdoc_files: []
|
|
189
189
|
files:
|
|
190
|
+
- ".circleci/config.yml"
|
|
190
191
|
- ".gitignore"
|
|
192
|
+
- ".ruby-version"
|
|
191
193
|
- ".travis.yml"
|
|
192
194
|
- CODE_OF_CONDUCT.md
|
|
193
195
|
- Gemfile
|
|
@@ -222,7 +224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
222
224
|
version: '0'
|
|
223
225
|
requirements: []
|
|
224
226
|
rubyforge_project:
|
|
225
|
-
rubygems_version: 2.6.
|
|
227
|
+
rubygems_version: 2.7.6.2
|
|
226
228
|
signing_key:
|
|
227
229
|
specification_version: 4
|
|
228
230
|
summary: An easy way to model state that changes over time with ActiveRecord
|