parametron 0.2.2 → 0.3.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/README.md +1 -1
- data/lib/parametron.rb +20 -1
- data/lib/parametron/params_validator.rb +16 -5
- data/lib/parametron/version.rb +1 -1
- data/parametron.gemspec +2 -2
- data/spec/casting_spec.rb +103 -0
- data/spec/parametron_spec.rb +2 -2
- metadata +19 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ead50f33629a792269e16c9daf73a101bf8abfe5
|
4
|
+
data.tar.gz: 9e3b6a0e03cb2888e34b14b5fbfd3d885f29d907
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cedeb7a75197ff92e15528204dd57535b86f0882d457e7fb7059d6ca614b6f2e8594121ae14addd9b1a580005270544c5623f134433c6ca8cae31c2dda96fdb9
|
7
|
+
data.tar.gz: 35708d414d02d7a497a482979db61aebaa89c05a37708a33550ac192bec40ece64d7194ffcf28ff657b43246acd17990873769aef9a8e1c351feeb26b44e2dd6
|
data/CHANGELOG.md
ADDED
data/README.md
CHANGED
data/lib/parametron.rb
CHANGED
@@ -27,13 +27,32 @@ module Parametron
|
|
27
27
|
original = instance_method(name.to_sym)
|
28
28
|
remove_method(name.to_sym)
|
29
29
|
define_method(name) do |params={}|
|
30
|
-
new_params = _rename_params!(_validate!(_set_defaults!(params)))
|
30
|
+
new_params = _rename_params!(_cast!(_validate!(_set_defaults!(params))))
|
31
31
|
original.bind(self).call(new_params)
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
36
|
private
|
37
|
+
def _cast!(params)
|
38
|
+
new_par = params.dup
|
39
|
+
_validators_list.each do |v|
|
40
|
+
next unless v.cast
|
41
|
+
key = v.name.to_sym
|
42
|
+
val = new_par[key]
|
43
|
+
next if val.nil? and not v.required?
|
44
|
+
new_par[key] =
|
45
|
+
case
|
46
|
+
when v.cast.to_s == "Integer" then Integer(val)
|
47
|
+
when v.cast.to_s == "Float" then Float(val)
|
48
|
+
when Proc === v.cast then v.cast.call(val)
|
49
|
+
else
|
50
|
+
raise MalformedParams.new("Unknown cast type: '#{v.cast.inspect}'")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
new_par
|
54
|
+
end
|
55
|
+
|
37
56
|
def _rename_params!(params)
|
38
57
|
new_par = params.dup
|
39
58
|
_validators_list.each do |v|
|
@@ -13,22 +13,27 @@ class Parametron::ParamsValidator
|
|
13
13
|
default = opts.delete(:default)
|
14
14
|
validator = opts.delete(:validator)
|
15
15
|
as = opts.delete(:as)
|
16
|
+
cast = opts.delete(:cast)
|
17
|
+
|
16
18
|
raise Parametron::ErrorMethodParams.new("Not available param: #{opts.inspect}") unless opts.empty?
|
17
|
-
self.optional_vals << OptionalParameter.new(name.to_s, default, validator, as)
|
19
|
+
self.optional_vals << OptionalParameter.new(name.to_s, default, validator, as, cast)
|
18
20
|
end
|
19
21
|
|
20
22
|
def required(name, opts={})
|
21
23
|
default = opts.delete(:default)
|
22
24
|
validator = opts.delete(:validator)
|
23
25
|
as = opts.delete(:as)
|
26
|
+
cast = opts.delete(:cast)
|
27
|
+
|
24
28
|
raise Parametron::ErrorMethodParams.new("Not available param: #{opts.inspect}") unless opts.empty?
|
25
|
-
self.required_vals << RequiredParameter.new(name.to_s, default, validator, as)
|
29
|
+
self.required_vals << RequiredParameter.new(name.to_s, default, validator, as, cast)
|
26
30
|
end
|
27
31
|
|
28
32
|
def validate!(obj, params)
|
29
33
|
obj.validation_error_cause = []
|
30
34
|
normalized_param_keys = params.keys.map(&:to_s).sort
|
31
35
|
exceed_params = normalized_param_keys - valid_keys
|
36
|
+
|
32
37
|
if exceed_params.any?
|
33
38
|
exceed_params.each do |par|
|
34
39
|
obj.validation_error_cause << [par, params[par.to_sym]]
|
@@ -72,10 +77,10 @@ class Parametron::ParamsValidator
|
|
72
77
|
self.required_vals.map{|x| x.name.to_s}.sort
|
73
78
|
end
|
74
79
|
|
75
|
-
class GenericParameter < Struct.new(:name, :default, :validator, :as)
|
76
|
-
def initialize(name, default, validator, as)
|
80
|
+
class GenericParameter < Struct.new(:name, :default, :validator, :as, :cast)
|
81
|
+
def initialize(name, default, validator, as, cast)
|
77
82
|
super
|
78
|
-
unless as.nil? || String===as || Symbol===as
|
83
|
+
unless as.nil? || String === as || Symbol === as
|
79
84
|
raise ArgumentError.new("Parameter :as should be either String or Symbol!")
|
80
85
|
end
|
81
86
|
end
|
@@ -91,9 +96,15 @@ class Parametron::ParamsValidator
|
|
91
96
|
end
|
92
97
|
|
93
98
|
class OptionalParameter < GenericParameter
|
99
|
+
def required?
|
100
|
+
false
|
101
|
+
end
|
94
102
|
end
|
95
103
|
|
96
104
|
class RequiredParameter < GenericParameter
|
105
|
+
def required?
|
106
|
+
true
|
107
|
+
end
|
97
108
|
end
|
98
109
|
|
99
110
|
|
data/lib/parametron/version.rb
CHANGED
data/parametron.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Parametron::VERSION
|
9
9
|
spec.authors = ["Yury Batenko"]
|
10
10
|
spec.email = ["jurbat@gmail.com"]
|
11
|
-
spec.description = %q{DSL for method arguments validation}
|
12
|
-
spec.summary = %q{DSL for method arguments validation}
|
11
|
+
spec.description = %q{DSL for method arguments validation and casting}
|
12
|
+
spec.summary = %q{DSL for method arguments validation and casting}
|
13
13
|
spec.homepage = "http://github.com/svenyurgensson/parametron"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -0,0 +1,103 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Parametron, "Casting" do
|
4
|
+
|
5
|
+
context 'accepts and provide casting input values' do
|
6
|
+
it 'knows cast parameter' do
|
7
|
+
expect do
|
8
|
+
class Victim
|
9
|
+
include Parametron
|
10
|
+
params_for(:fetch) do
|
11
|
+
required :year, validator: /\d+/, cast: Float
|
12
|
+
end
|
13
|
+
def fetch(params); params; end
|
14
|
+
end
|
15
|
+
end.not_to raise_error
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'cast input value to Integer' do
|
19
|
+
class VictimI
|
20
|
+
include Parametron
|
21
|
+
params_for(:fetch) do
|
22
|
+
required :year, validator: /\d+/, cast: Integer
|
23
|
+
end
|
24
|
+
def fetch(params); params; end
|
25
|
+
end
|
26
|
+
|
27
|
+
v = VictimI.new
|
28
|
+
expect do
|
29
|
+
v.fetch(year: '1974')
|
30
|
+
end.not_to raise_error
|
31
|
+
res = v.fetch(year: '1974')
|
32
|
+
res[:year].should == 1974
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'cast input value to Float' do
|
36
|
+
class VictimF
|
37
|
+
include Parametron
|
38
|
+
params_for(:fetch) do
|
39
|
+
required :weight, validator: /\A[.\d]+\z/, cast: Float
|
40
|
+
end
|
41
|
+
def fetch(params); params; end
|
42
|
+
end
|
43
|
+
|
44
|
+
v = VictimF.new
|
45
|
+
expect do
|
46
|
+
v.fetch(weight: '94.55')
|
47
|
+
end.not_to raise_error
|
48
|
+
res = v.fetch(weight: '94.55')
|
49
|
+
res[:weight].should == 94.55
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
it 'cast input value using proc' do
|
54
|
+
class VictimP
|
55
|
+
include Parametron
|
56
|
+
params_for(:fetch) do
|
57
|
+
required :name, cast: -> n { n.upcase }
|
58
|
+
end
|
59
|
+
def fetch(params); params; end
|
60
|
+
end
|
61
|
+
|
62
|
+
res = VictimP.new.fetch(name: 'use proc')
|
63
|
+
res[:name].should == "USE PROC"
|
64
|
+
end
|
65
|
+
|
66
|
+
context "when params cannot be casted to given class" do
|
67
|
+
it 'raises exception when not Integer' do
|
68
|
+
class Victim3
|
69
|
+
include Parametron
|
70
|
+
params_for(:fetch) do
|
71
|
+
required :year, cast: Integer
|
72
|
+
end
|
73
|
+
def fetch(params); params; end
|
74
|
+
end
|
75
|
+
|
76
|
+
expect do
|
77
|
+
Victim3.new.fetch(year: 'Not Year')
|
78
|
+
end.to raise_error
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'not raises exception on casting when parameter not required' do
|
86
|
+
class VictimNotStrict
|
87
|
+
include Parametron
|
88
|
+
params_for(:fetch) do
|
89
|
+
optional :year, cast: Integer
|
90
|
+
end
|
91
|
+
def fetch(params); params; end
|
92
|
+
end
|
93
|
+
|
94
|
+
expect do
|
95
|
+
VictimNotStrict.new.fetch()
|
96
|
+
end.not_to raise_error
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
data/spec/parametron_spec.rb
CHANGED
@@ -125,14 +125,14 @@ describe Parametron do
|
|
125
125
|
end
|
126
126
|
|
127
127
|
it 'reject unexpected params' do
|
128
|
-
class
|
128
|
+
class VictimUP
|
129
129
|
include Parametron
|
130
130
|
params_for(:fetch) do
|
131
131
|
optional :city, default: 'Krasnoyarsk'
|
132
132
|
end
|
133
133
|
def fetch(params); params ; end
|
134
134
|
end
|
135
|
-
v =
|
135
|
+
v = VictimUP.new
|
136
136
|
expect do
|
137
137
|
v.fetch({'_'=>'Not needed'})
|
138
138
|
end.not_to raise_error
|
metadata
CHANGED
@@ -1,67 +1,68 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parametron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yury Batenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.3'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.3'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
description: DSL for method arguments validation
|
55
|
+
description: DSL for method arguments validation and casting
|
56
56
|
email:
|
57
57
|
- jurbat@gmail.com
|
58
58
|
executables: []
|
59
59
|
extensions: []
|
60
60
|
extra_rdoc_files: []
|
61
61
|
files:
|
62
|
-
- .gitignore
|
63
|
-
- .rspec
|
64
|
-
- .travis.yml
|
62
|
+
- ".gitignore"
|
63
|
+
- ".rspec"
|
64
|
+
- ".travis.yml"
|
65
|
+
- CHANGELOG.md
|
65
66
|
- Gemfile
|
66
67
|
- LICENSE.txt
|
67
68
|
- README.md
|
@@ -70,6 +71,7 @@ files:
|
|
70
71
|
- lib/parametron/params_validator.rb
|
71
72
|
- lib/parametron/version.rb
|
72
73
|
- parametron.gemspec
|
74
|
+
- spec/casting_spec.rb
|
73
75
|
- spec/parametron_spec.rb
|
74
76
|
- spec/spec_helper.rb
|
75
77
|
homepage: http://github.com/svenyurgensson/parametron
|
@@ -82,20 +84,21 @@ require_paths:
|
|
82
84
|
- lib
|
83
85
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
86
|
requirements:
|
85
|
-
- -
|
87
|
+
- - ">="
|
86
88
|
- !ruby/object:Gem::Version
|
87
89
|
version: '1.9'
|
88
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
91
|
requirements:
|
90
|
-
- -
|
92
|
+
- - ">="
|
91
93
|
- !ruby/object:Gem::Version
|
92
94
|
version: '0'
|
93
95
|
requirements: []
|
94
96
|
rubyforge_project:
|
95
|
-
rubygems_version: 2.
|
97
|
+
rubygems_version: 2.2.2
|
96
98
|
signing_key:
|
97
99
|
specification_version: 4
|
98
|
-
summary: DSL for method arguments validation
|
100
|
+
summary: DSL for method arguments validation and casting
|
99
101
|
test_files:
|
102
|
+
- spec/casting_spec.rb
|
100
103
|
- spec/parametron_spec.rb
|
101
104
|
- spec/spec_helper.rb
|