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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5011f177f821f6b3468d1ecab3d8829cabc7ddae
4
- data.tar.gz: 381b02e2d0ce3bcd8412b631906313e4b232f382
3
+ metadata.gz: bbad4bbfa399606b9c598db327b0a2f5bdff3ce1
4
+ data.tar.gz: 3cb3336419e6ad5b3dfcaaef63331341be88eb8d
5
5
  SHA512:
6
- metadata.gz: 6ddf68e4a9f6e088f178e61364bb08d4893b026fab4a66203fc48affc7f3e65d3354824899f49f53ef691463d624ca6b7cb836af0b06c3fe0f972043bd4e9432
7
- data.tar.gz: 9d085887bc28ee666dad29f9dee04af40ef0357de1277e44fb8683f9bc40228d3ea80ab20f7f92ae065ed01b01e8443625c838c54540a9ec9d7707c862b11ac4
6
+ metadata.gz: 51f7e0e5895249dfb2fa08593bf26dfdb24cbecf1102d16977476b1fd567a76ceebafe889ffe9d4e5418ad0070dbeba89413eae3664ac44095331f6f3d69a02a
7
+ data.tar.gz: f79f8d920ca1beba70903a1f052d67f3573e09a1970f1ad8e80f8823c1eb2e807bf2eccd61794f694f747eb81b94c9cfc66ec45d31f0592745d29a850927cd13
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.3.0
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.1.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.11.2
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/TAXRATES_ZIP5_AL201602.csv
5
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_AK201602.csv
6
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_AZ201602.csv
7
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_AR201602.csv
8
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_CA201602.csv
9
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_CO201602.csv
10
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_CT201602.csv
11
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_DE201602.csv
12
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_FL201602.csv
13
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_GA201602.csv
14
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_HI201602.csv
15
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_ID201602.csv
16
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_IL201602.csv
17
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_WV201602.csv
18
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_VA201602.csv
19
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_TX201602.csv
20
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_SC201602.csv
21
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_PA201602.csv
22
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_OH201602.csv
23
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NY201602.csv
24
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NH201602.csv
25
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MT201602.csv
26
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MN201602.csv
27
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MD201602.csv
28
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_KY201602.csv
29
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_IN201602.csv
30
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_IA201602.csv
31
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_LA201602.csv
32
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MA201602.csv
33
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MS201602.csv
34
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NE201602.csv
35
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NJ201602.csv
36
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NC201602.csv
37
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_OK201602.csv
38
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_PR201602.csv
39
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_SD201602.csv
40
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_UT201602.csv
41
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_WA201602.csv
42
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_WI201602.csv
43
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_WY201602.csv
44
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_DC201602.csv
45
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_VT201602.csv
46
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_TN201602.csv
47
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_RI201602.csv
48
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_OR201602.csv
49
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_ND201602.csv
50
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NM201602.csv
51
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_NV201602.csv
52
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MO201602.csv
53
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_MI201602.csv
54
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_ME201602.csv
55
- http://taxrates.csv.s3.amazonaws.com/TAXRATES_ZIP5_KS201602.csv
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
@@ -13,4 +13,12 @@ module SalesTax
13
13
  end
14
14
  end
15
15
 
16
+ # Uncomment for profiling:
17
+ # require 'ruby-prof'
18
+ # RubyProf.start
19
+
16
20
  SalesTax.auto_load
21
+
22
+ # result = RubyProf.stop
23
+ # printer = RubyProf::FlatPrinter.new(result)
24
+ # printer.print(STDOUT)
@@ -1,3 +1,4 @@
1
+ require 'sales_tax/rate'
1
2
  require 'sales_tax/rate_store'
2
3
 
3
4
  module SalesTax
@@ -0,0 +1,13 @@
1
+ module SalesTax
2
+ RATE_FIELDS = [
3
+ :region_name,
4
+ :region_code,
5
+ :combined_rate,
6
+ :state_rate,
7
+ :county_rate,
8
+ :city_rate,
9
+ :special_rate,
10
+ ]
11
+
12
+ Rate = Struct.new(*RATE_FIELDS)
13
+ end
@@ -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
- CSV.foreach(path, headers: :first_row) do |row|
32
- zip_code = row['ZipCode']
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
- fields = FIELDS_MAP.map do |(row_key, transform)|
35
- row[row_key].send transform
36
- end
71
+ rows.to_a.each do |row|
72
+ zip_code = row[1]
37
73
 
38
- @data[zip_code] = Rate.new *fields
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
@@ -1,3 +1,3 @@
1
1
  module SalesTax
2
- VERSION = '0.1.0'
2
+ VERSION = '0.2.0'
3
3
  end
data/sales_tax.gemspec CHANGED
@@ -22,4 +22,5 @@ Gem::Specification.new do |s|
22
22
  s.add_development_dependency 'bundler', '~> 1.10'
23
23
  s.add_development_dependency 'rake', '~> 10.4.2'
24
24
  s.add_development_dependency 'rspec', '~> 3.4.0'
25
+ s.add_development_dependency 'ruby-prof', '~> 0.15.9'
25
26
  end
@@ -16,8 +16,11 @@ describe SalesTax do
16
16
  }
17
17
 
18
18
  it 'auto-loads CSV data' do
19
- allow(CSV).to receive(:foreach).and_yield(mock_row)
20
- allow(Dir).to receive(:glob).and_return(['a/b.csv'])
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.1.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: 2016-02-07 00:00:00.000000000 Z
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.5.1
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: