super_good-solidus_taxjar 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b11c5166cfe6ab6a6642c8b08d3cedc8faae319c
4
+ data.tar.gz: 0f59931ebbf60fdae8b42510fc00111e12488d49
5
+ SHA512:
6
+ metadata.gz: 64bb574adc61f27623381fdd6bcabf0e5f0dd508a73e97442c3e2d1b66a62036e89f4ed569a5a62dddbdf9088789e2c2670c12744c1f66bb454a8f6271352f56
7
+ data.tar.gz: e6d919c2de1225d5ec329bea08c0e30b922fa7e7bb053aca39c8e1f8517af99f62d9c8fe157af82afd8be406893e4429a645c4045ee81dedb0de1afe08c29474
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+
13
+ Gemfile.lock
14
+ /spec/dummy
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.travis.yml ADDED
@@ -0,0 +1,12 @@
1
+ ---
2
+ sudo: false
3
+ language: ruby
4
+ cache: bundler
5
+ rvm:
6
+ - 2.3.7
7
+ env:
8
+ matrix:
9
+ - SOLIDUS_BRANCH=v2.4 DB=postgres RAILS_VERSION="~> 5.1.0"
10
+ before_install:
11
+ - gem update --system
12
+ - gem install bundler
@@ -0,0 +1,74 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ In the interest of fostering an open and welcoming environment, we as
6
+ contributors and maintainers pledge to making participation in our project and
7
+ our community a harassment-free experience for everyone, regardless of age,
8
+ body size, disability, ethnicity, gender identity and expression, level of
9
+ experience, nationality, personal appearance, race, religion, or sexual
10
+ identity and orientation.
11
+
12
+ ## Our Standards
13
+
14
+ Examples of behavior that contributes to creating a positive environment
15
+ include:
16
+
17
+ * Using welcoming and inclusive language
18
+ * Being respectful of differing viewpoints and experiences
19
+ * Gracefully accepting constructive criticism
20
+ * Focusing on what is best for the community
21
+ * Showing empathy towards other community members
22
+
23
+ Examples of unacceptable behavior by participants include:
24
+
25
+ * The use of sexualized language or imagery and unwelcome sexual attention or
26
+ advances
27
+ * Trolling, insulting/derogatory comments, and personal or political attacks
28
+ * Public or private harassment
29
+ * Publishing others' private information, such as a physical or electronic
30
+ address, without explicit permission
31
+ * Other conduct which could reasonably be considered inappropriate in a
32
+ professional setting
33
+
34
+ ## Our Responsibilities
35
+
36
+ Project maintainers are responsible for clarifying the standards of acceptable
37
+ behavior and are expected to take appropriate and fair corrective action in
38
+ response to any instances of unacceptable behavior.
39
+
40
+ Project maintainers have the right and responsibility to remove, edit, or
41
+ reject comments, commits, code, wiki edits, issues, and other contributions
42
+ that are not aligned to this Code of Conduct, or to ban temporarily or
43
+ permanently any contributor for other behaviors that they deem inappropriate,
44
+ threatening, offensive, or harmful.
45
+
46
+ ## Scope
47
+
48
+ This Code of Conduct applies both within project spaces and in public spaces
49
+ when an individual is representing the project or its community. Examples of
50
+ representing a project or community include using an official project e-mail
51
+ address, posting via an official social media account, or acting as an
52
+ appointed representative at an online or offline event. Representation of a
53
+ project may be further defined and clarified by project maintainers.
54
+
55
+ ## Enforcement
56
+
57
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
58
+ reported by contacting the project team at contact@super.gd. All complaints
59
+ will be reviewed and investigated and will result in a response that is deemed
60
+ necessary and appropriate to the circumstances. The project team is obligated
61
+ to maintain confidentiality with regard to the reporter of an incident.
62
+ Further details of specific enforcement policies may be posted separately.
63
+
64
+ Project maintainers who do not follow or enforce the Code of Conduct in good
65
+ faith may face temporary or permanent repercussions as determined by other
66
+ members of the project's leadership.
67
+
68
+ ## Attribution
69
+
70
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71
+ available at [http://contributor-covenant.org/version/1/4][version]
72
+
73
+ [homepage]: http://contributor-covenant.org
74
+ [version]: http://contributor-covenant.org/version/1/4/
data/Gemfile ADDED
@@ -0,0 +1,21 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ branch = ENV.fetch('SOLIDUS_BRANCH', 'master')
6
+
7
+ gem "solidus", github: "solidusio/solidus", branch: branch
8
+
9
+ if ENV['RAILS_VERSION']
10
+ gem "rails", ENV['RAILS_VERSON']
11
+ end
12
+
13
+ if ENV.fetch('DB') == 'postgres'
14
+ gem 'pg'
15
+ end
16
+
17
+ group :development, :test do
18
+ gem "pry"
19
+ end
20
+
21
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 Jared Norman
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # `SuperGood::SolidusTaxJar` [![Build Status](https://travis-ci.com/SuperGoodSoft/solidus_taxjar.svg?token=rc5QTgHvLLF7cpqkmyfd&branch=master)](https://travis-ci.com/SuperGoodSoft/solidus_taxjar)
2
+
3
+ `SuperGood::SolidusTaxJar` is a [Solidus](https://github.com/solidusio/solidus) extension that allows Solidus stores to use [TaxJar](https://www.taxjar.com/) for tax calculations.
4
+
5
+ This is not a fork of [spree_taxjar](https://github.com/vinsol-spree-contrib/spree_taxjar), like [solidus_taxjar](https://github.com/boomerdigital/solidus_taxjar). Instead, `SuperGood::SolidusTaxJar` uses the new configurable tax system [introduced by @adammathys](https://github.com/solidusio/solidus/pull/1892) in Solidus 2.4.
6
+
7
+ ## Installation
8
+
9
+ 1. Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'super_good-solidus_taxjar'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ 2. Next, configure Solidus to use this gem:
20
+
21
+ ```ruby
22
+ # Put this in config/initializers/solidus.rb
23
+
24
+ Spree.config do |config|
25
+ config.tax_calculator_class = SuperGood::SolidusTaxJar::TaxCalculator
26
+ end
27
+ ```
28
+
29
+ 3. Also, configure your error handling:
30
+
31
+ ```ruby
32
+ # Put this in config/initializers/taxjar.rb
33
+
34
+ SuperGood::SolidusTaxJar::TaxCalculator.exception_handler = ->(e) {
35
+ # Report exceptions in here. For example, if you were using the Sentry's
36
+ # raven-ruby gem to report errors, you might do this:
37
+ Raven.capture_exception(e)
38
+ }
39
+ ```
40
+
41
+ 4. Finally, make sure that the `TAXJAR_API_KEY` environment variable is set to a your TaxJar API key and make sure that you have a `Spree::TaxRate` with the name "Sales Tax". This will be used as the source for the tax adjustments that Solidus creates.
42
+
43
+ ## Development
44
+
45
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
46
+
47
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
48
+
49
+ ## Contributing
50
+
51
+ Bug reports and pull requests are welcome on GitHub at https://github.com/SuperGoodSoft/solidus_taxjar. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
52
+
53
+ ## License
54
+
55
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
56
+
57
+ ## Code of Conduct
58
+
59
+ Everyone interacting in the `SuperGood::SolidusTaxjar` project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/SuperGoodSoft/solidus_taxjar/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+ require 'spree/testing_support/extension_rake'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task :default do
8
+ if Dir["spec/dummy"].empty?
9
+ Rake::Task[:test_app].invoke
10
+ Dir.chdir("../../")
11
+ end
12
+ Rake::Task[:spec].invoke
13
+ end
14
+
15
+ desc 'Generates a dummy app for testing'
16
+ task :test_app do
17
+ ENV['LIB_NAME'] = 'super_good/solidus_taxjar'
18
+ Rake::Task['extension:test_app'].invoke
19
+ end
data/bin/console ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "super_good/solidus_taxjar"
5
+ require "pry"
6
+
7
+ Pry.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,48 @@
1
+ module SuperGood
2
+ module SolidusTaxJar
3
+ class API
4
+ def self.default_taxjar_client
5
+ ::Taxjar::Client.new(
6
+ api_key: ENV.fetch("TAXJAR_API_KEY"),
7
+ api_url: 'https://api.sandbox.taxjar.com'
8
+ )
9
+ end
10
+
11
+ def initialize(taxjar_client: self.class.default_taxjar_client)
12
+ @taxjar_client = taxjar_client
13
+ end
14
+
15
+ def tax_for(order)
16
+ taxjar_client.tax_for_order order_params(order)
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :taxjar_client
22
+
23
+ def order_params(order)
24
+ tax_address = order.tax_address
25
+
26
+ {
27
+ to_country: tax_address.country.iso,
28
+ to_zip: tax_address.zipcode,
29
+ to_city: tax_address.city,
30
+ to_state: tax_address&.state&.abbr || tax_address.state_name,
31
+ to_street: tax_address.address1,
32
+
33
+ shipping: order.shipment_total,
34
+
35
+ line_items: order.line_items.map do |line_item|
36
+ {
37
+ id: line_item.id,
38
+ quantity: line_item.quantity,
39
+ unit_price: line_item.price,
40
+ discount: -line_item.adjustment_total,
41
+ product_tax_code: line_item.tax_category&.tax_code
42
+ }
43
+ end
44
+ }
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,147 @@
1
+ module SuperGood
2
+ module SolidusTaxJar
3
+ class TaxCalculator
4
+ class_attribute :exception_handler
5
+ self.exception_handler = ->(e) {
6
+ Rails.logger.error "An error occurred while fetching TaxJar tax rates - #{e}: #{e.message}"
7
+ }
8
+
9
+ def self.default_api
10
+ ::SuperGood::SolidusTaxJar::API.new
11
+ end
12
+
13
+ def initialize(order, api: self.class.default_api)
14
+ @order = order
15
+ @api = api
16
+ end
17
+
18
+ def calculate
19
+ return no_tax if order.tax_address.empty?
20
+
21
+ cache do
22
+ next no_tax unless taxjar_breakdown
23
+
24
+ Spree::Tax::OrderTax.new(
25
+ order_id: order.id,
26
+ line_item_taxes: line_item_taxes,
27
+ shipment_taxes: shipment_taxes
28
+ )
29
+ end
30
+ rescue StandardError => e
31
+ exception_handler.(e)
32
+ no_tax
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :order, :api
38
+
39
+ def line_item_taxes
40
+ @line_item_taxes ||=
41
+ taxjar_breakdown.line_items.map do |line_item|
42
+ Spree::Tax::ItemTax.new(
43
+ item_id: line_item.id.to_i,
44
+ label: "Sales Tax",
45
+ tax_rate: tax_rate,
46
+ amount: line_item.tax_collectable,
47
+ included_in_price: false
48
+ )
49
+ end
50
+ end
51
+
52
+ def shipment_taxes
53
+ @shipment_taxes ||=
54
+ if taxjar_breakdown.shipping? &&
55
+ (total_shipping_tax = taxjar_breakdown.shipping.tax_collectable) != 0
56
+
57
+ # Distribute shipping tax across shipments:
58
+ # TaxJar does not provide a breakdown of shipping taxes, so we have
59
+ # to proportionally distribute the tax across the shipments,
60
+ # accounting for rounding errors.
61
+ tax_items = []
62
+ remaining_tax = total_shipping_tax
63
+ shipments = order.shipments.to_a
64
+ total_shipping_cost = shipments.sum(&:total_before_tax)
65
+
66
+ shipments[0...-1].each do |shipment|
67
+ percentage_of_tax = shipment.total_before_tax / total_shipping_cost
68
+ shipping_tax = (percentage_of_tax * total_shipping_tax).round(2)
69
+ remaining_tax -= shipping_tax
70
+
71
+ tax_items << ::Spree::Tax::ItemTax.new(
72
+ item_id: shipment.id,
73
+ label: "Sales Tax",
74
+ tax_rate: tax_rate,
75
+ amount: shipping_tax,
76
+ included_in_price: false
77
+ )
78
+ end
79
+
80
+ tax_items << ::Spree::Tax::ItemTax.new(
81
+ item_id: shipments.last.id,
82
+ label: "Sales Tax",
83
+ tax_rate: tax_rate,
84
+ amount: remaining_tax,
85
+ included_in_price: false
86
+ )
87
+
88
+ tax_items
89
+ else
90
+ []
91
+ end
92
+ end
93
+
94
+ def taxjar_breakdown
95
+ @taxjar_breakdown ||= taxjar_tax.breakdown
96
+ end
97
+
98
+ def taxjar_tax
99
+ @taxjar_taxes ||= api.tax_for(order)
100
+ end
101
+
102
+ def no_tax
103
+ Spree::Tax::OrderTax.new(
104
+ order_id: order.id,
105
+ line_item_taxes: [],
106
+ shipment_taxes: []
107
+ )
108
+ end
109
+
110
+ def tax_rate
111
+ Spree::TaxRate.find_by(name: "Sales Tax")
112
+ end
113
+
114
+ def cache
115
+ if !Rails.env.test?
116
+ Rails.cache.fetch(cache_key, expires_in: 10.minutes) { yield }
117
+ else
118
+ yield
119
+ end
120
+ end
121
+
122
+ def cache_key
123
+ tax_address = order.tax_address
124
+
125
+ {
126
+ to_country: tax_address.country.iso,
127
+ to_zip: tax_address.zipcode,
128
+ to_city: tax_address.city,
129
+ to_state: tax_address&.state&.abbr || tax_address.state_name,
130
+ to_street: tax_address.address1,
131
+
132
+ shipping: order.shipment_total,
133
+
134
+ line_items: order.line_items.map do |line_item|
135
+ {
136
+ id: line_item.id,
137
+ quantity: line_item.quantity,
138
+ unit_price: line_item.price,
139
+ discount: -line_item.adjustment_total,
140
+ product_tax_code: line_item.tax_category&.tax_code
141
+ }
142
+ end.hash
143
+ }
144
+ end
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,5 @@
1
+ module SuperGood
2
+ module SolidusTaxJar
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ require 'solidus_core'
2
+ require 'solidus_support'
3
+ require 'taxjar'
4
+
5
+ module SuperGood
6
+ module SolidusTaxJar
7
+ end
8
+ end
9
+
10
+ require "super_good/solidus_taxjar/version"
11
+ require "super_good/solidus_taxjar/api"
12
+ require "super_good/solidus_taxjar/tax_calculator"
@@ -0,0 +1,36 @@
1
+ lib = File.expand_path("../lib", __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "super_good/solidus_taxjar/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "super_good-solidus_taxjar"
7
+ spec.version = SuperGood::SolidusTaxJar::VERSION
8
+ spec.authors = ["Jared Norman"]
9
+ spec.email = ["jared@super.gd"]
10
+
11
+ spec.summary = "Support for using TaxJar to handle tax calculations in Solidus"
12
+ spec.description = spec.summary
13
+ spec.homepage = "https://github.com/SuperGoodSoft/solidus_taxjar"
14
+ spec.license = "MIT"
15
+
16
+ # Specify which files should be added to the gem when it is released.
17
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ end
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_dependency "solidus_core", ">= 2.4.0"
26
+ spec.add_dependency "solidus_support"
27
+ spec.add_dependency "taxjar-ruby"
28
+
29
+ spec.add_development_dependency "bundler"
30
+ spec.add_development_dependency "database_cleaner"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "rspec", "~> 3.0"
33
+ spec.add_development_dependency "rspec-rails"
34
+ spec.add_development_dependency "vcr", "~> 4.0"
35
+ spec.add_development_dependency "webmock"
36
+ end
metadata ADDED
@@ -0,0 +1,199 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: super_good-solidus_taxjar
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jared Norman
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-01-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: solidus_core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.4.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.4.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: solidus_support
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: taxjar-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: database_cleaner
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rake
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '10.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec-rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: vcr
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '4.0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '4.0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: webmock
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ description: Support for using TaxJar to handle tax calculations in Solidus
154
+ email:
155
+ - jared@super.gd
156
+ executables: []
157
+ extensions: []
158
+ extra_rdoc_files: []
159
+ files:
160
+ - ".gitignore"
161
+ - ".rspec"
162
+ - ".travis.yml"
163
+ - CODE_OF_CONDUCT.md
164
+ - Gemfile
165
+ - LICENSE.txt
166
+ - README.md
167
+ - Rakefile
168
+ - bin/console
169
+ - bin/setup
170
+ - lib/super_good/solidus_taxjar.rb
171
+ - lib/super_good/solidus_taxjar/api.rb
172
+ - lib/super_good/solidus_taxjar/tax_calculator.rb
173
+ - lib/super_good/solidus_taxjar/version.rb
174
+ - super_good-solidus_taxjar.gemspec
175
+ homepage: https://github.com/SuperGoodSoft/solidus_taxjar
176
+ licenses:
177
+ - MIT
178
+ metadata: {}
179
+ post_install_message:
180
+ rdoc_options: []
181
+ require_paths:
182
+ - lib
183
+ required_ruby_version: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - ">="
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ required_rubygems_version: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: '0'
193
+ requirements: []
194
+ rubyforge_project:
195
+ rubygems_version: 2.5.2.3
196
+ signing_key:
197
+ specification_version: 4
198
+ summary: Support for using TaxJar to handle tax calculations in Solidus
199
+ test_files: []