timeliness 0.4.2 → 0.4.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 830b2a8f549031529ac5f153c60e80c4f6babae4edfd5e883fc954645f350322
4
- data.tar.gz: 74ed311a9aa4a2da4d995a774e1ee438ee1454708cb25d991dfac30440d4cdcc
3
+ metadata.gz: '09a4713be8da3195a5d92e1cfbd2bfda98f35ff922674fd12339bcecc562e366'
4
+ data.tar.gz: d645f22bed3e99b5e2ebf971304e6f6acc6b657339f3d3d651ea67902258fb24
5
5
  SHA512:
6
- metadata.gz: 66516e7c7cd33f1ef1c030f99a9e0ede74a39091c18d8c039310894a4e9ef7069c3630ac9bb6e2fe2f2b9be1acd68ca17e0036645842f56a489101776417264c
7
- data.tar.gz: a1334464ba03f8c55245ab93ea8d26267900e5af3c2a6b6340d566e7cf59917758526ac2ab9165424568c84a8058932129fecc9a1caa844d2cb067bc0a679fdb
6
+ metadata.gz: 346644804949fc5398084ff04feecca71b6a415908433520932ff7f38985bcf6bb2c8db0dd048f3939286ebdf9d01fab4544ab9c45e5d2a6549984231f0ec329
7
+ data.tar.gz: 39b7862378f626fb7f361769deb81488cd7d5c3c86a61a81dff199ea4b6abc07d29422f64a16e8220085a49fc25c45216259c1e49d5a371533ac4255257fb25f
@@ -1,3 +1,8 @@
1
+ = 0.4.3 - 2019-06-16
2
+ * Fixed `Timeliness.ambiguous_date_format` being used in new threads if custom value set
3
+ * Moved all config from Timeliness to new Configuration class. Delegated all
4
+ old config methods to Timeliness.configuration instance.
5
+
1
6
  = 0.4.2 - 2019-06-15
2
7
  * Fixed thread safe issue that forced you to use one of the date format methods e.g. `use_euro_formats`
3
8
  to initialize the format sets in each new thread. Now a new thread will default to the global default (main thread).
@@ -1,6 +1,7 @@
1
1
  require 'date'
2
2
  require 'forwardable'
3
3
 
4
+ require 'timeliness/configuration'
4
5
  require 'timeliness/helpers'
5
6
  require 'timeliness/definitions'
6
7
  require 'timeliness/format'
@@ -13,38 +14,19 @@ module Timeliness
13
14
  extend Forwardable
14
15
  def_delegators Parser, :parse, :_parse
15
16
  def_delegators Definitions, :add_formats, :remove_formats, :use_us_formats, :use_euro_formats
16
- attr_accessor :default_timezone, :date_for_time_type, :ambiguous_date_format, :ambiguous_year_threshold
17
- end
18
-
19
- # Default timezone. Options:
20
- # - :local (default)
21
- # - :utc
22
- #
23
- # If ActiveSupport loaded, also
24
- # - :current
25
- # - 'Zone name'
26
- #
27
- self.default_timezone = :local
17
+ attr_accessor :configuration
28
18
 
29
- # Set the default date part for a time type values.
30
- #
31
- self.date_for_time_type = lambda { Time.now }
19
+ def_delegators :configuration, :default_timezone, :date_for_time_type, :ambiguous_date_format, :ambiguous_year_threshold
20
+ def_delegators :configuration, :default_timezone=, :date_for_time_type=, :ambiguous_date_format=, :ambiguous_year_threshold=
21
+ end
32
22
 
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
23
+ def self.configuration
24
+ @configuration ||= Configuration.new
25
+ end
38
26
 
39
- # Set the threshold value for a two digit year to be considered last century
40
- #
41
- # Default: 30
42
- #
43
- # Example:
44
- # year = '29' is considered 2029
45
- # year = '30' is considered 1930
46
- #
47
- self.ambiguous_year_threshold = 30
27
+ def self.configure
28
+ yield(configuration)
29
+ end
48
30
  end
49
31
 
50
32
  Timeliness::Definitions.compile_formats
@@ -0,0 +1,40 @@
1
+ module Timeliness
2
+ class Configuration
3
+ # Default timezone. Options:
4
+ # - :local (default)
5
+ # - :utc
6
+ #
7
+ # If ActiveSupport loaded, also
8
+ # - :current
9
+ # - 'Zone name'
10
+ #
11
+ attr_accessor :default_timezone
12
+
13
+ # Set the default date part for a time type values.
14
+ #
15
+ attr_accessor :date_for_time_type
16
+
17
+ # Default parsing of ambiguous date formats. Options:
18
+ # - :us (default, 01/02/2000 = 2nd of January 2000)
19
+ # - :euro (01/02/2000 = 1st of February 2000)
20
+ #
21
+ attr_accessor :ambiguous_date_format
22
+
23
+ # Set the threshold value for a two digit year to be considered last century
24
+ #
25
+ # Default: 30
26
+ #
27
+ # Example:
28
+ # year = '29' is considered 2029
29
+ # year = '30' is considered 1930
30
+ #
31
+ attr_accessor :ambiguous_year_threshold
32
+
33
+ def initialize
34
+ @default_timezone = :local
35
+ @date_for_time_type = lambda { Time.now }
36
+ @ambiguous_date_format = :us
37
+ @ambiguous_year_threshold = 30
38
+ end
39
+ end
40
+ end
@@ -195,15 +195,17 @@ module Timeliness
195
195
  end
196
196
 
197
197
  def current_date_format
198
- Thread.current["Timeliness.current_date_format"] ||= @current_date_format
198
+ Thread.current["Timeliness.current_date_format"] ||= Timeliness.configuration.ambiguous_date_format
199
199
  end
200
200
 
201
201
  # Get date format set for using current thread format setting
202
+ #
202
203
  def date_format_set
203
204
  instance_variable_get(:"@#{current_date_format}_date_format_set")
204
205
  end
205
206
 
206
207
  # Get datetime format set for using current thread format setting
208
+ #
207
209
  def datetime_format_set
208
210
  instance_variable_get(:"@#{current_date_format}_datetime_format_set")
209
211
  end
@@ -222,9 +224,6 @@ module Timeliness
222
224
 
223
225
  def compile_formats
224
226
  @sorted_token_keys = nil
225
- @current_date_format = Timeliness.ambiguous_date_format
226
-
227
- self.current_date_format = @current_date_format
228
227
 
229
228
  @time_format_set = FormatSet.compile(time_formats)
230
229
  @us_date_format_set = FormatSet.compile(date_formats)
@@ -15,7 +15,7 @@ module Timeliness
15
15
  def unambiguous_year(year)
16
16
  if year.length <= 2
17
17
  century = Time.now.year.to_s[0..1].to_i
18
- century -= 1 if year.to_i >= Timeliness.ambiguous_year_threshold
18
+ century -= 1 if year.to_i >= Timeliness.configuration.ambiguous_year_threshold
19
19
  year = "#{century}#{year.rjust(2,'0')}"
20
20
  end
21
21
  year.to_i
@@ -105,7 +105,7 @@ module Timeliness
105
105
  end
106
106
 
107
107
  def shift_time_to_zone(time, zone=nil)
108
- zone ||= Timeliness.default_timezone
108
+ zone ||= Timeliness.configuration.default_timezone
109
109
  case zone
110
110
  when :utc, :local
111
111
  time.send("get#{zone}")
@@ -117,7 +117,7 @@ module Timeliness
117
117
  end
118
118
 
119
119
  def create_time_in_zone(time_array, zone=nil)
120
- zone ||= Timeliness.default_timezone
120
+ zone ||= Timeliness.configuration.default_timezone
121
121
  case zone
122
122
  when :utc, :local
123
123
  time_with_datetime_fallback(zone, *time_array)
@@ -153,11 +153,13 @@ module Timeliness
153
153
  end
154
154
 
155
155
  def evaluate_date_for_time_type
156
- case Timeliness.date_for_time_type
156
+ date_for_time_type = Timeliness.configuration.date_for_time_type
157
+
158
+ case date_for_time_type
157
159
  when Array
158
- Timeliness.date_for_time_type
160
+ date_for_time_type
159
161
  when Proc
160
- v = Timeliness.date_for_time_type.call
162
+ v = date_for_time_type.call
161
163
  [v.year, v.month, v.day]
162
164
  end
163
165
  end
@@ -1,3 +1,3 @@
1
1
  module Timeliness
2
- VERSION = '0.4.2'
2
+ VERSION = '0.4.3'
3
3
  end
@@ -1,5 +1,4 @@
1
1
  describe Timeliness::Definitions do
2
-
3
2
  context "add_formats" do
4
3
  before do
5
4
  @default_formats = definitions.time_formats.dup
@@ -102,10 +101,16 @@ describe Timeliness::Definitions do
102
101
  end
103
102
  end
104
103
 
105
- context "thread safe date format switching" do
104
+ context "thread safe ambiguous date format switching" do
106
105
  let(:ambiguous_date) { "01/02/2000" }
107
106
 
108
- it "should allow indepdent regional format control in current thread" do
107
+ around do |example|
108
+ Timeliness::Definitions.compile_formats
109
+ example.call
110
+ Timeliness::Definitions.compile_formats
111
+ end
112
+
113
+ it "should allow independent control in current thread" do
109
114
  threads = {
110
115
  euro: Thread.new { Timeliness.use_euro_formats; sleep(0.005); Timeliness.parse(ambiguous_date) },
111
116
  us: Thread.new { sleep(0.001); Timeliness.use_us_formats; Timeliness.parse(ambiguous_date) }
@@ -116,11 +121,13 @@ describe Timeliness::Definitions do
116
121
  expect(threads[:us].value).to eql(Time.new(2000,1,2))
117
122
  end
118
123
 
119
- it 'should use default regional format in new threads' do
124
+ it 'should use default format in new threads' do
125
+ Timeliness.configuration.ambiguous_date_format = :euro
126
+
120
127
  thread = Thread.new { sleep(0.001); Timeliness.parse(ambiguous_date) }
121
128
  thread.join
122
129
 
123
- expect(thread.value).to eql(Time.new(2000,1,2))
130
+ expect(thread.value).to eql(Time.new(2000,2,1))
124
131
  end
125
132
  end
126
133
  end
@@ -1,19 +1,17 @@
1
1
  describe Timeliness::Parser do
2
- around(:all) do |example|
3
- current_default = Timeliness.default_timezone
4
- current_zone = Time.zone
5
- example.call
6
- Time.zone = current_zone
7
- Timeliness.default_timezone = current_default
8
- end
9
-
10
2
  def self.timezone_settings(zone: nil, output: nil)
11
3
  before do
12
4
  Time.zone = zone if zone
13
- Timeliness.default_timezone = output if output
5
+ Timeliness.configuration.default_timezone = output if output
14
6
  end
15
7
  end
16
8
 
9
+ around(:all) do |example|
10
+ current_zone = Time.zone
11
+ example.call
12
+ Time.zone = current_zone
13
+ end
14
+
17
15
  before(:all) do
18
16
  Timecop.freeze(2010,1,1,0,0,0)
19
17
  end
@@ -121,22 +119,25 @@ describe Timeliness::Parser do
121
119
  timezone_settings zone: 'Australia/Melbourne'
122
120
 
123
121
  it 'should return value using string zone adjusted to default :local timezone' do
124
- Timeliness.default_timezone = :local
122
+ Timeliness.configuration.default_timezone = :local
123
+
125
124
  value = parse("Thu, 01 Jun 2000 03:00:00 MST")
126
125
  expect(value).to eq Time.utc(2000,6,1,10,0,0).getlocal
127
126
  expect(value.utc_offset).to eq Time.mktime(2000, 6, 1, 10, 0, 0).utc_offset
128
127
  end
129
128
 
130
129
  it 'should return value using string zone adjusted to default :current timezone' do
131
- Timeliness.default_timezone = :current
130
+ Timeliness.configuration.default_timezone = :current
132
131
  Time.zone = 'Adelaide'
132
+
133
133
  value = parse("Thu, 01 Jun 2000 03:00:00 MST")
134
134
  expect(value).to eq Time.zone.local(2000,6,1,19,30,0)
135
135
  expect(value.utc_offset).to eq 9.5.hours
136
136
  end
137
137
 
138
138
  it 'should return value using string zone adjusted to :zone option string timezone' do
139
- Timeliness.default_timezone = :local
139
+ Timeliness.configuration.default_timezone = :local
140
+
140
141
  value = parse("Thu, 01 Jun 2000 03:00:00 MST", :zone => 'Perth')
141
142
  expect(value).to eq Time.use_zone('Perth') { Time.zone.local(2000,6,1,18,0,0) }
142
143
  expect(value.utc_offset).to eq 8.hours
@@ -147,7 +148,7 @@ describe Timeliness::Parser do
147
148
  timezone_settings zone: 'Australia/Melbourne'
148
149
 
149
150
  it 'should return value using string zone adjusted to default :current timezone' do
150
- Timeliness.default_timezone = :current
151
+ Timeliness.configuration.default_timezone = :current
151
152
 
152
153
  value = parse("2000-06-01T12:00:00Z")
153
154
  expect(value).to eq Time.zone.local(2000,6,1,22,0,0)
@@ -276,22 +277,16 @@ describe Timeliness::Parser do
276
277
 
277
278
  context "for time type" do
278
279
  context "with date from date_for_time_type" do
279
- before do
280
- @original = Timeliness.date_for_time_type
281
- end
282
-
283
280
  it 'should return date array' do
284
- Timeliness.date_for_time_type = [2010,1,1]
281
+ Timeliness.configuration.date_for_time_type = [2010,1,1]
282
+
285
283
  expect(parse('12:13:14', :time)).to eq Time.local(2010,1,1,12,13,14)
286
284
  end
287
285
 
288
286
  it 'should return date array evaluated lambda' do
289
- Timeliness.date_for_time_type = lambda { Time.local(2010,2,1) }
290
- expect(parse('12:13:14', :time)).to eq Time.local(2010,2,1,12,13,14)
291
- end
287
+ Timeliness.configuration.date_for_time_type = lambda { Time.local(2010,2,1) }
292
288
 
293
- after do
294
- Timeliness.date_for_time_type = @original
289
+ expect(parse('12:13:14', :time)).to eq Time.local(2010,2,1,12,13,14)
295
290
  end
296
291
  end
297
292
 
@@ -303,7 +298,6 @@ describe Timeliness::Parser do
303
298
 
304
299
  context "with :zone option" do
305
300
  before(:all) do
306
- Timecop.return
307
301
  @current_tz = ENV['TZ']
308
302
  ENV['TZ'] = 'Australia/Melbourne'
309
303
  Timecop.freeze(2010,1,1,0,0,0)
@@ -317,7 +311,6 @@ describe Timeliness::Parser do
317
311
  end
318
312
 
319
313
  after(:all) do
320
- Timecop.return
321
314
  ENV['TZ'] = @current_tz
322
315
  Timecop.freeze(2010,1,1,0,0,0)
323
316
  end
@@ -442,13 +435,12 @@ describe Timeliness::Parser do
442
435
  end
443
436
 
444
437
  it "should allow custom threshold" do
445
- default = Timeliness.ambiguous_year_threshold
446
- Timeliness.ambiguous_year_threshold = 40
438
+ Timeliness.configuration.ambiguous_year_threshold = 40
439
+
447
440
  time_array = parser._parse('01-02-39', :date)
448
441
  expect(time_array).to eq [2039,2,1,nil,nil,nil,nil,nil]
449
442
  time_array = parser._parse('01-02-40', :date)
450
443
  expect(time_array).to eq [1940,2,1,nil,nil,nil,nil,nil]
451
- Timeliness.ambiguous_year_threshold = default
452
444
  end
453
445
  end
454
446
  end
@@ -476,7 +468,8 @@ describe Timeliness::Parser do
476
468
 
477
469
  context "default timezone" do
478
470
  it "should be used if no zone value" do
479
- Timeliness.default_timezone = :utc
471
+ Timeliness.configuration.default_timezone = :utc
472
+
480
473
  time = parser.make_time([2000,6,1,12,0,0])
481
474
  expect(time.utc_offset).to eq 0
482
475
  end
@@ -518,7 +511,7 @@ describe Timeliness::Parser do
518
511
 
519
512
  context "with no options" do
520
513
  it 'should return date_for_time_type values with no options' do
521
- dummy_date = Timeliness.date_for_time_type.call
514
+ dummy_date = Timeliness.configuration.date_for_time_type.call
522
515
  expect(current_date).to eq [ dummy_date.year, dummy_date.month, dummy_date.day ]
523
516
  end
524
517
  end
@@ -34,4 +34,8 @@ I18n.available_locales = ['en', 'es']
34
34
  RSpec.configure do |c|
35
35
  c.mock_with :rspec
36
36
  c.include TimelinessHelpers
37
+
38
+ c.after do
39
+ Timeliness.configuration = Timeliness::Configuration.new
40
+ end
37
41
  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.2
4
+ version: 0.4.3
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-15 00:00:00.000000000 Z
11
+ date: 2019-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -95,6 +95,7 @@ files:
95
95
  - Rakefile
96
96
  - benchmark.rb
97
97
  - lib/timeliness.rb
98
+ - lib/timeliness/configuration.rb
98
99
  - lib/timeliness/core_ext.rb
99
100
  - lib/timeliness/core_ext/string.rb
100
101
  - lib/timeliness/definitions.rb