kosher 0.6.2 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/kosher.gemspec +3 -6
- data/lib/kosher/item.rb +1 -7
- data/lib/kosher/offer.rb +1 -3
- data/lib/kosher/price.rb +13 -0
- data/lib/kosher/shipping.rb +2 -9
- data/lib/kosher/version.rb +1 -1
- data/lib/kosher.rb +2 -6
- data/spec/kosher/item_spec.rb +0 -10
- data/spec/kosher/offer_spec.rb +2 -5
- data/spec/kosher/price_spec.rb +16 -0
- data/spec/kosher/seller_spec.rb +2 -2
- data/spec/kosher/shipping_spec.rb +2 -12
- data/spec/spec_helper.rb +1 -4
- metadata +17 -33
- data/lib/kosher/author.rb +0 -8
- data/lib/kosher/book.rb +0 -39
- data/lib/kosher/image.rb +0 -9
- data/spec/kosher/book_spec.rb +0 -76
data/kosher.gemspec
CHANGED
@@ -9,20 +9,17 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ['Paper Cavalier']
|
10
10
|
s.email = 'code@papercavalier.com'
|
11
11
|
s.homepage = 'https://rubygems.org/gems/kosher'
|
12
|
-
s.summary = %q{An overengineered
|
13
|
-
s.description = %q{Kosher
|
14
|
-
|
15
|
-
s.rubyforge_project = 'kosher'
|
12
|
+
s.summary = %q{An overengineered abstraction of book trading}
|
13
|
+
s.description = %q{Kosher abstracts online book trading into a set of models.}
|
16
14
|
|
17
15
|
{
|
18
16
|
'rspec' => '~> 2.6',
|
19
|
-
'ruby-debug19' => '~> 0.11.6'
|
20
17
|
}.each do |lib, version|
|
21
18
|
s.add_development_dependency lib, version
|
22
19
|
end
|
23
20
|
|
24
21
|
{
|
25
|
-
'money' => '~> 3.
|
22
|
+
'money' => '~> 3.7.1',
|
26
23
|
'structure' => '~> 0.7.1'
|
27
24
|
}.each do |lib, version|
|
28
25
|
s.add_runtime_dependency lib, version
|
data/lib/kosher/item.rb
CHANGED
@@ -4,19 +4,13 @@ module Kosher
|
|
4
4
|
#
|
5
5
|
# An item has a price, quantity, condition, and description.
|
6
6
|
class Item < Structure
|
7
|
-
key :cents, :type => Integer
|
8
|
-
key :currency
|
9
7
|
key :quantity, :type => Integer
|
8
|
+
has_one :price
|
10
9
|
has_one :condition
|
11
10
|
has_one :description
|
12
11
|
|
13
12
|
def kosher?
|
14
13
|
condition.kosher? && description.kosher?
|
15
14
|
end
|
16
|
-
|
17
|
-
def price
|
18
|
-
raise TypeError, "Can't render money" unless cents
|
19
|
-
Money.new(cents, currency)
|
20
|
-
end
|
21
15
|
end
|
22
16
|
end
|
data/lib/kosher/offer.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
module Kosher
|
2
2
|
|
3
3
|
# An offer.
|
4
|
-
#
|
5
|
-
# This is an actual item offered on a particular venue by a seller.
|
6
4
|
class Offer < Structure
|
7
5
|
include Comparable
|
8
6
|
|
@@ -33,7 +31,7 @@ module Kosher
|
|
33
31
|
|
34
32
|
# The total price of an offer.
|
35
33
|
def price
|
36
|
-
item.price + shipping.cost
|
34
|
+
item.price.to_money + shipping.cost.to_money
|
37
35
|
end
|
38
36
|
end
|
39
37
|
end
|
data/lib/kosher/price.rb
ADDED
data/lib/kosher/shipping.rb
CHANGED
@@ -3,24 +3,17 @@ module Kosher
|
|
3
3
|
#
|
4
4
|
# Shipping costs something (or nothing) and is subject to availability.
|
5
5
|
class Shipping < Structure
|
6
|
-
|
7
|
-
key :currency
|
6
|
+
has_one :cost
|
8
7
|
has_one :availability
|
9
8
|
|
10
9
|
# Returns whether the item ships for free.
|
11
10
|
def free?
|
12
|
-
cents == 0
|
11
|
+
cost.cents == 0
|
13
12
|
end
|
14
13
|
|
15
14
|
# Returns true if the item is available to ship.
|
16
15
|
def kosher?
|
17
16
|
availability.kosher?
|
18
17
|
end
|
19
|
-
|
20
|
-
# The shipping cost.
|
21
|
-
def cost
|
22
|
-
raise TypeError, "Can't render money" unless cents
|
23
|
-
Money.new(cents, currency)
|
24
|
-
end
|
25
18
|
end
|
26
19
|
end
|
data/lib/kosher/version.rb
CHANGED
data/lib/kosher.rb
CHANGED
@@ -9,25 +9,21 @@ require 'structure/json'
|
|
9
9
|
require 'kosher/threshold'
|
10
10
|
|
11
11
|
# Require the models.
|
12
|
-
require 'kosher/author'
|
13
12
|
require 'kosher/availability'
|
14
|
-
require 'kosher/book'
|
15
13
|
require 'kosher/condition'
|
16
14
|
require 'kosher/description'
|
17
|
-
require 'kosher/image'
|
18
15
|
require 'kosher/item'
|
19
16
|
require 'kosher/location'
|
20
17
|
require 'kosher/offer'
|
18
|
+
require 'kosher/price'
|
21
19
|
require 'kosher/seller'
|
22
20
|
require 'kosher/shipping'
|
23
21
|
require 'kosher/venue'
|
24
22
|
|
25
23
|
module Kosher
|
26
24
|
class << self
|
27
|
-
attr_writer :seller_blacklist
|
28
|
-
|
29
25
|
def seller_blacklist
|
30
|
-
@seller_blacklist ||=
|
26
|
+
@seller_blacklist ||= Array.new
|
31
27
|
end
|
32
28
|
end
|
33
29
|
|
data/spec/kosher/item_spec.rb
CHANGED
data/spec/kosher/offer_spec.rb
CHANGED
@@ -65,11 +65,8 @@ module Kosher
|
|
65
65
|
|
66
66
|
describe "#price" do
|
67
67
|
it "sum of item price and shipping cost" do
|
68
|
-
@offer.item.cents
|
69
|
-
@offer.
|
70
|
-
|
71
|
-
@offer.shipping.cents = 399
|
72
|
-
@offer.shipping.currency = 'EUR'
|
68
|
+
@offer.item.price = Price.new(cents: 1000, currency: 'EUR')
|
69
|
+
@offer.shipping.cost = Price.new(cents: 399, currency: 'EUR')
|
73
70
|
|
74
71
|
@offer.price.cents.should eql 1399
|
75
72
|
@offer.price.currency.iso_code.should eql 'EUR'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Kosher
|
4
|
+
describe Price do
|
5
|
+
describe "#to_money" do
|
6
|
+
it "returns a Money object" do
|
7
|
+
price = Price.new(:cents => 100, :currency => 'USD')
|
8
|
+
price.to_money.should be_a Money
|
9
|
+
end
|
10
|
+
|
11
|
+
it "raises a type error if cents is nil" do
|
12
|
+
expect { Price.new.to_money }.to raise_error TypeError
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/spec/kosher/seller_spec.rb
CHANGED
@@ -8,7 +8,7 @@ module Kosher
|
|
8
8
|
|
9
9
|
describe "#blacklisted?" do
|
10
10
|
before do
|
11
|
-
Kosher.seller_blacklist
|
11
|
+
Kosher.seller_blacklist << 'foo'
|
12
12
|
end
|
13
13
|
|
14
14
|
it "returns true if the seller is blacklisted" do
|
@@ -48,7 +48,7 @@ module Kosher
|
|
48
48
|
|
49
49
|
it "returns false if seller is blacklisted" do
|
50
50
|
@seller.id = ['foo']
|
51
|
-
Kosher.seller_blacklist
|
51
|
+
Kosher.seller_blacklist << @seller.id
|
52
52
|
@seller.should_not be_kosher
|
53
53
|
end
|
54
54
|
end
|
@@ -9,14 +9,14 @@ module Kosher
|
|
9
9
|
describe "#free?" do
|
10
10
|
context "when shipping costs 0" do
|
11
11
|
it "returns true" do
|
12
|
-
@shipping.
|
12
|
+
@shipping.cost = Price.new(cents: 0)
|
13
13
|
@shipping.should be_free
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
context "when shipping is not free" do
|
18
18
|
it "returns false" do
|
19
|
-
@shipping.
|
19
|
+
@shipping.cost = Price.new(cents: 1)
|
20
20
|
@shipping.should_not be_free
|
21
21
|
end
|
22
22
|
end
|
@@ -37,15 +37,5 @@ module Kosher
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
|
-
|
41
|
-
describe "#cost" do
|
42
|
-
context "when no cents are specified" do
|
43
|
-
it "raises an error" do
|
44
|
-
expect do
|
45
|
-
@shipping.cost
|
46
|
-
end.to raise_error TypeError
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
40
|
end
|
51
41
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'bundler/setup'
|
3
3
|
require 'rspec'
|
4
|
-
require 'ruby-debug'
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
5
|
+
trequire File.expand_path('../../lib/kosher', __FILE__)
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 7
|
8
|
+
- 0
|
9
|
+
version: 0.7.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Paper Cavalier
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-06-
|
17
|
+
date: 2011-06-20 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -31,39 +31,25 @@ dependencies:
|
|
31
31
|
version: "2.6"
|
32
32
|
type: :development
|
33
33
|
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: ruby-debug19
|
36
|
-
prerelease: false
|
37
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
-
none: false
|
39
|
-
requirements:
|
40
|
-
- - ~>
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
segments:
|
43
|
-
- 0
|
44
|
-
- 11
|
45
|
-
- 6
|
46
|
-
version: 0.11.6
|
47
|
-
type: :development
|
48
|
-
version_requirements: *id002
|
49
34
|
- !ruby/object:Gem::Dependency
|
50
35
|
name: money
|
51
36
|
prerelease: false
|
52
|
-
requirement: &
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
53
38
|
none: false
|
54
39
|
requirements:
|
55
40
|
- - ~>
|
56
41
|
- !ruby/object:Gem::Version
|
57
42
|
segments:
|
58
43
|
- 3
|
59
|
-
-
|
60
|
-
|
44
|
+
- 7
|
45
|
+
- 1
|
46
|
+
version: 3.7.1
|
61
47
|
type: :runtime
|
62
|
-
version_requirements: *
|
48
|
+
version_requirements: *id002
|
63
49
|
- !ruby/object:Gem::Dependency
|
64
50
|
name: structure
|
65
51
|
prerelease: false
|
66
|
-
requirement: &
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
67
53
|
none: false
|
68
54
|
requirements:
|
69
55
|
- - ~>
|
@@ -74,8 +60,8 @@ dependencies:
|
|
74
60
|
- 1
|
75
61
|
version: 0.7.1
|
76
62
|
type: :runtime
|
77
|
-
version_requirements: *
|
78
|
-
description: Kosher
|
63
|
+
version_requirements: *id003
|
64
|
+
description: Kosher abstracts online book trading into a set of models.
|
79
65
|
email: code@papercavalier.com
|
80
66
|
executables: []
|
81
67
|
|
@@ -91,27 +77,25 @@ files:
|
|
91
77
|
- Rakefile
|
92
78
|
- kosher.gemspec
|
93
79
|
- lib/kosher.rb
|
94
|
-
- lib/kosher/author.rb
|
95
80
|
- lib/kosher/availability.rb
|
96
|
-
- lib/kosher/book.rb
|
97
81
|
- lib/kosher/condition.rb
|
98
82
|
- lib/kosher/description.rb
|
99
|
-
- lib/kosher/image.rb
|
100
83
|
- lib/kosher/item.rb
|
101
84
|
- lib/kosher/location.rb
|
102
85
|
- lib/kosher/offer.rb
|
86
|
+
- lib/kosher/price.rb
|
103
87
|
- lib/kosher/seller.rb
|
104
88
|
- lib/kosher/shipping.rb
|
105
89
|
- lib/kosher/threshold.rb
|
106
90
|
- lib/kosher/venue.rb
|
107
91
|
- lib/kosher/version.rb
|
108
92
|
- spec/kosher/availability_spec.rb
|
109
|
-
- spec/kosher/book_spec.rb
|
110
93
|
- spec/kosher/condition_spec.rb
|
111
94
|
- spec/kosher/description_spec.rb
|
112
95
|
- spec/kosher/item_spec.rb
|
113
96
|
- spec/kosher/location_spec.rb
|
114
97
|
- spec/kosher/offer_spec.rb
|
98
|
+
- spec/kosher/price_spec.rb
|
115
99
|
- spec/kosher/seller_spec.rb
|
116
100
|
- spec/kosher/shipping_spec.rb
|
117
101
|
- spec/kosher/venue_spec.rb
|
@@ -144,19 +128,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
128
|
version: "0"
|
145
129
|
requirements: []
|
146
130
|
|
147
|
-
rubyforge_project:
|
131
|
+
rubyforge_project:
|
148
132
|
rubygems_version: 1.3.7
|
149
133
|
signing_key:
|
150
134
|
specification_version: 3
|
151
|
-
summary: An overengineered
|
135
|
+
summary: An overengineered abstraction of book trading
|
152
136
|
test_files:
|
153
137
|
- spec/kosher/availability_spec.rb
|
154
|
-
- spec/kosher/book_spec.rb
|
155
138
|
- spec/kosher/condition_spec.rb
|
156
139
|
- spec/kosher/description_spec.rb
|
157
140
|
- spec/kosher/item_spec.rb
|
158
141
|
- spec/kosher/location_spec.rb
|
159
142
|
- spec/kosher/offer_spec.rb
|
143
|
+
- spec/kosher/price_spec.rb
|
160
144
|
- spec/kosher/seller_spec.rb
|
161
145
|
- spec/kosher/shipping_spec.rb
|
162
146
|
- spec/kosher/venue_spec.rb
|
data/lib/kosher/author.rb
DELETED
data/lib/kosher/book.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Kosher
|
2
|
-
|
3
|
-
# A book.
|
4
|
-
#
|
5
|
-
# A book is sold on many venues and has many offers through those venues.
|
6
|
-
class Book < Structure
|
7
|
-
key :asin
|
8
|
-
key :edition
|
9
|
-
key :format
|
10
|
-
key :images, :type => Hash
|
11
|
-
key :isbn
|
12
|
-
key :pages, :type => Integer
|
13
|
-
key :published_in, :type => Integer
|
14
|
-
key :publisher
|
15
|
-
key :title
|
16
|
-
key :volumes, :type => Integer
|
17
|
-
has_many :other_editions
|
18
|
-
has_many :authors
|
19
|
-
has_many :offers
|
20
|
-
has_many :similar_books
|
21
|
-
|
22
|
-
# The best kosher offer.
|
23
|
-
#
|
24
|
-
# Returns nil if there are no (kosher) offers.
|
25
|
-
def best_kosher_offer
|
26
|
-
offer = offers.sort.first
|
27
|
-
offer && offer.kosher? ? offer : nil
|
28
|
-
end
|
29
|
-
|
30
|
-
# A full bibliographic description of the book, as in:
|
31
|
-
#
|
32
|
-
# Chronicle Books, 1991. Hardcover. 1st edition. 2 volumes. 1200 pages.
|
33
|
-
#
|
34
|
-
# Missing attributes are omitted.
|
35
|
-
def description
|
36
|
-
# TODO
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/kosher/image.rb
DELETED
data/spec/kosher/book_spec.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
module Kosher
|
4
|
-
describe Book do
|
5
|
-
describe "#best_kosher_offer" do
|
6
|
-
before do
|
7
|
-
@book = Book.new
|
8
|
-
|
9
|
-
@offer1 = Offer.new
|
10
|
-
@offer2 = Offer.new
|
11
|
-
end
|
12
|
-
|
13
|
-
context "when there are more than one kosher offers" do
|
14
|
-
before do
|
15
|
-
@offer1.stub!(:kosher?).and_return(true)
|
16
|
-
@offer1.stub!(:price).and_return(Money.new(200, 'EUR'))
|
17
|
-
@book.offers << @offer1
|
18
|
-
|
19
|
-
@offer2.stub!(:kosher?).and_return(true)
|
20
|
-
@offer2.stub!(:price).and_return(Money.new(100, 'EUR'))
|
21
|
-
@book.offers << @offer2
|
22
|
-
end
|
23
|
-
|
24
|
-
it "returns the kosher offer with the lowest price" do
|
25
|
-
@book.best_kosher_offer.should eql @offer2
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context "when there is one kosher and one unkosher offer" do
|
30
|
-
before do
|
31
|
-
@offer1.stub!(:kosher?).and_return(true)
|
32
|
-
@offer1.stub!(:price).and_return(Money.new(200, 'EUR'))
|
33
|
-
@book.offers << @offer1
|
34
|
-
|
35
|
-
@offer2.stub!(:kosher?).and_return(false)
|
36
|
-
@offer2.stub!(:price).and_return(Money.new(100, 'EUR'))
|
37
|
-
@book.offers << @offer2
|
38
|
-
end
|
39
|
-
|
40
|
-
it "returns the kosher offer" do
|
41
|
-
@book.best_kosher_offer.should eql @offer1
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
context "when there is one kosher offer" do
|
46
|
-
before do
|
47
|
-
@offer1.stub!(:kosher?).and_return(true)
|
48
|
-
@offer1.stub!(:price).and_return(Money.new(100, 'EUR'))
|
49
|
-
@book.offers << @offer1
|
50
|
-
end
|
51
|
-
|
52
|
-
it "returns the kosher offer" do
|
53
|
-
@book.best_kosher_offer.should eql @offer1
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context "when there is one unkosher offer" do
|
58
|
-
before do
|
59
|
-
@offer1.stub!(:kosher?).and_return(false)
|
60
|
-
@offer1.stub!(:price).and_return(Money.new(100, 'EUR'))
|
61
|
-
@book.offers << @offer1
|
62
|
-
end
|
63
|
-
|
64
|
-
it "returns nil" do
|
65
|
-
@book.best_kosher_offer.should be_nil
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context "when there are no offers" do
|
70
|
-
it "returns nil" do
|
71
|
-
@book.best_kosher_offer.should be_nil
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|