sales_tax 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/Gemfile.lock +4 -2
- data/data/taxrates_download_list.txt +52 -52
- data/lib/sales_tax/auto_load.rb +8 -0
- data/lib/sales_tax/base.rb +1 -0
- data/lib/sales_tax/rate.rb +13 -0
- data/lib/sales_tax/rate_store.rb +64 -20
- data/lib/sales_tax/version.rb +1 -1
- data/sales_tax.gemspec +1 -0
- data/spec/auto_load_spec.rb +5 -2
- data/spec/rate_spec.rb +21 -0
- metadata +19 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbad4bbfa399606b9c598db327b0a2f5bdff3ce1
|
4
|
+
data.tar.gz: 3cb3336419e6ad5b3dfcaaef63331341be88eb8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51f7e0e5895249dfb2fa08593bf26dfdb24cbecf1102d16977476b1fd567a76ceebafe889ffe9d4e5418ad0070dbeba89413eae3664ac44095331f6f3d69a02a
|
7
|
+
data.tar.gz: f79f8d920ca1beba70903a1f052d67f3573e09a1970f1ad8e80f8823c1eb2e807bf2eccd61794f694f747eb81b94c9cfc66ec45d31f0592745d29a850927cd13
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.4.0
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sales_tax (0.
|
4
|
+
sales_tax (0.2.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -21,6 +21,7 @@ GEM
|
|
21
21
|
diff-lcs (>= 1.2.0, < 2.0)
|
22
22
|
rspec-support (~> 3.4.0)
|
23
23
|
rspec-support (3.4.1)
|
24
|
+
ruby-prof (0.15.9)
|
24
25
|
|
25
26
|
PLATFORMS
|
26
27
|
ruby
|
@@ -29,7 +30,8 @@ DEPENDENCIES
|
|
29
30
|
bundler (~> 1.10)
|
30
31
|
rake (~> 10.4.2)
|
31
32
|
rspec (~> 3.4.0)
|
33
|
+
ruby-prof (~> 0.15.9)
|
32
34
|
sales_tax!
|
33
35
|
|
34
36
|
BUNDLED WITH
|
35
|
-
1.
|
37
|
+
1.13.6
|
@@ -1,55 +1,55 @@
|
|
1
1
|
# This is a list of public CSV URLs from:
|
2
2
|
# http://www.taxrates.com/download-tax-tables/
|
3
3
|
|
4
|
-
http://taxrates.csv.s3.amazonaws.com/
|
5
|
-
http://taxrates.csv.s3.amazonaws.com/
|
6
|
-
http://taxrates.csv.s3.amazonaws.com/
|
7
|
-
http://taxrates.csv.s3.amazonaws.com/
|
8
|
-
http://taxrates.csv.s3.amazonaws.com/
|
9
|
-
http://taxrates.csv.s3.amazonaws.com/
|
10
|
-
http://taxrates.csv.s3.amazonaws.com/
|
11
|
-
http://taxrates.csv.s3.amazonaws.com/
|
12
|
-
http://taxrates.csv.s3.amazonaws.com/
|
13
|
-
http://taxrates.csv.s3.amazonaws.com/
|
14
|
-
http://taxrates.csv.s3.amazonaws.com/
|
15
|
-
http://taxrates.csv.s3.amazonaws.com/
|
16
|
-
http://taxrates.csv.s3.amazonaws.com/
|
17
|
-
http://taxrates.csv.s3.amazonaws.com/
|
18
|
-
http://taxrates.csv.s3.amazonaws.com/
|
19
|
-
http://taxrates.csv.s3.amazonaws.com/
|
20
|
-
http://taxrates.csv.s3.amazonaws.com/
|
21
|
-
http://taxrates.csv.s3.amazonaws.com/
|
22
|
-
http://taxrates.csv.s3.amazonaws.com/
|
23
|
-
http://taxrates.csv.s3.amazonaws.com/
|
24
|
-
http://taxrates.csv.s3.amazonaws.com/
|
25
|
-
http://taxrates.csv.s3.amazonaws.com/
|
26
|
-
http://taxrates.csv.s3.amazonaws.com/
|
27
|
-
http://taxrates.csv.s3.amazonaws.com/
|
28
|
-
http://taxrates.csv.s3.amazonaws.com/
|
29
|
-
http://taxrates.csv.s3.amazonaws.com/
|
30
|
-
http://taxrates.csv.s3.amazonaws.com/
|
31
|
-
http://taxrates.csv.s3.amazonaws.com/
|
32
|
-
http://taxrates.csv.s3.amazonaws.com/
|
33
|
-
http://taxrates.csv.s3.amazonaws.com/
|
34
|
-
http://taxrates.csv.s3.amazonaws.com/
|
35
|
-
http://taxrates.csv.s3.amazonaws.com/
|
36
|
-
http://taxrates.csv.s3.amazonaws.com/
|
37
|
-
http://taxrates.csv.s3.amazonaws.com/
|
38
|
-
http://taxrates.csv.s3.amazonaws.com/
|
39
|
-
http://taxrates.csv.s3.amazonaws.com/
|
40
|
-
http://taxrates.csv.s3.amazonaws.com/
|
41
|
-
http://taxrates.csv.s3.amazonaws.com/
|
42
|
-
http://taxrates.csv.s3.amazonaws.com/
|
43
|
-
http://taxrates.csv.s3.amazonaws.com/
|
44
|
-
http://taxrates.csv.s3.amazonaws.com/
|
45
|
-
http://taxrates.csv.s3.amazonaws.com/
|
46
|
-
http://taxrates.csv.s3.amazonaws.com/
|
47
|
-
http://taxrates.csv.s3.amazonaws.com/
|
48
|
-
http://taxrates.csv.s3.amazonaws.com/
|
49
|
-
http://taxrates.csv.s3.amazonaws.com/
|
50
|
-
http://taxrates.csv.s3.amazonaws.com/
|
51
|
-
http://taxrates.csv.s3.amazonaws.com/
|
52
|
-
http://taxrates.csv.s3.amazonaws.com/
|
53
|
-
http://taxrates.csv.s3.amazonaws.com/
|
54
|
-
http://taxrates.csv.s3.amazonaws.com/
|
55
|
-
http://taxrates.csv.s3.amazonaws.com/
|
4
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_AL201702.csv
|
5
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_AK201702.csv
|
6
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_AZ201702.csv
|
7
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_AR201702.csv
|
8
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_CA201702.csv
|
9
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_CO201702.csv
|
10
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_CT201702.csv
|
11
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_DE201702.csv
|
12
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_FL201702.csv
|
13
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_GA201702.csv
|
14
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_HI201702.csv
|
15
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_ID201702.csv
|
16
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_IL201702.csv
|
17
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_WV201702.csv
|
18
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_VA201702.csv
|
19
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_TX201702.csv
|
20
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_SC201702.csv
|
21
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_PA201702.csv
|
22
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_OH201702.csv
|
23
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NY201702.csv
|
24
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NH201702.csv
|
25
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MT201702.csv
|
26
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MN201702.csv
|
27
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MD201702.csv
|
28
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_KY201702.csv
|
29
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_IN201702.csv
|
30
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_IA201702.csv
|
31
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_LA201702.csv
|
32
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MA201702.csv
|
33
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MS201702.csv
|
34
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NE201702.csv
|
35
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NJ201702.csv
|
36
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NC201702.csv
|
37
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_OK201702.csv
|
38
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_PR201702.csv
|
39
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_SD201702.csv
|
40
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_UT201702.csv
|
41
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_WA201702.csv
|
42
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_WI201702.csv
|
43
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_WY201702.csv
|
44
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_DC201702.csv
|
45
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_VT201702.csv
|
46
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_TN201702.csv
|
47
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_RI201702.csv
|
48
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_OR201702.csv
|
49
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_ND201702.csv
|
50
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NM201702.csv
|
51
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NV201702.csv
|
52
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MO201702.csv
|
53
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MI201702.csv
|
54
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_ME201702.csv
|
55
|
+
http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_KS201702.csv
|
data/lib/sales_tax/auto_load.rb
CHANGED
data/lib/sales_tax/base.rb
CHANGED
data/lib/sales_tax/rate_store.rb
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
require 'csv'
|
2
|
-
|
3
1
|
module SalesTax
|
4
|
-
Rate = Struct.new(:region_name, :region_code, :combined_rate, :state_rate, :county_rate, :city_rate, :special_rate)
|
5
|
-
|
6
2
|
class RateStore
|
7
3
|
def initialize
|
8
4
|
# Map of 5-digit US zip code to `Rate` instances
|
@@ -17,25 +13,73 @@ module SalesTax
|
|
17
13
|
@data[zip_code.to_s]
|
18
14
|
end
|
19
15
|
|
20
|
-
FIELDS_MAP = [
|
21
|
-
['TaxRegionName' , :to_s],
|
22
|
-
['TaxRegionCode' , :to_s],
|
23
|
-
['CombinedRate' , :to_f],
|
24
|
-
['StateRate' , :to_f],
|
25
|
-
['CountyRate' , :to_f],
|
26
|
-
['CityRate' , :to_f],
|
27
|
-
['SpecialRate' , :to_f],
|
28
|
-
]
|
29
|
-
|
30
16
|
def load_csv_file(path)
|
31
|
-
|
32
|
-
|
17
|
+
rows = File.read(path)
|
18
|
+
.split("\n")
|
19
|
+
.map { |row| row.split ',' }
|
20
|
+
|
21
|
+
rows.shift # Shift the header row off the front
|
22
|
+
|
23
|
+
if path.include? '2016'
|
24
|
+
load_2016_rows rows
|
25
|
+
elsif path.include? '2017'
|
26
|
+
load_2017_rows rows
|
27
|
+
else
|
28
|
+
raise ArgumentError, "Could not infer version from path: #{path}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def load_2016_rows(rows)
|
33
|
+
# Layout of the rows in CSV:
|
34
|
+
# 0 = State
|
35
|
+
# 1 = ZipCode
|
36
|
+
# 2 = TaxRegionName
|
37
|
+
# 3 = TaxRegionCode
|
38
|
+
# 4 = CombinedRate
|
39
|
+
# 5 = StateRate
|
40
|
+
# 6 = CountyRate
|
41
|
+
# 7 = CityRate
|
42
|
+
# 8 = SpecialRate
|
43
|
+
|
44
|
+
rows.to_a.each do |row|
|
45
|
+
zip_code = row[1]
|
46
|
+
|
47
|
+
@data[zip_code] = Rate.new(
|
48
|
+
row[2], # region_name
|
49
|
+
row[3], # region_code
|
50
|
+
row[4].to_f, # combined_rate
|
51
|
+
row[5].to_f, # state_rate
|
52
|
+
row[6].to_f, # county_rate
|
53
|
+
row[7].to_f, # city_rate
|
54
|
+
row[8].to_f, # special_rate
|
55
|
+
)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def load_2017_rows(rows)
|
60
|
+
# Layout of the rows in the CSV:
|
61
|
+
# 0 = State
|
62
|
+
# 1 = ZipCode
|
63
|
+
# 2 = TaxRegionName
|
64
|
+
# 3 = StateRate
|
65
|
+
# 4 = EstimatedCombinedRate
|
66
|
+
# 5 = EstimatedCountyRate
|
67
|
+
# 6 = EstimatedCityRate
|
68
|
+
# 7 = EstimatedSpecialRate
|
69
|
+
# 8 = RiskLevel
|
33
70
|
|
34
|
-
|
35
|
-
|
36
|
-
end
|
71
|
+
rows.to_a.each do |row|
|
72
|
+
zip_code = row[1]
|
37
73
|
|
38
|
-
@data[zip_code] = Rate.new
|
74
|
+
@data[zip_code] = Rate.new(
|
75
|
+
row[2].gsub('"', ''), # region_name
|
76
|
+
'', # region_code
|
77
|
+
row[4].to_f, # combined_rate
|
78
|
+
row[3].to_f, # state_rate
|
79
|
+
row[5].to_f, # county_rate
|
80
|
+
row[6].to_f, # city_rate
|
81
|
+
row[7].to_f, # special_rate
|
82
|
+
)
|
39
83
|
end
|
40
84
|
end
|
41
85
|
end
|
data/lib/sales_tax/version.rb
CHANGED
data/sales_tax.gemspec
CHANGED
data/spec/auto_load_spec.rb
CHANGED
@@ -16,8 +16,11 @@ describe SalesTax do
|
|
16
16
|
}
|
17
17
|
|
18
18
|
it 'auto-loads CSV data' do
|
19
|
-
|
20
|
-
|
19
|
+
mock_csv = mock_row.keys.join(',') + "\n" +
|
20
|
+
mock_row.values.join(',') + "\n"
|
21
|
+
|
22
|
+
allow(File).to receive(:read).and_return(mock_csv)
|
23
|
+
allow(Dir).to receive(:glob).and_return(['data/taxrates_AA2016.csv'])
|
21
24
|
|
22
25
|
require 'sales_tax/auto_load'
|
23
26
|
|
data/spec/rate_spec.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SalesTax::Rate do
|
4
|
+
ATTRIBUTES = [
|
5
|
+
[:region_name, 'A SUNNY SOCIALIST WORLD' ],
|
6
|
+
[:region_code, 'ABCD' ],
|
7
|
+
[:combined_rate, 0.03 ],
|
8
|
+
[:state_rate, 0.02 ],
|
9
|
+
[:county_rate, 0.01 ],
|
10
|
+
[:city_rate, 0.0 ],
|
11
|
+
[:special_rate, 0.0 ],
|
12
|
+
]
|
13
|
+
|
14
|
+
let(:rate) { SalesTax::Rate.new *ATTRIBUTES.map(&:last) }
|
15
|
+
|
16
|
+
ATTRIBUTES.each do |(key, value)|
|
17
|
+
it "has a .#{key}" do
|
18
|
+
expect(rate.send(key)).to eq value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sales_tax
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dirk Gadsden
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 3.4.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: ruby-prof
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.15.9
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.15.9
|
55
69
|
description: Look up sales tax rates by zip code.
|
56
70
|
email:
|
57
71
|
- dirk@esherido.com
|
@@ -72,11 +86,13 @@ files:
|
|
72
86
|
- lib/sales_tax.rb
|
73
87
|
- lib/sales_tax/auto_load.rb
|
74
88
|
- lib/sales_tax/base.rb
|
89
|
+
- lib/sales_tax/rate.rb
|
75
90
|
- lib/sales_tax/rate_store.rb
|
76
91
|
- lib/sales_tax/tasks/download.rake
|
77
92
|
- lib/sales_tax/version.rb
|
78
93
|
- sales_tax.gemspec
|
79
94
|
- spec/auto_load_spec.rb
|
95
|
+
- spec/rate_spec.rb
|
80
96
|
- spec/rate_store_spec.rb
|
81
97
|
- spec/spec_helper.rb
|
82
98
|
homepage: https://github.com/dirk/sales_tax
|
@@ -99,9 +115,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
115
|
version: '0'
|
100
116
|
requirements: []
|
101
117
|
rubyforge_project:
|
102
|
-
rubygems_version: 2.
|
118
|
+
rubygems_version: 2.6.8
|
103
119
|
signing_key:
|
104
120
|
specification_version: 4
|
105
121
|
summary: Look up sales tax rates by zip code.
|
106
122
|
test_files: []
|
107
|
-
has_rdoc:
|