kosher 0.8.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ rvm:
2
+ - 1.9.2
3
+ - 1.9.3
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
1
  source 'http://rubygems.org'
2
+
2
3
  gemspec
4
+ gem 'rake'
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- Kosher
2
- ======
1
+ Kosher
3
2
 
4
- Kosher abstracts online book trading into a set of models.
3
+ [![travis](https://secure.travis-ci.org/hakanensari/kosher.png)](http://travis-ci.org/hakanensari/kosher)
4
+
5
+ Online trading, abstracted.
data/Rakefile CHANGED
@@ -1,11 +1,9 @@
1
- require 'bundler'
2
- require 'rspec/core/rake_task'
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
3
 
4
- Bundler::GemHelper.install_tasks
4
+ task :default => :test
5
5
 
6
- desc 'Run all specs in spec directory'
7
- RSpec::Core::RakeTask.new(:spec) do |spec|
8
- spec.pattern = 'spec/**/*_spec.rb'
6
+ Rake::TestTask.new do |test|
7
+ test.libs << 'test'
8
+ test.test_files = FileList['test/**/*_test.rb']
9
9
  end
10
-
11
- task :default => :spec
data/data/venues.yml ADDED
@@ -0,0 +1,28 @@
1
+ ---
2
+ - id: 1
3
+ name: Amazon.com
4
+ country: us
5
+ - id: 2
6
+ name: Amazon.co.uk
7
+ country: uk
8
+ - id: 3
9
+ name: Amazon.de
10
+ country: de
11
+ - id: 4
12
+ name: Amazon.ca
13
+ country: ca
14
+ - id: 5
15
+ name: Amazon.fr
16
+ country: fr
17
+ - id: 6
18
+ name: Amazon.co.jp
19
+ country: jp
20
+ - id: 7
21
+ name: Amazon.co.jp
22
+ country: jp
23
+ - id: 8
24
+ name: Amazon.cn
25
+ country: cn
26
+ - id: 9
27
+ name: Barnesandnoble.com
28
+ country: us
data/kosher.gemspec CHANGED
@@ -6,27 +6,21 @@ Gem::Specification.new do |s|
6
6
  s.name = 'kosher'
7
7
  s.version = Kosher::VERSION
8
8
  s.platform = Gem::Platform::RUBY
9
- s.authors = ['Paper Cavalier']
9
+ s.authors = ['Hakan Ensari']
10
10
  s.email = 'code@papercavalier.com'
11
- s.homepage = 'https://rubygems.org/gems/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.}
11
+ s.homepage = 'https://github.com/hakanensari/kosher'
12
+ s.summary = %q{Online trade, abstracted}
13
+ s.description = %q{Online trade, abstracted}
14
14
 
15
- {
16
- 'rspec' => '~> 2.6',
17
- }.each do |lib, version|
18
- s.add_development_dependency lib, version
19
- end
20
-
21
- {
22
- 'money' => '~> 3.7.1',
23
- 'structure' => '~> 0.8.0'
15
+ {
16
+ 'activemodel' => '~> 3.0',
17
+ 'money' => '~> 3.7',
18
+ 'structure' => '~> 0.15'
24
19
  }.each do |lib, version|
25
20
  s.add_runtime_dependency lib, version
26
21
  end
27
22
 
28
23
  s.files = `git ls-files`.split("\n")
29
24
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
30
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
31
25
  s.require_paths = ['lib']
32
26
  end
@@ -0,0 +1,7 @@
1
+ module Kosher
2
+ class Invalid < StandardError
3
+ def initialize(record)
4
+ super(record.errors.full_messages.join(", "))
5
+ end
6
+ end
7
+ end
data/lib/kosher/offer.rb CHANGED
@@ -1,37 +1,35 @@
1
1
  module Kosher
2
-
3
- # An offer.
4
2
  class Offer < Structure
3
+ include ActiveModel::Validations
5
4
  include Comparable
6
5
 
7
- key :id
8
- has_one :venue
9
- has_one :item
10
- has_one :seller
11
- has_one :shipping
6
+ key :id
7
+ one :seller
8
+ one :shipping
9
+ one :unit
10
+ key :venue_id, Integer
11
+
12
+ validates_presence_of :seller, :shipping, :unit, :venue
12
13
 
13
- # Compares offer with another offer.
14
- #
15
- # A kosher offer is better than an unkosher offer. If both offers are
16
- # kosher or unkosher, a lower-priced offer is better.
17
14
  def <=>(other)
18
15
  if kosher? != other.kosher?
19
16
  kosher? ? -1 : 1
20
17
  else
21
- price <=> other.price
18
+ total <=> other.total
22
19
  end
23
20
  end
24
21
 
25
- # Returns whether the offer is kosher.
26
- #
27
- # An offer is kosher if its item, seller, and shipping are kosher.
28
22
  def kosher?
29
- item.kosher? && seller.kosher? && shipping.kosher?
23
+ raise Invalid.new(self) unless valid?
24
+ seller.kosher? && shipping.kosher? && unit.kosher?
30
25
  end
31
26
 
32
- # The total price of an offer.
33
27
  def price
34
- item.price.to_money + shipping.cost.to_money
28
+ unit.price + shipping.cost
29
+ end
30
+
31
+ def venue
32
+ Venue.find(venue_id)
35
33
  end
36
34
  end
37
35
  end
data/lib/kosher/seller.rb CHANGED
@@ -1,27 +1,13 @@
1
1
  module Kosher
2
-
3
- # The seller offering a book on a venue.
4
- #
5
- # A seller may have a location.
6
2
  class Seller < Structure
7
- include Threshold
8
-
9
- key :id
10
- key :name
11
- key :rating, :type => Float
12
- has_one :location
13
-
14
- # Returns whether we blacklist the seller.
15
- def blacklisted?
16
- Kosher.seller_blacklist.include? id
17
- end
3
+ key :id
4
+ key :kosher, Boolean, :default => true
5
+ key :name
6
+ key :rating, Float
18
7
 
19
- # Returns whether the seller is kosher.
20
- #
21
- # A seller is kosher as long as he is not blacklisted and his rating is
22
- # unknown, 0.0, or above our minimum threshold.
8
+ # Returns whether the item is kosher.
23
9
  def kosher?
24
- !blacklisted? && (rating.to_f == 0.0 || rating >= threshold)
10
+ kosher
25
11
  end
26
12
  end
27
13
  end
@@ -1,19 +1,25 @@
1
1
  module Kosher
2
- # Shipping details of an offer.
3
- #
4
- # Shipping costs something (or nothing) and is subject to availability.
5
2
  class Shipping < Structure
6
- has_one :cost
7
- has_one :availability
3
+ include ActiveModel::Validations
8
4
 
9
- # Returns whether the item ships for free.
10
- def free?
11
- cost.cents == 0
5
+ key :available
6
+ key :cents, Integer
7
+ key :currency
8
+ key :kosher, Boolean, :default => true
9
+
10
+ validates_presence_of :currency, :available
11
+ validates_numericality_of :cents,
12
+ :greater_than => 0
13
+
14
+ # Shipping cost.
15
+ def cost
16
+ Money.new(cents, currency)
12
17
  end
13
18
 
14
- # Returns true if the item is available to ship.
19
+ # Returns whether the item is kosher.
15
20
  def kosher?
16
- availability.kosher?
21
+ raise Invalid.new(self) unless valid?
22
+ kosher
17
23
  end
18
24
  end
19
25
  end
@@ -0,0 +1,28 @@
1
+ module Kosher
2
+ class Unit < Structure
3
+ include ActiveModel::Validations
4
+
5
+ key :cents, Integer
6
+ key :condition, Integer
7
+ key :currency
8
+ key :description
9
+ key :kosher, Boolean, :default => true
10
+ key :quantity, Integer, :default => 1
11
+
12
+ validates_inclusion_of :condition, :in => 1..6
13
+ validates_numericality_of :cents,
14
+ :greater_than => 0
15
+ validates_presence_of :currency
16
+
17
+ # Returns whether the item is kosher.
18
+ def kosher?
19
+ raise Invalid.new(self) unless valid?
20
+ kosher
21
+ end
22
+
23
+ # Item price.
24
+ def price
25
+ Money.new(cents, currency)
26
+ end
27
+ end
28
+ end
data/lib/kosher/venue.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  module Kosher
2
-
3
- # A Venue.
4
2
  class Venue < Structure
5
- key :id, :type => Integer
3
+ include Static
4
+
5
+ set_data_path File.expand_path("../../../data/venues.yml", __FILE__)
6
+
7
+ # The name of the venue.
6
8
  key :name
7
- key :locale
9
+
10
+ # The country the venue is based in.
11
+ key :country
8
12
  end
9
13
  end
@@ -1,3 +1,3 @@
1
1
  module Kosher
2
- VERSION = '0.8.0'
2
+ VERSION = '0.9.1'
3
3
  end
data/lib/kosher.rb CHANGED
@@ -1,34 +1,13 @@
1
- # Kosher is a somewhat overengineered attempt to abstract bookdealing into a
2
- # set of models.
3
-
1
+ require 'active_model'
4
2
  require 'money'
5
3
  require 'structure'
6
- require 'structure/json'
7
-
8
- # Require this module before all models.
9
- require 'kosher/threshold'
10
-
11
- # Require the models.
12
- require 'kosher/availability'
13
- require 'kosher/condition'
14
- require 'kosher/description'
15
- require 'kosher/item'
16
- require 'kosher/location'
17
- require 'kosher/offer'
18
- require 'kosher/price'
19
- require 'kosher/seller'
20
- require 'kosher/shipping'
21
- require 'kosher/venue'
22
4
 
23
5
  module Kosher
24
- class << self
25
- def seller_blacklist
26
- @seller_blacklist ||= Array.new
27
- end
28
- end
29
-
30
- # Set threshold defaults.
31
- Availability.threshold = 48
32
- Condition.threshold = 4
33
- Seller.threshold = 4.8
6
+ autoload :Invalid, 'kosher/invalid'
7
+ autoload :Item, 'kosher/item'
8
+ autoload :Offer, 'kosher/offer'
9
+ autoload :Seller, 'kosher/seller'
10
+ autoload :Shipping, 'kosher/shipping'
11
+ autoload :Unit, 'kosher/unit'
12
+ autoload :Venue, 'kosher/venue'
34
13
  end
@@ -0,0 +1,62 @@
1
+ # encoding: UTF-8
2
+ require 'minitest/autorun'
3
+
4
+ require_relative '../lib/kosher'
5
+
6
+ class TestKosher < MiniTest::Unit::TestCase
7
+ def test_unit_price
8
+ unit = Kosher::Unit.new(:cents => '100',
9
+ :currency => 'JPY')
10
+ assert_equal '¥1.00', unit.price.format
11
+ end
12
+
13
+ def test_shipping_cost
14
+ shipping = Kosher::Shipping.new(:cents => '100',
15
+ :currency => 'EUR')
16
+ assert_equal '1,00 €', shipping.cost.format
17
+ end
18
+
19
+ def test_offer_price
20
+ shipping = Kosher::Shipping.new(:cents => 100,
21
+ :currency => 'USD')
22
+ unit = Kosher::Unit.new(:cents => 100,
23
+ :currency => 'USD')
24
+ offer = Kosher::Offer.new(:shipping => shipping,
25
+ :unit => unit)
26
+ assert_equal '$2.00', offer.price.format
27
+ end
28
+
29
+ def test_venue
30
+ assert_equal 'Amazon.com', Kosher::Venue.find(1).name
31
+ assert_equal 'Amazon.co.uk', Kosher::Venue.find(2).name
32
+ end
33
+
34
+ def test_venue_in_offer
35
+ offer = Kosher::Offer.new(:venue_id => 1)
36
+ assert_equal Kosher::Venue.find(1), offer.venue
37
+ end
38
+
39
+ def test_validation
40
+ assert_raises(Kosher::Invalid) { Kosher::Unit.new.kosher? }
41
+ unit = Kosher::Unit.new(:condition => 1,
42
+ :cents => 100,
43
+ :currency => 'USD')
44
+ assert unit.kosher?
45
+
46
+ assert_raises(Kosher::Invalid) { Kosher::Shipping.new.kosher? }
47
+ shipping = Kosher::Shipping.new(:available => true,
48
+ :cents => 100,
49
+ :currency => 'USD')
50
+ assert shipping.kosher?
51
+
52
+ assert_raises(Kosher::Invalid) { Kosher::Offer.new.kosher? }
53
+ offer = Kosher::Offer.new(:unit => unit,
54
+ :shipping => shipping,
55
+ :seller => Kosher::Seller.new,
56
+ :venue_id => 1)
57
+ assert offer.kosher?
58
+
59
+ offer.venue_id = 0
60
+ assert_raises(Kosher::Invalid) { offer.kosher? }
61
+ end
62
+ end
metadata CHANGED
@@ -1,148 +1,101 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: kosher
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 8
8
- - 0
9
- version: 0.8.0
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.1
5
+ prerelease:
10
6
  platform: ruby
11
- authors:
12
- - Paper Cavalier
7
+ authors:
8
+ - Hakan Ensari
13
9
  autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
-
17
- date: 2011-06-24 00:00:00 +01:00
18
- default_executable:
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: rspec
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
12
+ date: 2011-08-12 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activemodel
16
+ requirement: &70269322416700 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
18
+ requirements:
26
19
  - - ~>
27
- - !ruby/object:Gem::Version
28
- segments:
29
- - 2
30
- - 6
31
- version: "2.6"
32
- type: :development
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: money
20
+ - !ruby/object:Gem::Version
21
+ version: '3.0'
22
+ type: :runtime
36
23
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *70269322416700
25
+ - !ruby/object:Gem::Dependency
26
+ name: money
27
+ requirement: &70269322415880 !ruby/object:Gem::Requirement
38
28
  none: false
39
- requirements:
29
+ requirements:
40
30
  - - ~>
41
- - !ruby/object:Gem::Version
42
- segments:
43
- - 3
44
- - 7
45
- - 1
46
- version: 3.7.1
31
+ - !ruby/object:Gem::Version
32
+ version: '3.7'
47
33
  type: :runtime
48
- version_requirements: *id002
49
- - !ruby/object:Gem::Dependency
50
- name: structure
51
34
  prerelease: false
52
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *70269322415880
36
+ - !ruby/object:Gem::Dependency
37
+ name: structure
38
+ requirement: &70269322415060 !ruby/object:Gem::Requirement
53
39
  none: false
54
- requirements:
40
+ requirements:
55
41
  - - ~>
56
- - !ruby/object:Gem::Version
57
- segments:
58
- - 0
59
- - 8
60
- - 0
61
- version: 0.8.0
42
+ - !ruby/object:Gem::Version
43
+ version: '0.15'
62
44
  type: :runtime
63
- version_requirements: *id003
64
- description: Kosher abstracts online book trading into a set of models.
45
+ prerelease: false
46
+ version_requirements: *70269322415060
47
+ description: Online trade, abstracted
65
48
  email: code@papercavalier.com
66
49
  executables: []
67
-
68
50
  extensions: []
69
-
70
51
  extra_rdoc_files: []
71
-
72
- files:
52
+ files:
73
53
  - .gitignore
54
+ - .travis.yml
74
55
  - Gemfile
75
56
  - LICENSE
76
57
  - README.md
77
58
  - Rakefile
59
+ - data/venues.yml
78
60
  - kosher.gemspec
79
61
  - lib/kosher.rb
80
- - lib/kosher/availability.rb
81
- - lib/kosher/condition.rb
82
- - lib/kosher/description.rb
83
- - lib/kosher/item.rb
84
- - lib/kosher/location.rb
62
+ - lib/kosher/invalid.rb
85
63
  - lib/kosher/offer.rb
86
- - lib/kosher/price.rb
87
64
  - lib/kosher/seller.rb
88
65
  - lib/kosher/shipping.rb
89
- - lib/kosher/threshold.rb
66
+ - lib/kosher/unit.rb
90
67
  - lib/kosher/venue.rb
91
68
  - lib/kosher/version.rb
92
- - spec/kosher/availability_spec.rb
93
- - spec/kosher/condition_spec.rb
94
- - spec/kosher/description_spec.rb
95
- - spec/kosher/item_spec.rb
96
- - spec/kosher/location_spec.rb
97
- - spec/kosher/offer_spec.rb
98
- - spec/kosher/price_spec.rb
99
- - spec/kosher/seller_spec.rb
100
- - spec/kosher/shipping_spec.rb
101
- - spec/kosher/venue_spec.rb
102
- - spec/kosher_spec.rb
103
- - spec/spec_helper.rb
104
- has_rdoc: true
105
- homepage: https://rubygems.org/gems/kosher
69
+ - test/kosher_test.rb
70
+ homepage: https://github.com/hakanensari/kosher
106
71
  licenses: []
107
-
108
72
  post_install_message:
109
73
  rdoc_options: []
110
-
111
- require_paths:
74
+ require_paths:
112
75
  - lib
113
- required_ruby_version: !ruby/object:Gem::Requirement
76
+ required_ruby_version: !ruby/object:Gem::Requirement
114
77
  none: false
115
- requirements:
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- segments:
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ segments:
119
83
  - 0
120
- version: "0"
121
- required_rubygems_version: !ruby/object:Gem::Requirement
84
+ hash: 908814609031354876
85
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
86
  none: false
123
- requirements:
124
- - - ">="
125
- - !ruby/object:Gem::Version
126
- segments:
87
+ requirements:
88
+ - - ! '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ segments:
127
92
  - 0
128
- version: "0"
93
+ hash: 908814609031354876
129
94
  requirements: []
130
-
131
95
  rubyforge_project:
132
- rubygems_version: 1.3.7
96
+ rubygems_version: 1.8.6
133
97
  signing_key:
134
98
  specification_version: 3
135
- summary: An overengineered abstraction of book trading
136
- test_files:
137
- - spec/kosher/availability_spec.rb
138
- - spec/kosher/condition_spec.rb
139
- - spec/kosher/description_spec.rb
140
- - spec/kosher/item_spec.rb
141
- - spec/kosher/location_spec.rb
142
- - spec/kosher/offer_spec.rb
143
- - spec/kosher/price_spec.rb
144
- - spec/kosher/seller_spec.rb
145
- - spec/kosher/shipping_spec.rb
146
- - spec/kosher/venue_spec.rb
147
- - spec/kosher_spec.rb
148
- - spec/spec_helper.rb
99
+ summary: Online trade, abstracted
100
+ test_files:
101
+ - test/kosher_test.rb
@@ -1,22 +0,0 @@
1
- module Kosher
2
-
3
- # The availability of an offer.
4
- #
5
- # This represents within how many hours an offer is expected to ship out.
6
- class Availability < Structure
7
- include Threshold
8
-
9
- key :hours, :type => Integer
10
-
11
- # Returns whether the availability is kosher.
12
- #
13
- # An availability is kosher if the item ships within a maximum threshold of
14
- # hours.
15
- #
16
- # If we do not know when an item will ship (e.g. Amazon's preorders), we
17
- # should set hours to nil, which will render the availability unkosher.
18
- def kosher?
19
- !hours.nil? && hours <= threshold
20
- end
21
- end
22
- end
@@ -1,28 +0,0 @@
1
- module Kosher
2
-
3
- # The condition of a book.
4
- #
5
- # This condition is modeled on a numeric range starting from 1, which
6
- # represents `new' offers.
7
- class Condition < Structure
8
- include Threshold
9
-
10
- key :grade, :type => Integer
11
-
12
- # Returns whether the condition is kosher.
13
- #
14
- # A condition is kosher if its grade is below a minimum threshold. We
15
- # usually consider books that are good or better kosher.
16
- def kosher?
17
- grade <= threshold
18
- end
19
-
20
- def new?
21
- grade == 1
22
- end
23
-
24
- def used?
25
- !new?
26
- end
27
- end
28
- end
@@ -1,47 +0,0 @@
1
- module Kosher
2
-
3
- # The seller's description of the offer.
4
- class Description < Structure
5
- key :text, :default => ''
6
-
7
- DAMAGED = "\\b(?:missing|torn|broken|split|discard|withdrawn|rent|stain|school|damaged|water)"
8
- EXLIB = "(?:e?x|discarded|retired|former|has|have)[\\s._-]*lib"
9
- MARKED = "(highlight|hilit|underlin)"
10
- MISSING_VOL = "(vols?|volume) only"
11
- REVIEW_COPY = "\\b(?:uncorrected|advanced?\\sreview|arc)\\b"
12
-
13
- def damaged?
14
- matches? DAMAGED
15
- end
16
-
17
- def ex_lib?
18
- matches?(EXLIB) && !matches?(negation_of(EXLIB))
19
- end
20
-
21
- def kosher?
22
- !damaged? && !ex_lib? && !marked? && !missing_volume? && !review_copy?
23
- end
24
-
25
- def marked?
26
- matches?(MARKED) && !matches?(negation_of(MARKED))
27
- end
28
-
29
- def missing_volume?
30
- matches? MISSING_VOL
31
- end
32
-
33
- def review_copy?
34
- matches? REVIEW_COPY
35
- end
36
-
37
- private
38
-
39
- def matches?(value)
40
- !!text.match(Regexp.new(value, true))
41
- end
42
-
43
- def negation_of(value)
44
- "(?:no|not an?)\\s+#{value}"
45
- end
46
- end
47
- end
data/lib/kosher/item.rb DELETED
@@ -1,16 +0,0 @@
1
- module Kosher
2
-
3
- # The actual item offered by a seller.
4
- #
5
- # An item has a price, quantity, condition, and description.
6
- class Item < Structure
7
- key :quantity, :type => Integer
8
- has_one :price
9
- has_one :condition
10
- has_one :description
11
-
12
- def kosher?
13
- condition.kosher? && description.kosher?
14
- end
15
- end
16
- end
@@ -1,8 +0,0 @@
1
- module Kosher
2
-
3
- # The location of a seller.
4
- class Location < Structure
5
- key :country
6
- key :state
7
- end
8
- end
data/lib/kosher/price.rb DELETED
@@ -1,13 +0,0 @@
1
- module Kosher
2
-
3
- # A price.
4
- class Price < Structure
5
- key :cents, :type => Integer
6
- key :currency
7
-
8
- def to_money
9
- raise TypeError, "Cannot render money" unless cents
10
- Money.new(cents, currency)
11
- end
12
- end
13
- end
@@ -1,15 +0,0 @@
1
- module Kosher
2
- module Threshold
3
- def self.included(klass)
4
- klass.extend(ClassMethods)
5
- end
6
-
7
- def threshold
8
- self.class.threshold
9
- end
10
-
11
- module ClassMethods
12
- attr_accessor :threshold
13
- end
14
- end
15
- end
@@ -1,41 +0,0 @@
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
- before do
16
- @availability.hours = 48
17
- end
18
-
19
- it "returns true" do
20
- @availability.should be_kosher
21
- end
22
- end
23
-
24
- context "when not available within threshold" do
25
- before do
26
- @availability.hours = 96
27
- end
28
-
29
- it "should return false" do
30
- @availability.should_not be_kosher
31
- end
32
- end
33
-
34
- context "when availability is not known" do
35
- it "should return false" do
36
- @availability.should_not be_kosher
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,29 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Kosher
4
- describe Condition do
5
- before do
6
- @condition = Condition.new
7
- end
8
-
9
- describe "#kosher?" do
10
- before do
11
- Condition.threshold = 4
12
- end
13
-
14
- context "when grade within threshold" do
15
- it "returns true" do
16
- @condition.grade = 4
17
- @condition.should be_kosher
18
- end
19
- end
20
-
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
26
- end
27
- end
28
- end
29
- end
@@ -1,79 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Kosher
4
- describe Description do
5
- before do
6
- @description = Description.new
7
- end
8
-
9
- describe "#kosher?" do
10
- it "validates a blank description" do
11
- @description.text = ''
12
- @description.should be_kosher
13
- end
14
-
15
- it "validates a non-blank description" do
16
- @description.text = 'foo'
17
- @description.should be_kosher
18
- end
19
-
20
- it "does not validate advance review copies" do
21
- @description.text = 'Uncorrected review copy'
22
- @description.should_not be_kosher
23
-
24
- @description.text = 'arc'
25
- @description.should_not be_kosher
26
-
27
- @description.text = 'arc.'
28
- @description.should_not be_kosher
29
-
30
- @description.text = 'marc'
31
- @description.should be_kosher
32
- end
33
-
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
70
-
71
- @description.text = 'retired library copy'
72
- @description.should_not be_kosher
73
-
74
- @description.text = 'Not an ex-library'
75
- @description.should be_kosher
76
- end
77
- end
78
- end
79
- end
@@ -1,45 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Kosher
4
- describe Item do
5
- before do
6
- @item = Item.new
7
- @item.condition = Condition.new(:grade => 1)
8
- end
9
-
10
- describe "#kosher?" do
11
- context "when condition is kosher" do
12
- context "when description is kosher" do
13
- before do
14
- @item.description = Description.new
15
- end
16
-
17
- it "returns true" do
18
- @item.should be_kosher
19
- end
20
- end
21
-
22
- context "when description is not kosher" do
23
- before do
24
- @item.description = Description.new(
25
- :text => 'Withdrawn library book')
26
- end
27
-
28
- it "returns false" do
29
- @item.should_not be_kosher
30
- end
31
- end
32
- end
33
-
34
- context "when condition is not kosher" do
35
- before do
36
- @item.condition.grade = 5
37
- end
38
-
39
- it "returns false" do
40
- @item.should_not be_kosher
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,5 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Kosher
4
- describe Location
5
- end
@@ -1,178 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Kosher
4
- describe Offer do
5
- before do
6
- @offer = Offer.new
7
- @offer.item = Item.new
8
- @offer.seller = Seller.new
9
- @offer.shipping = Shipping.new
10
- end
11
-
12
- describe "#kosher?" do
13
- context "when item is kosher" do
14
- before do
15
- @offer.item.stub!(:kosher?).and_return(true)
16
- end
17
-
18
- context "when seller is kosher" do
19
- before do
20
- @offer.seller.stub!(:kosher?).and_return(true)
21
- end
22
-
23
- context "when shipping is kosher" do
24
- before do
25
- @offer.shipping.stub!(:kosher?).and_return(true)
26
- end
27
-
28
- it "returns true" do
29
- @offer.should be_kosher
30
- end
31
- end
32
-
33
- context "when shipping is not kosher" do
34
- before do
35
- @offer.shipping.stub!(:kosher?).and_return(false)
36
- end
37
-
38
- it "returns false" do
39
- @offer.should_not be_kosher
40
- end
41
- end
42
- end
43
-
44
- context "when seller is not kosher" do
45
- before do
46
- @offer.seller.stub!(:kosher?).and_return(false)
47
- end
48
-
49
- it "returns false" do
50
- @offer.should_not be_kosher
51
- end
52
- end
53
- end
54
-
55
- context "when item is not kosher" do
56
- before do
57
- @offer.item.stub!(:kosher?).and_return(false)
58
- end
59
-
60
- it "returns false" do
61
- @offer.should_not be_kosher
62
- end
63
- end
64
- end
65
-
66
- describe "#price" do
67
- it "sum of item price and shipping cost" do
68
- @offer.item.price = Price.new(cents: 1000, currency: 'EUR')
69
- @offer.shipping.cost = Price.new(cents: 399, currency: 'EUR')
70
-
71
- @offer.price.cents.should eql 1399
72
- @offer.price.currency.iso_code.should eql 'EUR'
73
- end
74
- end
75
-
76
- describe "#<=>" do
77
- before do
78
- @another_offer = Offer.new
79
- end
80
-
81
- context "when kosher" do
82
- before do
83
- @offer.stub!(:kosher?).and_return(true)
84
- end
85
-
86
- it "is less than a non-kosher offer" do
87
- @another_offer.stub!(:kosher?).and_return(false)
88
- @offer.should < @another_offer
89
- end
90
-
91
- context "when the other offer is kosher as well" do
92
- before do
93
- @offer.stub!(:price).and_return(Money.new(100, 'EUR'))
94
- @another_offer.stub!(:kosher?).and_return(true)
95
- end
96
-
97
- context "when it has a lower price" do
98
- before do
99
- @another_offer.stub!(:price).and_return(Money.new(150, 'EUR'))
100
- end
101
-
102
- it "is less than other offer" do
103
- @offer.should < @another_offer
104
- end
105
- end
106
-
107
- context "when the prices are equal" do
108
- before do
109
- @another_offer.stub!(:price).and_return(Money.new(100, 'EUR'))
110
- end
111
-
112
- it "is equal to the other offer" do
113
- @offer.should <=> @another_offer
114
- end
115
- end
116
-
117
- context "when it has a higher price" do
118
- before do
119
- @another_offer.stub!(:price).and_return(Money.new(50, 'EUR'))
120
- end
121
-
122
- it "is greater than the other offer" do
123
- @offer.should > @another_offer
124
- end
125
- end
126
- end
127
- end
128
-
129
- context "when not kosher" do
130
- before do
131
- @offer.stub!(:kosher?).and_return(false)
132
- end
133
-
134
- it "is greater than a kosher offer" do
135
- @another_offer.stub!(:kosher?).and_return(true)
136
- @offer.should > @another_offer
137
- end
138
-
139
- context "when the other offer is not kosher either" do
140
- before do
141
- @offer.stub!(:price).and_return(Money.new(100, 'EUR'))
142
- @another_offer.stub!(:kosher?).and_return(false)
143
- end
144
-
145
- context "when it has a lower price" do
146
- before do
147
- @another_offer.stub!(:price).and_return(Money.new(150, 'EUR'))
148
- end
149
-
150
- it "is less than the other offer" do
151
- @offer.should < @another_offer
152
- end
153
- end
154
-
155
- context "when the prices are equal" do
156
- before do
157
- @another_offer.stub!(:price).and_return(Money.new(100, 'EUR'))
158
- end
159
-
160
- it "is equal to the other offer" do
161
- @offer.should <=> @another_offer
162
- end
163
- end
164
-
165
- context "when it has a higher price" do
166
- before do
167
- @another_offer.stub!(:price).and_return(Money.new(50, 'EUR'))
168
- end
169
-
170
- it "is greater than the other offer" do
171
- @offer.should > @another_offer
172
- end
173
- end
174
- end
175
- end
176
- end
177
- end
178
- end
@@ -1,16 +0,0 @@
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
@@ -1,56 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Kosher
4
- describe Seller do
5
- before do
6
- @seller = Seller.new
7
- end
8
-
9
- describe "#blacklisted?" do
10
- before do
11
- Kosher.seller_blacklist << 'foo'
12
- end
13
-
14
- it "returns true if the seller is blacklisted" do
15
- @seller.id = 'foo'
16
- @seller.should be_blacklisted
17
- end
18
-
19
- it "returns false if the seller is not blacklisted" do
20
- @seller.id = 'bar'
21
- @seller.should_not be_blacklisted
22
- end
23
- end
24
-
25
- describe "#kosher?" do
26
- before do
27
- Seller.threshold = 4.8
28
- end
29
-
30
- it "returns true if rating is 0.0" do
31
- @seller.rating = 0.0
32
- @seller.should be_kosher
33
- end
34
-
35
- it "returns true if rating is nil" do
36
- @seller.should be_kosher
37
- end
38
-
39
- it "returns true if rating is within threshold" do
40
- @seller.rating = 4.8
41
- @seller.should be_kosher
42
- end
43
-
44
- it "returns false if rating is not within threshold" do
45
- @seller.rating = 4.7
46
- @seller.should_not be_kosher
47
- end
48
-
49
- it "returns false if seller is blacklisted" do
50
- @seller.id = ['foo']
51
- Kosher.seller_blacklist << @seller.id
52
- @seller.should_not be_kosher
53
- end
54
- end
55
- end
56
- end
@@ -1,41 +0,0 @@
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.cost = Price.new(cents: 0)
13
- @shipping.should be_free
14
- end
15
- end
16
-
17
- context "when shipping is not free" do
18
- it "returns false" do
19
- @shipping.cost = Price.new(cents: 1)
20
- @shipping.should_not be_free
21
- end
22
- end
23
- end
24
-
25
- describe "#kosher?" do
26
- context "when available" do
27
- it "returns true" do
28
- @shipping.availability = Availability.new(:hours => 0)
29
- @shipping.should be_kosher
30
- end
31
- end
32
-
33
- context "when not available" do
34
- it "returns false" do
35
- @shipping.availability = Availability.new(:hours => 96)
36
- @shipping.should_not be_kosher
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,5 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Kosher
4
- describe Venue
5
- end
data/spec/kosher_spec.rb DELETED
@@ -1,4 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Kosher do
4
- end
data/spec/spec_helper.rb DELETED
@@ -1,5 +0,0 @@
1
- require 'rubygems'
2
- require 'bundler/setup'
3
- require 'rspec'
4
-
5
- require_relative '../lib/kosher'