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 CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- YzA1MDY3MDRmZjU5NTllN2RkMWYwZTEwMzBmNmFjN2ExNDNlZmE2Yg==
5
- data.tar.gz: !binary |-
6
- ZjQxNDk1NGJjOWVkYTBiNTQ1Y2U2MjBlMDVlNWVlYzNmZTAyOWUzMw==
2
+ SHA1:
3
+ metadata.gz: dd463b0989fbb4dc2bce7543483db1039a1eeb73
4
+ data.tar.gz: 2902030d6d74477f8773b801d47b29c0e22abeae
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- YWM1YWQ3ZGU4NTA5ZmM4MjAwMTI3ZWM0NDVkZjczOTNmYzAyMGE0ZmY3NDk3
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
@@ -9,8 +9,9 @@ nbproject
9
9
  *.swp
10
10
  Gemfile.lock
11
11
  .rvmrc
12
- .localeapp
13
12
  coverage
14
13
  spec/dummy
15
14
  pkg/
16
- *.gem
15
+ *.gem
16
+ .bundle
17
+ .ruby-version
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
@@ -1 +1,3 @@
1
1
  --color
2
+ -r spec_helper
3
+ -f documentation
data/.rubocop.yml ADDED
@@ -0,0 +1,8 @@
1
+ ---
2
+ inherit_from: .hound.yml
3
+
4
+ AllCops:
5
+ Exclude:
6
+ - spec/dummy/**/*
7
+ - bin/*
8
+ - Guardfile
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ spree-postal-service
data/.travis.yml CHANGED
@@ -8,4 +8,4 @@ script:
8
8
  rvm:
9
9
  - 1.9.3
10
10
  - 2.0.0
11
- - 2.1.0
11
+ - 2.1.5
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ # Changelog
2
+
3
+ See: [Github Release Information](https://github.com/futhr/spree-postal-service/releases)
data/CONTRIBUTING.md CHANGED
@@ -27,4 +27,4 @@ Starting point:
27
27
 
28
28
  [1]: http://www.fsf.org/licensing/essays/free-sw.html
29
29
  [2]: https://github.com/futhr/spree-postal-service/issues
30
- [3]: http://www.localeapp.com/projects/4917
30
+ [3]: https://github.com/futhr/spree-postal-service/blob/master/config/locales
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
1
  source 'https://rubygems.org/'
2
2
 
3
- gemspec
3
+ gemspec
data/Guardfile CHANGED
@@ -1,5 +1,13 @@
1
- guard 'rspec', cmd: 'bundle exec rspec', all_on_start: true do
2
- watch('spec/spec_helper.rb') { 'spec' }
3
- watch(%r{^spec/(.+)_spec\.rb$}) { |m| "spec/#{m[1]}_spec.rb"}
4
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
5
- end
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://api.travis-ci.org/futhr/spree-postal-service.png?branch=2-2-stable)](https://travis-ci.org/futhr/spree-postal-service)
4
- [![Code Climate](https://codeclimate.com/github/futhr/spree-postal-service.png)](https://codeclimate.com/github/futhr/spree-postal-service)
5
- [![Gem Version](https://badge.fury.io/rb/spree_postal_service.png)](http://badge.fury.io/rb/spree_postal_service)
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 europe will.
8
+ A postal service is delivers based on weight only(*). Like most post services in Europe will.
8
9
 
9
- This spree extension adds a spree-calculator to model 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.2.0'
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 euro)
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
@@ -4,4 +4,4 @@ ENGINE_ROOT = File.expand_path('../..', __FILE__)
4
4
  ENGINE_PATH = File.expand_path('../../lib/spree_postal_service/engine', __FILE__)
5
5
 
6
6
  require 'rails/all'
7
- require 'rails/engine/commands'
7
+ require 'rails/engine/commands'
@@ -11,4 +11,4 @@ en:
11
11
  handling_max: "Amount, over which handling fee won't be applied"
12
12
  min_price: Minimum price
13
13
  default_weight: Default weight
14
- max_price: Maximum price
14
+ max_price: Maximum price
@@ -11,4 +11,4 @@ pt:
11
11
  handling_max: Valor a partir do qual a taxa de tratamento não é aplicada
12
12
  min_price: Preço mínimo
13
13
  default_weight: Peso por omissão
14
- max_price: Preço máximo
14
+ max_price: Preço máximo
@@ -11,4 +11,4 @@ sv:
11
11
  handling_max: "Belopp, över vilken expeditionsavgift inte skall tillämpas"
12
12
  min_price: Minsta belopp
13
13
  default_weight: Förvald vikt
14
- max_price: Största belopp
14
+ max_price: Största belopp
@@ -1,73 +1,104 @@
1
- class Spree::Calculator::Shipping::PostalService < Spree::ShippingCalculator
2
- preference :weight_table, :string, default: '1 2 5 10 20'
3
- preference :price_table, :string, default: '6 9 12 15 18'
4
- preference :max_item_weight, :decimal, default: 18
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
- def self.register
17
- super
18
- end
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
- def item_oversized?(variant)
21
- sizes = [
22
- variant.width ? variant.width : 0,
23
- variant.depth ? variant.depth : 0,
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
- return true if sizes[0] > self.preferred_max_item_length # longest side
28
- return true if sizes[1] > self.preferred_max_item_width # second longest side
29
- return false
30
- end
21
+ def register
22
+ super
23
+ end
24
+ end
31
25
 
32
- def available?(package)
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
- # as order_or_line_items we always get line items, as calculable we have Coupon, ShippingMethod or ShippingRate
42
- def compute(package)
43
- order = package.order
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
- total_price, total_weight, shipping = 0, 0, 0
46
- prices = self.preferred_price_table.split.map { |price| price.to_f }
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
- order.line_items.each do |item| # determine total price and weight
49
- total_weight += item.quantity * (item.variant.weight || self.preferred_default_weight)
50
- total_price += item.price * item.quantity
51
- end
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
- return 0.0 if total_price > self.preferred_max_price
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
- # determine handling fee
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
- while total_weight > weights.last # in several packages if need be
60
- total_weight -= weights.last
61
- shipping += prices.last
62
- end
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
- index = weights.length - 2
65
- while index >= 0
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
- shipping += prices[index + 1]
71
- return shipping + handling_fee
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
@@ -1,3 +1,3 @@
1
1
  require 'spree_core'
2
2
  require 'spree_postal_service/engine'
3
- require 'spree_postal_service/version'
3
+ require 'spree_postal_service/version'
@@ -10,4 +10,4 @@ module SpreePostalService
10
10
  app.config.spree.calculators.shipping_methods << Spree::Calculator::Shipping::PostalService
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -1,16 +1,17 @@
1
1
  module SpreePostalService
2
2
 
3
- # Returns the version of the currently loaded SpreePostalService as a <tt>Gem::Version</tt>
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 = 2
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
- require 'spec_helper'
1
+ RSpec.describe Spree::Calculator::Shipping::PostalService do
2
2
 
3
- describe Spree::Calculator::Shipping::PostalService do
3
+ subject { described_class.new }
4
4
 
5
- let(:postal_service_calculator) { described_class.new }
6
-
7
- describe 'return description' do
8
- context 'in english' do
9
- before { I18n.locale = :en }
10
- specify do
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 ':using the default weight-price table: [1 2 5 10 20] => [6 9 12 15 18]' do
24
- context '#compute:' do
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 = postal_service_calculator.compute(@package)
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 = postal_service_calculator.compute(@package)
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 = postal_service_calculator.compute(@package)
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 = postal_service_calculator.compute(@package)
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
- postal_service_calculator.preferred_max_price = 250
52
- result = postal_service_calculator.compute(@package)
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 = create(:order)
58
- [30.0, 40.0, 30.0].each do |price|
59
- create(:line_item,
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
- shipment = create(:shipment, order: order)
67
- package = shipment.to_package
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
- postal_service_calculator.preferred_max_price = 300
76
- result = postal_service_calculator.compute(@package)
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 '#available?' do
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(postal_service_calculator.available?(@package)).to be_false
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(postal_service_calculator.available?(@package)).to be_false
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(postal_service_calculator.available?(@package)).to be_false
97
- end
81
+ expect(subject.available?(@package)).to be(false)
98
82
  end
83
+ end
99
84
 
100
- context '#item_oversized?' do
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(postal_service_calculator.item_oversized?(@variant)).to be_true
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(postal_service_calculator.item_oversized?(@variant)).to be_true
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
- params = {}
115
- params.merge!(weight: args[:weight]) if args[:weight]
116
- params.merge!(height: args[:height]) if args[:height]
117
- params.merge!(width: args[:width]) if args[:width]
118
- params.merge!(depth: args[:depth]) if args[:depth]
119
- @variant = create(:base_variant, params)
120
-
121
- params = { variant: @variant }
122
- params.merge!(price: args[:price]) if args[:price]
123
- params.merge!(quantity: args[:quantity]) if args[:quantity]
124
- @line_item = create(:line_item, params)
125
-
126
- @order = @line_item.order
127
- @order.line_items.reload
128
- @shipment = create(:shipment, order: @order)
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'] = 'test'
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
- Dir[Rails.root.join('spec/support/**/*.rb')].each {|f| require f}
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.use_transactional_fixtures = true
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
- config.include FactoryGirl::Syntax::Methods
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,5 @@
1
+ require 'factory_girl'
2
+
3
+ RSpec.configure do |config|
4
+ config.include FactoryGirl::Syntax::Methods
5
+ end
@@ -0,0 +1,9 @@
1
+ require 'rspec'
2
+ require 'i18n-spec'
3
+
4
+ RSpec.configure do |config|
5
+
6
+ config.before(:suite) do
7
+ I18n.locale = :en
8
+ end
9
+ end
@@ -0,0 +1 @@
1
+ require 'spree/testing_support/factories'
@@ -1,15 +1,14 @@
1
- require 'spec_helper'
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 { should be_parseable }
7
- it { should have_valid_pluralization_keys }
8
- it { should_not have_missing_pluralization_keys }
9
- it { should have_one_top_level_namespace }
10
- it { should_not have_legacy_interpolations }
11
- it { should have_a_valid_locale }
12
- it { should be_a_complete_translation_of 'config/locales/en.yml' }
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
- $:.unshift lib unless $:.include?(lib)
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 = %q{BSD-3}
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.add_dependency 'spree_core', '~> 2.2.0'
27
+ s.add_runtime_dependency 'spree_core', '~> 2.3.0'
28
28
 
29
- s.add_development_dependency 'rspec', '~> 2.14.0'
30
- s.add_development_dependency 'rspec-rails', '~> 2.14.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.7.1'
34
- s.add_development_dependency 'i18n-spec', '>= 0.4.1'
35
- s.add_development_dependency 'ffaker', '>= 1.24.0'
36
- s.add_development_dependency 'guard-rspec', '>= 4.2.8'
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
- end
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.2.0
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-04-05 00:00:00.000000000 Z
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.2.0
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.2.0
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: 2.14.0
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: 2.14.0
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: 2.14.0
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: 2.14.0
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.7.1
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.7.1
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.4.1
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.4.1
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.0
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.0
139
+ version: '1.24'
126
140
  - !ruby/object:Gem::Dependency
127
- name: guard-rspec
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.2.8
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.2.8
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: hi@futhr.io
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
- - .rspec
162
- - .travis.yml
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