rest_model 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -4,20 +4,23 @@ RestModel::Configuration.configure do |c|
4
4
  c.true_value = "X"
5
5
  c.false_value = ""
6
6
  c.date_format = "%Y%m%d"
7
+ c.datetime_format = "%a %b %d %H:%M:%S %Y"
7
8
  end
8
9
 
9
10
  class Customer < RestModel
10
11
  property :login
11
- property :age, type: Integer
12
- property :birth, type: Date
13
- property :active, type: Boolean
14
- property :services, type: Enumerable
15
- property :balance, type: Float
12
+ property :age, type: Integer
13
+ property :birth, type: Date
14
+ property :created_at, type: DateTime
15
+ property :active, type: Boolean
16
+ property :services, type: Enumerable
17
+ property :balance, type: Float
16
18
  end
17
19
 
18
20
  @root = Customer.new(login: 'jackiechan2010',
19
21
  age: 22,
20
22
  birth: "1990-07-04",
23
+ created_at: DateTime.now,
21
24
  active: true,
22
25
  services: ["Hosting", "Email"],
23
26
  balance: 200.00)
@@ -38,6 +38,14 @@ class RestModel
38
38
  @date_format = format
39
39
  end
40
40
 
41
+ def datetime_format
42
+ @datetime_format
43
+ end
44
+
45
+ def datetime_format=(format)
46
+ @datetime_format = format
47
+ end
48
+
41
49
  def configure
42
50
  yield self if block_given?
43
51
  end
@@ -0,0 +1,16 @@
1
+ class RestModel
2
+ class SerializationError < StandardError; end
3
+ class TranslationError < StandardError; end
4
+
5
+ class SourceError < StandardError
6
+ attr_reader :errors
7
+
8
+ def initialize(errors)
9
+ @errors = errors
10
+ end
11
+
12
+ def self.exception(errors = {})
13
+ new(errors)
14
+ end
15
+ end
16
+ end
@@ -5,7 +5,7 @@ class RestModel
5
5
  source_value = begin
6
6
  translation.translates_to_source? ? translation.translate_to_source(value, resource)
7
7
  : serializer.desserialize(value)
8
- rescue => exception
8
+ rescue TranslationError, SerializationError
9
9
  raise exception if options[:fail]
10
10
  end
11
11
 
@@ -27,12 +27,12 @@ class RestModel
27
27
 
28
28
  def self.serialize(value)
29
29
  MAPPINGS[value].tap do |bool|
30
- fail "value not serializable: #{value}" if bool.nil?
30
+ fail SerializationError, "value '#{value}' is not boolean" if bool.nil?
31
31
  end
32
32
  end
33
33
 
34
34
  def self.desserialize(value)
35
- fail unless boolean?(value)
35
+ fail SerializationError, "value '#{value}' is not boolean" unless boolean?(value)
36
36
 
37
37
  value ? RestModel::Configuration.true_value
38
38
  : RestModel::Configuration.false_value
@@ -4,7 +4,7 @@ class RestModel
4
4
  def self.serialize(value)
5
5
  ::Date.parse value
6
6
  rescue ArgumentError
7
- raise "value not serializable: #{value}"
7
+ raise SerializationError, "value '#{value}' is an invalid date"
8
8
  end
9
9
 
10
10
  def self.desserialize(value)
@@ -12,7 +12,7 @@ class RestModel
12
12
  format = RestModel::Configuration.date_format
13
13
  format ? date.strftime(format) : date.to_s
14
14
  rescue ArgumentError
15
- raise "value not desserializable: #{value}"
15
+ raise SerializationError, "value '#{value}' is an invalid date"
16
16
  end
17
17
  end
18
18
  end
@@ -0,0 +1,19 @@
1
+ class RestModel
2
+ module Serialization
3
+ class DateTime
4
+ def self.serialize(value)
5
+ ::DateTime.parse value
6
+ rescue ArgumentError
7
+ raise SerializationError, "value '#{value}' is an invalid datetime"
8
+ end
9
+
10
+ def self.desserialize(value)
11
+ datetime = value.kind_of?(::DateTime) ? value : ::DateTime.parse(value)
12
+ format = RestModel::Configuration.datetime_format
13
+ format ? datetime.strftime(format) : datetime.to_s
14
+ rescue ArgumentError
15
+ raise SerializationError, "value '#{value}' is an invalid datetime"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -2,12 +2,14 @@ class RestModel
2
2
  module Serialization
3
3
  class Enumerable
4
4
  def self.serialize(value)
5
- fail "value not serializable: #{value}" unless value.kind_of?(::Enumerable)
5
+ fail SerializationError, "value '#{value}' is not an enumerable" unless value.kind_of?(::Enumerable)
6
+
6
7
  value
7
8
  end
8
9
 
9
10
  def self.desserialize(value)
10
- fail "value not desserializable: #{value}" unless value.kind_of?(::Enumerable)
11
+ fail SerializationError, "value '#{value}' is not an enumerable" unless value.kind_of?(::Enumerable)
12
+
11
13
  value
12
14
  end
13
15
  end
@@ -4,13 +4,13 @@ class RestModel
4
4
  def self.serialize(value)
5
5
  Float(value)
6
6
  rescue ArgumentError
7
- raise "value not serializable: #{value}"
7
+ raise SerializationError, "value '#{value}' is not a float"
8
8
  end
9
9
 
10
10
  def self.desserialize(value)
11
11
  Float(value)
12
12
  rescue ArgumentError
13
- raise "value not desserializable: #{value}"
13
+ raise SerializationError, "value '#{value}' is not a float"
14
14
  end
15
15
  end
16
16
  end
@@ -4,13 +4,13 @@ class RestModel
4
4
  def self.serialize(value)
5
5
  Integer(value)
6
6
  rescue ArgumentError
7
- raise "value not serializable: #{value}"
7
+ raise SerializationError, "value '#{value}' is not an integer"
8
8
  end
9
9
 
10
10
  def self.desserialize(value)
11
11
  Integer(value)
12
12
  rescue ArgumentError
13
- raise "value not desserializable: #{value}"
13
+ raise SerializationError, "value '#{value}' is not an integer"
14
14
  end
15
15
  end
16
16
  end
@@ -7,14 +7,22 @@ class RestModel
7
7
 
8
8
  def to_source(options = {})
9
9
  source = {}
10
+ errors = {}
10
11
  root_options = {without_nil: options[:without_nil], fail: options[:fail]}
11
12
 
12
13
  keys_to_source(options).each do |key|
13
14
  value = __send__(key.name)
14
15
  key_options = options.fetch(key.name, {}).merge(root_options)
15
- source.merge! key.to_source!(value, self, key_options)
16
+
17
+ begin
18
+ source.merge! key.to_source!(value, self, key_options)
19
+ rescue TranslationError, SerializationError => error
20
+ errors[key.name] = error.message
21
+ end
16
22
  end
17
23
 
24
+ fail SourceError, errors unless errors.empty? if options[:fail]
25
+
18
26
  source.with_indifferent_access
19
27
  end
20
28
 
@@ -17,7 +17,10 @@ class RestModel
17
17
  if from_source
18
18
  resource.instance_exec(value, &from_source)
19
19
  elsif values
20
- fail "from source error" unless values.has_value?(value)
20
+ unless values.has_value?(value)
21
+ fail TranslationError, "value '#{value}' doesn't belong to values: #{values.values}"
22
+ end
23
+
21
24
  values.key(value)
22
25
  else
23
26
  value
@@ -32,7 +35,10 @@ class RestModel
32
35
  if to_source
33
36
  resource.instance_exec(value, &to_source)
34
37
  elsif values
35
- fail "to source error" unless values.has_key?(value)
38
+ unless values.has_key?(value)
39
+ fail TranslationError, "value '#{value}' doesn't belong to values: #{values.keys}"
40
+ end
41
+
36
42
  values[value]
37
43
  else
38
44
  value
@@ -1,3 +1,3 @@
1
1
  class RestModel
2
- VERSION = "0.1.6"
2
+ VERSION = "0.1.7"
3
3
  end
data/lib/rest_model.rb CHANGED
@@ -15,6 +15,7 @@ require "rest_model/source/sender"
15
15
  require "rest_model/response"
16
16
  require "rest_model/serialization/boolean"
17
17
  require "rest_model/serialization/date"
18
+ require "rest_model/serialization/datetime"
18
19
  require "rest_model/serialization/enumerable"
19
20
  require "rest_model/serialization/float"
20
21
  require "rest_model/serialization/integer"
@@ -30,6 +31,7 @@ require "rest_model/key/embeddable/builder"
30
31
  require "rest_model/key/href"
31
32
  require "rest_model/key/builder"
32
33
  require "rest_model/configuration"
34
+ require "rest_model/errors"
33
35
 
34
36
  class RestModel
35
37
  extend Key::Builder
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe RestModel::Serialization::DateTime do
4
+ it "converts to datetime" do
5
+ subject.class.serialize('2011-07-01T10:20:30').should == DateTime.new(2011, 07, 01, 10, 20, 30)
6
+ end
7
+
8
+ context "when an invalid value is serialized" do
9
+ it "raises an error" do
10
+ expect {subject.class.serialize("not a datetime")}.to raise_error
11
+ end
12
+ end
13
+ end
@@ -85,7 +85,7 @@ describe RestModel::Source::Retriever do
85
85
 
86
86
  context "when calling from_source!" do
87
87
  it "fails when value wasn't mapped" do
88
- expect {Example.from_source!({status: '03'})}.to raise_error("from source error")
88
+ expect {Example.from_source!({status: '03'})}.to raise_error
89
89
  end
90
90
  end
91
91
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest_model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,11 +11,11 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-10-28 00:00:00.000000000Z
14
+ date: 2011-11-03 00:00:00.000000000Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: activesupport
18
- requirement: &70170593933400 !ruby/object:Gem::Requirement
18
+ requirement: &70151888329840 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ~>
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '3.0'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *70170593933400
26
+ version_requirements: *70151888329840
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: i18n
29
- requirement: &70170593932860 !ruby/object:Gem::Requirement
29
+ requirement: &70151882162800 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ! '>='
@@ -34,10 +34,10 @@ dependencies:
34
34
  version: '0.5'
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *70170593932860
37
+ version_requirements: *70151882162800
38
38
  - !ruby/object:Gem::Dependency
39
39
  name: rspec
40
- requirement: &70170593932360 !ruby/object:Gem::Requirement
40
+ requirement: &70151882162340 !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
43
  - - ~>
@@ -45,10 +45,10 @@ dependencies:
45
45
  version: '2.6'
46
46
  type: :development
47
47
  prerelease: false
48
- version_requirements: *70170593932360
48
+ version_requirements: *70151882162340
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: guard
51
- requirement: &70170593920300 !ruby/object:Gem::Requirement
51
+ requirement: &70151882161880 !ruby/object:Gem::Requirement
52
52
  none: false
53
53
  requirements:
54
54
  - - ~>
@@ -56,10 +56,10 @@ dependencies:
56
56
  version: '0.5'
57
57
  type: :development
58
58
  prerelease: false
59
- version_requirements: *70170593920300
59
+ version_requirements: *70151882161880
60
60
  - !ruby/object:Gem::Dependency
61
61
  name: guard-rspec
62
- requirement: &70170593919700 !ruby/object:Gem::Requirement
62
+ requirement: &70151882161420 !ruby/object:Gem::Requirement
63
63
  none: false
64
64
  requirements:
65
65
  - - ~>
@@ -67,10 +67,10 @@ dependencies:
67
67
  version: '0.4'
68
68
  type: :development
69
69
  prerelease: false
70
- version_requirements: *70170593919700
70
+ version_requirements: *70151882161420
71
71
  - !ruby/object:Gem::Dependency
72
72
  name: growl
73
- requirement: &70170593919100 !ruby/object:Gem::Requirement
73
+ requirement: &70151882160960 !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ~>
@@ -78,7 +78,7 @@ dependencies:
78
78
  version: '1.0'
79
79
  type: :development
80
80
  prerelease: false
81
- version_requirements: *70170593919100
81
+ version_requirements: *70151882160960
82
82
  description: ''
83
83
  email:
84
84
  - victorcrodrigues@gmail.com
@@ -143,6 +143,7 @@ files:
143
143
  - examples/update_attributes/simple.rb
144
144
  - lib/rest_model.rb
145
145
  - lib/rest_model/configuration.rb
146
+ - lib/rest_model/errors.rb
146
147
  - lib/rest_model/key.rb
147
148
  - lib/rest_model/key/association.rb
148
149
  - lib/rest_model/key/builder.rb
@@ -164,6 +165,7 @@ files:
164
165
  - lib/rest_model/response.rb
165
166
  - lib/rest_model/serialization/boolean.rb
166
167
  - lib/rest_model/serialization/date.rb
168
+ - lib/rest_model/serialization/datetime.rb
167
169
  - lib/rest_model/serialization/enumerable.rb
168
170
  - lib/rest_model/serialization/float.rb
169
171
  - lib/rest_model/serialization/integer.rb
@@ -204,6 +206,7 @@ files:
204
206
  - spec/unit/rest_model_spec.rb
205
207
  - spec/unit/serialization/boolean_spec.rb
206
208
  - spec/unit/serialization/date_spec.rb
209
+ - spec/unit/serialization/datetime_spec.rb
207
210
  - spec/unit/serialization/float_spec.rb
208
211
  - spec/unit/serialization/integer_spec.rb
209
212
  - spec/unit/serialization/string_spec.rb
@@ -263,8 +266,10 @@ test_files:
263
266
  - spec/unit/rest_model_spec.rb
264
267
  - spec/unit/serialization/boolean_spec.rb
265
268
  - spec/unit/serialization/date_spec.rb
269
+ - spec/unit/serialization/datetime_spec.rb
266
270
  - spec/unit/serialization/float_spec.rb
267
271
  - spec/unit/serialization/integer_spec.rb
268
272
  - spec/unit/serialization/string_spec.rb
269
273
  - spec/unit/source/path_spec.rb
270
274
  - spec/unit/source/retriever_spec.rb
275
+ has_rdoc: