hcast 0.1.0 → 0.1.1
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 +15 -0
- data/Gemfile.lock +1 -1
- data/README.md +1 -1
- data/lib/hcast/attributes_caster.rb +9 -4
- data/lib/hcast/attributes_parser.rb +3 -3
- data/lib/hcast/casters/array_caster.rb +1 -1
- data/lib/hcast/casters/boolean_caster.rb +1 -1
- data/lib/hcast/casters/date_caster.rb +2 -2
- data/lib/hcast/casters/datetime_caster.rb +2 -2
- data/lib/hcast/casters/float_caster.rb +2 -2
- data/lib/hcast/casters/hash_caster.rb +1 -1
- data/lib/hcast/casters/integer_caster.rb +2 -2
- data/lib/hcast/casters/string_caster.rb +1 -1
- data/lib/hcast/casters/symbol_caster.rb +2 -2
- data/lib/hcast/casters/time_caster.rb +2 -2
- data/lib/hcast/errors.rb +32 -3
- data/lib/hcast/version.rb +1 -1
- data/spec/hcast/caster_spec.rb +4 -4
- metadata +13 -25
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NTM3NjVkMmE2YzUwZGJkYzdkMGRlYzZmZjhmMzQ5ZDJiNWYyYTNmMg==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MDRiN2M2ZTM1Mjc2MzhjMTkyNTBjOTM5YjNhZjE4OTAxZDEzYWRjNw==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
N2JkYTdhMDg0ZTg5MDkzYjVjZGJlNjZjMGYzYzY5ZTRiYTAyYmJkYzA4NDYz
|
10
|
+
NGE5ZmYyMDIzNzdmZWJjYjg0M2M4NTAzYTU0YTdlMmZjNTg0YzRkYjYwNDQ5
|
11
|
+
ZjNlOWFjODEzNjk1YmQ4MDY5MWEzMWM4MGU5NWUyODc3ZGEzMmU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MGZhZWU4YTdhNWEyMGYzZjM5OWY4MTI2MWVkNjY5MmRmYzY3Y2U4NTc3MTRm
|
14
|
+
Nzc0ZTVhOTgwYmVkODI2YzQxNzE5YTRiNWJmYzM2YjBlYjZhM2Y5OGI4N2Yy
|
15
|
+
ZTU1MzRiYzA5OGYwMDQ4MDA2NWI4OGRjZGYwOTYzYjczNGViNjU=
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -12,10 +12,15 @@ class HCast::AttributesCaster
|
|
12
12
|
hash_keys = get_keys(input_hash)
|
13
13
|
attributes.each do |attribute|
|
14
14
|
if hash_keys.include?(attribute.name)
|
15
|
-
|
16
|
-
|
15
|
+
begin
|
16
|
+
casted_value = cast_attribute(attribute, input_hash)
|
17
|
+
casted_hash[attribute.name] = casted_value
|
18
|
+
rescue HCast::Errors::AttributeError => e
|
19
|
+
e.add_namespace(attribute.name)
|
20
|
+
raise e
|
21
|
+
end
|
17
22
|
else
|
18
|
-
raise HCast::Errors::MissingAttributeError
|
23
|
+
raise HCast::Errors::MissingAttributeError.new("should be given", attribute.name)if attribute.required?
|
19
24
|
end
|
20
25
|
end
|
21
26
|
check_unexpected_attributes_not_given!(hash_keys, casted_hash.keys)
|
@@ -75,7 +80,7 @@ class HCast::AttributesCaster
|
|
75
80
|
def check_unexpected_attributes_not_given!(input_hash_keys, casted_hash_keys)
|
76
81
|
unexpected_keys = input_hash_keys - casted_hash_keys
|
77
82
|
unless unexpected_keys.empty?
|
78
|
-
raise HCast::Errors::UnexpectedAttributeError
|
83
|
+
raise HCast::Errors::UnexpectedAttributeError.new("is not valid attribute name", unexpected_keys.first)
|
79
84
|
end
|
80
85
|
end
|
81
86
|
|
@@ -29,7 +29,7 @@ class HCast::AttributesParser
|
|
29
29
|
options = args[1] || {}
|
30
30
|
caster = HCast.casters[caster_name]
|
31
31
|
|
32
|
-
check_caster_exists!(caster)
|
32
|
+
check_caster_exists!(caster, caster_name)
|
33
33
|
check_attr_name_valid!(attr_name)
|
34
34
|
check_options_is_hash!(options)
|
35
35
|
|
@@ -42,9 +42,9 @@ class HCast::AttributesParser
|
|
42
42
|
|
43
43
|
private
|
44
44
|
|
45
|
-
def check_caster_exists!(caster)
|
45
|
+
def check_caster_exists!(caster, caster_name)
|
46
46
|
if !caster
|
47
|
-
raise HCast::Errors::CasterNotFoundError, "caster with name '#{
|
47
|
+
raise HCast::Errors::CasterNotFoundError, "caster with name '#{caster_name}' is not found"
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -7,10 +7,10 @@ class HCast::Casters::DateCaster
|
|
7
7
|
begin
|
8
8
|
Date.parse(value)
|
9
9
|
rescue ArgumentError => e
|
10
|
-
raise HCast::Errors::CastingError, "
|
10
|
+
raise HCast::Errors::CastingError, "is invalid date"
|
11
11
|
end
|
12
12
|
else
|
13
|
-
raise HCast::Errors::CastingError, "
|
13
|
+
raise HCast::Errors::CastingError, "should be a date"
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -9,10 +9,10 @@ class HCast::Casters::DateTimeCaster
|
|
9
9
|
begin
|
10
10
|
DateTime.parse(value)
|
11
11
|
rescue ArgumentError => e
|
12
|
-
raise HCast::Errors::CastingError, "
|
12
|
+
raise HCast::Errors::CastingError, "is invalid datetime"
|
13
13
|
end
|
14
14
|
else
|
15
|
-
raise HCast::Errors::CastingError, "
|
15
|
+
raise HCast::Errors::CastingError, "should be a datetime"
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -7,10 +7,10 @@ class HCast::Casters::FloatCaster
|
|
7
7
|
begin
|
8
8
|
Float(value)
|
9
9
|
rescue ArgumentError => e
|
10
|
-
raise HCast::Errors::CastingError, "
|
10
|
+
raise HCast::Errors::CastingError, "is invalid float"
|
11
11
|
end
|
12
12
|
else
|
13
|
-
raise HCast::Errors::CastingError, "
|
13
|
+
raise HCast::Errors::CastingError, "should be a float"
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -7,10 +7,10 @@ class HCast::Casters::IntegerCaster
|
|
7
7
|
begin
|
8
8
|
Integer(value)
|
9
9
|
rescue ArgumentError => e
|
10
|
-
raise HCast::Errors::CastingError, "
|
10
|
+
raise HCast::Errors::CastingError, "is invalid integer"
|
11
11
|
end
|
12
12
|
else
|
13
|
-
raise HCast::Errors::CastingError, "
|
13
|
+
raise HCast::Errors::CastingError, "should be a integer"
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -6,12 +6,12 @@ class HCast::Casters::SymbolCaster
|
|
6
6
|
value
|
7
7
|
elsif value.is_a?(String)
|
8
8
|
if value.length > MAX_SYMBOL_LENGTH
|
9
|
-
raise HCast::Errors::CastingError, "
|
9
|
+
raise HCast::Errors::CastingError, "is too long to be a symbol"
|
10
10
|
else
|
11
11
|
value.to_sym
|
12
12
|
end
|
13
13
|
else
|
14
|
-
raise HCast::Errors::CastingError, "
|
14
|
+
raise HCast::Errors::CastingError, "should be a symbol"
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -7,10 +7,10 @@ class HCast::Casters::TimeCaster
|
|
7
7
|
begin
|
8
8
|
Time.parse(value)
|
9
9
|
rescue ArgumentError => e
|
10
|
-
raise HCast::Errors::CastingError, "
|
10
|
+
raise HCast::Errors::CastingError, "is invalid time"
|
11
11
|
end
|
12
12
|
else
|
13
|
-
raise HCast::Errors::CastingError, "
|
13
|
+
raise HCast::Errors::CastingError, "should be a time"
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
data/lib/hcast/errors.rb
CHANGED
@@ -9,14 +9,43 @@ module HCast::Errors
|
|
9
9
|
# Raised when some of the given to HCast argument is not valid
|
10
10
|
class ArgumentError < HCastError; end
|
11
11
|
|
12
|
+
class AttributeError < HCastError
|
13
|
+
attr_reader :namespaces
|
14
|
+
|
15
|
+
def initialize(message, namespace = nil)
|
16
|
+
super(message)
|
17
|
+
@namespaces = []
|
18
|
+
@namespaces << namespace if namespace
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_namespace(namespace)
|
22
|
+
namespaces << namespace
|
23
|
+
end
|
24
|
+
|
25
|
+
def message
|
26
|
+
to_s
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_s
|
30
|
+
if namespaces.empty?
|
31
|
+
super
|
32
|
+
else
|
33
|
+
reverted_namespaces = namespaces.reverse
|
34
|
+
msg = reverted_namespaces.first.to_s
|
35
|
+
msg += reverted_namespaces[1..-1].inject("") { |res, item| res += "[#{item}]"}
|
36
|
+
msg + " " + super
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
12
41
|
# Raised when hash attribute can't be casted
|
13
|
-
class CastingError
|
42
|
+
class CastingError < AttributeError; end
|
14
43
|
|
15
44
|
# Raised when required hash attribute wasn't given for casting
|
16
|
-
class MissingAttributeError <
|
45
|
+
class MissingAttributeError < AttributeError; end
|
17
46
|
|
18
47
|
# Raised when unexpected hash attribute was given for casting
|
19
|
-
class UnexpectedAttributeError <
|
48
|
+
class UnexpectedAttributeError < AttributeError; end
|
20
49
|
|
21
50
|
# Raised when hash has validation errors
|
22
51
|
class ValidationError < StandardError
|
data/lib/hcast/version.rb
CHANGED
data/spec/hcast/caster_spec.rb
CHANGED
@@ -108,7 +108,7 @@ describe HCast::Caster do
|
|
108
108
|
|
109
109
|
expect do
|
110
110
|
ContactCaster.cast(input_hash)
|
111
|
-
end.to raise_error(HCast::Errors::CastingError, "name should be a string")
|
111
|
+
end.to raise_error(HCast::Errors::CastingError, "contact[name] should be a string")
|
112
112
|
end
|
113
113
|
|
114
114
|
it "should raise error if some attribute wasn't given" do
|
@@ -138,7 +138,7 @@ describe HCast::Caster do
|
|
138
138
|
|
139
139
|
expect do
|
140
140
|
ContactCaster.cast(input_hash)
|
141
|
-
end.to raise_error(HCast::Errors::MissingAttributeError, "name should be given")
|
141
|
+
end.to raise_error(HCast::Errors::MissingAttributeError, "contact[name] should be given")
|
142
142
|
end
|
143
143
|
|
144
144
|
it "should not raise error if attribute is optional" do
|
@@ -173,8 +173,8 @@ describe HCast::Caster do
|
|
173
173
|
|
174
174
|
it "should raise error if unexpected attribute was given" do
|
175
175
|
input_hash = {
|
176
|
-
wrong_attribute: 'foo',
|
177
176
|
contact: {
|
177
|
+
wrong_attribute: 'foo',
|
178
178
|
name: "Jim",
|
179
179
|
weight: 65.5,
|
180
180
|
birthday: Date.today,
|
@@ -199,7 +199,7 @@ describe HCast::Caster do
|
|
199
199
|
|
200
200
|
expect do
|
201
201
|
ContactCaster.cast(input_hash)
|
202
|
-
end.to raise_error(HCast::Errors::UnexpectedAttributeError, "
|
202
|
+
end.to raise_error(HCast::Errors::UnexpectedAttributeError, "contact[wrong_attribute] is not valid attribute name")
|
203
203
|
end
|
204
204
|
|
205
205
|
it "should convert accept hash with string keys and cast them to symbol keys" do
|
metadata
CHANGED
@@ -1,48 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hcast
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.1.0
|
4
|
+
version: 0.1.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Albert Gazizov
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-
|
11
|
+
date: 2014-09-06 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
|
-
prerelease: false
|
16
|
-
name: bundler
|
17
14
|
type: :development
|
18
|
-
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
19
16
|
requirements:
|
20
17
|
- - ~>
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: '1.3'
|
23
|
-
|
24
|
-
|
20
|
+
name: bundler
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
22
|
requirements:
|
26
23
|
- - ~>
|
27
24
|
- !ruby/object:Gem::Version
|
28
25
|
version: '1.3'
|
29
|
-
none: false
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
26
|
prerelease: false
|
32
|
-
|
27
|
+
- !ruby/object:Gem::Dependency
|
33
28
|
type: :development
|
34
|
-
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
35
30
|
requirements:
|
36
31
|
- - ! '>='
|
37
32
|
- !ruby/object:Gem::Version
|
38
33
|
version: '0'
|
39
|
-
|
40
|
-
|
34
|
+
name: rake
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
36
|
requirements:
|
42
37
|
- - ! '>='
|
43
38
|
- !ruby/object:Gem::Version
|
44
39
|
version: '0'
|
45
|
-
|
40
|
+
prerelease: false
|
46
41
|
description: Hash Caster and Validator
|
47
42
|
email:
|
48
43
|
- deeper4k@gmail.com
|
@@ -84,6 +79,7 @@ files:
|
|
84
79
|
homepage: http://github.com/AlbertGazizov/hcast
|
85
80
|
licenses:
|
86
81
|
- MIT
|
82
|
+
metadata: {}
|
87
83
|
post_install_message:
|
88
84
|
rdoc_options: []
|
89
85
|
require_paths:
|
@@ -92,25 +88,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
92
88
|
requirements:
|
93
89
|
- - ! '>='
|
94
90
|
- !ruby/object:Gem::Version
|
95
|
-
segments:
|
96
|
-
- 0
|
97
|
-
hash: 3528154238926352388
|
98
91
|
version: '0'
|
99
|
-
none: false
|
100
92
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
93
|
requirements:
|
102
94
|
- - ! '>='
|
103
95
|
- !ruby/object:Gem::Version
|
104
|
-
segments:
|
105
|
-
- 0
|
106
|
-
hash: 3528154238926352388
|
107
96
|
version: '0'
|
108
|
-
none: false
|
109
97
|
requirements: []
|
110
98
|
rubyforge_project:
|
111
|
-
rubygems_version:
|
99
|
+
rubygems_version: 2.4.1
|
112
100
|
signing_key:
|
113
|
-
specification_version:
|
101
|
+
specification_version: 4
|
114
102
|
summary: Hash Caster and Validator
|
115
103
|
test_files:
|
116
104
|
- spec/hcast/caster_spec.rb
|