sales_tax 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: