datetime_helper 1.0.0 → 1.0.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.
- checksums.yaml +8 -8
- data/README.md +24 -9
- data/lib/datetime_helper.rb +21 -4
- data/lib/datetime_helper/matchers/iso_date_and_time_rspec_matchers.rb +17 -0
- data/lib/datetime_helper/rspec.rb +1 -0
- data/lib/datetime_helper/validators/zulu_time_active_model_validator.rb +1 -13
- data/lib/datetime_helper/version.rb +1 -1
- data/spec/matchers/iso_date_and_time_rspec_matcher_spec.rb +27 -0
- data/spec/matchers/zulu_time_rspec_matcher_spec.rb +20 -0
- data/spec/spec_helper.rb +0 -5
- data/spec/validators/zulu_time_active_model_validator_spec.rb +11 -10
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MDFmZGQ5MjZiYmFiNWYzYWMxMjM1YTBjYmM1Y2VhMTJmZDY4MGExYg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
MGM5MTFhOWMzYjdhYTVjMGVkZjcxNDdiN2E0ODY4MjA2MTc2MDg4Zg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NjczNzkyNDhmMTUwYzAyYTY4ZDdjNTg4MTkxZGRiZWZjOWM3NTIxYWMyM2Q0
|
10
|
+
Y2NiZjMzYzEyODVkYmRjNzYzOWExZDM3ZjNlMGVkMTdkOTQ3ZTkxMzM0YjZl
|
11
|
+
ZmQxY2QzYjgzMTQ0ZjNjODM4OTgwODJhZTg2NGM2NWFmZmU0ZTA=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YWMwMzNhY2M1OTdmOTI1OTU3MjcwODA1MmFiYjkxY2RkZGEyYzJlMmVjYzNl
|
14
|
+
OTFkNTAwYTdmNTAxOTc0MmI2Mzk4ZmZjNmMwM2RjZGY0MjI0ODUzYWZmNThl
|
15
|
+
MDFkZmMwZmQyZTEyMDM2MmRlNWQ4ZmM2N2QxYjJlMzRjZTI0OGM=
|
data/README.md
CHANGED
@@ -5,9 +5,9 @@ A collection of useful utilities for projects that have to deal with dates, time
|
|
5
5
|
## Features
|
6
6
|
|
7
7
|
1. A base method called `is_zulu_time?`,
|
8
|
-
2.
|
8
|
+
2. `rspec` matchers `be_zulu_time`, `be_an_iso_formatted_date`, and `be_an_iso_formatted_time`
|
9
9
|
3. An `ActiveModel` validator called `zulu_time`, and
|
10
|
-
4. An `ActiveModel::Serializer` helper method called `
|
10
|
+
4. An `ActiveModel::Serializer` helper method called `enforce_zulu_time`.
|
11
11
|
|
12
12
|
Each feature can be required individually so you can use the `rspec` matcher, `ActiveModel` validator, or `ActiveModel::Serializer` helper in isolation.
|
13
13
|
|
@@ -18,7 +18,7 @@ Each feature can be required individually so you can use the `rspec` matcher, `A
|
|
18
18
|
1. `Ruby`, `Bundler`, etc. The usual suspects. (Tested against Ruby 2.0.0 and up)
|
19
19
|
2. `rspec` if you `require 'datetime_helper/rspec'`
|
20
20
|
3. `active_model` if you `require 'datetime_helper/active_model'`
|
21
|
-
4. `
|
21
|
+
4. `active_model_serializer` if you `require 'datetime_helper/active_model_serialiser'`
|
22
22
|
|
23
23
|
## TL;DR
|
24
24
|
|
@@ -36,10 +36,13 @@ Put this in your `Gemfile`
|
|
36
36
|
gem 'datetime_helper'
|
37
37
|
```
|
38
38
|
|
39
|
-
###
|
39
|
+
### Basic Zulu Time checking
|
40
|
+
|
41
|
+
You can also use this to test that a `DateTime`, or `Time`, are at `UTC+0`, or
|
42
|
+
that a `String` is formatted in correct Zulu Time format.
|
40
43
|
|
41
44
|
```ruby
|
42
|
-
DatetimeHelper.is_zulu_time?
|
45
|
+
DatetimeHelper.is_zulu_time? something
|
43
46
|
```
|
44
47
|
|
45
48
|
### Using the `be_zulu_time` matcher in your `RSpec` tests
|
@@ -60,6 +63,15 @@ And put this in your `rspec` tests.
|
|
60
63
|
it {expect(subject[:deleted_at]).to be_zulu_time}
|
61
64
|
```
|
62
65
|
|
66
|
+
This can be used to expect that a `DateTime`, or `Time`, are at `UTC+0`, or that a `String` is formatted in Zulu Time.
|
67
|
+
|
68
|
+
#### ISO Times and Dates
|
69
|
+
|
70
|
+
Similarly to the above you can also test Time and Date strings with
|
71
|
+
|
72
|
+
* `be_an_iso_formatted_time`, and
|
73
|
+
* `be_an_iso_formatted_date`
|
74
|
+
|
63
75
|
### Validating `ActiveModel` fields to ensure they hold UTC+0 `datetime` data
|
64
76
|
|
65
77
|
First be sure you `require 'datetime_helper/active_model'`
|
@@ -72,18 +84,20 @@ include DatetimeHelper::Validators
|
|
72
84
|
validates :updated_at, zulu_time: true
|
73
85
|
```
|
74
86
|
|
75
|
-
This will verify that a `Time` is supplied at `UTC+0`,
|
87
|
+
This will verify that a `Time` is supplied at `UTC+0`,
|
88
|
+
or that a `DateTime` has `.zone == "+00:00"`,
|
89
|
+
or that a `String` is in Zulu Time format.
|
76
90
|
|
77
91
|
### Enforcing `ActiveModel::Serializer` Zulu Time string formats
|
78
92
|
|
79
|
-
First be sure you `require 'datetime_helper/
|
93
|
+
First be sure you `require 'datetime_helper/active_model_serialiser'`
|
80
94
|
|
81
95
|
Then you can put this in your serialisers:
|
82
96
|
|
83
97
|
```ruby
|
84
98
|
extend DatetimeHelper::Serialisers
|
85
99
|
|
86
|
-
|
100
|
+
enforce_zulu_time :updated_at
|
87
101
|
```
|
88
102
|
|
89
103
|
or if you have a bunch of 'em
|
@@ -91,7 +105,7 @@ or if you have a bunch of 'em
|
|
91
105
|
```ruby
|
92
106
|
extend DatetimeHelper::Serialisers
|
93
107
|
|
94
|
-
%w(updated_at deleted_at).each { |attribute|
|
108
|
+
%w(updated_at deleted_at).each { |attribute| enforce_zulu_time attribute }
|
95
109
|
```
|
96
110
|
|
97
111
|
This will ensure that the serialised output is a proper Zulu Time formatted string.
|
@@ -128,3 +142,4 @@ The `Datetime Helper` is © 2015 Westfield Labs and is available for use under t
|
|
128
142
|
|`0.0.2`| Added the `ActiveModel` validator |
|
129
143
|
|`0.0.3`| Added the `ActiveModel::Serializer` helper |
|
130
144
|
|`1.0.0`| Cleaned up for first official release |
|
145
|
+
|`1.0.1`| Enhanced matchers, and validator |
|
data/lib/datetime_helper.rb
CHANGED
@@ -2,10 +2,27 @@ require "datetime_helper/version"
|
|
2
2
|
|
3
3
|
module DatetimeHelper
|
4
4
|
|
5
|
-
ZULU_TIME_PATTERN =
|
5
|
+
ZULU_TIME_PATTERN = /^(\d{4})-([0-1][0-9])-([0-3]\d{1})T([0-2]\d{1}):([0-5]\d{1}):([0-5]\d{1})(\.[0-9]{1,3})?Z$/
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
class << self
|
8
|
+
def is_zulu_time?(something)
|
9
|
+
return is_zulu_time_string?(something) if something.is_a? String
|
10
|
+
return is_zulu_time_datetime?(something) if something.is_a? DateTime
|
11
|
+
return is_zulu_time_time?(something) if something.is_a? Time
|
12
|
+
false
|
13
|
+
end
|
14
|
+
|
15
|
+
def is_zulu_time_string?(time_string)
|
16
|
+
!(time_string =~ ZULU_TIME_PATTERN).nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def is_zulu_time_datetime?(datetime)
|
20
|
+
datetime.zone == "+00:00"
|
21
|
+
end
|
10
22
|
|
23
|
+
def is_zulu_time_time?(time)
|
24
|
+
time.utc?
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
11
28
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module DatetimeHelper
|
2
|
+
module Matchers
|
3
|
+
|
4
|
+
RSpec::Matchers.define :be_an_iso_formatted_time do |expected|
|
5
|
+
match do |time|
|
6
|
+
!(time =~ /\d{2}:\d{2}/).nil?
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
RSpec::Matchers.define :be_an_iso_formatted_date do |expected|
|
11
|
+
match do |date|
|
12
|
+
!(date =~ /\d{4}\-\d{2}\-\d{2}/).nil?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -8,22 +8,10 @@ module DatetimeHelper
|
|
8
8
|
class ZuluTimeValidator < ActiveModel::EachValidator
|
9
9
|
|
10
10
|
def validate_each(record, attribute, value)
|
11
|
-
return if
|
12
|
-
return if value.is_a? Time and utc_time? value
|
13
|
-
|
11
|
+
return if DatetimeHelper.is_zulu_time? value
|
14
12
|
record.errors[attribute] << (options[:message] || 'is not in UTC+0 (Zulu Time)')
|
15
13
|
end
|
16
14
|
|
17
|
-
private
|
18
|
-
|
19
|
-
def utc_datetime?(value)
|
20
|
-
value.zone == "+00:00"
|
21
|
-
end
|
22
|
-
|
23
|
-
def utc_time?(value)
|
24
|
-
value.utc?
|
25
|
-
end
|
26
|
-
|
27
15
|
end
|
28
16
|
end
|
29
17
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative '../spec_helper'
|
2
|
+
|
3
|
+
describe 'iso_formatted' do
|
4
|
+
describe 'be_an_iso_formatted_time' do
|
5
|
+
context 'given a valid time string' do
|
6
|
+
let(:valid_time_string) { "11:00" }
|
7
|
+
it { expect(valid_time_string).to be_an_iso_formatted_time }
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'given an invalid time string' do
|
11
|
+
let(:invalid_time_string) { "This is not a time string" }
|
12
|
+
it { expect(invalid_time_string).to_not be_an_iso_formatted_time }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'be_an_iso_formatted_date' do
|
17
|
+
context 'given a valid date string' do
|
18
|
+
let(:valid_time_string) { "2015-11-30" }
|
19
|
+
it { expect(valid_time_string).to be_an_iso_formatted_date }
|
20
|
+
end
|
21
|
+
|
22
|
+
context 'given an invalid date string' do
|
23
|
+
let(:invalid_time_string) { "This is not a date string" }
|
24
|
+
it { expect(invalid_time_string).to_not be_an_iso_formatted_date }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -10,4 +10,24 @@ describe 'be_zulu_time' do
|
|
10
10
|
let(:invalid_time_string) { "This is not a zulu time string" }
|
11
11
|
it { expect(invalid_time_string).to_not be_zulu_time }
|
12
12
|
end
|
13
|
+
|
14
|
+
context 'given a datetime that is at UTC0' do
|
15
|
+
let(:valid_datetime) { DateTime.now.new_offset(0) }
|
16
|
+
it { expect(valid_datetime).to be_zulu_time }
|
17
|
+
end
|
18
|
+
|
19
|
+
context 'given a datetime that is not at UTC0' do
|
20
|
+
let(:invalid_datetime) { DateTime.now.new_offset("+05:30") }
|
21
|
+
it { expect(invalid_datetime).to_not be_zulu_time }
|
22
|
+
end
|
23
|
+
|
24
|
+
context 'given a time that is at UTC0' do
|
25
|
+
let(:valid_time) { Time.now.utc }
|
26
|
+
it { expect(valid_time).to be_zulu_time }
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'given a time that is not at UTC0' do
|
30
|
+
let(:invalid_time) { Time.now.getlocal("+05:30") }
|
31
|
+
it { expect(invalid_time).to_not be_zulu_time }
|
32
|
+
end
|
13
33
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -5,11 +5,6 @@ describe DatetimeHelper::Validators::ZuluTimeValidator do
|
|
5
5
|
let(:validator) { described_class.new({attributes: [:updated_at]})}
|
6
6
|
let(:model) { double('model') }
|
7
7
|
|
8
|
-
# if, by chance, you happen to be running these tests
|
9
|
-
# on a machine set to UTC+0 then the local time tests
|
10
|
-
# won't really be a valid test.
|
11
|
-
let(:already_in_utc) { Time.now.utc == Time.now.getlocal }
|
12
|
-
|
13
8
|
before :each do
|
14
9
|
allow(model).to receive_message_chain('errors').and_return([])
|
15
10
|
allow(model.errors).to receive_message_chain('[]').and_return({})
|
@@ -24,10 +19,9 @@ describe DatetimeHelper::Validators::ZuluTimeValidator do
|
|
24
19
|
end
|
25
20
|
end
|
26
21
|
|
27
|
-
context "given a
|
28
|
-
let(:invalid_time) { Time.now.getlocal }
|
22
|
+
context "given a non UTC+0 Time" do
|
23
|
+
let(:invalid_time) { Time.now.getlocal("+05:30") }
|
29
24
|
it "is not accepted as valid" do
|
30
|
-
pending "Local Time is UTC so skipping test" if already_in_utc
|
31
25
|
expect(model.errors[]).to receive('<<')
|
32
26
|
validator.validate_each(model, 'updated_at', invalid_time)
|
33
27
|
end
|
@@ -42,14 +36,21 @@ describe DatetimeHelper::Validators::ZuluTimeValidator do
|
|
42
36
|
end
|
43
37
|
|
44
38
|
context "given a local DateTime" do
|
45
|
-
let(:invalid_time) { DateTime.now }
|
39
|
+
let(:invalid_time) { DateTime.now.new_offset("+05:30") }
|
46
40
|
it "is not accepted as valid" do
|
47
|
-
pending "Local Time is UTC so skipping test" if already_in_utc
|
48
41
|
expect(model.errors[]).to receive('<<')
|
49
42
|
validator.validate_each(model, 'updated_at', invalid_time)
|
50
43
|
end
|
51
44
|
end
|
52
45
|
|
46
|
+
context "given a zulu time string" do
|
47
|
+
let(:valid_time) { Time.now.utc.iso8601 }
|
48
|
+
it "is accepted as valid" do
|
49
|
+
expect(model.errors[]).to_not receive('<<')
|
50
|
+
validator.validate_each(model, 'updated_at', valid_time)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
53
54
|
context "given a String instead of a Time or DateTime" do
|
54
55
|
let(:nonsense) { "this makes no sense" }
|
55
56
|
it "is not accepted as valid" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datetime_helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- davesag
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-05-
|
11
|
+
date: 2015-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -114,12 +114,14 @@ files:
|
|
114
114
|
- lib/datetime_helper.rb
|
115
115
|
- lib/datetime_helper/active_model.rb
|
116
116
|
- lib/datetime_helper/active_model_serialiser.rb
|
117
|
+
- lib/datetime_helper/matchers/iso_date_and_time_rspec_matchers.rb
|
117
118
|
- lib/datetime_helper/matchers/zulu_time_rspec_matcher.rb
|
118
119
|
- lib/datetime_helper/rspec.rb
|
119
120
|
- lib/datetime_helper/serialisers/zulu_time_active_model_serialiser_helper.rb
|
120
121
|
- lib/datetime_helper/validators/zulu_time_active_model_validator.rb
|
121
122
|
- lib/datetime_helper/version.rb
|
122
123
|
- spec/datetime_helper_spec.rb
|
124
|
+
- spec/matchers/iso_date_and_time_rspec_matcher_spec.rb
|
123
125
|
- spec/matchers/zulu_time_rspec_matcher_spec.rb
|
124
126
|
- spec/serialisers/zulu_time_active_model_serialiser_helper_spec.rb
|
125
127
|
- spec/spec_helper.rb
|
@@ -151,6 +153,7 @@ summary: A collection of useful helpers for projects which have to deal with dat
|
|
151
153
|
times, and time zones.
|
152
154
|
test_files:
|
153
155
|
- spec/datetime_helper_spec.rb
|
156
|
+
- spec/matchers/iso_date_and_time_rspec_matcher_spec.rb
|
154
157
|
- spec/matchers/zulu_time_rspec_matcher_spec.rb
|
155
158
|
- spec/serialisers/zulu_time_active_model_serialiser_helper_spec.rb
|
156
159
|
- spec/spec_helper.rb
|