spree_postal_service 2.2.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.gitignore +3 -2
- data/.hound.yml +25 -0
- data/.reek +19 -0
- data/.rspec +2 -0
- data/.rubocop.yml +8 -0
- data/.ruby-gemset +1 -0
- data/.travis.yml +1 -1
- data/CHANGELOG.md +3 -0
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +1 -1
- data/Guardfile +13 -5
- data/README.md +23 -22
- data/bin/rails +1 -1
- data/config/locales/en.yml +1 -1
- data/config/locales/pt.yml +1 -1
- data/config/locales/sv.yml +1 -1
- data/lib/spree/calculator/shipping/postal_service.rb +90 -59
- data/lib/spree_postal_service.rb +1 -1
- data/lib/spree_postal_service/engine.rb +1 -1
- data/lib/spree_postal_service/version.rb +4 -3
- data/spec/lib/postal_service_spec.rb +48 -64
- data/spec/spec_helper.rb +23 -8
- data/spec/support/database_cleaner.rb +18 -0
- data/spec/support/factory_girl.rb +5 -0
- data/spec/support/i18n.rb +9 -0
- data/spec/support/spree.rb +1 -0
- data/spec/translations/locale_spec.rb +8 -9
- data/spree_postal_service.gemspec +19 -13
- metadata +142 -43
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
ZjQxNDk1NGJjOWVkYTBiNTQ1Y2U2MjBlMDVlNWVlYzNmZTAyOWUzMw==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dd463b0989fbb4dc2bce7543483db1039a1eeb73
|
4
|
+
data.tar.gz: 2902030d6d74477f8773b801d47b29c0e22abeae
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
ZDljMGFkYjM4NTJjYjM5MjA2NDQyNmRjM2Q2NGJjMDZkYjRkZWFiZDI1YWYz
|
11
|
-
ZGQwYTcxMmRlMzg3ZThmOTllZmYzMDNjZmE1ZjFiNTJhYzk0MDA=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MzYzZWUwZmIyYmQ1NTI1NmRhNGE0NjVlMzA3MjIyMDliZmIzM2RkOWFlYWNk
|
14
|
-
Zjk5M2MyNDU4YTQ0YjRiN2UyY2I0NWEzYjdiODUxYjU4ODNlZjg1N2QwM2Jj
|
15
|
-
MGE5OWQ5MjFjZmU2Njk5ZGM4NTk1MmI2MTI3Mjg4MzMxMzRhNmY=
|
6
|
+
metadata.gz: 407f1c00f47ccb8e91c0b158b5185f021282d8af5be5e4bf81bcbf755c2d8765456f1864894a0a239c33167c577d8fab75b1ceb4a47d79ff16679eedaba9629d
|
7
|
+
data.tar.gz: 809eb3766cb7bfc9daaf1eff0ae3e2afa80e36919beba8702ec82a7ce4cff5ad5e433536c8f2d16b2f5e7348698ea904714abdacc44fcfca270637ea965e7da0
|
data/.gitignore
CHANGED
data/.hound.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
# Too picky.
|
3
|
+
LineLength:
|
4
|
+
Enabled: false
|
5
|
+
|
6
|
+
# This should truly be on for well documented gems.
|
7
|
+
Documentation:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
# Neatly aligned code is to swell.
|
11
|
+
SingleSpaceBeforeFirstArg:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
# Rubocop default is leading but hound-ci use trailing.
|
15
|
+
DotPosition:
|
16
|
+
EnforcedStyle: leading
|
17
|
+
|
18
|
+
# Don't mess with RSpec DSL.
|
19
|
+
Blocks:
|
20
|
+
Exclude:
|
21
|
+
- 'spec/**/*'
|
22
|
+
|
23
|
+
# We really like the readability with newline in beginning of classes.
|
24
|
+
EmptyLinesAroundBody:
|
25
|
+
Enabled: false
|
data/.reek
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
---
|
2
|
+
UncommunicativeVariableName:
|
3
|
+
accept:
|
4
|
+
- t
|
5
|
+
- c
|
6
|
+
NestedIterators:
|
7
|
+
max_allowed_nesting: 2
|
8
|
+
DuplicateMethodCall:
|
9
|
+
enabled: false
|
10
|
+
IrresponsibleModule:
|
11
|
+
enabled: false
|
12
|
+
FeatureEnvy:
|
13
|
+
enabled: false
|
14
|
+
TooManyMethods:
|
15
|
+
enabled: false
|
16
|
+
TooManyStatements:
|
17
|
+
enabled: false
|
18
|
+
UtilityFunction:
|
19
|
+
enabled: false
|
data/.rspec
CHANGED
data/.rubocop.yml
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
spree-postal-service
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
ADDED
data/CONTRIBUTING.md
CHANGED
data/Gemfile
CHANGED
data/Guardfile
CHANGED
@@ -1,5 +1,13 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
group :red_green_refactor, halt_on_fail: true do
|
2
|
+
|
3
|
+
guard 'rspec', cmd: 'bundle exec rspec' do
|
4
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
5
|
+
watch(%r{^spec/(.+)_spec\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
7
|
+
end
|
8
|
+
|
9
|
+
guard :rubocop, all_on_start: false, cli: ['--format', 'clang', '--rails'] do
|
10
|
+
watch(%r{.+\.rb$})
|
11
|
+
watch(%r{(?:.+/)?\.(rubocop|hound)\.yml$}) { |m| File.dirname(m[0]) }
|
12
|
+
end
|
13
|
+
end
|
data/README.md
CHANGED
@@ -1,34 +1,35 @@
|
|
1
1
|
# Spree Postal Service
|
2
2
|
|
3
|
-
[![Build Status](https://
|
4
|
-
[![
|
5
|
-
[![
|
3
|
+
[![Build Status](https://travis-ci.org/futhr/spree-postal-service.svg?branch=2-3-stable)](https://travis-ci.org/futhr/spree-postal-service)
|
4
|
+
[![Coverage Status](https://img.shields.io/coveralls/futhr/spree-postal-service.svg)](https://coveralls.io/r/futhr/spree-postal-service?branch=master)
|
5
|
+
[![Code Climate](https://codeclimate.com/github/futhr/spree-postal-service/badges/gpa.svg)](https://codeclimate.com/github/futhr/spree-postal-service)
|
6
|
+
[![Gem Version](https://badge.fury.io/rb/spree_postal_service.svg)](http://badge.fury.io/rb/spree_postal_service)
|
6
7
|
|
7
|
-
A postal service is delivers based on weight only(*). Like most post services in
|
8
|
+
A postal service is delivers based on weight only(*). Like most post services in Europe will.
|
8
9
|
|
9
|
-
This
|
10
|
+
This Spree extension adds a spree-calculator to model this.
|
10
11
|
|
11
12
|
**Other features:**
|
12
13
|
|
13
|
-
- Size and weight restrictions can be specified
|
14
|
-
- You specify a weight/price table
|
15
|
-
- Handling fee may be added ( with a maximum when it won't be applied anymore)
|
16
|
-
- Multi-parcel shipments are automatically created
|
17
|
-
- You can specify a maximum order price, orders over this will not be charged
|
14
|
+
- Size and weight restrictions can be specified.
|
15
|
+
- You specify a weight/price table.
|
16
|
+
- Handling fee may be added ( with a maximum when it won't be applied anymore).
|
17
|
+
- Multi-parcel shipments are automatically created.
|
18
|
+
- You can specify a maximum order price, orders over this will not be charged.
|
18
19
|
|
19
20
|
Off course this relies on your weight data to be correct (and if you want the restrictions to work, the size data too).
|
20
21
|
Use the same measurements as in the product info page.
|
21
22
|
|
22
|
-
(*) You may install several ShippingMethods for (usually) different countries.
|
23
|
+
_(*) You may install several ShippingMethods for (usually) different countries._
|
23
24
|
|
24
25
|
## Usage
|
25
26
|
|
26
27
|
Add to your `Gemfile`:
|
27
28
|
```ruby
|
28
|
-
gem 'spree_postal_service', '~> 2.
|
29
|
+
gem 'spree_postal_service', '~> 2.3.0'
|
29
30
|
```
|
30
31
|
|
31
|
-
Go to admin interface
|
32
|
+
Go to admin interface:
|
32
33
|
|
33
34
|
`http://localhost:3000/admin/shipping_methods/new`
|
34
35
|
|
@@ -56,19 +57,19 @@ With the default settings (measurements in kg and cm):
|
|
56
57
|
|
57
58
|
The Shipping method does not apply to the order if:
|
58
59
|
|
59
|
-
- Any items weighs more than 18 kg
|
60
|
-
- Any item is longer than 90 cm
|
60
|
+
- Any items weighs more than 18 kg.
|
61
|
+
- Any item is longer than 90 cm.
|
61
62
|
- Any items second longest side (width) is over 60 cm. Eg a 70x70x20 item.
|
62
63
|
|
63
64
|
## Costs
|
64
65
|
|
65
|
-
- Items weighing 10 kg of worth 100 Euros will cost 15 Euros
|
66
|
-
- Items weighing 10 kg of worth 40 Euros will cost 25 Euros (15 + 10 handling)
|
67
|
-
- Items weighing less than 1 kg of worth 60 Euros will cost 6 Euros
|
68
|
-
- Items weighing less than 1 kg of worth 40 Euros will cost 16 Euros (6 + 10)
|
69
|
-
- Items weighing 25 kg of worth 200 Euros will cost 30 Euros (2 packages, 18 + 12
|
70
|
-
- 3 items without weight information of worth 100 euros will cost 12 Euro
|
71
|
-
- Any amount of items costing more than the max_price will cost 0 Euro
|
66
|
+
- Items weighing 10 kg of worth 100 Euros will cost 15 Euros.
|
67
|
+
- Items weighing 10 kg of worth 40 Euros will cost 25 Euros (15 + 10 handling).
|
68
|
+
- Items weighing less than 1 kg of worth 60 Euros will cost 6 Euros.
|
69
|
+
- Items weighing less than 1 kg of worth 40 Euros will cost 16 Euros (6 + 10).
|
70
|
+
- Items weighing 25 kg of worth 200 Euros will cost 30 Euros (2 packages, 18 + 12 Euro).
|
71
|
+
- 3 items without weight information of worth 100 euros will cost 12 Euro.
|
72
|
+
- Any amount of items costing more than the max_price will cost 0 Euro.
|
72
73
|
|
73
74
|
---
|
74
75
|
|
data/bin/rails
CHANGED
data/config/locales/en.yml
CHANGED
data/config/locales/pt.yml
CHANGED
data/config/locales/sv.yml
CHANGED
@@ -1,73 +1,104 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
preference :max_item_width, :decimal, default: 60
|
6
|
-
preference :max_item_length, :decimal, default: 120
|
7
|
-
preference :max_price, :decimal, default: 120
|
8
|
-
preference :handling_max, :decimal, default: 50
|
9
|
-
preference :handling_fee, :decimal, default: 10
|
10
|
-
preference :default_weight, :decimal, default: 1
|
11
|
-
|
12
|
-
def self.description
|
13
|
-
Spree.t(:postal_service)
|
14
|
-
end
|
1
|
+
module Spree
|
2
|
+
class Calculator
|
3
|
+
module Shipping
|
4
|
+
class PostalService < Spree::ShippingCalculator
|
15
5
|
|
16
|
-
|
17
|
-
|
18
|
-
|
6
|
+
preference :weight_table, :string, default: '1 2 5 10 20'
|
7
|
+
preference :price_table, :string, default: '6 9 12 15 18'
|
8
|
+
preference :max_item_weight, :decimal, default: 18
|
9
|
+
preference :max_item_width, :decimal, default: 60
|
10
|
+
preference :max_item_length, :decimal, default: 120
|
11
|
+
preference :max_price, :decimal, default: 120
|
12
|
+
preference :handling_max, :decimal, default: 50
|
13
|
+
preference :handling_fee, :decimal, default: 10
|
14
|
+
preference :default_weight, :decimal, default: 1
|
19
15
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
variant.height ? variant.height : 0
|
25
|
-
].sort.reverse
|
16
|
+
class << self
|
17
|
+
def description
|
18
|
+
Spree.t(:postal_service)
|
19
|
+
end
|
26
20
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
21
|
+
def register
|
22
|
+
super
|
23
|
+
end
|
24
|
+
end
|
31
25
|
|
32
|
-
|
33
|
-
variants = package.contents.map(&:variant)
|
34
|
-
variants.each do |variant| # determine if weight or size goes over bounds
|
35
|
-
return false if variant.weight && variant.weight > self.preferred_max_item_weight # 18
|
36
|
-
return false if item_oversized? variant
|
37
|
-
end
|
38
|
-
return true
|
39
|
-
end
|
26
|
+
attr_accessor :line_items
|
40
27
|
|
41
|
-
|
42
|
-
|
43
|
-
|
28
|
+
def item_oversized?(variant)
|
29
|
+
sizes = [
|
30
|
+
variant.width ? variant.width : 0,
|
31
|
+
variant.depth ? variant.depth : 0,
|
32
|
+
variant.height ? variant.height : 0
|
33
|
+
].sort.reverse
|
44
34
|
|
45
|
-
|
46
|
-
|
35
|
+
return true if sizes[0] > preferred_max_item_length # Longest side.
|
36
|
+
return true if sizes[1] > preferred_max_item_width # Second longest side.
|
37
|
+
false
|
38
|
+
end
|
47
39
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
40
|
+
# Determine if weight or size goes over bounds.
|
41
|
+
def available?(package)
|
42
|
+
package.order.variants.each do |variant|
|
43
|
+
return false if item_within_bounds?(variant.weight) # 18
|
44
|
+
return false if item_oversized?(variant)
|
45
|
+
end
|
46
|
+
true
|
47
|
+
end
|
52
48
|
|
53
|
-
|
49
|
+
# As order_or_line_items we always get line items, as calculable we have
|
50
|
+
# Coupon, ShippingMethod or ShippingRate.
|
51
|
+
def compute(package)
|
52
|
+
@line_items ||= package.order.line_items
|
53
|
+
total_price, total_weight, shipping = compute_total_price, compute_total_weight, 0
|
54
54
|
|
55
|
-
|
56
|
-
handling_fee = self.preferred_handling_max < total_price ? 0 : self.preferred_handling_fee
|
57
|
-
weights = self.preferred_weight_table.split.map { |weight| weight.to_f }
|
55
|
+
return 0.0 if total_price > preferred_max_price
|
58
56
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
57
|
+
while total_weight > weights.last # In several packages if need be.
|
58
|
+
total_weight -= weights.last
|
59
|
+
shipping += prices.last
|
60
|
+
end
|
63
61
|
|
64
|
-
|
65
|
-
|
66
|
-
break if total_weight > weights[index]
|
67
|
-
index -= 1
|
68
|
-
end
|
62
|
+
[shipping, prices[compute_index(total_weight)], handling_fee(total_price)].compact.sum
|
63
|
+
end
|
69
64
|
|
70
|
-
|
71
|
-
|
65
|
+
private
|
66
|
+
|
67
|
+
def compute_total_weight
|
68
|
+
line_items.map do |item|
|
69
|
+
item.quantity * (item.variant.weight || preferred_default_weight)
|
70
|
+
end.reduce(:+)
|
71
|
+
end
|
72
|
+
|
73
|
+
def compute_total_price
|
74
|
+
line_items.map { |item| item.price * item.quantity }.reduce(:+)
|
75
|
+
end
|
76
|
+
|
77
|
+
def compute_index(total_weight)
|
78
|
+
index = weights.length - 2
|
79
|
+
while index >= 0
|
80
|
+
break if total_weight > weights[index]
|
81
|
+
index -= 1
|
82
|
+
end
|
83
|
+
index + 1
|
84
|
+
end
|
85
|
+
|
86
|
+
def item_within_bounds?(weight)
|
87
|
+
weight && weight > preferred_max_item_weight
|
88
|
+
end
|
89
|
+
|
90
|
+
def handling_fee(total_price)
|
91
|
+
preferred_handling_max < total_price ? 0 : preferred_handling_fee
|
92
|
+
end
|
93
|
+
|
94
|
+
def prices
|
95
|
+
@prices ||= preferred_price_table.split.map(&:to_f)
|
96
|
+
end
|
97
|
+
|
98
|
+
def weights
|
99
|
+
@weights ||= preferred_weight_table.split.map(&:to_f)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
72
103
|
end
|
73
104
|
end
|
data/lib/spree_postal_service.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
module SpreePostalService
|
2
2
|
|
3
|
-
# Returns the version of the currently loaded SpreePostalService as a
|
3
|
+
# Returns the version of the currently loaded SpreePostalService as a
|
4
|
+
# <tt>Gem::Version</tt>.
|
4
5
|
def self.version
|
5
6
|
Gem::Version.new VERSION::STRING
|
6
7
|
end
|
7
8
|
|
8
9
|
module VERSION
|
9
10
|
MAJOR = 2
|
10
|
-
MINOR =
|
11
|
+
MINOR = 3
|
11
12
|
TINY = 0
|
12
13
|
PRE = nil
|
13
14
|
|
14
15
|
STRING = [MAJOR, MINOR, TINY, PRE].compact.join('.')
|
15
16
|
end
|
16
|
-
end
|
17
|
+
end
|
@@ -1,131 +1,115 @@
|
|
1
|
-
|
1
|
+
RSpec.describe Spree::Calculator::Shipping::PostalService do
|
2
2
|
|
3
|
-
|
3
|
+
subject { described_class.new }
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
expect(postal_service_calculator.description).to eq 'Postal Service'
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
context 'in any language' do
|
16
|
-
before { I18n.locale = :pt }
|
17
|
-
specify do
|
18
|
-
expect(postal_service_calculator.description).to eq Spree.t(:postal_service)
|
5
|
+
context 'returns description' do
|
6
|
+
%w(en pt sv).each do |locale|
|
7
|
+
it "in supported language: #{locale}" do
|
8
|
+
I18n.with_locale(locale.to_sym) do
|
9
|
+
expect(described_class.description).to eq Spree.t(:postal_service)
|
10
|
+
end
|
19
11
|
end
|
20
12
|
end
|
21
13
|
end
|
22
14
|
|
23
|
-
describe '
|
24
|
-
context '
|
15
|
+
describe 'using the default weight-price table: [1 2 5 10 20] => [6 9 12 15 18]' do
|
16
|
+
context '.compute(package)' do
|
25
17
|
it 'gives 15.0 when total price is 100 and weight is 10kg' do
|
26
18
|
create_our_package(weight: 10.0, price: 100.0, quantity: 1)
|
27
|
-
result =
|
19
|
+
result = subject.compute(@package)
|
28
20
|
expect(result).to eq(15.0)
|
29
21
|
end
|
30
22
|
|
31
23
|
it 'gives 25.0 when total price is 40 and weight is 10kg' do
|
32
24
|
create_our_package(weight: 10.0, price: 40.0, quantity: 1)
|
33
|
-
result =
|
25
|
+
result = subject.compute(@package)
|
34
26
|
expect(result).to eq(25.0)
|
35
27
|
end
|
36
28
|
|
37
29
|
it 'gives 6 when total price is 60 and weight is less than 1kg' do
|
38
30
|
create_our_package(weight: 0.5, price: 60.0, quantity: 1)
|
39
|
-
result =
|
31
|
+
result = subject.compute(@package)
|
40
32
|
expect(result).to eq(6.0)
|
41
33
|
end
|
42
34
|
|
43
35
|
it 'gives 16 when total price is 40 and weight is less than 1kg' do
|
44
36
|
create_our_package(weight: 0.5, price: 40.0, quantity: 1)
|
45
|
-
result =
|
37
|
+
result = subject.compute(@package)
|
46
38
|
expect(result).to eq(16.0)
|
47
39
|
end
|
48
40
|
|
49
41
|
it 'gives 30 when total price is 200 and weight is 25kg (split into two)' do
|
50
42
|
create_our_package(weight: 25.0, price: 200.0, quantity: 1)
|
51
|
-
|
52
|
-
result =
|
43
|
+
subject.preferred_max_price = 250
|
44
|
+
result = subject.compute(@package)
|
53
45
|
expect(result).to eq(30.0)
|
54
46
|
end
|
55
47
|
|
56
48
|
it 'gives 12 when total price is 100, there are three items and their weight is unknown' do
|
57
|
-
order
|
58
|
-
|
59
|
-
|
60
|
-
price: price,
|
61
|
-
quantity: 1,
|
62
|
-
order: order,
|
63
|
-
variant: create(:base_variant, weight: nil))
|
64
|
-
end
|
49
|
+
order = create(:order)
|
50
|
+
variant = create(:base_variant, weight: nil)
|
51
|
+
[30.0, 40.0, 30.0].each { |price| create_line_item(order, variant, price: price) }
|
65
52
|
order.line_items.reload
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
result = postal_service_calculator.compute(shipment)
|
53
|
+
package = create(:shipment, order: order)
|
54
|
+
result = subject.compute(package)
|
70
55
|
expect(result).to eq(12.0)
|
71
56
|
end
|
72
57
|
|
73
58
|
it 'gives 0 when total price is more than the MAX, for any number of items' do
|
74
59
|
create_our_package(weight: 25.0, price: 350.0, quantity: 1)
|
75
|
-
|
76
|
-
result =
|
60
|
+
subject.preferred_max_price = 300
|
61
|
+
result = subject.compute(@package)
|
77
62
|
expect(result).to eq(0.0)
|
78
63
|
end
|
79
64
|
end
|
80
65
|
end
|
81
66
|
|
82
67
|
describe 'when preferred max weight, length and width are 18 kg, 120 cm and 60 cm' do
|
83
|
-
context '
|
68
|
+
context '.available?(package)' do
|
84
69
|
it 'is false when item weighs more than 18kg' do
|
85
70
|
create_our_package(weight: 20, height: 70, width: 30, depth: 30)
|
86
|
-
expect(
|
71
|
+
expect(subject.available?(@package)).to be(false)
|
87
72
|
end
|
88
73
|
|
89
74
|
it 'is false when item is longer than 120cm' do
|
90
75
|
create_our_package(weight: 10, height: 130, width: 30, depth: 30)
|
91
|
-
expect(
|
76
|
+
expect(subject.available?(@package)).to be(false)
|
92
77
|
end
|
93
78
|
|
94
79
|
it 'is false when item is wider than 60cm' do
|
95
80
|
create_our_package(weight: 10, height: 80, width: 70, depth: 30)
|
96
|
-
expect(
|
97
|
-
end
|
81
|
+
expect(subject.available?(@package)).to be(false)
|
98
82
|
end
|
83
|
+
end
|
99
84
|
|
100
|
-
|
85
|
+
context '.item_oversized?(variant)' do
|
101
86
|
it 'is true if the longest side is more than 120cm' do
|
102
87
|
create_our_package(weight: 10, height: 130, width: 40, depth: 30)
|
103
|
-
expect(
|
88
|
+
expect(subject.item_oversized?(@variant)).to be(true)
|
104
89
|
end
|
105
90
|
|
106
91
|
it 'is true if the second longest side is more than 60cm' do
|
107
92
|
create_our_package(weight: 10, height: 80, width: 70, depth: 30)
|
108
|
-
expect(
|
93
|
+
expect(subject.item_oversized?(@variant)).to be(true)
|
109
94
|
end
|
110
95
|
end
|
111
96
|
end
|
112
97
|
|
113
|
-
def create_our_package(args={})
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
@package = @shipment.to_package
|
98
|
+
def create_our_package(args = {})
|
99
|
+
@variant = create :base_variant, args.except!(:quantity)
|
100
|
+
order = create :order
|
101
|
+
create_line_item(order, @variant, args)
|
102
|
+
order.line_items.reload
|
103
|
+
@package = create :shipment, order: order
|
104
|
+
end
|
105
|
+
|
106
|
+
def create_line_item(order, variant, args = {})
|
107
|
+
create(
|
108
|
+
:line_item,
|
109
|
+
price: args[:price] || BigDecimal.new('10.00'),
|
110
|
+
quantity: args[:quantity] || 1,
|
111
|
+
order: order,
|
112
|
+
variant: variant
|
113
|
+
)
|
130
114
|
end
|
131
|
-
end
|
115
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,25 +1,40 @@
|
|
1
1
|
require 'simplecov'
|
2
|
+
require 'coveralls'
|
3
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
4
|
+
SimpleCov::Formatter::HTMLFormatter,
|
5
|
+
Coveralls::SimpleCov::Formatter
|
6
|
+
]
|
2
7
|
SimpleCov.start do
|
8
|
+
add_filter '/.bundle'
|
3
9
|
add_filter '/spec/'
|
4
10
|
add_filter '/lib/spree_postal_service/engine'
|
5
11
|
add_group 'Libraries', 'lib'
|
6
12
|
end
|
7
13
|
|
8
|
-
ENV['RAILS_ENV']
|
14
|
+
ENV['RAILS_ENV'] ||= 'test'
|
9
15
|
|
10
16
|
require File.expand_path('../dummy/config/environment.rb', __FILE__)
|
11
17
|
|
18
|
+
require 'pry'
|
12
19
|
require 'ffaker'
|
13
20
|
require 'rspec/rails'
|
14
|
-
require 'i18n-spec'
|
15
21
|
|
16
|
-
|
17
|
-
|
18
|
-
require 'spree/testing_support/factories'
|
22
|
+
ActiveRecord::Migration.maintain_test_schema!
|
23
|
+
ActiveRecord::Migration.check_pending!
|
19
24
|
|
20
25
|
RSpec.configure do |config|
|
26
|
+
|
27
|
+
config.fail_fast = false
|
28
|
+
config.filter_run focus: true
|
29
|
+
config.run_all_when_everything_filtered = true
|
30
|
+
|
21
31
|
config.mock_with :rspec
|
22
|
-
config.
|
32
|
+
config.raise_errors_for_deprecations!
|
33
|
+
config.infer_spec_type_from_file_location!
|
34
|
+
|
35
|
+
config.expect_with :rspec do |expectations|
|
36
|
+
expectations.syntax = :expect
|
37
|
+
end
|
38
|
+
end
|
23
39
|
|
24
|
-
|
25
|
-
end
|
40
|
+
Dir[File.join(File.dirname(__FILE__), 'support/**/*.rb')].each { |file| require file }
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'database_cleaner'
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
|
5
|
+
config.before(:suite) do
|
6
|
+
DatabaseCleaner.strategy = :transaction
|
7
|
+
DatabaseCleaner.clean_with :truncation
|
8
|
+
end
|
9
|
+
|
10
|
+
config.before do
|
11
|
+
DatabaseCleaner.strategy = :transaction
|
12
|
+
DatabaseCleaner.start
|
13
|
+
end
|
14
|
+
|
15
|
+
config.after do
|
16
|
+
DatabaseCleaner.clean
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'spree/testing_support/factories'
|
@@ -1,15 +1,14 @@
|
|
1
|
-
|
1
|
+
RSpec.describe 'locale:' do
|
2
2
|
|
3
|
-
describe 'locale:' do
|
4
3
|
Dir.glob('config/locales/*.yml') do |locale_file|
|
5
4
|
context locale_file do
|
6
|
-
it {
|
7
|
-
it {
|
8
|
-
it {
|
9
|
-
it {
|
10
|
-
it {
|
11
|
-
it {
|
12
|
-
it {
|
5
|
+
it { is_expected.to be_parseable }
|
6
|
+
it { is_expected.to have_valid_pluralization_keys }
|
7
|
+
it { is_expected.not_to have_missing_pluralization_keys }
|
8
|
+
it { is_expected.to have_one_top_level_namespace }
|
9
|
+
it { is_expected.not_to have_legacy_interpolations }
|
10
|
+
it { is_expected.to have_a_valid_locale }
|
11
|
+
it { is_expected.to be_a_complete_translation_of 'config/locales/en.yml' }
|
13
12
|
end
|
14
13
|
end
|
15
14
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib/', __FILE__)
|
3
|
-
|
3
|
+
$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
4
4
|
|
5
5
|
require 'spree_postal_service/version'
|
6
6
|
|
@@ -13,9 +13,9 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.required_ruby_version = '>= 1.9.3'
|
14
14
|
|
15
15
|
s.authors = ['Torsten Rüger', 'Tobias Bohwalli']
|
16
|
-
s.email = 'hi@futhr.io'
|
16
|
+
s.email = ['torsten@villataika.fi', 'hi@futhr.io']
|
17
17
|
s.homepage = 'https://github.com/futhr/spree-postal-service'
|
18
|
-
s.license =
|
18
|
+
s.license = 'BSD-3'
|
19
19
|
|
20
20
|
s.files = `git ls-files`.split("\n")
|
21
21
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
@@ -24,15 +24,21 @@ Gem::Specification.new do |s|
|
|
24
24
|
|
25
25
|
s.has_rdoc = false
|
26
26
|
|
27
|
-
s.
|
27
|
+
s.add_runtime_dependency 'spree_core', '~> 2.3.0'
|
28
28
|
|
29
|
-
s.add_development_dependency 'rspec', '~>
|
30
|
-
s.add_development_dependency 'rspec-rails', '~>
|
31
|
-
s.add_development_dependency 'factory_girl', '
|
32
|
-
s.add_development_dependency 'sqlite3', '
|
33
|
-
s.add_development_dependency 'simplecov', '
|
34
|
-
s.add_development_dependency '
|
35
|
-
s.add_development_dependency '
|
36
|
-
s.add_development_dependency '
|
29
|
+
s.add_development_dependency 'rspec', '~> 3.1.0'
|
30
|
+
s.add_development_dependency 'rspec-rails', '~> 3.1.0'
|
31
|
+
s.add_development_dependency 'factory_girl', '>= 4.4'
|
32
|
+
s.add_development_dependency 'sqlite3', '~> 1.3.9'
|
33
|
+
s.add_development_dependency 'simplecov', '~> 0.9.0'
|
34
|
+
s.add_development_dependency 'coveralls', '>= 0.7.0'
|
35
|
+
s.add_development_dependency 'i18n-spec', '>= 0.5.1'
|
36
|
+
s.add_development_dependency 'ffaker', '>= 1.24'
|
37
|
+
s.add_development_dependency 'coffee-rails', '~> 4.0.0'
|
38
|
+
s.add_development_dependency 'sass-rails', '~> 4.0.0'
|
37
39
|
s.add_development_dependency 'pry-rails', '>= 0.3.2'
|
38
|
-
|
40
|
+
s.add_development_dependency 'database_cleaner', '1.3.0'
|
41
|
+
s.add_development_dependency 'guard-rspec', '>= 4.2.8'
|
42
|
+
s.add_development_dependency 'guard-rubocop', '>= 1.1.0'
|
43
|
+
s.add_development_dependency 'rubocop', '>= 0.24.1'
|
44
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_postal_service
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Torsten Rüger
|
@@ -9,157 +9,248 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-11-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: spree_core
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - ~>
|
18
|
+
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: 2.
|
20
|
+
version: 2.3.0
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - ~>
|
25
|
+
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: 2.
|
27
|
+
version: 2.3.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rspec
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - ~>
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 3.1.0
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - ~>
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 3.1.0
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rspec-rails
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - ~>
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: 3.1.0
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - ~>
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: 3.1.0
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: factory_girl
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '4.4'
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '4.4'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: sqlite3
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: 1.3.9
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- -
|
81
|
+
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: 1.3.9
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: simplecov
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- -
|
88
|
+
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: 0.
|
90
|
+
version: 0.9.0
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- -
|
95
|
+
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: 0.
|
97
|
+
version: 0.9.0
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: coveralls
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ">="
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: 0.7.0
|
105
|
+
type: :development
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - ">="
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 0.7.0
|
98
112
|
- !ruby/object:Gem::Dependency
|
99
113
|
name: i18n-spec
|
100
114
|
requirement: !ruby/object:Gem::Requirement
|
101
115
|
requirements:
|
102
|
-
- -
|
116
|
+
- - ">="
|
103
117
|
- !ruby/object:Gem::Version
|
104
|
-
version: 0.
|
118
|
+
version: 0.5.1
|
105
119
|
type: :development
|
106
120
|
prerelease: false
|
107
121
|
version_requirements: !ruby/object:Gem::Requirement
|
108
122
|
requirements:
|
109
|
-
- -
|
123
|
+
- - ">="
|
110
124
|
- !ruby/object:Gem::Version
|
111
|
-
version: 0.
|
125
|
+
version: 0.5.1
|
112
126
|
- !ruby/object:Gem::Dependency
|
113
127
|
name: ffaker
|
114
128
|
requirement: !ruby/object:Gem::Requirement
|
115
129
|
requirements:
|
116
|
-
- -
|
130
|
+
- - ">="
|
117
131
|
- !ruby/object:Gem::Version
|
118
|
-
version: 1.24
|
132
|
+
version: '1.24'
|
119
133
|
type: :development
|
120
134
|
prerelease: false
|
121
135
|
version_requirements: !ruby/object:Gem::Requirement
|
122
136
|
requirements:
|
123
|
-
- -
|
137
|
+
- - ">="
|
124
138
|
- !ruby/object:Gem::Version
|
125
|
-
version: 1.24
|
139
|
+
version: '1.24'
|
126
140
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
141
|
+
name: coffee-rails
|
128
142
|
requirement: !ruby/object:Gem::Requirement
|
129
143
|
requirements:
|
130
|
-
- -
|
144
|
+
- - "~>"
|
131
145
|
- !ruby/object:Gem::Version
|
132
|
-
version: 4.
|
146
|
+
version: 4.0.0
|
133
147
|
type: :development
|
134
148
|
prerelease: false
|
135
149
|
version_requirements: !ruby/object:Gem::Requirement
|
136
150
|
requirements:
|
137
|
-
- -
|
151
|
+
- - "~>"
|
138
152
|
- !ruby/object:Gem::Version
|
139
|
-
version: 4.
|
153
|
+
version: 4.0.0
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: sass-rails
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - "~>"
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: 4.0.0
|
161
|
+
type: :development
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - "~>"
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: 4.0.0
|
140
168
|
- !ruby/object:Gem::Dependency
|
141
169
|
name: pry-rails
|
142
170
|
requirement: !ruby/object:Gem::Requirement
|
143
171
|
requirements:
|
144
|
-
- -
|
172
|
+
- - ">="
|
145
173
|
- !ruby/object:Gem::Version
|
146
174
|
version: 0.3.2
|
147
175
|
type: :development
|
148
176
|
prerelease: false
|
149
177
|
version_requirements: !ruby/object:Gem::Requirement
|
150
178
|
requirements:
|
151
|
-
- -
|
179
|
+
- - ">="
|
152
180
|
- !ruby/object:Gem::Version
|
153
181
|
version: 0.3.2
|
182
|
+
- !ruby/object:Gem::Dependency
|
183
|
+
name: database_cleaner
|
184
|
+
requirement: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - '='
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: 1.3.0
|
189
|
+
type: :development
|
190
|
+
prerelease: false
|
191
|
+
version_requirements: !ruby/object:Gem::Requirement
|
192
|
+
requirements:
|
193
|
+
- - '='
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: 1.3.0
|
196
|
+
- !ruby/object:Gem::Dependency
|
197
|
+
name: guard-rspec
|
198
|
+
requirement: !ruby/object:Gem::Requirement
|
199
|
+
requirements:
|
200
|
+
- - ">="
|
201
|
+
- !ruby/object:Gem::Version
|
202
|
+
version: 4.2.8
|
203
|
+
type: :development
|
204
|
+
prerelease: false
|
205
|
+
version_requirements: !ruby/object:Gem::Requirement
|
206
|
+
requirements:
|
207
|
+
- - ">="
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
version: 4.2.8
|
210
|
+
- !ruby/object:Gem::Dependency
|
211
|
+
name: guard-rubocop
|
212
|
+
requirement: !ruby/object:Gem::Requirement
|
213
|
+
requirements:
|
214
|
+
- - ">="
|
215
|
+
- !ruby/object:Gem::Version
|
216
|
+
version: 1.1.0
|
217
|
+
type: :development
|
218
|
+
prerelease: false
|
219
|
+
version_requirements: !ruby/object:Gem::Requirement
|
220
|
+
requirements:
|
221
|
+
- - ">="
|
222
|
+
- !ruby/object:Gem::Version
|
223
|
+
version: 1.1.0
|
224
|
+
- !ruby/object:Gem::Dependency
|
225
|
+
name: rubocop
|
226
|
+
requirement: !ruby/object:Gem::Requirement
|
227
|
+
requirements:
|
228
|
+
- - ">="
|
229
|
+
- !ruby/object:Gem::Version
|
230
|
+
version: 0.24.1
|
231
|
+
type: :development
|
232
|
+
prerelease: false
|
233
|
+
version_requirements: !ruby/object:Gem::Requirement
|
234
|
+
requirements:
|
235
|
+
- - ">="
|
236
|
+
- !ruby/object:Gem::Version
|
237
|
+
version: 0.24.1
|
154
238
|
description: Calculate weight based charges for a Spree order
|
155
|
-
email:
|
239
|
+
email:
|
240
|
+
- torsten@villataika.fi
|
241
|
+
- hi@futhr.io
|
156
242
|
executables: []
|
157
243
|
extensions: []
|
158
244
|
extra_rdoc_files: []
|
159
245
|
files:
|
160
|
-
- .gitignore
|
161
|
-
- .
|
162
|
-
- .
|
246
|
+
- ".gitignore"
|
247
|
+
- ".hound.yml"
|
248
|
+
- ".reek"
|
249
|
+
- ".rspec"
|
250
|
+
- ".rubocop.yml"
|
251
|
+
- ".ruby-gemset"
|
252
|
+
- ".travis.yml"
|
253
|
+
- CHANGELOG.md
|
163
254
|
- CONTRIBUTING.md
|
164
255
|
- Gemfile
|
165
256
|
- Guardfile
|
@@ -176,6 +267,10 @@ files:
|
|
176
267
|
- lib/spree_postal_service/version.rb
|
177
268
|
- spec/lib/postal_service_spec.rb
|
178
269
|
- spec/spec_helper.rb
|
270
|
+
- spec/support/database_cleaner.rb
|
271
|
+
- spec/support/factory_girl.rb
|
272
|
+
- spec/support/i18n.rb
|
273
|
+
- spec/support/spree.rb
|
179
274
|
- spec/translations/locale_spec.rb
|
180
275
|
- spree_postal_service.gemspec
|
181
276
|
homepage: https://github.com/futhr/spree-postal-service
|
@@ -188,12 +283,12 @@ require_paths:
|
|
188
283
|
- lib
|
189
284
|
required_ruby_version: !ruby/object:Gem::Requirement
|
190
285
|
requirements:
|
191
|
-
- -
|
286
|
+
- - ">="
|
192
287
|
- !ruby/object:Gem::Version
|
193
288
|
version: 1.9.3
|
194
289
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
195
290
|
requirements:
|
196
|
-
- -
|
291
|
+
- - ">="
|
197
292
|
- !ruby/object:Gem::Version
|
198
293
|
version: '0'
|
199
294
|
requirements:
|
@@ -206,4 +301,8 @@ summary: Calculate weight based charges for a Spree order
|
|
206
301
|
test_files:
|
207
302
|
- spec/lib/postal_service_spec.rb
|
208
303
|
- spec/spec_helper.rb
|
304
|
+
- spec/support/database_cleaner.rb
|
305
|
+
- spec/support/factory_girl.rb
|
306
|
+
- spec/support/i18n.rb
|
307
|
+
- spec/support/spree.rb
|
209
308
|
- spec/translations/locale_spec.rb
|