timezone 1.2.4 → 1.2.5

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
  SHA1:
3
- metadata.gz: c3528575f40e59aefc08f078763424fd3f887a74
4
- data.tar.gz: d7ffa64333e9109858fb805d48e2a089f714db77
3
+ metadata.gz: f425df08238312c541ca6f27ec918e93839d3b71
4
+ data.tar.gz: 63d02b58ca7ef733860dfa69c63817ef4813b34c
5
5
  SHA512:
6
- metadata.gz: a59be63bf839ab0cddd7659c89085daba773412240f113af303c1b3c613ffa6b664b015902660be9284bbbb6b7fe4bdde1d3811104bb93793d6c2caec8564fd1
7
- data.tar.gz: b92c0bfa5b17550fb700d4194c2d73875212d2545311c49d19b1e3fd93f108421a3729b35c40b15f50d442cfd994396360da42a754a9230798d7cae84bb98f48
6
+ metadata.gz: d77400308229dfa26cb85efa32d6fdfd3e47b9adaced3bb35e9767e89ce1f7988740355e5bcc2b111169214276d385278bbf39dd0a88e7e4c698ab5b23bf8bbf
7
+ data.tar.gz: db2044e5927331b314654d961e85f77aa6e9883fd48c3fe417690d59415574688c919919cd2f23fb2ef7b3a078fd99eafbc0f8dfc46b7cd097c262a09634270b
@@ -1,5 +1,9 @@
1
1
  # master (unreleased)
2
2
 
3
+ # 1.2.5
4
+
5
+ * Fix [#71](https://github.com/panthomakos/timezone/issues/71): make lookups thread-safe. (panthomakos)
6
+
3
7
  # 1.2.4
4
8
 
5
9
  * Updated with `tzdata-2016j-1`. (panthomakos)
@@ -18,6 +18,8 @@ module Timezone
18
18
  raise(::Timezone::Error::InvalidConfig, 'missing url')
19
19
  end
20
20
 
21
+ config.uri ||= URI.parse("#{config.protocol}://#{config.url}")
22
+
21
23
  @config = config
22
24
  end
23
25
 
@@ -25,7 +27,7 @@ module Timezone
25
27
  #
26
28
  # @return [#get] an instance of a request handler
27
29
  def client
28
- @client ||= config.request_handler.new(config)
30
+ config.request_handler.new(config)
29
31
  end
30
32
 
31
33
  # Returns a timezone name for a given lat, long pair.
@@ -16,8 +16,7 @@ module Timezone
16
16
  #
17
17
  class NetHTTPClient
18
18
  def initialize(config)
19
- uri = URI.parse("#{config.protocol}://#{config.url}")
20
- @http = Net::HTTP.new(uri.host, uri.port)
19
+ @http = Net::HTTP.new(config.uri.host, config.uri.port)
21
20
  @http.open_timeout = config.open_timeout || 5
22
21
  @http.read_timeout = config.read_timeout || 5
23
22
  @http.use_ssl = (config.protocol == 'https'.freeze)
@@ -1,3 +1,3 @@
1
1
  module Timezone
2
- VERSION = '1.2.4'.freeze
2
+ VERSION = '1.2.5'.freeze
3
3
  end
@@ -12,3 +12,13 @@ class HTTPTestClient
12
12
  HTTPTestClient::Response.new(body)
13
13
  end
14
14
  end
15
+
16
+ class HTTPTestClientFactory
17
+ def initialize(body)
18
+ @body = body
19
+ end
20
+
21
+ def new(config)
22
+ HTTPTestClient.new(config).tap { |c| c.body = @body }
23
+ end
24
+ end
@@ -0,0 +1,17 @@
1
+ require 'timezone'
2
+
3
+ # Simple script to validate that lookups are threadsafe.
4
+ #
5
+ # Usage: bundle exec ruby -Ilib test/threadsafe_lookup.rb USERNAME
6
+
7
+ raise 'You must specify a geonames username' unless ARGV.first
8
+
9
+ Timezone::Lookup.config(:geonames) do |c|
10
+ c.username = ARGV.first
11
+ end
12
+
13
+ threads = Array.new(5).map do
14
+ Thread.new { p Timezone.lookup(33.7489954, -84.3879824).name }
15
+ end
16
+
17
+ threads.map(&:join)
@@ -1,11 +1,12 @@
1
1
  require 'timezone/lookup/basic'
2
2
  require 'minitest/autorun'
3
+ require 'ostruct'
3
4
 
4
5
  class BasicLookupTest < ::Minitest::Test
5
6
  parallelize_me!
6
7
 
7
8
  def config
8
- @config ||= Struct.new(:protocol, :url).new('http', 'example.com')
9
+ @config ||= OpenStruct.new(protocol: 'http', url: 'example.com')
9
10
  end
10
11
 
11
12
  def lookup
@@ -17,10 +17,10 @@ class TestGeonames < ::Minitest::Test
17
17
  }
18
18
  end
19
19
 
20
- def lookup(&_block)
20
+ def lookup(body = nil, &_block)
21
21
  config = OpenStruct.new
22
22
  config.username = 'timezone'
23
- config.request_handler = HTTPTestClient
23
+ config.request_handler = HTTPTestClientFactory.new(body)
24
24
  yield config if block_given?
25
25
 
26
26
  Timezone::Lookup::Geonames.new(config)
@@ -38,28 +38,23 @@ class TestGeonames < ::Minitest::Test
38
38
  end
39
39
 
40
40
  def test_lookup
41
- mine = lookup
42
- mine.client.body = File.open(mock_path + '/lat_lon_coords.txt').read
41
+ mine = lookup(File.open(mock_path + '/lat_lon_coords.txt').read)
43
42
 
44
43
  assert_equal 'Australia/Adelaide', mine.lookup(*coordinates)
45
44
  end
46
45
 
47
46
  def test_lookup_with_etc
48
47
  etc_data.each do |key, data|
49
- mine = lookup { |c| c.offset_etc_zones = true }
50
- mine.client.body = File.open(
51
- mock_path + "/lat_lon_coords_#{key}.txt"
52
- ).read
48
+ body = File.open(mock_path + "/lat_lon_coords_#{key}.txt").read
49
+ mine = lookup(body) { |c| c.offset_etc_zones = true }
53
50
 
54
51
  assert_equal data[:name], mine.lookup(*data[:coordinates])
55
52
  end
56
53
  end
57
54
 
58
55
  def test_wrong_offset
59
- mine = lookup { |c| c.offset_etc_zones = true }
60
- mine.client.body = File.open(
61
- mock_path + '/lat_lon_coords_wrong_offset.txt'
62
- ).read
56
+ body = File.open(mock_path + '/lat_lon_coords_wrong_offset.txt').read
57
+ mine = lookup(body) { |c| c.offset_etc_zones = true }
63
58
 
64
59
  assert_nil mine.lookup(*coordinates)
65
60
  end
@@ -83,8 +78,7 @@ class TestGeonames < ::Minitest::Test
83
78
  end
84
79
 
85
80
  def test_api_limit
86
- mine = lookup
87
- mine.client.body = File.open(mock_path + '/api_limit_reached.json').read
81
+ mine = lookup(File.open(mock_path + '/api_limit_reached.json').read)
88
82
 
89
83
  assert_exception(
90
84
  mine,
@@ -94,22 +88,19 @@ class TestGeonames < ::Minitest::Test
94
88
  end
95
89
 
96
90
  def test_invalid_latlong
97
- mine = lookup
98
- mine.client.body = File.open(mock_path + '/invalid_latlong.json').read
91
+ mine = lookup(File.open(mock_path + '/invalid_latlong.json').read)
99
92
 
100
93
  assert_exception(mine, 'invalid lat/lng')
101
94
  end
102
95
 
103
96
  def test_no_result_found
104
- mine = lookup
105
- mine.client.body = File.open(mock_path + '/no_result_found.json').read
97
+ mine = lookup(File.open(mock_path + '/no_result_found.json').read)
106
98
 
107
99
  assert_nil(mine.lookup(10, 10))
108
100
  end
109
101
 
110
102
  def test_invalid_parameter
111
- mine = lookup
112
- mine.client.body = File.open(mock_path + '/invalid_parameter.json').read
103
+ mine = lookup(File.open(mock_path + '/invalid_parameter.json').read)
113
104
 
114
105
  assert_exception(mine, 'error parsing parameter')
115
106
  end
@@ -10,14 +10,12 @@ class TestGoogle < ::Minitest::Test
10
10
  [-34.92771808058, 138.477041423321]
11
11
  end
12
12
 
13
- def config
13
+ def lookup(body = nil, &_block)
14
14
  config = OpenStruct.new
15
- config.request_handler = HTTPTestClient
16
15
  config.api_key = 'MTIzYWJj'
17
- config
18
- end
16
+ config.request_handler = HTTPTestClientFactory.new(body)
17
+ yield config if block_given?
19
18
 
20
- def lookup
21
19
  Timezone::Lookup::Google.new(config)
22
20
  end
23
21
 
@@ -33,15 +31,14 @@ class TestGoogle < ::Minitest::Test
33
31
  end
34
32
 
35
33
  def test_google_using_lat_long_coordinates
36
- mine = lookup
37
- mine.client.body = File.open(mock_path + '/google_lat_lon_coords.txt').read
34
+ mine = lookup(File.open(mock_path + '/google_lat_lon_coords.txt').read)
38
35
 
39
36
  assert_equal 'Australia/Adelaide', mine.lookup(*coordinates)
40
37
  end
41
38
 
42
39
  def test_google_request_denied_read_lat_long_coordinates
43
- mine = lookup
44
- mine.client.body = nil
40
+ mine = lookup(nil)
41
+
45
42
  assert_raises Timezone::Error::Google, 'The provided API key is invalid.' do
46
43
  mine.lookup(*coordinates)
47
44
  end
@@ -61,13 +58,10 @@ class TestGoogle < ::Minitest::Test
61
58
  end
62
59
 
63
60
  def test_url_enterprise
64
- econfig = config
65
- econfig.client_id = '123&asdf'
66
-
67
- enterprise = Timezone::Lookup::Google.new(econfig)
61
+ mine = lookup { |c| c.client_id = '123&asdf' }
68
62
 
69
63
  Timecop.freeze(Time.at(1_433_347_661)) do
70
- result = enterprise.send(:url, '123', '123')
64
+ result = mine.send(:url, '123', '123')
71
65
  params = {
72
66
  'location' => '123%2C123',
73
67
  'timestamp' => '1433347661',
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: timezone
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.4
4
+ version: 1.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pan Thomakos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-07 00:00:00.000000000 Z
11
+ date: 2017-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -708,6 +708,7 @@ files:
708
708
  - test/mocks/lat_lon_coords_wrong_offset.txt
709
709
  - test/mocks/no_result_found.json
710
710
  - test/test_timezone.rb
711
+ - test/threadsafe_lookup.rb
711
712
  - test/timezone/lookup/test_basic.rb
712
713
  - test/timezone/lookup/test_geonames.rb
713
714
  - test/timezone/lookup/test_google.rb
@@ -743,7 +744,7 @@ rubyforge_project: timezone
743
744
  rubygems_version: 2.5.1
744
745
  signing_key:
745
746
  specification_version: 4
746
- summary: timezone-1.2.4
747
+ summary: timezone-1.2.5
747
748
  test_files:
748
749
  - test/data/Helsinki_rules_without_timestamps.json
749
750
  - test/data/asia
@@ -760,6 +761,7 @@ test_files:
760
761
  - test/mocks/lat_lon_coords_wrong_offset.txt
761
762
  - test/mocks/no_result_found.json
762
763
  - test/test_timezone.rb
764
+ - test/threadsafe_lookup.rb
763
765
  - test/timezone/lookup/test_basic.rb
764
766
  - test/timezone/lookup/test_geonames.rb
765
767
  - test/timezone/lookup/test_google.rb
@@ -770,4 +772,3 @@ test_files:
770
772
  - test/timezone/test_mathn_compatibility.rb
771
773
  - test/timezone/test_nil_zone.rb
772
774
  - test/timezone/test_zone.rb
773
- has_rdoc: