ziptz 3.0.18 → 5.0.0

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: 9f1ff0d267b6ba06ee70a99186cd14f8684744f4fd243f56d9b7150117f26cc0
4
+ data.tar.gz: 407d339f02d80651adc97150bccb8e85cac844f948f3e9e7c2d348e110dfc20c
5
5
  SHA512:
6
- metadata.gz: e12dbe849abc336a65894be858be518433b97b9b9ac2622581534b7da9078de2f10fe21270dfed58cee58bb7a0f2003f40f86d9d3e1dcf662cad952dd2e41e20
7
- data.tar.gz: dd9b487f4a8a868e07c39837732433662879696f12378666d700a69ed561743e47dd5a0bd607b87e381b7abe63ffe6d36ebfba61a7efc848e95fedfd7cf4f0f8
6
+ metadata.gz: 4724ab134a22f108612b724339343a16f78bfcdad477f378bf6e30154cdb9e2470a6f95964dbabbbfa874253df215a88e93adba6a0e0bcb8a4bc4f6b88eb2e68
7
+ data.tar.gz: 69242029d2511543b28068cc0045f4de2ee00b00458a834dbcd810b736d75090f8c1fa74e8156f124a4857059b93d4f6ba15174e75d2340aa458062821a089df
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2015-2023 Keith Morrison <keithm@infused.org>
1
+ Copyright (c) 2015-2024 Keith Morrison <keithm@infused.org>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -6,13 +6,13 @@
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
 
13
13
  Ziptz is tested to work with the following versions of Ruby:
14
14
 
15
- * Ruby 2.3.x, 2.4.x, 2.5.x, 2.6.x, 2.7.x, 3.x
15
+ * Ruby 3.1.x, 3.2.x, 3.3.x
16
16
 
17
17
  ## Installation
18
18
 
@@ -160,7 +160,7 @@ Time zone names now reflect standard tz-database names.
160
160
 
161
161
  ## License
162
162
 
163
- Copyright (c) 2015-2023 Keith Morrison <<keithm@infused.org>>
163
+ Copyright (c) 2015-2024 Keith Morrison <<keithm@infused.org>>
164
164
 
165
165
  Permission is hereby granted, free of charge, to any person
166
166
  obtaining a copy of this software and associated documentation
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 = '5.0.0'.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
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe Ziptz do
4
- let(:ziptz) { Ziptz.new }
4
+ let(:ziptz) { described_class.new }
5
5
 
6
6
  describe 'when inspected' do
7
7
  it 'does not show internal instance variables' do
@@ -27,39 +27,35 @@ RSpec.describe Ziptz do
27
27
  expect(ziptz.time_zone_name('xyz')).to be_nil
28
28
  end
29
29
  end
30
- end
31
-
32
- describe '#time_zone_name' do
33
- context 'when given a 5-digit zipcode' do
34
- it 'returns the time zone number' do
35
- expect(ziptz.time_zone_name('97034')).to eq 'America/Los_Angeles'
36
- end
37
- end
38
-
39
- context 'when given a 9-digit zipcode' do
40
- it 'returns the time zone number' do
41
- expect(ziptz.time_zone_name('97034-1234')).to eq 'America/Los_Angeles'
42
- end
43
- end
44
30
 
45
- context 'when there is no matching zipcode' do
31
+ context 'when nil is passed' do
46
32
  it 'returns nil' do
47
- expect(ziptz.time_zone_name('xyz')).to be_nil
33
+ expect(ziptz.time_zone_name(nil)).to be_nil
48
34
  end
49
35
  end
50
36
  end
51
37
 
52
38
  describe '#time_zone_uses_dst?' do
53
- context 'when given a 5-digit zipcode' do
54
- it 'returns a boolean' do
39
+ context 'when given a valid 5-digit zipcode' do
40
+ it 'returns true' do
55
41
  expect(ziptz.time_zone_uses_dst?('97034')).to eq true
42
+ end
43
+ end
44
+
45
+ context 'when given an invalid 5-digit zipcode' do
46
+ it 'returns false' do
56
47
  expect(ziptz.time_zone_uses_dst?('85004')).to eq false
57
48
  end
58
49
  end
59
50
 
60
- context 'when given a 9-digit zipcode' do
61
- it 'returns a boolean' do
51
+ context 'when given a valid 9-digit zipcode' do
52
+ it 'returns a true' do
62
53
  expect(ziptz.time_zone_uses_dst?('97034-1234')).to eq true
54
+ end
55
+ end
56
+
57
+ context 'when given an invalid 9-digit zipcode' do
58
+ it 'returns false' do
63
59
  expect(ziptz.time_zone_uses_dst?('85004-1234')).to eq false
64
60
  end
65
61
  end
@@ -74,13 +70,13 @@ RSpec.describe Ziptz do
74
70
  describe '#time_zone_offset' do
75
71
  context 'when given a 5-digit zipcode' do
76
72
  it 'returns the time zone number' do
77
- expect(ziptz.time_zone_offset('97034')).to eq(-28800)
73
+ expect(ziptz.time_zone_offset('97034')).to eq(-28_800)
78
74
  end
79
75
  end
80
76
 
81
77
  context 'when given a 9-digit zipcode' do
82
78
  it 'returns the time zone number' do
83
- expect(ziptz.time_zone_offset('97034-1234')).to eq(-28800)
79
+ expect(ziptz.time_zone_offset('97034-1234')).to eq(-28_800)
84
80
  end
85
81
  end
86
82
 
@@ -110,13 +106,13 @@ RSpec.describe Ziptz do
110
106
  describe '#instance' do
111
107
  context 'when given a 5 digit zip code' do
112
108
  it 'matches the behavior of Ziptz.new' do
113
- expect(Ziptz.instance.time_zone_name('97034')).to eq ziptz.time_zone_name('97034')
109
+ expect(described_class.instance.time_zone_name('97034')).to eq ziptz.time_zone_name('97034')
114
110
  end
115
111
  end
116
112
 
117
113
  context 'when called twice' do
118
114
  it 'returns identical instances' do
119
- expect(Ziptz.instance.object_id).to eq Ziptz.instance.object_id
115
+ expect(described_class.instance.object_id).to eq described_class.instance.object_id
120
116
  end
121
117
  end
122
118
  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'
@@ -15,6 +17,7 @@ Gem::Specification.new do |s|
15
17
  s.extra_rdoc_files = ['README.md', 'LICENSE']
16
18
  s.files = Dir['README.md', 'LICENSE', '{data,lib,spec}/**/*', 'ziptz.gemspec']
17
19
  s.require_paths = ['lib']
18
- s.required_ruby_version = '>= 2.0.0'
20
+ s.required_ruby_version = '>= 3.1.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: 5.0.0
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-28 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
@@ -40,14 +56,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
40
56
  requirements:
41
57
  - - ">="
42
58
  - !ruby/object:Gem::Version
43
- version: 2.0.0
59
+ version: 3.1.0
44
60
  required_rubygems_version: !ruby/object:Gem::Requirement
45
61
  requirements:
46
62
  - - ">="
47
63
  - !ruby/object:Gem::Version
48
64
  version: '0'
49
65
  requirements: []
50
- rubygems_version: 3.4.10
66
+ rubygems_version: 3.5.3
51
67
  signing_key:
52
68
  specification_version: 4
53
69
  summary: TimeZone info for any 5-digit US zip code