kosher 0.10.0 → 0.11.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/Gemfile +4 -0
- data/README.md +0 -2
- data/kosher.gemspec +7 -5
- data/lib/kosher/base.rb +19 -0
- data/lib/kosher/offer.rb +14 -10
- data/lib/kosher/price.rb +18 -0
- data/lib/kosher/seller.rb +3 -5
- data/lib/kosher/shipping.rb +4 -19
- data/lib/kosher/unit.rb +10 -18
- data/lib/kosher/venue.rb +4 -11
- data/lib/kosher/version.rb +1 -1
- data/lib/kosher.rb +3 -9
- data/test/kosher_test.rb +40 -42
- metadata +37 -14
- data/lib/kosher/invalid.rb +0 -7
data/Gemfile
CHANGED
data/README.md
CHANGED
data/kosher.gemspec
CHANGED
@@ -9,13 +9,15 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.authors = ['Hakan Ensari']
|
10
10
|
s.email = 'code@papercavalier.com'
|
11
11
|
s.homepage = 'https://github.com/hakanensari/kosher'
|
12
|
-
s.summary = %q{Online
|
13
|
-
s.description = %q{Online
|
12
|
+
s.summary = %q{Online selling, abstracted}
|
13
|
+
s.description = %q{Online selling, abstracted}
|
14
14
|
|
15
15
|
{
|
16
|
-
'
|
17
|
-
'
|
18
|
-
'
|
16
|
+
'activesupport' => '~> 3.0',
|
17
|
+
'activemodel' => '~> 3.0',
|
18
|
+
'certainty' => '~> 0.2',
|
19
|
+
'money' => '~> 3.7',
|
20
|
+
'structure' => '~> 0.18'
|
19
21
|
}.each do |lib, version|
|
20
22
|
s.add_runtime_dependency lib, version
|
21
23
|
end
|
data/lib/kosher/base.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Kosher
|
2
|
+
module Base
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
include ActiveModel::Validations
|
5
|
+
|
6
|
+
included do
|
7
|
+
key :foo
|
8
|
+
key :kosher, Boolean, :default => true
|
9
|
+
end
|
10
|
+
|
11
|
+
def kosher?
|
12
|
+
unless valid?
|
13
|
+
raise StandardError.new(errors.full_messages.join(', '))
|
14
|
+
end
|
15
|
+
|
16
|
+
kosher
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/kosher/offer.rb
CHANGED
@@ -1,31 +1,35 @@
|
|
1
|
+
require 'kosher/base'
|
2
|
+
require 'kosher/price'
|
3
|
+
|
4
|
+
require 'kosher/seller'
|
5
|
+
require 'kosher/shipping'
|
6
|
+
require 'kosher/unit'
|
7
|
+
require 'kosher/venue'
|
8
|
+
|
1
9
|
module Kosher
|
2
10
|
class Offer < Structure
|
3
|
-
include ActiveModel::Validations
|
4
11
|
include Comparable
|
5
12
|
|
6
13
|
key :id
|
7
|
-
|
8
|
-
|
9
|
-
|
14
|
+
key :seller
|
15
|
+
key :shipping
|
16
|
+
key :unit
|
10
17
|
key :venue_id, Integer
|
11
18
|
|
12
|
-
validates_presence_of :seller, :shipping, :unit, :venue
|
13
|
-
|
14
19
|
def <=>(other)
|
15
20
|
if kosher? != other.kosher?
|
16
21
|
kosher? ? -1 : 1
|
17
22
|
else
|
18
|
-
|
23
|
+
price <=> other.price
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
22
27
|
def kosher?
|
23
|
-
|
24
|
-
seller.kosher? && shipping.kosher? && unit.kosher?
|
28
|
+
[seller, shipping, unit].all?(&:kosher?)
|
25
29
|
end
|
26
30
|
|
27
31
|
def price
|
28
|
-
unit.price + shipping.
|
32
|
+
unit.price + shipping.price
|
29
33
|
end
|
30
34
|
|
31
35
|
def venue
|
data/lib/kosher/price.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Kosher
|
2
|
+
module Price
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
key :cents, Integer
|
7
|
+
key :currency, String
|
8
|
+
|
9
|
+
validates_presence_of :currency
|
10
|
+
validates_numericality_of :cents,
|
11
|
+
:greater_than => 0
|
12
|
+
end
|
13
|
+
|
14
|
+
def price
|
15
|
+
Money.new(cents, currency)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/kosher/seller.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
module Kosher
|
2
2
|
class Seller < Structure
|
3
|
+
include Base
|
4
|
+
|
3
5
|
key :id
|
4
|
-
key :kosher, Boolean, :default => true
|
5
6
|
key :name
|
6
7
|
key :rating, Float
|
7
8
|
|
8
|
-
|
9
|
-
def kosher?
|
10
|
-
kosher
|
11
|
-
end
|
9
|
+
validates_presence_of :name
|
12
10
|
end
|
13
11
|
end
|
data/lib/kosher/shipping.rb
CHANGED
@@ -1,25 +1,10 @@
|
|
1
1
|
module Kosher
|
2
2
|
class Shipping < Structure
|
3
|
-
include
|
3
|
+
include Base
|
4
|
+
include Price
|
4
5
|
|
5
|
-
key :available
|
6
|
-
key :cents, Integer
|
7
|
-
key :currency
|
8
|
-
key :kosher, Boolean, :default => true
|
6
|
+
key :available, Boolean
|
9
7
|
|
10
|
-
validates_presence_of
|
11
|
-
validates_numericality_of :cents,
|
12
|
-
:greater_than => 0
|
13
|
-
|
14
|
-
# Shipping cost.
|
15
|
-
def cost
|
16
|
-
Money.new(cents, currency)
|
17
|
-
end
|
18
|
-
|
19
|
-
# Returns whether the item is kosher.
|
20
|
-
def kosher?
|
21
|
-
raise Invalid.new(self) unless valid?
|
22
|
-
kosher
|
23
|
-
end
|
8
|
+
validates_presence_of :available
|
24
9
|
end
|
25
10
|
end
|
data/lib/kosher/unit.rb
CHANGED
@@ -1,28 +1,20 @@
|
|
1
1
|
module Kosher
|
2
2
|
class Unit < Structure
|
3
|
-
include
|
3
|
+
include Base
|
4
|
+
include Price
|
4
5
|
|
5
|
-
key :
|
6
|
-
key :
|
7
|
-
key :
|
8
|
-
key :description
|
9
|
-
key :kosher, Boolean, :default => true
|
10
|
-
key :quantity, Integer, :default => 1
|
6
|
+
key :condition, Integer
|
7
|
+
key :description, String
|
8
|
+
key :quantity, Integer, :default => 1
|
11
9
|
|
12
|
-
validates_inclusion_of
|
13
|
-
validates_numericality_of :cents,
|
14
|
-
:greater_than => 0
|
15
|
-
validates_presence_of :currency
|
10
|
+
validates_inclusion_of :condition, :in => 1..6
|
16
11
|
|
17
|
-
|
18
|
-
|
19
|
-
raise Invalid.new(self) unless valid?
|
20
|
-
kosher
|
12
|
+
def new?
|
13
|
+
condition == 1
|
21
14
|
end
|
22
15
|
|
23
|
-
|
24
|
-
|
25
|
-
Money.new(cents, currency)
|
16
|
+
def used?
|
17
|
+
!new?
|
26
18
|
end
|
27
19
|
end
|
28
20
|
end
|
data/lib/kosher/venue.rb
CHANGED
@@ -1,19 +1,12 @@
|
|
1
1
|
module Kosher
|
2
2
|
class Venue < Structure
|
3
|
-
|
4
|
-
|
5
|
-
set_data_path File.expand_path("../../../data/venues.yml", __FILE__)
|
6
|
-
|
7
|
-
# The name of the venue.
|
3
|
+
key :country
|
8
4
|
key :name
|
9
5
|
|
10
|
-
|
11
|
-
key :country
|
6
|
+
set_data_file File.expand_path("../../../data/venues.yml", __FILE__)
|
12
7
|
|
13
|
-
|
14
|
-
|
15
|
-
@amazons ||= select { |record| record.name.include? 'Amazon' }
|
16
|
-
end
|
8
|
+
def self.amazon
|
9
|
+
@amazons ||= find_all { |e| e.name.include? 'Amazon' }
|
17
10
|
end
|
18
11
|
end
|
19
12
|
end
|
data/lib/kosher/version.rb
CHANGED
data/lib/kosher.rb
CHANGED
@@ -1,13 +1,7 @@
|
|
1
|
+
require 'active_support/concern'
|
1
2
|
require 'active_model'
|
3
|
+
require 'certainty'
|
2
4
|
require 'money'
|
3
5
|
require 'structure'
|
4
6
|
|
5
|
-
|
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'
|
13
|
-
end
|
7
|
+
require 'kosher/offer'
|
data/test/kosher_test.rb
CHANGED
@@ -3,64 +3,62 @@ require 'minitest/autorun'
|
|
3
3
|
|
4
4
|
require_relative '../lib/kosher'
|
5
5
|
|
6
|
+
begin
|
7
|
+
require 'ruby-debug'
|
8
|
+
rescue LoadError
|
9
|
+
end
|
10
|
+
|
11
|
+
include Kosher
|
12
|
+
|
6
13
|
class TestKosher < MiniTest::Unit::TestCase
|
7
|
-
def
|
8
|
-
unit =
|
9
|
-
|
10
|
-
assert_equal '
|
11
|
-
end
|
14
|
+
def test_prices
|
15
|
+
unit = Unit.new(:cents => '1000',
|
16
|
+
:currency => 'EUR')
|
17
|
+
assert_equal '10,00 €', unit.price.format
|
12
18
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
assert_equal '1,00 €', shipping.cost.format
|
17
|
-
end
|
19
|
+
shipping = Shipping.new(:cents => '300',
|
20
|
+
:currency => 'EUR')
|
21
|
+
assert_equal '3,00 €', shipping.price.format
|
18
22
|
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
23
|
+
offer = Offer.new(:shipping => shipping,
|
24
|
+
:unit => unit)
|
25
|
+
assert_equal '13,00 €', offer.price.format
|
27
26
|
end
|
28
27
|
|
29
|
-
def
|
30
|
-
assert_equal 'Amazon.com',
|
31
|
-
assert_equal 'Amazon.co.uk',
|
32
|
-
end
|
28
|
+
def test_venues
|
29
|
+
assert_equal 'Amazon.com', Venue.find(1).name
|
30
|
+
assert_equal 'Amazon.co.uk', Venue.find(2).name
|
33
31
|
|
34
|
-
|
35
|
-
|
36
|
-
assert_equal Kosher::Venue.find(1), offer.venue
|
32
|
+
offer = Offer.new(:venue_id => 1)
|
33
|
+
assert_equal Venue.find(1), offer.venue
|
37
34
|
end
|
38
35
|
|
39
36
|
def test_validation
|
40
|
-
assert_raises(
|
41
|
-
unit =
|
42
|
-
|
43
|
-
|
37
|
+
assert_raises(StandardError) { Unit.new.kosher? }
|
38
|
+
unit = Unit.new(:condition => 1,
|
39
|
+
:cents => 100,
|
40
|
+
:currency => 'USD')
|
44
41
|
assert unit.kosher?
|
45
42
|
|
46
|
-
assert_raises(
|
47
|
-
shipping =
|
48
|
-
|
49
|
-
|
43
|
+
assert_raises(StandardError) { Shipping.new.kosher? }
|
44
|
+
shipping = Shipping.new(:available => true,
|
45
|
+
:cents => 100,
|
46
|
+
:currency => 'USD')
|
50
47
|
assert shipping.kosher?
|
51
48
|
|
52
|
-
assert_raises(
|
53
|
-
|
54
|
-
|
55
|
-
:seller => Kosher::Seller.new,
|
56
|
-
:venue_id => 1)
|
57
|
-
assert offer.kosher?
|
49
|
+
assert_raises(StandardError) { Seller.new.kosher? }
|
50
|
+
seller = Seller.new(:name => 'John Doe')
|
51
|
+
assert seller.kosher?
|
58
52
|
|
59
|
-
|
60
|
-
|
53
|
+
assert_raises(NoMethodError) { Offer.new.kosher? }
|
54
|
+
offer = Offer.new(:unit => unit,
|
55
|
+
:shipping => shipping,
|
56
|
+
:seller => seller,
|
57
|
+
:venue_id => 1)
|
58
|
+
assert offer.kosher?
|
61
59
|
end
|
62
60
|
|
63
61
|
def test_amazon_venues
|
64
|
-
assert_equal 8,
|
62
|
+
assert_equal 8, Venue.amazon.size
|
65
63
|
end
|
66
64
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kosher
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-26 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: &70121457070860 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70121457070860
|
14
25
|
- !ruby/object:Gem::Dependency
|
15
26
|
name: activemodel
|
16
|
-
requirement: &
|
27
|
+
requirement: &70121457069980 !ruby/object:Gem::Requirement
|
17
28
|
none: false
|
18
29
|
requirements:
|
19
30
|
- - ~>
|
@@ -21,10 +32,21 @@ dependencies:
|
|
21
32
|
version: '3.0'
|
22
33
|
type: :runtime
|
23
34
|
prerelease: false
|
24
|
-
version_requirements: *
|
35
|
+
version_requirements: *70121457069980
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: certainty
|
38
|
+
requirement: &70121457069440 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0.2'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70121457069440
|
25
47
|
- !ruby/object:Gem::Dependency
|
26
48
|
name: money
|
27
|
-
requirement: &
|
49
|
+
requirement: &70121457068900 !ruby/object:Gem::Requirement
|
28
50
|
none: false
|
29
51
|
requirements:
|
30
52
|
- - ~>
|
@@ -32,19 +54,19 @@ dependencies:
|
|
32
54
|
version: '3.7'
|
33
55
|
type: :runtime
|
34
56
|
prerelease: false
|
35
|
-
version_requirements: *
|
57
|
+
version_requirements: *70121457068900
|
36
58
|
- !ruby/object:Gem::Dependency
|
37
59
|
name: structure
|
38
|
-
requirement: &
|
60
|
+
requirement: &70121457068360 !ruby/object:Gem::Requirement
|
39
61
|
none: false
|
40
62
|
requirements:
|
41
63
|
- - ~>
|
42
64
|
- !ruby/object:Gem::Version
|
43
|
-
version: '0.
|
65
|
+
version: '0.18'
|
44
66
|
type: :runtime
|
45
67
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
-
description: Online
|
68
|
+
version_requirements: *70121457068360
|
69
|
+
description: Online selling, abstracted
|
48
70
|
email: code@papercavalier.com
|
49
71
|
executables: []
|
50
72
|
extensions: []
|
@@ -59,8 +81,9 @@ files:
|
|
59
81
|
- data/venues.yml
|
60
82
|
- kosher.gemspec
|
61
83
|
- lib/kosher.rb
|
62
|
-
- lib/kosher/
|
84
|
+
- lib/kosher/base.rb
|
63
85
|
- lib/kosher/offer.rb
|
86
|
+
- lib/kosher/price.rb
|
64
87
|
- lib/kosher/seller.rb
|
65
88
|
- lib/kosher/shipping.rb
|
66
89
|
- lib/kosher/unit.rb
|
@@ -81,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
81
104
|
version: '0'
|
82
105
|
segments:
|
83
106
|
- 0
|
84
|
-
hash:
|
107
|
+
hash: 2657274426638176480
|
85
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
109
|
none: false
|
87
110
|
requirements:
|
@@ -90,12 +113,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
113
|
version: '0'
|
91
114
|
segments:
|
92
115
|
- 0
|
93
|
-
hash:
|
116
|
+
hash: 2657274426638176480
|
94
117
|
requirements: []
|
95
118
|
rubyforge_project:
|
96
119
|
rubygems_version: 1.8.6
|
97
120
|
signing_key:
|
98
121
|
specification_version: 3
|
99
|
-
summary: Online
|
122
|
+
summary: Online selling, abstracted
|
100
123
|
test_files:
|
101
124
|
- test/kosher_test.rb
|