snapi 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -94,6 +94,15 @@ module Snapi
94
94
  @attributes[:required] = bool
95
95
  end
96
96
 
97
+ # DSL Setter
98
+ # Description of the argument
99
+ #
100
+ # @param desc, String
101
+ def description(desc)
102
+ raise InvalidDescriptionError unless desc.class == String
103
+ @attributes[:description] = desc
104
+ end
105
+
97
106
  # DSL Setter
98
107
  # What type of value is this argument. This will impact the way in which
99
108
  # this argument value gets validated later on
@@ -14,6 +14,7 @@ module Snapi
14
14
  InvalidArgumentAttributeError = Class.new(StandardError)
15
15
  InvalidBooleanError = Class.new(StandardError)
16
16
  InvalidCapabilityError = Class.new(StandardError)
17
+ InvalidDescriptionError = Class.new(StandardError)
17
18
  InvalidFormatError = Class.new(StandardError)
18
19
  InvalidFunctionCallError = Class.new(StandardError)
19
20
  InvalidFunctionNameError = Class.new(StandardError)
@@ -60,25 +60,19 @@ module Snapi
60
60
  # @params args Hash
61
61
  # @returns Boolean
62
62
  def valid_args?(args={})
63
- valid = false
64
-
65
63
  if arguments
66
64
  arguments.each do |name, argument|
67
- if argument[:required]
68
- return false if args[name] == nil
69
- end
70
65
 
71
- if argument[:default_value] && !args[name]
72
- args[name] = argument[:default_value]
66
+ if argument[:default_value]
67
+ args[name] = args[name] || argument[:default_value]
73
68
  end
74
69
 
75
- valid = argument.valid_input?(args[name])
70
+ return false if (argument[:required] && (args[name] == nil))
71
+ return false if (argument[:required] && !(argument.valid_input? args[name]))
76
72
  end
77
- else
78
- valid = true
79
73
  end
80
74
 
81
- return valid
75
+ return true
82
76
  end
83
77
  end
84
78
  end
@@ -1,3 +1,4 @@
1
+ require 'json'
1
2
  module Snapi
2
3
 
3
4
  # Helpful module to check strings against named Regexp patterns which
@@ -53,6 +54,7 @@ module Snapi
53
54
  :ip => [IP_V4_REGEX, IP_V6_REGEX],
54
55
  :ipv6 => [IP_V6_REGEX],
55
56
  :ipv4 => [IP_V4_REGEX],
57
+ :json => [JsonValidator],
56
58
  :mac => [MAC_REGEX],
57
59
  :snapi_function_name => [SNAPI_FUNCTION_NAME],
58
60
  :on_off => [ON_OFF_REGEX],
@@ -120,4 +122,19 @@ module Snapi
120
122
  #
121
123
  URI_REGEX = /https?:\/\/[\S]+/
122
124
  end
125
+
126
+ # Provide an object to validate JSON with a =~ method that mirrors Regexp.=~.
127
+ # The existing validation code relies on the fact that Regexp.=~ will return
128
+ # the index for which the string matches the regex. We return 0 if the JSON
129
+ # is parsable, since the JSON string will always start at index 0.
130
+ class JsonValidator
131
+ def self.=~(obj)
132
+ begin
133
+ JSON.parse(obj)
134
+ 0
135
+ rescue
136
+ nil
137
+ end
138
+ end
139
+ end
123
140
  end
@@ -1,3 +1,3 @@
1
1
  module Snapi
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -42,10 +42,15 @@ describe Snapi::Argument do
42
42
  subject.type(:string).should == :string
43
43
  end
44
44
 
45
+ it "can have a description set" do
46
+ subject.description("describe the argument").should == "describe the argument"
47
+ end
48
+
45
49
  it "can return a hash of its own options" do
46
50
  subject.attributes.keys.sort.should == []
47
51
  end
48
52
 
53
+
49
54
  describe "can validate types such as" do
50
55
  it ":boolean" do
51
56
  a = Snapi::Argument.new
@@ -21,15 +21,49 @@ describe Snapi::Function do
21
21
 
22
22
  it "can validate a ruby hash of keys and values against its arguments" do
23
23
  subject.argument :argument do |arg|
24
- arg.default_value "test"
25
24
  arg.required true
26
25
  arg.type :string
27
26
  end
28
27
 
29
- subject.valid_args?({}).should == false
30
- subject.valid_args?({:not_argument => "test value"}).should == false
31
- subject.valid_args?({:argument => "test value"}).should == true
32
- # ignores
33
- subject.valid_args?({:argument => "test value", :not => :relevant}).should == true
28
+ subject.argument :optional_argument do |arg|
29
+ arg.type :string
30
+ end
31
+
32
+ blank = {}
33
+
34
+ # no relevant args
35
+ wrong1 = {
36
+ :not_argument => "test value"
37
+ }
38
+
39
+ # just the optional arg
40
+ wrong2 = {
41
+ :optional_argument => "test value"
42
+ }
43
+
44
+ # just required, missing non-required
45
+ valid1 = {
46
+ :argument => "test value"
47
+ }
48
+
49
+ # required + optional
50
+ valid2 = {
51
+ :argument => "test value",
52
+ :optional_argument => "test value"
53
+ }
54
+
55
+ # ignores unexected key / values
56
+ valid3 = {
57
+ :argument => "test value",
58
+ :not => :relevant
59
+ }
60
+
61
+
62
+ subject.valid_args?(blank).should == false
63
+ subject.valid_args?(wrong1).should == false
64
+ subject.valid_args?(wrong2).should == false
65
+ subject.valid_args?(valid1).should == true
66
+ subject.valid_args?(valid2).should == true
67
+ subject.valid_args?(valid3).should == true
34
68
  end
35
69
  end
@@ -19,10 +19,15 @@ describe "Snapi::Validator" do
19
19
  end
20
20
 
21
21
  it "offers an array of regular expressions in exchange for a format type" do
22
- test_format = Snapi::Validator.format_types.shuffle.first
23
- v_reg = Snapi::Validator.validation_regex[test_format]
24
- v_reg.class.should == Array
25
- v_reg.first.class.should == Regexp
22
+ ip_reg = Snapi::Validator.validation_regex[:ip]
23
+ ip_reg.class.should == Array
24
+ ip_reg.first.class.should == Regexp
25
+ ip_reg.first.respond_to?(:=~).should == true
26
+
27
+ json_reg = Snapi::Validator.validation_regex[:json]
28
+ json_reg.class.should == Array
29
+ json_reg.first.class.should == Class
30
+ json_reg.first.respond_to?(:=~).should == true
26
31
  end
27
32
 
28
33
  it "will attempt to confirm if a string matches the specified regex" do
@@ -30,4 +35,12 @@ describe "Snapi::Validator" do
30
35
  Snapi::Validator.valid_input?( :ip, "192.168.10.256" ).should == false
31
36
  Snapi::Validator.valid_input?( :ip, "Jake the Dog" ).should == false
32
37
  end
38
+
39
+ it "validates well-formed json" do
40
+ Snapi::Validator.valid_input?( :json, "{}" ).should == true
41
+ Snapi::Validator.valid_input?( :json, "{'}" ).should == false
42
+ Snapi::Validator.valid_input?( :json, "{\"asdf\": 3}" ).should == true
43
+ Snapi::Validator.valid_input?( :json, "{asdf: 3" ).should == false
44
+ Snapi::Validator.valid_input?( :json, "[{},{}]" ).should == true
45
+ end
33
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-03-16 00:00:00.000000000 Z
12
+ date: 2014-03-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec