ziptz 3.0.18 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8584f30a48d305cf57165059fdf89bc90ff1169b540b07e4810dd08facf3bb76
4
- data.tar.gz: 974d31d4c7ab3f17e7e5bf86d875eca5b29f9d44087a09ae9b83c4694fd68945
3
+ metadata.gz: e372363dfe77796f0e34f2c5a84e8cb534a023be513ddef02e06ac9996bf0f45
4
+ data.tar.gz: bb831c06249d4074173c82f78509c6abfd03aa04795c5379d9ef306f1bcec496
5
5
  SHA512:
6
- metadata.gz: e12dbe849abc336a65894be858be518433b97b9b9ac2622581534b7da9078de2f10fe21270dfed58cee58bb7a0f2003f40f86d9d3e1dcf662cad952dd2e41e20
7
- data.tar.gz: dd9b487f4a8a868e07c39837732433662879696f12378666d700a69ed561743e47dd5a0bd607b87e381b7abe63ffe6d36ebfba61a7efc848e95fedfd7cf4f0f8
6
+ metadata.gz: a71f7908c800eab26541917afcbe734872482b4b1578243efb8c17b69dcae8b3f53fc2d89049fd48c1adac5452185a19bf4ab8efc70fab07f97b59b8262fd89e
7
+ data.tar.gz: e7c151febd3365c5a5842363b993083d0971f58bbf6b3839b8aa7614f56c602265e866bfe04ca4712621ad79e76b1ee29ff70264ef4ff7a1879790ef18639df6
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  Get time zone, daylight saving time, and base offset for any US ZIP code.
8
8
 
9
- <i>ZIP codes are up to date as of <b>July 2023</b>.</i>
9
+ <i>ZIP codes are up to date as of <b>December 2023</b>.</i>
10
10
 
11
11
  ## Compatibility
12
12
 
data/data/tz.data CHANGED
Binary file
data/data/tz.db ADDED
Binary file
data/lib/version.rb ADDED
@@ -0,0 +1,3 @@
1
+ class Ziptz
2
+ VERSION = '4.0.2'.freeze
3
+ end
data/lib/ziptz.rb CHANGED
@@ -1,37 +1,42 @@
1
- require 'yaml'
2
- require 'zlib'
1
+ require 'sqlite3'
2
+ require 'version'
3
3
 
4
4
  class Ziptz
5
- VERSION = '3.0.18'.freeze
6
-
7
5
  def self.instance
8
6
  @instance ||= new
9
7
  end
10
8
 
11
- def time_zone_name(zip)
12
- tz_info = time_zone_info(zip)
13
- return unless tz_info
9
+ def db
10
+ @db ||= begin
11
+ db = SQLite3::Database.open(tz_data_path)
12
+ db.results_as_hash = true
13
+ db
14
+ end
15
+ end
14
16
 
15
- tz_info[:tz]
17
+ def time_zone_name(zip)
18
+ time_zone_info(zip)&.dig('time_zone')
16
19
  end
17
20
 
18
21
  def time_zone_offset(zip)
19
- tz_info = time_zone_info(zip)
20
- return unless tz_info
21
-
22
- tzm_info = tzm[tz_info[:tz]]
23
- tzm_info[:offset] && tzm_info[:offset].to_i
22
+ time_zone_info(zip)&.dig('offset')
24
23
  end
25
24
 
26
25
  def time_zone_uses_dst?(zip)
27
26
  tz_info = time_zone_info(zip)
28
27
  return unless tz_info
29
28
 
30
- tz_info[:dst]
29
+ tz_info['observes_dst'] == 1
31
30
  end
32
31
 
33
32
  def zips(tz_name)
34
- tz.select { |_, v| v[:tz].downcase == tz_name.downcase }.keys
33
+ sql = <<-SQL
34
+ select zip_code
35
+ from zip_codes
36
+ where time_zone = ?
37
+ order by zip_code
38
+ SQL
39
+ db.execute(sql, tz_name).map { |row| row['zip_code'] }
35
40
  end
36
41
 
37
42
  def inspect
@@ -40,53 +45,13 @@ class Ziptz
40
45
 
41
46
  protected
42
47
 
43
- def tzm
44
- @tzm ||= load_tzm_data
45
- end
46
-
47
- def lazy_tz
48
- @lazy_tz ||= lazy_load_tz_data
49
- end
50
-
51
- def tz
52
- @tz ||= load_tz_data
53
- end
54
-
55
48
  def time_zone_info(zip)
56
- if (data = lazy_tz[zip.to_s.slice(0, 5)])
57
- _, tz, dst = data.strip.split('|')
58
- {tz: tz, dst: dst == '1'}
59
- end
60
- end
49
+ return unless zip
61
50
 
62
- def tzm_data_path
63
- File.join(File.dirname(__FILE__), '..', 'data', 'tzm.data')
51
+ db.get_first_row('select * from zip_codes where zip_code = ? limit 1', zip[0, 5])
64
52
  end
65
53
 
66
54
  def tz_data_path
67
- File.join(File.dirname(__FILE__), '..', 'data', 'tz.data')
68
- end
69
-
70
- def lazy_load_tz_data
71
- uncompressed = Zlib::Inflate.inflate(File.read(tz_data_path, encoding: 'ASCII-8BIT'))
72
- uncompressed.each_line.with_object({}) do |line, data|
73
- data[line.slice(0, 5)] = line
74
- end
75
- end
76
-
77
- def load_tz_data
78
- uncompressed = Zlib::Inflate.inflate(File.read(tz_data_path, encoding: 'ASCII-8BIT'))
79
- uncompressed.each_line.with_object({}) do |line, data|
80
- zip, tz, dst = line.strip.split('|')
81
- data[zip] = {tz: tz, dst: dst == '1'}
82
- end
83
- end
84
-
85
- def load_tzm_data
86
- uncompressed = Zlib::Inflate.inflate(File.read(tzm_data_path, encoding: 'ASCII-8BIT'))
87
- uncompressed.each_line.with_object({}) do |line, data|
88
- tz, offset = line.strip.split('|')
89
- data[tz] = {offset: offset}
90
- end
55
+ File.join(File.dirname(__FILE__), '..', 'data', 'tz.db')
91
56
  end
92
57
  end
data/spec/ziptz_spec.rb CHANGED
@@ -27,6 +27,12 @@ RSpec.describe Ziptz do
27
27
  expect(ziptz.time_zone_name('xyz')).to be_nil
28
28
  end
29
29
  end
30
+
31
+ context 'when nil is passed' do
32
+ it 'returns nil' do
33
+ expect(ziptz.time_zone_name(nil)).to be_nil
34
+ end
35
+ end
30
36
  end
31
37
 
32
38
  describe '#time_zone_name' do
data/ziptz.gemspec CHANGED
@@ -1,4 +1,6 @@
1
- require File.expand_path('lib/ziptz')
1
+ lib = File.expand_path('lib', __dir__)
2
+ $LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
3
+ require 'version'
2
4
 
3
5
  Gem::Specification.new do |s|
4
6
  s.name = 'ziptz'
@@ -17,4 +19,5 @@ Gem::Specification.new do |s|
17
19
  s.require_paths = ['lib']
18
20
  s.required_ruby_version = '>= 2.0.0'
19
21
  s.metadata['rubygems_mfa_required'] = 'true'
22
+ s.add_dependency 'sqlite3', '~> 1.6'
20
23
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ziptz
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.18
4
+ version: 4.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Keith Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-02 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2023-12-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: sqlite3
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
13
27
  description: Get timezone info for all 5-digit US zip codes
14
28
  email: keithm@infused.org
15
29
  executables: []
@@ -21,7 +35,9 @@ files:
21
35
  - LICENSE
22
36
  - README.md
23
37
  - data/tz.data
38
+ - data/tz.db
24
39
  - data/tzm.data
40
+ - lib/version.rb
25
41
  - lib/ziptz.rb
26
42
  - spec/spec_helper.rb
27
43
  - spec/ziptz_spec.rb
@@ -47,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
47
63
  - !ruby/object:Gem::Version
48
64
  version: '0'
49
65
  requirements: []
50
- rubygems_version: 3.4.10
66
+ rubygems_version: 3.4.21
51
67
  signing_key:
52
68
  specification_version: 4
53
69
  summary: TimeZone info for any 5-digit US zip code