timeliness 0.4.1 → 0.4.2
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/CHANGELOG.rdoc +5 -0
- data/README.rdoc +8 -1
- data/lib/timeliness.rb +7 -2
- data/lib/timeliness/definitions.rb +29 -14
- data/lib/timeliness/version.rb +1 -1
- data/spec/timeliness/definitions_spec.rb +19 -9
- metadata +2 -3
- data/lib/timeliness/threadsafe_attr.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 830b2a8f549031529ac5f153c60e80c4f6babae4edfd5e883fc954645f350322
|
4
|
+
data.tar.gz: 74ed311a9aa4a2da4d995a774e1ee438ee1454708cb25d991dfac30440d4cdcc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66516e7c7cd33f1ef1c030f99a9e0ede74a39091c18d8c039310894a4e9ef7069c3630ac9bb6e2fe2f2b9be1acd68ca17e0036645842f56a489101776417264c
|
7
|
+
data.tar.gz: a1334464ba03f8c55245ab93ea8d26267900e5af3c2a6b6340d566e7cf59917758526ac2ab9165424568c84a8058932129fecc9a1caa844d2cb067bc0a679fdb
|
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
= 0.4.2 - 2019-06-15
|
2
|
+
* Fixed thread safe issue that forced you to use one of the date format methods e.g. `use_euro_formats`
|
3
|
+
to initialize the format sets in each new thread. Now a new thread will default to the global default (main thread).
|
4
|
+
* Add `Timeliness.ambiguous_date_format` config setting (:us or :euro) to control global default for date format sets.
|
5
|
+
|
1
6
|
= 0.4.1 - 2019-06-11
|
2
7
|
* Add format for ISO 8601 with usec and 'Z' UTC zone offset (jartek)
|
3
8
|
* Fix ISO 8601 parsing bug where Z was not recognised as UTC
|
data/README.rdoc
CHANGED
@@ -236,7 +236,7 @@ To see all defined formats look at the {source code}[http://github.com/adzap/tim
|
|
236
236
|
=== US/Euro Formats
|
237
237
|
|
238
238
|
The perennial problem for non-US developers or applications not primarily for the US, is the US date
|
239
|
-
format of m/d/yy. This is ambiguous with the European format of d/m/yy. By default the gem uses the
|
239
|
+
format of m/d/yy. This is can be ambiguous with the European format of d/m/yy. By default the gem uses the
|
240
240
|
US formats as this is the Ruby default
|
241
241
|
when it does date interpretation.
|
242
242
|
|
@@ -250,6 +250,13 @@ You can switch back to US formats with
|
|
250
250
|
|
251
251
|
Timeliness.use_us_formats
|
252
252
|
|
253
|
+
==== Thread Safety
|
254
|
+
|
255
|
+
The switching of formats is threadsafe (since v0.4.0), however for each new thread the format default will be
|
256
|
+
the gem default, being the US format. To control default for your app and each new thread, use the config
|
257
|
+
|
258
|
+
Timeliness.ambiguous_date_format = :euro
|
259
|
+
|
253
260
|
|
254
261
|
=== Customising Formats
|
255
262
|
|
data/lib/timeliness.rb
CHANGED
@@ -2,7 +2,6 @@ require 'date'
|
|
2
2
|
require 'forwardable'
|
3
3
|
|
4
4
|
require 'timeliness/helpers'
|
5
|
-
require 'timeliness/threadsafe_attr'
|
6
5
|
require 'timeliness/definitions'
|
7
6
|
require 'timeliness/format'
|
8
7
|
require 'timeliness/format_set'
|
@@ -14,7 +13,7 @@ module Timeliness
|
|
14
13
|
extend Forwardable
|
15
14
|
def_delegators Parser, :parse, :_parse
|
16
15
|
def_delegators Definitions, :add_formats, :remove_formats, :use_us_formats, :use_euro_formats
|
17
|
-
attr_accessor :default_timezone, :date_for_time_type, :ambiguous_year_threshold
|
16
|
+
attr_accessor :default_timezone, :date_for_time_type, :ambiguous_date_format, :ambiguous_year_threshold
|
18
17
|
end
|
19
18
|
|
20
19
|
# Default timezone. Options:
|
@@ -31,6 +30,12 @@ module Timeliness
|
|
31
30
|
#
|
32
31
|
self.date_for_time_type = lambda { Time.now }
|
33
32
|
|
33
|
+
# Default parsing of ambiguous date formats. Options:
|
34
|
+
# - :us (default, 01/02/2000 = 2nd of January 2000)
|
35
|
+
# - :euro (01/02/2000 = 1st of February 2000)
|
36
|
+
#
|
37
|
+
self.ambiguous_date_format = :us
|
38
|
+
|
34
39
|
# Set the threshold value for a two digit year to be considered last century
|
35
40
|
#
|
36
41
|
# Default: 30
|
@@ -155,9 +155,8 @@ module Timeliness
|
|
155
155
|
DuplicateFormat = Class.new(StandardError)
|
156
156
|
|
157
157
|
class << self
|
158
|
-
extend ThreadsafeAttr
|
159
158
|
attr_accessor :time_formats, :date_formats, :datetime_formats, :format_tokens, :format_components, :timezone_mapping
|
160
|
-
|
159
|
+
attr_reader :time_format_set, :date_format_set, :datetime_format_set
|
161
160
|
|
162
161
|
# Adds new formats. Must specify format type and can specify a :before
|
163
162
|
# option to nominate which format the new formats should be inserted in
|
@@ -191,35 +190,51 @@ module Timeliness
|
|
191
190
|
compile_formats
|
192
191
|
end
|
193
192
|
|
194
|
-
|
193
|
+
def current_date_format=(value)
|
194
|
+
Thread.current["Timeliness.current_date_format"] = value
|
195
|
+
end
|
196
|
+
|
197
|
+
def current_date_format
|
198
|
+
Thread.current["Timeliness.current_date_format"] ||= @current_date_format
|
199
|
+
end
|
200
|
+
|
201
|
+
# Get date format set for using current thread format setting
|
202
|
+
def date_format_set
|
203
|
+
instance_variable_get(:"@#{current_date_format}_date_format_set")
|
204
|
+
end
|
205
|
+
|
206
|
+
# Get datetime format set for using current thread format setting
|
207
|
+
def datetime_format_set
|
208
|
+
instance_variable_get(:"@#{current_date_format}_datetime_format_set")
|
209
|
+
end
|
210
|
+
|
211
|
+
# Use date formats that return ambiguous dates parsed in European format
|
195
212
|
#
|
196
213
|
def use_euro_formats
|
197
|
-
self.
|
198
|
-
self.datetime_format_set = @euro_datetime_format_set
|
214
|
+
self.current_date_format = :euro
|
199
215
|
end
|
200
216
|
|
201
|
-
#
|
217
|
+
# Use date formats that return ambiguous dates parsed as US format
|
202
218
|
#
|
203
219
|
def use_us_formats
|
204
|
-
self.
|
205
|
-
self.datetime_format_set = @us_datetime_format_set
|
220
|
+
self.current_date_format = :us
|
206
221
|
end
|
207
222
|
|
208
223
|
def compile_formats
|
209
|
-
@sorted_token_keys
|
210
|
-
|
224
|
+
@sorted_token_keys = nil
|
225
|
+
@current_date_format = Timeliness.ambiguous_date_format
|
211
226
|
|
227
|
+
self.current_date_format = @current_date_format
|
228
|
+
|
229
|
+
@time_format_set = FormatSet.compile(time_formats)
|
212
230
|
@us_date_format_set = FormatSet.compile(date_formats)
|
213
231
|
@us_datetime_format_set = FormatSet.compile(datetime_formats)
|
214
232
|
@euro_date_format_set = FormatSet.compile(date_formats.select { |format| US_FORMAT_REGEXP !~ format })
|
215
233
|
@euro_datetime_format_set = FormatSet.compile(datetime_formats.select { |format| US_FORMAT_REGEXP !~ format })
|
216
|
-
|
217
|
-
self.date_format_set = @us_date_format_set
|
218
|
-
self.datetime_format_set = @us_datetime_format_set
|
219
234
|
end
|
220
235
|
|
221
236
|
def sorted_token_keys
|
222
|
-
@sorted_token_keys ||= format_tokens.keys.
|
237
|
+
@sorted_token_keys ||= format_tokens.keys.sort_by(&:size).reverse
|
223
238
|
end
|
224
239
|
|
225
240
|
# Returns format for type and other possible matching format set based on type
|
data/lib/timeliness/version.rb
CHANGED
@@ -102,15 +102,25 @@ describe Timeliness::Definitions do
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
|
-
context "
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
threads =
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
threads.each { |t|
|
105
|
+
context "thread safe date format switching" do
|
106
|
+
let(:ambiguous_date) { "01/02/2000" }
|
107
|
+
|
108
|
+
it "should allow indepdent regional format control in current thread" do
|
109
|
+
threads = {
|
110
|
+
euro: Thread.new { Timeliness.use_euro_formats; sleep(0.005); Timeliness.parse(ambiguous_date) },
|
111
|
+
us: Thread.new { sleep(0.001); Timeliness.use_us_formats; Timeliness.parse(ambiguous_date) }
|
112
|
+
}
|
113
|
+
threads.values.each { |t| t.join }
|
114
|
+
|
115
|
+
expect(threads[:euro].value).to eql(Time.new(2000,2,1))
|
116
|
+
expect(threads[:us].value).to eql(Time.new(2000,1,2))
|
117
|
+
end
|
118
|
+
|
119
|
+
it 'should use default regional format in new threads' do
|
120
|
+
thread = Thread.new { sleep(0.001); Timeliness.parse(ambiguous_date) }
|
121
|
+
thread.join
|
122
|
+
|
123
|
+
expect(thread.value).to eql(Time.new(2000,1,2))
|
114
124
|
end
|
115
125
|
end
|
116
126
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: timeliness
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Meehan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -102,7 +102,6 @@ files:
|
|
102
102
|
- lib/timeliness/format_set.rb
|
103
103
|
- lib/timeliness/helpers.rb
|
104
104
|
- lib/timeliness/parser.rb
|
105
|
-
- lib/timeliness/threadsafe_attr.rb
|
106
105
|
- lib/timeliness/version.rb
|
107
106
|
- spec/spec_helper.rb
|
108
107
|
- spec/timeliness/core_ext/string_spec.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module Timeliness
|
2
|
-
module ThreadsafeAttr
|
3
|
-
def threadsafe_attr_accessor(*attrs)
|
4
|
-
attrs.each do |attr|
|
5
|
-
storage_name = "#{name}.#{attr}".freeze
|
6
|
-
reader attr, storage_name
|
7
|
-
writer attr, storage_name
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
def reader(attr, storage_name)
|
13
|
-
define_method(attr) do
|
14
|
-
Thread.current[storage_name]
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def writer(attr, storage_name)
|
19
|
-
define_method("#{attr}=") do |value|
|
20
|
-
Thread.current[storage_name] = value
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|