acfs 0.22.2.b193 → 0.22.2.b194
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 +8 -8
- data/lib/acfs/model/attributes.rb +13 -7
- data/lib/acfs/model/attributes/base.rb +28 -0
- data/lib/acfs/model/attributes/boolean.rb +2 -2
- data/lib/acfs/model/attributes/date_time.rb +22 -23
- data/lib/acfs/model/attributes/float.rb +18 -20
- data/lib/acfs/model/attributes/integer.rb +18 -20
- data/lib/acfs/model/attributes/list.rb +20 -22
- data/lib/acfs/model/attributes/string.rb +18 -20
- data/spec/acfs/model/attributes/date_time_spec.rb +16 -6
- data/spec/acfs/model/attributes/float_spec.rb +4 -6
- data/spec/acfs/model/attributes/list_spec.rb +1 -1
- data/spec/acfs/model/attributes_spec.rb +29 -16
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZDBlODUyYTBjYWJmOTJmYTczYjVjNTc5YTc3OTkzYjc3YTQ5NWE1NA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NzZiYTA2NGNhZWViZGM2NzY1YTcxYWYzZGNiNmZlYmU3YWM0ZTE1Yg==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OWUwYjdjMjVkMzMwY2Q4MGY1YWU2YmJiNWMxNDY3MDRkYWFkNWNhYzkwMGMx
|
10
|
+
NjZiZDZkYzg0NWM0ZTk1NWI2ZDg1ZmIwNmZkM2Q0NDUxZDYwMWFhMDM1NjMz
|
11
|
+
ZDdlNzU1ODEzMWI0ZDAxZmM5ZDQ5ZmNlN2M4ODFmYjY2MzlhMzU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YmNlOWU1YzkyNGNjZDRmMmI2ZWIzNDMwN2RhMWU0M2FkNTZmNjFjMjFkNzUy
|
14
|
+
ZWI5MmQ0MWZhM2YwYzY5MmZjYmRhZmViYzViYmI5OWRhN2ExZDc3Njc5NWE5
|
15
|
+
MGRiYmNjYmRkZGQ0YzcxNjljZmY2MzM2ODU1YjdkNDkxYjE5NmY=
|
@@ -125,11 +125,11 @@ module Acfs::Model
|
|
125
125
|
# @raise [ ArgumentError ] If no attribute with given name is defined.
|
126
126
|
#
|
127
127
|
def write_attribute(name, value, opts = {})
|
128
|
-
if (
|
128
|
+
if (attr = self.class.defined_attributes[name.to_s]).nil?
|
129
129
|
raise ArgumentError.new "Unknown attribute `#{name}`."
|
130
130
|
end
|
131
131
|
|
132
|
-
write_raw_attribute name,
|
132
|
+
write_raw_attribute name, attr.cast(value), opts
|
133
133
|
end
|
134
134
|
|
135
135
|
# @api private
|
@@ -187,7 +187,15 @@ module Acfs::Model
|
|
187
187
|
# @return [ Hash{ String => Object, Proc } ] Attributes with default values.
|
188
188
|
#
|
189
189
|
def attributes
|
190
|
-
|
190
|
+
Hash.new.tap do |attrs|
|
191
|
+
defined_attributes.each do |key, attr|
|
192
|
+
attrs[key] = attr.default_value
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def defined_attributes
|
198
|
+
@attributes ||= {}.merge superclass.respond_to?(:defined_attributes) ? superclass.defined_attributes : {}
|
191
199
|
end
|
192
200
|
|
193
201
|
# @api public
|
@@ -211,11 +219,9 @@ module Acfs::Model
|
|
211
219
|
private
|
212
220
|
def define_attribute(name, type, opts = {})
|
213
221
|
name = name.to_s
|
214
|
-
|
215
|
-
default_value = type.cast default_value unless default_value.is_a? Proc or default_value.nil?
|
222
|
+
attribute = type.new opts
|
216
223
|
|
217
|
-
|
218
|
-
attribute_types[name.to_sym] = type
|
224
|
+
defined_attributes[name] = attribute
|
219
225
|
define_attribute_method name
|
220
226
|
|
221
227
|
self.send :define_method, name do
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Acfs::Model::Attributes
|
2
|
+
|
3
|
+
class Base
|
4
|
+
attr_reader :options
|
5
|
+
|
6
|
+
def initialize(opts = {})
|
7
|
+
@options = opts
|
8
|
+
@options.reverse_merge! allow_nil: true
|
9
|
+
end
|
10
|
+
|
11
|
+
def nil_allowed?
|
12
|
+
!!options[:allow_nil]
|
13
|
+
end
|
14
|
+
|
15
|
+
def default_value
|
16
|
+
options[:default].is_a?(Proc) ? options[:default] : cast(options[:default])
|
17
|
+
end
|
18
|
+
|
19
|
+
def cast(obj)
|
20
|
+
return nil if obj.nil? && nil_allowed?
|
21
|
+
cast_type obj
|
22
|
+
end
|
23
|
+
|
24
|
+
def cast_type(obj)
|
25
|
+
raise NotImplementedError
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -16,7 +16,7 @@ module Acfs::Model
|
|
16
16
|
#
|
17
17
|
# true, on, yes
|
18
18
|
#
|
19
|
-
|
19
|
+
class Boolean < Base
|
20
20
|
|
21
21
|
TRUE_VALUES = %w(true on yes)
|
22
22
|
|
@@ -27,7 +27,7 @@ module Acfs::Model
|
|
27
27
|
# @param [Object] obj Object to cast.
|
28
28
|
# @return [TrueClass, FalseClass] Casted boolean.
|
29
29
|
#
|
30
|
-
def
|
30
|
+
def cast_type(obj)
|
31
31
|
return true if obj.is_a? TrueClass
|
32
32
|
return false if obj.is_a? FalseClass
|
33
33
|
|
@@ -1,31 +1,30 @@
|
|
1
|
-
module Acfs::Model
|
2
|
-
|
1
|
+
module Acfs::Model::Attributes
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
#
|
5
|
+
# DateTime attribute type. Use it in your model as an attribute type:
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# class User
|
9
|
+
# include Acfs::Model
|
10
|
+
# attribute :name, :date_time
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
class DateTime < Base
|
3
14
|
|
4
15
|
# @api public
|
5
16
|
#
|
6
|
-
#
|
17
|
+
# Cast given object to DateTime.
|
18
|
+
# Expect
|
7
19
|
#
|
8
|
-
# @
|
9
|
-
#
|
10
|
-
# include Acfs::Model
|
11
|
-
# attribute :name, :date_time
|
12
|
-
# end
|
20
|
+
# @param [Object] obj Object to cast.
|
21
|
+
# @return [DateTime] Casted object as DateTime.
|
13
22
|
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
# Expect
|
20
|
-
#
|
21
|
-
# @param [Object] obj Object to cast.
|
22
|
-
# @return [DateTime] Casted object as DateTime.
|
23
|
-
#
|
24
|
-
def self.cast(obj)
|
25
|
-
return obj if obj.is_a? ::DateTime
|
26
|
-
return ::DateTime.iso8601(obj.iso8601) if obj.is_a? Time or obj.is_a? Date
|
27
|
-
return ::DateTime.iso8601(obj)
|
28
|
-
end
|
23
|
+
def cast_type(obj)
|
24
|
+
return nil if nil_allowed? and obj.blank?
|
25
|
+
return obj if obj.is_a? ::DateTime
|
26
|
+
return ::DateTime.iso8601(obj.iso8601) if obj.is_a? Time or obj.is_a? Date
|
27
|
+
return ::DateTime.iso8601(obj)
|
29
28
|
end
|
30
29
|
end
|
31
30
|
end
|
@@ -1,28 +1,26 @@
|
|
1
|
-
module Acfs::Model
|
2
|
-
|
1
|
+
module Acfs::Model::Attributes
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
#
|
5
|
+
# Float attribute type. Use it in your model as an attribute type:
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# class User
|
9
|
+
# include Acfs::Model
|
10
|
+
# attribute :name, :float
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
class Float < Base
|
3
14
|
|
4
15
|
# @api public
|
5
16
|
#
|
6
|
-
#
|
17
|
+
# Cast given object to float.
|
7
18
|
#
|
8
|
-
# @
|
9
|
-
#
|
10
|
-
# include Acfs::Model
|
11
|
-
# attribute :name, :float
|
12
|
-
# end
|
19
|
+
# @param [Object] obj Object to cast.
|
20
|
+
# @return [Float] Casted object as float.
|
13
21
|
#
|
14
|
-
|
15
|
-
|
16
|
-
# @api public
|
17
|
-
#
|
18
|
-
# Cast given object to float.
|
19
|
-
#
|
20
|
-
# @param [Object] obj Object to cast.
|
21
|
-
# @return [Float] Casted object as float.
|
22
|
-
#
|
23
|
-
def self.cast(obj)
|
24
|
-
obj.to_f
|
25
|
-
end
|
22
|
+
def cast_type(obj)
|
23
|
+
obj.to_f
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
@@ -1,28 +1,26 @@
|
|
1
|
-
module Acfs::Model
|
2
|
-
|
1
|
+
module Acfs::Model::Attributes
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
#
|
5
|
+
# Integer attribute type. Use it in your model as an attribute type:
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# class User
|
9
|
+
# include Acfs::Model
|
10
|
+
# attribute :name, :integer
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
class Integer < Base
|
3
14
|
|
4
15
|
# @api public
|
5
16
|
#
|
6
|
-
#
|
17
|
+
# Cast given object to integer.
|
7
18
|
#
|
8
|
-
# @
|
9
|
-
#
|
10
|
-
# include Acfs::Model
|
11
|
-
# attribute :name, :integer
|
12
|
-
# end
|
19
|
+
# @param [Object] obj Object to cast.
|
20
|
+
# @return [Fixnum] Casted object as fixnum.
|
13
21
|
#
|
14
|
-
|
15
|
-
|
16
|
-
# @api public
|
17
|
-
#
|
18
|
-
# Cast given object to integer.
|
19
|
-
#
|
20
|
-
# @param [Object] obj Object to cast.
|
21
|
-
# @return [Fixnum] Casted object as fixnum.
|
22
|
-
#
|
23
|
-
def self.cast(obj)
|
24
|
-
obj.to_i
|
25
|
-
end
|
22
|
+
def cast_type(obj)
|
23
|
+
obj.to_i
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
@@ -1,30 +1,28 @@
|
|
1
|
-
module Acfs::Model
|
2
|
-
|
1
|
+
module Acfs::Model::Attributes
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
#
|
5
|
+
# List attribute type. Use it in your model as an attribute type:
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# class User
|
9
|
+
# include Acfs::Model
|
10
|
+
# attribute :name, :list
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
class List < Base
|
3
14
|
|
4
15
|
# @api public
|
5
16
|
#
|
6
|
-
#
|
17
|
+
# Cast given object to a list.
|
7
18
|
#
|
8
|
-
# @
|
9
|
-
#
|
10
|
-
#
|
11
|
-
# attribute :name, :list
|
12
|
-
# end
|
19
|
+
# @param [Object] obj Object to cast.
|
20
|
+
# @return [Fixnum] Casted object as list.
|
21
|
+
# @raise [TypeError] If object cannot be casted to a list.
|
13
22
|
#
|
14
|
-
|
15
|
-
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# Cast given object to a list.
|
19
|
-
#
|
20
|
-
# @param [Object] obj Object to cast.
|
21
|
-
# @return [Fixnum] Casted object as list.
|
22
|
-
# @raise [TypeError] If object cannot be casted to a list.
|
23
|
-
#
|
24
|
-
def self.cast(obj)
|
25
|
-
return obj.to_a if obj.respond_to? :to_a
|
26
|
-
raise TypeError.new "Cannot cast #{obj.inspect} to array."
|
27
|
-
end
|
23
|
+
def cast_type(obj)
|
24
|
+
return obj.to_a if obj.respond_to? :to_a
|
25
|
+
raise TypeError.new "Cannot cast #{obj.inspect} to array."
|
28
26
|
end
|
29
27
|
end
|
30
28
|
end
|
@@ -1,28 +1,26 @@
|
|
1
|
-
module Acfs::Model
|
2
|
-
|
1
|
+
module Acfs::Model::Attributes
|
2
|
+
|
3
|
+
# @api public
|
4
|
+
#
|
5
|
+
# String attribute type. Use it in your model as an attribute type:
|
6
|
+
#
|
7
|
+
# @example
|
8
|
+
# class User
|
9
|
+
# include Acfs::Model
|
10
|
+
# attribute :name, :string
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
class String < Base
|
3
14
|
|
4
15
|
# @api public
|
5
16
|
#
|
6
|
-
#
|
17
|
+
# Cast given object to string.
|
7
18
|
#
|
8
|
-
# @
|
9
|
-
#
|
10
|
-
# include Acfs::Model
|
11
|
-
# attribute :name, :string
|
12
|
-
# end
|
19
|
+
# @param [Object] obj Object to cast.
|
20
|
+
# @return [String] Casted string.
|
13
21
|
#
|
14
|
-
|
15
|
-
|
16
|
-
# @api public
|
17
|
-
#
|
18
|
-
# Cast given object to string.
|
19
|
-
#
|
20
|
-
# @param [Object] obj Object to cast.
|
21
|
-
# @return [String] Casted string.
|
22
|
-
#
|
23
|
-
def self.cast(obj)
|
24
|
-
obj.to_s
|
25
|
-
end
|
22
|
+
def cast_type(obj)
|
23
|
+
obj.to_s
|
26
24
|
end
|
27
25
|
end
|
28
26
|
end
|
@@ -2,44 +2,54 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Acfs::Model::Attributes::DateTime do
|
4
4
|
let(:model) { Class.new.tap { |c| c.send :include, Acfs::Model }}
|
5
|
+
let(:params) { {} }
|
6
|
+
subject { Acfs::Model::Attributes::DateTime.new params }
|
5
7
|
|
6
8
|
describe 'cast' do
|
7
9
|
it 'should return same object, if obj is already of DateTime class' do
|
8
10
|
date_time = DateTime.now
|
9
|
-
retval =
|
11
|
+
retval = subject.cast(date_time)
|
10
12
|
expect(retval).to be == date_time
|
11
13
|
end
|
12
14
|
|
13
15
|
it 'should return parsed object, if obj is of Time class' do
|
14
16
|
time = Time.now
|
15
|
-
retval =
|
17
|
+
retval = subject.cast(time)
|
16
18
|
expect(retval).to be == DateTime.iso8601(time.iso8601)
|
17
19
|
end
|
18
20
|
|
19
21
|
it 'should return parsed object, if obj is of Date class' do
|
20
22
|
date = Date.today
|
21
|
-
retval =
|
23
|
+
retval = subject.cast(date)
|
22
24
|
expect(retval).to be == DateTime.iso8601(date.iso8601)
|
23
25
|
end
|
24
26
|
|
25
27
|
it 'should return parsed object, if obj is of String class in ISO-8601 format' do
|
26
28
|
date_time_string = DateTime.now.iso8601
|
27
|
-
retval =
|
29
|
+
retval = subject.cast(date_time_string)
|
28
30
|
expect(retval).to be == DateTime.iso8601(date_time_string)
|
29
31
|
end
|
30
32
|
|
31
33
|
it 'should raise an error if obj is of String class not in valid ISO-8601 format' do
|
32
34
|
malformed_string = 'qwe123'
|
33
35
|
expect {
|
34
|
-
|
36
|
+
subject.cast(malformed_string)
|
35
37
|
}.to raise_error ArgumentError
|
36
38
|
end
|
37
39
|
|
38
40
|
it 'should raise an error if obj is of wrong class (Fixnum)' do
|
39
41
|
fixnum = 12
|
40
42
|
expect {
|
41
|
-
|
43
|
+
subject.cast(fixnum)
|
42
44
|
}.to raise_error TypeError
|
43
45
|
end
|
46
|
+
|
47
|
+
context 'with allow_nil option' do
|
48
|
+
let(:params) { {allow_nil: true} }
|
49
|
+
|
50
|
+
it 'should accept empty string as nil' do
|
51
|
+
expect(subject.cast('')).to eq nil
|
52
|
+
end
|
53
|
+
end
|
44
54
|
end
|
45
55
|
end
|
@@ -2,21 +2,19 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Acfs::Model::Attributes::Float do
|
4
4
|
let(:model) { Class.new.tap { |c| c.send :include, Acfs::Model }}
|
5
|
+
subject { Acfs::Model::Attributes::Float.new }
|
5
6
|
|
6
7
|
describe 'cast' do
|
7
8
|
it 'should return same object, if obj is already of float class' do
|
8
|
-
|
9
|
-
expect(retval).to be == 1.3
|
9
|
+
expect(subject.cast(1.3)).to be == 1.3
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'should return parsed object, if obj is of Fixnum class' do
|
13
|
-
|
14
|
-
expect(retval).to be == 7.0
|
13
|
+
expect(subject.cast(7)).to be == 7.0
|
15
14
|
end
|
16
15
|
|
17
16
|
it 'should return parsed object, if obj is of String class containing a float' do
|
18
|
-
|
19
|
-
expect(retval).to be == 1.7
|
17
|
+
expect(subject.cast('1.7')).to be == 1.7
|
20
18
|
end
|
21
19
|
end
|
22
20
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Acfs::Model::Attributes::List do
|
4
4
|
let(:model) { Class.new.tap { |c| c.send :include, Acfs::Model }}
|
5
|
-
subject { Acfs::Model::Attributes::List }
|
5
|
+
subject { Acfs::Model::Attributes::List.new }
|
6
6
|
|
7
7
|
describe '.cast' do
|
8
8
|
context 'with array' do
|
@@ -115,29 +115,42 @@ describe Acfs::Model::Attributes do
|
|
115
115
|
end
|
116
116
|
end
|
117
117
|
|
118
|
-
describe '
|
119
|
-
|
120
|
-
model
|
118
|
+
describe 'class' do
|
119
|
+
describe '#attribute' do
|
120
|
+
it 'should add an attribute to model attribute list' do
|
121
|
+
model.send :attribute, :name, :string
|
121
122
|
|
122
|
-
|
123
|
-
|
123
|
+
expect(model.attributes).to be == { :name => nil }.stringify_keys
|
124
|
+
end
|
124
125
|
|
125
|
-
|
126
|
-
|
126
|
+
it 'should accept a default value' do
|
127
|
+
model.send :attribute, :name, :string, default: 'John'
|
127
128
|
|
128
|
-
|
129
|
-
|
129
|
+
expect(model.attributes).to be == { :name => 'John' }.stringify_keys
|
130
|
+
end
|
130
131
|
|
131
|
-
|
132
|
-
|
132
|
+
it 'should accept an symbolic type' do
|
133
|
+
model.send :attribute, :age, :integer, default: '12'
|
133
134
|
|
134
|
-
|
135
|
-
|
135
|
+
expect(model.attributes).to be == { :age => 12 }.stringify_keys
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'should accept an class type' do
|
139
|
+
model.send :attribute, :age, Acfs::Model::Attributes::Integer, default: '12'
|
136
140
|
|
137
|
-
|
138
|
-
|
141
|
+
expect(model.attributes).to be == { :age => 12 }.stringify_keys
|
142
|
+
end
|
139
143
|
|
140
|
-
|
144
|
+
context 'allow nil option' do
|
145
|
+
it 'should allow nil as value' do
|
146
|
+
model.send :attribute, :updated_at, Acfs::Model::Attributes::DateTime, default: DateTime.new, allow_nil: true
|
147
|
+
resource = model.new
|
148
|
+
expect(resource.updated_at).to eq DateTime.new
|
149
|
+
|
150
|
+
resource.updated_at = ''
|
151
|
+
expect(resource.updated_at).to eq nil
|
152
|
+
end
|
153
|
+
end
|
141
154
|
end
|
142
155
|
end
|
143
156
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: acfs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.22.2.
|
4
|
+
version: 0.22.2.b194
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Graichen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-09-
|
11
|
+
date: 2013-09-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -145,6 +145,7 @@ files:
|
|
145
145
|
- lib/acfs/middleware/print.rb
|
146
146
|
- lib/acfs/model.rb
|
147
147
|
- lib/acfs/model/attributes.rb
|
148
|
+
- lib/acfs/model/attributes/base.rb
|
148
149
|
- lib/acfs/model/attributes/boolean.rb
|
149
150
|
- lib/acfs/model/attributes/date_time.rb
|
150
151
|
- lib/acfs/model/attributes/float.rb
|