kosher 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +13 -20
- data/kosher.gemspec +2 -0
- data/lib/kosher/availability.rb +15 -0
- data/lib/kosher/condition.rb +11 -7
- data/lib/kosher/description.rb +16 -24
- data/lib/kosher/item.rb +11 -0
- data/lib/kosher/offer.rb +11 -26
- data/lib/kosher/seller.rb +18 -2
- data/lib/kosher/shipping.rb +15 -0
- data/lib/kosher/version.rb +1 -1
- data/lib/kosher.rb +6 -1
- data/spec/kosher/availability_spec.rb +29 -0
- data/spec/kosher/condition_spec.rb +15 -5
- data/spec/kosher/description_spec.rb +62 -30
- data/spec/kosher/item_spec.rb +47 -0
- data/spec/kosher/offer_spec.rb +93 -89
- data/spec/kosher/seller_spec.rb +27 -22
- data/spec/kosher/shipping_spec.rb +55 -0
- data/spec/spec_helper.rb +1 -0
- metadata +36 -8
- data/lib/kosher/config.rb +0 -45
- data/spec/kosher/config_spec.rb +0 -40
data/README.md
CHANGED
@@ -1,33 +1,26 @@
|
|
1
1
|
Kosher
|
2
2
|
======
|
3
3
|
|
4
|
-
Kosher models
|
4
|
+
Kosher models booksellers' offers.
|
5
5
|
|
6
|
-
It knows if
|
7
|
-
|
6
|
+
It knows if an offer is good or bad. It is also able to compare offers.
|
7
|
+
|
8
|
+
It is somewhat overengineered.
|
8
9
|
|
9
10
|
![Booksellers](http://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/Bucharest_booksellers_2.jpg/600px-Bucharest_booksellers_2.jpg)
|
10
11
|
|
11
12
|
Usage
|
12
13
|
-----
|
13
14
|
|
14
|
-
include Kosher
|
15
|
-
|
16
|
-
offer = Offer.new(1234,
|
17
|
-
Seller.new('ABCDEF',
|
18
|
-
'John Doe Books',
|
19
|
-
4.8),
|
20
|
-
Condition.new(1),
|
21
|
-
Description.new('A fine copy'),
|
22
|
-
48,
|
23
|
-
1000,
|
24
|
-
399,
|
25
|
-
'USD',
|
26
|
-
'http://bookseller.com/listings/1234'
|
27
|
-
|
28
15
|
offer.kosher?
|
29
16
|
=> true
|
17
|
+
offer.price
|
18
|
+
=> #<Money cents:1399 currency:EUR>
|
30
19
|
|
31
|
-
|
32
|
-
|
33
|
-
|
20
|
+
another_offer.kosher?
|
21
|
+
=> true
|
22
|
+
another_offer.price
|
23
|
+
=> #<Money cents:1499 currency:EUR>
|
24
|
+
|
25
|
+
offer > another_offer
|
26
|
+
=> true
|
data/kosher.gemspec
CHANGED
@@ -14,8 +14,10 @@ Gem::Specification.new do |s|
|
|
14
14
|
|
15
15
|
s.rubyforge_project = 'kosher'
|
16
16
|
|
17
|
+
s.add_dependency('json', '~> 1.5.1')
|
17
18
|
s.add_dependency('money', '~> 3.6.1')
|
18
19
|
s.add_development_dependency('rspec', '~> 2.5.0')
|
20
|
+
s.add_development_dependency('ruby-debug19', '~> 0.11.6')
|
19
21
|
|
20
22
|
s.files = `git ls-files`.split("\n")
|
21
23
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/lib/kosher/condition.rb
CHANGED
@@ -1,15 +1,19 @@
|
|
1
1
|
module Kosher
|
2
|
-
class Condition
|
3
|
-
def initialize(grade)
|
4
|
-
@grade = grade
|
5
|
-
end
|
6
|
-
|
2
|
+
class Condition < Struct.new(:grade)
|
7
3
|
def kosher?
|
8
|
-
|
4
|
+
grade <= threshold
|
9
5
|
end
|
10
6
|
|
11
7
|
def new?
|
12
|
-
|
8
|
+
grade == 1
|
9
|
+
end
|
10
|
+
|
11
|
+
def threshold
|
12
|
+
@threshold ||= 4
|
13
|
+
end
|
14
|
+
|
15
|
+
def threshold=(grade)
|
16
|
+
@threshold = grade
|
13
17
|
end
|
14
18
|
|
15
19
|
def used?
|
data/lib/kosher/description.rb
CHANGED
@@ -1,51 +1,43 @@
|
|
1
1
|
module Kosher
|
2
|
-
class Description
|
2
|
+
class Description < Struct.new(:text)
|
3
3
|
DAMAGED = "\\b(?:missing|torn|broken|split|discard|withdrawn|rent|stain|school|damaged|water)"
|
4
4
|
EXLIB = "(?:e?x|discarded|retired|former|has|have)[\\s._-]*lib"
|
5
5
|
MARKED = "(highlight|hilit|underlin)"
|
6
6
|
MISSING_VOL = "(vols?|volume) only"
|
7
7
|
REVIEW_COPY = "\\b(?:uncorrected|advanced?\\sreview|arc)\\b"
|
8
8
|
|
9
|
-
def
|
10
|
-
|
9
|
+
def damaged?
|
10
|
+
matches?(DAMAGED)
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
|
13
|
+
def ex_lib?
|
14
|
+
matches?(EXLIB) && !matches?(negation_of(EXLIB))
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
def damaged?
|
20
|
-
matches(DAMAGED)
|
17
|
+
def kosher?
|
18
|
+
!(damaged? || ex_lib? || marked? || missing_volume? || review_copy?)
|
21
19
|
end
|
22
20
|
|
23
|
-
def
|
24
|
-
!matches(
|
21
|
+
def marked?
|
22
|
+
matches?(MARKED) && !matches?(negation_of(MARKED))
|
25
23
|
end
|
26
24
|
|
27
|
-
def
|
28
|
-
matches(
|
25
|
+
def missing_volume?
|
26
|
+
matches?(MISSING_VOL)
|
29
27
|
end
|
30
28
|
|
31
|
-
def
|
32
|
-
matches(
|
29
|
+
def review_copy?
|
30
|
+
matches?(REVIEW_COPY)
|
33
31
|
end
|
34
32
|
|
35
|
-
|
36
|
-
@description.match(Regexp.new(value, true))
|
37
|
-
end
|
33
|
+
private
|
38
34
|
|
39
|
-
def
|
40
|
-
|
35
|
+
def matches?(value)
|
36
|
+
!!text.match(Regexp.new(value, true))
|
41
37
|
end
|
42
38
|
|
43
39
|
def negation_of(value)
|
44
40
|
"(?:no|not an?)\\s+#{value}"
|
45
41
|
end
|
46
|
-
|
47
|
-
def review_copy?
|
48
|
-
matches(REVIEW_COPY)
|
49
|
-
end
|
50
42
|
end
|
51
43
|
end
|
data/lib/kosher/item.rb
ADDED
data/lib/kosher/offer.rb
CHANGED
@@ -1,45 +1,30 @@
|
|
1
|
-
require 'money'
|
2
|
-
|
3
1
|
module Kosher
|
4
|
-
class Offer < Struct.new(
|
5
|
-
:id,
|
6
|
-
:seller,
|
7
|
-
:condition,
|
8
|
-
:description,
|
9
|
-
:hours_shipped,
|
10
|
-
:price_in_cents,
|
11
|
-
:shipping_in_cents,
|
12
|
-
:currency,
|
13
|
-
:url)
|
14
|
-
|
2
|
+
class Offer < Struct.new(:id, :url, :item, :seller, :shipping)
|
15
3
|
include Comparable
|
16
4
|
|
17
|
-
def <=>(
|
18
|
-
if self.kosher? !=
|
5
|
+
def <=>(other)
|
6
|
+
if self.kosher? != other.kosher?
|
19
7
|
self.kosher? ? 1 : -1
|
20
8
|
else
|
21
|
-
|
9
|
+
currency = base_currency
|
10
|
+
-(self.price.exchange_to(currency) <=> other.price.exchange_to(currency))
|
22
11
|
end
|
23
12
|
end
|
24
13
|
|
25
|
-
def
|
26
|
-
|
14
|
+
def base_currency
|
15
|
+
@base_currency ||= 'EUR'
|
27
16
|
end
|
28
17
|
|
29
|
-
def
|
30
|
-
|
18
|
+
def base_currency=(currency)
|
19
|
+
@base_currency = currency
|
31
20
|
end
|
32
21
|
|
33
22
|
def kosher?
|
34
|
-
|
23
|
+
item.kosher? && seller.kosher? && shipping.kosher?
|
35
24
|
end
|
36
25
|
|
37
26
|
def price
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
def shipping
|
42
|
-
Money.new(shipping_in_cents.to_i, currency)
|
27
|
+
item.price + shipping.cost
|
43
28
|
end
|
44
29
|
end
|
45
30
|
end
|
data/lib/kosher/seller.rb
CHANGED
@@ -1,11 +1,27 @@
|
|
1
1
|
module Kosher
|
2
2
|
class Seller < Struct.new(:id, :name, :rating)
|
3
|
+
def blacklist
|
4
|
+
@blacklist ||= []
|
5
|
+
end
|
6
|
+
|
7
|
+
def blacklist=(ids)
|
8
|
+
@blacklist = ids
|
9
|
+
end
|
10
|
+
|
3
11
|
def blacklisted?
|
4
|
-
|
12
|
+
blacklist.include? id
|
5
13
|
end
|
6
14
|
|
7
15
|
def kosher?
|
8
|
-
!blacklisted? && (rating.to_f == 0.0 || rating >=
|
16
|
+
!blacklisted? && (rating.to_f == 0.0 || rating >= threshold)
|
17
|
+
end
|
18
|
+
|
19
|
+
def threshold
|
20
|
+
@threshold ||= 4.8
|
21
|
+
end
|
22
|
+
|
23
|
+
def threshold=(rating)
|
24
|
+
@threshold = rating
|
9
25
|
end
|
10
26
|
end
|
11
27
|
end
|
data/lib/kosher/version.rb
CHANGED
data/lib/kosher.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Kosher
|
4
|
+
describe Availability do
|
5
|
+
before do
|
6
|
+
@availability = Availability.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#kosher?" do
|
10
|
+
before do
|
11
|
+
@availability.threshold = 48
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when available within threshold" do
|
15
|
+
it "returns true" do
|
16
|
+
@availability.hours = 48
|
17
|
+
@availability.should be_kosher
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when not available within threshold" do
|
22
|
+
it "returns false" do
|
23
|
+
@availability.hours = 96
|
24
|
+
@availability.should_not be_kosher
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -2,17 +2,27 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Kosher
|
4
4
|
describe Condition do
|
5
|
+
before do
|
6
|
+
@condition = Condition.new
|
7
|
+
end
|
8
|
+
|
5
9
|
describe "#kosher?" do
|
6
10
|
before do
|
7
|
-
|
11
|
+
@condition.threshold = 4
|
8
12
|
end
|
9
13
|
|
10
|
-
|
11
|
-
|
14
|
+
context "when grade within threshold" do
|
15
|
+
it "returns true" do
|
16
|
+
@condition.grade = 4
|
17
|
+
@condition.should be_kosher
|
18
|
+
end
|
12
19
|
end
|
13
20
|
|
14
|
-
|
15
|
-
|
21
|
+
context "when grade not within threshold" do
|
22
|
+
it "returns false" do
|
23
|
+
@condition.grade = 5
|
24
|
+
@condition.should_not be_kosher
|
25
|
+
end
|
16
26
|
end
|
17
27
|
end
|
18
28
|
end
|
@@ -2,46 +2,78 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Kosher
|
4
4
|
describe Description do
|
5
|
-
|
6
|
-
Description.new
|
5
|
+
before do
|
6
|
+
@description = Description.new
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
describe "#kosher?" do
|
10
|
+
it "validates a blank description" do
|
11
|
+
@description.text = ''
|
12
|
+
@description.should be_kosher
|
13
|
+
end
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
it "validates a non-blank description" do
|
16
|
+
@description.text = 'foo'
|
17
|
+
@description.should be_kosher
|
18
|
+
end
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
+
it "does not validate advance review copies" do
|
21
|
+
@description.text = 'Uncorrected review copy'
|
22
|
+
@description.should_not be_kosher
|
20
23
|
|
21
|
-
|
22
|
-
|
23
|
-
Description.new('Underlining.').should_not be_kosher
|
24
|
-
Description.new('Good. Hiliting.').should_not be_kosher
|
24
|
+
@description.text = 'arc'
|
25
|
+
@description.should_not be_kosher
|
25
26
|
|
26
|
-
|
27
|
-
|
27
|
+
@description.text = 'arc.'
|
28
|
+
@description.should_not be_kosher
|
28
29
|
|
29
|
-
|
30
|
-
|
31
|
-
|
30
|
+
@description.text = 'marc'
|
31
|
+
@description.should be_kosher
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
34
|
+
it "does not validate marked books" do
|
35
|
+
@description.text = 'Some highlighting'
|
36
|
+
@description.should_not be_kosher
|
37
|
+
|
38
|
+
@description.text = 'Underlining.'
|
39
|
+
@description.should_not be_kosher
|
40
|
+
|
41
|
+
@description.text = 'Good. Hiliting.'
|
42
|
+
@description.should_not be_kosher
|
43
|
+
|
44
|
+
@description.text = 'No highlighting.'
|
45
|
+
@description.should be_kosher
|
46
|
+
end
|
47
|
+
|
48
|
+
it "does not validate books with missing volumes" do
|
49
|
+
@description.text = 'First vol only.'
|
50
|
+
@description.should_not be_kosher
|
51
|
+
end
|
52
|
+
|
53
|
+
it "does not validate damaged or worn books" do
|
54
|
+
@description.text = 'Different'
|
55
|
+
@description.should be_kosher
|
56
|
+
|
57
|
+
@description.text = 'Rental'
|
58
|
+
@description.should_not be_kosher
|
59
|
+
|
60
|
+
@description.text = 'Torn pages'
|
61
|
+
@description.should_not be_kosher
|
62
|
+
end
|
63
|
+
|
64
|
+
it "does not validate withdrawn library copies" do
|
65
|
+
@description.text = 'xlib'
|
66
|
+
@description.should_not be_kosher
|
67
|
+
|
68
|
+
@description.text = 'ex-library'
|
69
|
+
@description.should_not be_kosher
|
38
70
|
|
39
|
-
|
40
|
-
|
41
|
-
Description.new('ex-library').should_not be_kosher
|
42
|
-
Description.new('retired library copy').should_not be_kosher
|
71
|
+
@description.text = 'retired library copy'
|
72
|
+
@description.should_not be_kosher
|
43
73
|
|
44
|
-
|
74
|
+
@description.text = 'Not an ex-library'
|
75
|
+
@description.should be_kosher
|
76
|
+
end
|
45
77
|
end
|
46
78
|
end
|
47
79
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Kosher
|
4
|
+
describe Item do
|
5
|
+
before do
|
6
|
+
@item = Item.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#kosher?" do
|
10
|
+
context "when condition is kosher" do
|
11
|
+
before do
|
12
|
+
@item.condition = Condition.new(1)
|
13
|
+
end
|
14
|
+
|
15
|
+
context "when description is kosher" do
|
16
|
+
before do
|
17
|
+
@item.description = Description.new('')
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns true" do
|
21
|
+
@item.should be_kosher
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context "when description is not kosher" do
|
26
|
+
before do
|
27
|
+
@item.description = Description.new('Withdrawn library book')
|
28
|
+
end
|
29
|
+
|
30
|
+
it "returns false" do
|
31
|
+
@item.should_not be_kosher
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when condition is not kosher" do
|
37
|
+
before do
|
38
|
+
@item.condition = Condition.new(5)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns false" do
|
42
|
+
@item.should_not be_kosher
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/spec/kosher/offer_spec.rb
CHANGED
@@ -2,173 +2,177 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
module Kosher
|
4
4
|
describe Offer do
|
5
|
-
|
5
|
+
before do
|
6
|
+
@offer = Offer.new
|
7
|
+
@offer.item = Item.new
|
8
|
+
@offer.seller = Seller.new
|
9
|
+
@offer.shipping = Shipping.new
|
10
|
+
end
|
6
11
|
|
7
12
|
describe "#kosher?" do
|
8
|
-
|
13
|
+
context "when item is kosher" do
|
9
14
|
before do
|
10
|
-
offer.
|
15
|
+
@offer.item.stub!(:kosher?).and_return(true)
|
11
16
|
end
|
12
17
|
|
13
|
-
|
18
|
+
context "when seller is kosher" do
|
14
19
|
before do
|
15
|
-
offer.seller
|
20
|
+
@offer.seller.stub!(:kosher?).and_return(true)
|
16
21
|
end
|
17
22
|
|
18
|
-
|
23
|
+
context "when shipping is kosher" do
|
19
24
|
before do
|
20
|
-
offer.
|
21
|
-
end
|
22
|
-
|
23
|
-
describe "when offer ships now" do
|
24
|
-
it "returns true" do
|
25
|
-
offer.should be_kosher
|
26
|
-
end
|
25
|
+
@offer.shipping.stub!(:kosher?).and_return(true)
|
27
26
|
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
offer.hours_shipped = 72
|
32
|
-
end
|
33
|
-
|
34
|
-
it "returns false" do
|
35
|
-
offer.should_not be_kosher
|
36
|
-
end
|
28
|
+
it "returns true" do
|
29
|
+
@offer.should be_kosher
|
37
30
|
end
|
38
31
|
end
|
39
32
|
|
40
|
-
|
33
|
+
context "when shipping is not kosher" do
|
41
34
|
before do
|
42
|
-
offer.
|
35
|
+
@offer.shipping.stub!(:kosher?).and_return(false)
|
43
36
|
end
|
44
37
|
|
45
38
|
it "returns false" do
|
46
|
-
offer.should_not be_kosher
|
39
|
+
@offer.should_not be_kosher
|
47
40
|
end
|
48
41
|
end
|
49
42
|
end
|
50
43
|
|
51
|
-
|
44
|
+
context "when seller is not kosher" do
|
52
45
|
before do
|
53
|
-
offer.seller
|
46
|
+
@offer.seller.stub!(:kosher?).and_return(false)
|
54
47
|
end
|
55
48
|
|
56
49
|
it "returns false" do
|
57
|
-
offer.should_not be_kosher
|
50
|
+
@offer.should_not be_kosher
|
58
51
|
end
|
59
52
|
end
|
60
53
|
end
|
61
54
|
|
62
|
-
|
55
|
+
context "when item is not kosher" do
|
63
56
|
before do
|
64
|
-
offer.
|
65
|
-
end
|
66
|
-
|
67
|
-
it "returns false" do
|
68
|
-
offer.should_not be_kosher
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe "#available?" do
|
74
|
-
before do
|
75
|
-
Config.max_hours_shipped = 48
|
76
|
-
end
|
77
|
-
|
78
|
-
describe "when offer is expected to ship on time" do
|
79
|
-
it "returns true" do
|
80
|
-
offer.hours_shipped = 48
|
81
|
-
offer.should be_available
|
57
|
+
@offer.item.stub!(:kosher?).and_return(false)
|
82
58
|
end
|
83
|
-
end
|
84
59
|
|
85
|
-
describe "when offer is not expected to ship on time" do
|
86
60
|
it "returns false" do
|
87
|
-
offer.
|
88
|
-
offer.should_not be_available
|
61
|
+
@offer.should_not be_kosher
|
89
62
|
end
|
90
63
|
end
|
91
64
|
end
|
92
65
|
|
93
66
|
describe "#price" do
|
94
|
-
it "
|
95
|
-
offer.
|
96
|
-
offer.currency = '
|
67
|
+
it "sum of item price and shipping cost" do
|
68
|
+
@offer.item.cents = 1000
|
69
|
+
@offer.item.currency = 'EUR'
|
70
|
+
|
71
|
+
@offer.shipping.cents = 399
|
72
|
+
@offer.shipping.currency = 'EUR'
|
97
73
|
|
98
|
-
offer.price.should
|
99
|
-
offer.price.
|
74
|
+
@offer.price.cents.should eql 1399
|
75
|
+
@offer.price.currency.iso_code.should eql 'EUR'
|
100
76
|
end
|
101
77
|
end
|
102
78
|
|
103
79
|
describe "#<=>" do
|
104
80
|
before do
|
105
|
-
|
106
|
-
offer.seller = Seller.new
|
107
|
-
offer.description = Description.new
|
108
|
-
offer.price_in_cents = 100
|
109
|
-
offer.currency = 'EUR'
|
110
|
-
@another_offer = offer.dup
|
81
|
+
@another_offer = Offer.new
|
111
82
|
end
|
112
83
|
|
113
84
|
context "when kosher" do
|
114
|
-
|
115
|
-
@
|
116
|
-
|
117
|
-
@another_offer.should_not be_kosher
|
85
|
+
before do
|
86
|
+
@offer.stub!(:kosher?).and_return(true)
|
87
|
+
end
|
118
88
|
|
119
|
-
|
89
|
+
it "is greater than a non-kosher offer" do
|
90
|
+
@another_offer.stub!(:kosher?).and_return(false)
|
91
|
+
@offer.should be > @another_offer
|
120
92
|
end
|
121
93
|
|
122
|
-
context "when the other offer is kosher
|
123
|
-
|
124
|
-
@
|
94
|
+
context "when the other offer is kosher as well" do
|
95
|
+
before do
|
96
|
+
@offer.stub!(:price).and_return(Money.new(100, 'EUR'))
|
97
|
+
@another_offer.stub!(:kosher?).and_return(true)
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when it has a lower price" do
|
101
|
+
before do
|
102
|
+
@another_offer.stub!(:price).and_return(Money.new(150, 'EUR'))
|
103
|
+
end
|
125
104
|
|
126
|
-
|
105
|
+
it "is greater than other offer" do
|
106
|
+
@offer.should be > @another_offer
|
107
|
+
end
|
127
108
|
end
|
128
109
|
|
129
|
-
|
130
|
-
|
110
|
+
context "when the prices are equal" do
|
111
|
+
before do
|
112
|
+
@another_offer.stub!(:price).and_return(Money.new(100, 'EUR'))
|
113
|
+
end
|
114
|
+
|
115
|
+
it "is equal to the other offer" do
|
116
|
+
@offer.should <=> @another_offer
|
117
|
+
end
|
131
118
|
end
|
132
119
|
|
133
|
-
|
134
|
-
|
120
|
+
context "when it has a higher price" do
|
121
|
+
before do
|
122
|
+
@another_offer.stub!(:price).and_return(Money.new(50, 'EUR'))
|
123
|
+
end
|
135
124
|
|
136
|
-
|
125
|
+
it "is less than the other offer" do
|
126
|
+
@offer.should be < @another_offer
|
127
|
+
end
|
137
128
|
end
|
138
129
|
end
|
139
130
|
end
|
140
131
|
|
141
132
|
context "when not kosher" do
|
142
133
|
before do
|
143
|
-
offer.
|
134
|
+
@offer.stub!(:kosher?).and_return(false)
|
144
135
|
end
|
145
136
|
|
146
137
|
it "is less than a kosher offer" do
|
147
|
-
|
148
|
-
@
|
149
|
-
|
150
|
-
offer.should be < @another_offer
|
138
|
+
@another_offer.stub!(:kosher?).and_return(true)
|
139
|
+
@offer.should be < @another_offer
|
151
140
|
end
|
152
141
|
|
153
142
|
context "when the other offer is not kosher either" do
|
154
143
|
before do
|
155
|
-
@
|
144
|
+
@offer.stub!(:price).and_return(Money.new(100, 'EUR'))
|
145
|
+
@another_offer.stub!(:kosher?).and_return(false)
|
156
146
|
end
|
157
147
|
|
158
|
-
|
159
|
-
|
148
|
+
context "when it has a higher price" do
|
149
|
+
before do
|
150
|
+
@another_offer.stub!(:price).and_return(Money.new(150, 'EUR'))
|
151
|
+
end
|
160
152
|
|
161
|
-
|
153
|
+
it "is greater than the other offer" do
|
154
|
+
@offer.should > @another_offer
|
155
|
+
end
|
162
156
|
end
|
163
157
|
|
164
|
-
|
165
|
-
|
158
|
+
context "when the prices are equal" do
|
159
|
+
before do
|
160
|
+
@another_offer.stub!(:price).and_return(Money.new(100, 'EUR'))
|
161
|
+
end
|
162
|
+
|
163
|
+
it "is equal to the other offer" do
|
164
|
+
@offer.should <=> @another_offer
|
165
|
+
end
|
166
166
|
end
|
167
167
|
|
168
|
-
|
169
|
-
|
168
|
+
context "when it has a lower price" do
|
169
|
+
before do
|
170
|
+
@another_offer.stub!(:price).and_return(Money.new(50, 'EUR'))
|
171
|
+
end
|
170
172
|
|
171
|
-
|
173
|
+
it "is less than the other offer" do
|
174
|
+
@offer.should < @another_offer
|
175
|
+
end
|
172
176
|
end
|
173
177
|
end
|
174
178
|
end
|
data/spec/kosher/seller_spec.rb
CHANGED
@@ -3,54 +3,59 @@ require 'spec_helper'
|
|
3
3
|
module Kosher
|
4
4
|
describe Seller do
|
5
5
|
before do
|
6
|
-
|
6
|
+
@seller = Seller.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#blacklist" do
|
10
|
+
it "defaults to an empty array" do
|
11
|
+
@seller.blacklist.should eql []
|
12
|
+
end
|
7
13
|
end
|
8
14
|
|
9
15
|
describe "#blacklisted?" do
|
10
16
|
before do
|
11
|
-
|
17
|
+
@seller.blacklist = ['foo']
|
12
18
|
end
|
13
19
|
|
14
20
|
it "returns true if the seller is blacklisted" do
|
15
|
-
|
21
|
+
@seller.id = 'foo'
|
22
|
+
@seller.should be_blacklisted
|
16
23
|
end
|
17
24
|
|
18
25
|
it "returns false if the seller is not blacklisted" do
|
19
|
-
|
26
|
+
@seller.id = 'bar'
|
27
|
+
@seller.should_not be_blacklisted
|
20
28
|
end
|
21
29
|
end
|
22
30
|
|
23
31
|
describe "#kosher?" do
|
24
32
|
before do
|
25
|
-
|
33
|
+
@seller.threshold = 4.8
|
26
34
|
end
|
27
35
|
|
28
|
-
it "returns true if
|
29
|
-
seller =
|
30
|
-
seller.should be_kosher
|
36
|
+
it "returns true if rating is 0.0" do
|
37
|
+
@seller.rating = 0.0
|
38
|
+
@seller.should be_kosher
|
31
39
|
end
|
32
40
|
|
33
|
-
it "returns true if
|
34
|
-
seller
|
35
|
-
seller.should be_kosher
|
41
|
+
it "returns true if rating is nil" do
|
42
|
+
@seller.should be_kosher
|
36
43
|
end
|
37
44
|
|
38
|
-
it "returns true if
|
39
|
-
seller =
|
40
|
-
seller.should be_kosher
|
45
|
+
it "returns true if rating is within threshold" do
|
46
|
+
@seller.rating = 4.8
|
47
|
+
@seller.should be_kosher
|
41
48
|
end
|
42
49
|
|
43
|
-
it "returns false if
|
44
|
-
seller =
|
45
|
-
seller.should_not be_kosher
|
50
|
+
it "returns false if rating is not within threshold" do
|
51
|
+
@seller.rating = 4.7
|
52
|
+
@seller.should_not be_kosher
|
46
53
|
end
|
47
54
|
|
48
55
|
it "returns false if seller is blacklisted" do
|
49
|
-
seller =
|
50
|
-
seller.
|
51
|
-
|
52
|
-
Config.blacklist = [seller.id]
|
53
|
-
seller.should_not be_kosher
|
56
|
+
@seller.id = ['foo']
|
57
|
+
@seller.blacklist = [@seller.id]
|
58
|
+
@seller.should_not be_kosher
|
54
59
|
end
|
55
60
|
end
|
56
61
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Kosher
|
4
|
+
describe Shipping do
|
5
|
+
before do
|
6
|
+
@shipping = Shipping.new
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#free?" do
|
10
|
+
context "when shipping costs 0" do
|
11
|
+
it "returns true" do
|
12
|
+
@shipping.cents = 0
|
13
|
+
@shipping.should be_free
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "when shipping costs nil" do
|
18
|
+
it "returns true" do
|
19
|
+
@shipping.cents = nil
|
20
|
+
@shipping.should be_free
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when shipping is not free" do
|
25
|
+
it "returns false" do
|
26
|
+
@shipping.cents = 1
|
27
|
+
@shipping.should_not be_free
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "#kosher?" do
|
33
|
+
context "when available" do
|
34
|
+
it "returns true" do
|
35
|
+
@shipping.availability = Availability.new(0)
|
36
|
+
@shipping.should be_kosher
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when not available" do
|
41
|
+
it "returns false" do
|
42
|
+
@shipping.availability = Availability.new(96)
|
43
|
+
@shipping.should_not be_kosher
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#cost" do
|
49
|
+
it "returns 0 if no cents given" do
|
50
|
+
@shipping.cents = nil
|
51
|
+
@shipping.cost.cents.should eql 0
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: kosher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.2.
|
5
|
+
version: 0.2.1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Paper Cavalier
|
@@ -14,27 +14,49 @@ date: 2011-03-09 00:00:00 +00:00
|
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
17
|
+
name: json
|
18
18
|
prerelease: false
|
19
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
20
20
|
none: false
|
21
21
|
requirements:
|
22
22
|
- - ~>
|
23
23
|
- !ruby/object:Gem::Version
|
24
|
-
version:
|
24
|
+
version: 1.5.1
|
25
25
|
type: :runtime
|
26
26
|
version_requirements: *id001
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: money
|
29
29
|
prerelease: false
|
30
30
|
requirement: &id002 !ruby/object:Gem::Requirement
|
31
|
+
none: false
|
32
|
+
requirements:
|
33
|
+
- - ~>
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 3.6.1
|
36
|
+
type: :runtime
|
37
|
+
version_requirements: *id002
|
38
|
+
- !ruby/object:Gem::Dependency
|
39
|
+
name: rspec
|
40
|
+
prerelease: false
|
41
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
31
42
|
none: false
|
32
43
|
requirements:
|
33
44
|
- - ~>
|
34
45
|
- !ruby/object:Gem::Version
|
35
46
|
version: 2.5.0
|
36
47
|
type: :development
|
37
|
-
version_requirements: *
|
48
|
+
version_requirements: *id003
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: ruby-debug19
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ~>
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 0.11.6
|
58
|
+
type: :development
|
59
|
+
version_requirements: *id004
|
38
60
|
description: Kosher wraps Amazon in a loving embrace.
|
39
61
|
email: code@papercavalier.com
|
40
62
|
executables: []
|
@@ -51,17 +73,21 @@ files:
|
|
51
73
|
- Rakefile
|
52
74
|
- kosher.gemspec
|
53
75
|
- lib/kosher.rb
|
76
|
+
- lib/kosher/availability.rb
|
54
77
|
- lib/kosher/condition.rb
|
55
|
-
- lib/kosher/config.rb
|
56
78
|
- lib/kosher/description.rb
|
79
|
+
- lib/kosher/item.rb
|
57
80
|
- lib/kosher/offer.rb
|
58
81
|
- lib/kosher/seller.rb
|
82
|
+
- lib/kosher/shipping.rb
|
59
83
|
- lib/kosher/version.rb
|
84
|
+
- spec/kosher/availability_spec.rb
|
60
85
|
- spec/kosher/condition_spec.rb
|
61
|
-
- spec/kosher/config_spec.rb
|
62
86
|
- spec/kosher/description_spec.rb
|
87
|
+
- spec/kosher/item_spec.rb
|
63
88
|
- spec/kosher/offer_spec.rb
|
64
89
|
- spec/kosher/seller_spec.rb
|
90
|
+
- spec/kosher/shipping_spec.rb
|
65
91
|
- spec/spec_helper.rb
|
66
92
|
has_rdoc: true
|
67
93
|
homepage: https://rubygems.org/gems/kosher
|
@@ -92,9 +118,11 @@ signing_key:
|
|
92
118
|
specification_version: 3
|
93
119
|
summary: Wraps Amazon in a loving embrace.
|
94
120
|
test_files:
|
121
|
+
- spec/kosher/availability_spec.rb
|
95
122
|
- spec/kosher/condition_spec.rb
|
96
|
-
- spec/kosher/config_spec.rb
|
97
123
|
- spec/kosher/description_spec.rb
|
124
|
+
- spec/kosher/item_spec.rb
|
98
125
|
- spec/kosher/offer_spec.rb
|
99
126
|
- spec/kosher/seller_spec.rb
|
127
|
+
- spec/kosher/shipping_spec.rb
|
100
128
|
- spec/spec_helper.rb
|
data/lib/kosher/config.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
module Kosher
|
2
|
-
module Config
|
3
|
-
extend self
|
4
|
-
|
5
|
-
def base_currency
|
6
|
-
@base_currency ||= 'EUR'
|
7
|
-
end
|
8
|
-
|
9
|
-
def base_currency=(code)
|
10
|
-
@base_currency = code
|
11
|
-
end
|
12
|
-
|
13
|
-
def blacklist
|
14
|
-
@blacklist ||= []
|
15
|
-
end
|
16
|
-
|
17
|
-
def blacklist=(seller_ids)
|
18
|
-
@blacklist = seller_ids
|
19
|
-
end
|
20
|
-
|
21
|
-
def max_hours_shipped
|
22
|
-
@max_hours_shipped ||= 48
|
23
|
-
end
|
24
|
-
|
25
|
-
def max_hours_shipped=(hours)
|
26
|
-
@max_hours_shipped = hours
|
27
|
-
end
|
28
|
-
|
29
|
-
def min_rating
|
30
|
-
@min_rating ||= 4.8
|
31
|
-
end
|
32
|
-
|
33
|
-
def min_rating=(rating)
|
34
|
-
@min_rating = rating
|
35
|
-
end
|
36
|
-
|
37
|
-
def min_condition
|
38
|
-
@min_condition ||= 4
|
39
|
-
end
|
40
|
-
|
41
|
-
def min_condition=(grade)
|
42
|
-
@min_condition = grade
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
data/spec/kosher/config_spec.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Kosher
|
4
|
-
describe Config do
|
5
|
-
describe ".base_currency" do
|
6
|
-
it "defaults to EUR" do
|
7
|
-
Config.base_currency = nil
|
8
|
-
Config.base_currency.should eql 'EUR'
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
describe ".blacklist" do
|
13
|
-
it "defaults to an empty array" do
|
14
|
-
Config.blacklist = nil
|
15
|
-
Config.blacklist.should eql []
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe ".max_hours_shipped" do
|
20
|
-
it "defaults to 48" do
|
21
|
-
Config.max_hours_shipped = nil
|
22
|
-
Config.max_hours_shipped.should eql 48
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe ".min_rating" do
|
27
|
-
it "defaults to 4.8" do
|
28
|
-
Config.min_rating = nil
|
29
|
-
Config.min_rating.should eql 4.8
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
describe ".min_condition" do
|
34
|
-
it "defaults to 4" do
|
35
|
-
Config.min_condition = nil
|
36
|
-
Config.min_condition.should eql 4
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|