goods 0.0.2 → 0.0.3
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.
- checksums.yaml +4 -4
- data/lib/goods/category.rb +3 -5
- data/lib/goods/currency.rb +2 -14
- data/lib/goods/element.rb +78 -0
- data/lib/goods/offer.rb +9 -16
- data/lib/goods/version.rb +1 -1
- data/lib/goods/xml.rb +1 -1
- data/lib/goods.rb +1 -1
- data/spec/goods/category_spec.rb +1 -1
- data/spec/goods/currency_spec.rb +1 -1
- data/spec/goods/offer_spec.rb +1 -1
- data/spec/support/{shared_examples_for_containable.rb → shared_examples_for_element.rb} +1 -1
- metadata +5 -5
- data/lib/goods/containable.rb +0 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ba028ffc9f2ea9eeec008971060a0b66c2c99ea
|
4
|
+
data.tar.gz: 1e80a10fd4e52f22c57789994592ce09c62added
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca29741ba878d8c0a29e43c256737d606ed011babe5f0a73102611c4c9bef3d94ca67276f757240a2649ba285d77bf7a5b012ccdaf2c0f62e480102e9bd2cf2b
|
7
|
+
data.tar.gz: cc1780dca99d100667402dd7b7ac541b545d853232b71af992cffb22ef8c51b8b64c027134e10abb49959091f698476ecc42f96d0ee62df51e19f3074e9bf6d9
|
data/lib/goods/category.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
module Goods
|
2
|
-
class Category
|
3
|
-
include Containable
|
2
|
+
class Category < Element
|
4
3
|
attr_accessor :parent
|
5
|
-
attr_field :parent_id
|
6
|
-
attr_field :name
|
4
|
+
attr_field :parent_id, :name
|
7
5
|
|
8
6
|
def initialize(info_hash)
|
9
|
-
|
7
|
+
super
|
10
8
|
@parent_at_level = {}
|
11
9
|
end
|
12
10
|
|
data/lib/goods/currency.rb
CHANGED
@@ -1,18 +1,6 @@
|
|
1
1
|
module Goods
|
2
|
-
class Currency
|
3
|
-
|
4
|
-
|
5
|
-
def initialize(info_hash)
|
6
|
-
self._info_hash = info_hash
|
7
|
-
end
|
8
|
-
|
9
|
-
def rate
|
10
|
-
@rate ||= _info_hash[:rate].to_f
|
11
|
-
end
|
12
|
-
|
13
|
-
def plus
|
14
|
-
@plus ||= _info_hash[:plus].to_f
|
15
|
-
end
|
2
|
+
class Currency < Element
|
3
|
+
attr_field :rate, :plus, type: :float
|
16
4
|
|
17
5
|
def in(other_currency)
|
18
6
|
self.rate/other_currency.rate
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Goods
|
2
|
+
class Element
|
3
|
+
|
4
|
+
def self.generate_accessor(field_name, type)
|
5
|
+
define_method field_name do
|
6
|
+
if field = instance_variable_get("@#{field_name}")
|
7
|
+
field
|
8
|
+
else
|
9
|
+
setup_instance_variable(field_name, type)
|
10
|
+
instance_variable_get("@#{field_name}")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Class macro that defined mathods to access instance variables @some_field
|
16
|
+
# in the following way (illustrative example)
|
17
|
+
#
|
18
|
+
# attr_field :field_name
|
19
|
+
#
|
20
|
+
# is equivalent to
|
21
|
+
#
|
22
|
+
# def field_name
|
23
|
+
# @field_name ||= description[:field_name]
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# This method can take several arguments with optional hash at the end.
|
27
|
+
# Semantics is the same as with attr_* family of methods.
|
28
|
+
#
|
29
|
+
# You can specify the type of field by providin {type: :some_type} hash as
|
30
|
+
# the last argument. For example type: :float will call #to_f on resulting
|
31
|
+
# value.
|
32
|
+
def self.attr_field(*args)
|
33
|
+
opts = args.last.is_a?(Hash) ? args.pop : {}
|
34
|
+
type = opts[:type] || :string
|
35
|
+
|
36
|
+
args.each do |field_name|
|
37
|
+
self.generate_accessor(field_name, type)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(info_hash)
|
42
|
+
@info_hash = info_hash
|
43
|
+
end
|
44
|
+
|
45
|
+
attr_field :id
|
46
|
+
|
47
|
+
def invalid_fields
|
48
|
+
@invalid_fields ||= []
|
49
|
+
end
|
50
|
+
|
51
|
+
def valid?
|
52
|
+
reset_validation
|
53
|
+
apply_validation_rules
|
54
|
+
invalid_fields.empty?
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def reset_validation
|
60
|
+
invalid_fields.clear
|
61
|
+
end
|
62
|
+
|
63
|
+
def validate(field, predicate)
|
64
|
+
invalid_fields << field unless predicate.call(send(field))
|
65
|
+
end
|
66
|
+
|
67
|
+
def setup_instance_variable(name, type)
|
68
|
+
case type
|
69
|
+
when :string
|
70
|
+
instance_variable_set("@#{name}", @info_hash[name])
|
71
|
+
when :float
|
72
|
+
instance_variable_set("@#{name}", @info_hash[name].to_f)
|
73
|
+
else
|
74
|
+
raise ArgumentError, 'wrong type'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lib/goods/offer.rb
CHANGED
@@ -1,21 +1,9 @@
|
|
1
1
|
module Goods
|
2
|
-
class Offer
|
3
|
-
include Containable
|
2
|
+
class Offer < Element
|
4
3
|
attr_accessor :category, :currency, :price
|
5
|
-
attr_field :category_id
|
6
|
-
|
7
|
-
attr_field :
|
8
|
-
attr_field :description
|
9
|
-
attr_field :model
|
10
|
-
attr_field :name
|
11
|
-
attr_field :picture
|
12
|
-
attr_field :vendor
|
13
|
-
attr_field :url
|
14
|
-
|
15
|
-
def initialize(info_hash)
|
16
|
-
self._info_hash = info_hash
|
17
|
-
@price = _info_hash[:price].to_f
|
18
|
-
end
|
4
|
+
attr_field :category_id, :currency_id, :available, :description,
|
5
|
+
:model, :name, :picture, :vendor, :url
|
6
|
+
attr_field :price, type: :float
|
19
7
|
|
20
8
|
def convert_currency(other_currency)
|
21
9
|
self.price *= currency.in(other_currency)
|
@@ -28,6 +16,10 @@ module Goods
|
|
28
16
|
@category_id = other_category.id
|
29
17
|
end
|
30
18
|
|
19
|
+
def price=(price)
|
20
|
+
@price = price
|
21
|
+
end
|
22
|
+
|
31
23
|
private
|
32
24
|
|
33
25
|
def apply_validation_rules
|
@@ -40,5 +32,6 @@ module Goods
|
|
40
32
|
}
|
41
33
|
validate :price, proc { |price| price && price > 0 }
|
42
34
|
end
|
35
|
+
|
43
36
|
end
|
44
37
|
end
|
data/lib/goods/version.rb
CHANGED
data/lib/goods/xml.rb
CHANGED
data/lib/goods.rb
CHANGED
data/spec/goods/category_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe Goods::Category do
|
|
4
4
|
let(:valid_description) { {id: "1", name: "Name"} }
|
5
5
|
let(:root) { Goods::Category.new valid_description }
|
6
6
|
|
7
|
-
it_should_behave_like "
|
7
|
+
it_should_behave_like "element" do
|
8
8
|
let(:element) { Goods::Category.new(valid_description) }
|
9
9
|
end
|
10
10
|
|
data/spec/goods/currency_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe Goods::Currency do
|
|
4
4
|
let(:valid_description) { {id: "VAL_CUR", rate: 1, plus: 0} }
|
5
5
|
let(:valid_currency) { Goods::Currency.new(valid_description) }
|
6
6
|
|
7
|
-
it_should_behave_like "
|
7
|
+
it_should_behave_like "element" do
|
8
8
|
let(:element) { valid_currency }
|
9
9
|
end
|
10
10
|
|
data/spec/goods/offer_spec.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goods
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Pyanykh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -101,10 +101,10 @@ files:
|
|
101
101
|
- lib/goods/catalog.rb
|
102
102
|
- lib/goods/categories_list.rb
|
103
103
|
- lib/goods/category.rb
|
104
|
-
- lib/goods/containable.rb
|
105
104
|
- lib/goods/container.rb
|
106
105
|
- lib/goods/currencies_list.rb
|
107
106
|
- lib/goods/currency.rb
|
107
|
+
- lib/goods/element.rb
|
108
108
|
- lib/goods/offer.rb
|
109
109
|
- lib/goods/offers_list.rb
|
110
110
|
- lib/goods/version.rb
|
@@ -124,8 +124,8 @@ files:
|
|
124
124
|
- spec/goods/xml_spec.rb
|
125
125
|
- spec/goods_spec.rb
|
126
126
|
- spec/spec_helper.rb
|
127
|
-
- spec/support/shared_examples_for_containable.rb
|
128
127
|
- spec/support/shared_examples_for_container.rb
|
128
|
+
- spec/support/shared_examples_for_element.rb
|
129
129
|
homepage: https://github.com/ArtemPyanykh/goods
|
130
130
|
licenses:
|
131
131
|
- MIT
|
@@ -164,5 +164,5 @@ test_files:
|
|
164
164
|
- spec/goods/xml_spec.rb
|
165
165
|
- spec/goods_spec.rb
|
166
166
|
- spec/spec_helper.rb
|
167
|
-
- spec/support/shared_examples_for_containable.rb
|
168
167
|
- spec/support/shared_examples_for_container.rb
|
168
|
+
- spec/support/shared_examples_for_element.rb
|
data/lib/goods/containable.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
module Goods
|
2
|
-
module Containable
|
3
|
-
def self.included(base)
|
4
|
-
# Class macro that defined mathod to access instance variable @field_name
|
5
|
-
# in the following way (illustrative example)
|
6
|
-
#
|
7
|
-
# def field_name
|
8
|
-
# @field_name ||= description[field_name]
|
9
|
-
# end
|
10
|
-
base.define_singleton_method :attr_field do |field_name|
|
11
|
-
define_method field_name do
|
12
|
-
if field = instance_variable_get("@#{field_name}")
|
13
|
-
field
|
14
|
-
else
|
15
|
-
instance_variable_set("@#{field_name}", _info_hash[field_name])
|
16
|
-
instance_variable_get("@#{field_name}")
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def _info_hash
|
23
|
-
@_info_hash
|
24
|
-
end
|
25
|
-
private :_info_hash
|
26
|
-
|
27
|
-
def id
|
28
|
-
@id ||= _info_hash[:id]
|
29
|
-
end
|
30
|
-
|
31
|
-
def invalid_fields
|
32
|
-
@invalid_fields ||= []
|
33
|
-
end
|
34
|
-
|
35
|
-
def valid?
|
36
|
-
reset_validation
|
37
|
-
apply_validation_rules
|
38
|
-
invalid_fields.empty?
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def reset_validation
|
44
|
-
invalid_fields.clear
|
45
|
-
end
|
46
|
-
|
47
|
-
def validate(field, predicate)
|
48
|
-
invalid_fields << field unless predicate.call(send(field))
|
49
|
-
end
|
50
|
-
|
51
|
-
def _info_hash=(info_hash)
|
52
|
-
@_info_hash = info_hash
|
53
|
-
end
|
54
|
-
private :_info_hash=
|
55
|
-
end
|
56
|
-
end
|