ziptz 3.0.18 → 4.0.1

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: 0d3cd4dde0a56133d9db0798f044077335652c0dfcf16dbbbf4a09f1a47230bc
4
+ data.tar.gz: 20d18826c8007c4d15b418902cc467bb93e29eddf565f3a1776623dedb481fb7
5
5
  SHA512:
6
- metadata.gz: e12dbe849abc336a65894be858be518433b97b9b9ac2622581534b7da9078de2f10fe21270dfed58cee58bb7a0f2003f40f86d9d3e1dcf662cad952dd2e41e20
7
- data.tar.gz: dd9b487f4a8a868e07c39837732433662879696f12378666d700a69ed561743e47dd5a0bd607b87e381b7abe63ffe6d36ebfba61a7efc848e95fedfd7cf4f0f8
6
+ metadata.gz: b23fb49a49a372b949e6fe31af147999f241a706744654613c576d00c2e9c4f1d65bf50c9d0224089479a6361096a6c77bcd1b54ff21d341365606bcd9db0f95
7
+ data.tar.gz: aff97067607af0b0d3aff3313761cea8e38dbabf89545eeae0b45da826e7aa794dff58245353ec8885d8dfb823242eb99d27196ffe326bf149ef2c6456060d25
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.1'.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,11 @@ 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
61
-
62
- def tzm_data_path
63
- File.join(File.dirname(__FILE__), '..', 'data', 'tzm.data')
49
+ db.get_first_row('select * from zip_codes where zip_code = ? limit 1', zip[0, 5])
64
50
  end
65
51
 
66
52
  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
53
+ File.join(File.dirname(__FILE__), '..', 'data', 'tz.db')
91
54
  end
92
55
  end
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.1
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-04 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