ncco 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +1 -0
- data/Gemfile.lock +2 -14
- data/lib/ncco/data/errors.yml +2 -2
- data/lib/ncco/predicates.rb +7 -5
- data/lib/ncco/schemas/base_schema.rb +6 -0
- data/lib/ncco/schemas/connect.rb +2 -2
- data/lib/ncco/schemas/record.rb +1 -1
- data/lib/ncco/version.rb +1 -1
- data/lib/ncco.rb +9 -4
- data/ncco.gemspec +0 -1
- metadata +1 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 83ee03788109717640e74920bb21cc2fbc07dd2d27ec8850bde4ad0002ae94a7
|
4
|
+
data.tar.gz: 625ca24611c7640f53e7bdfbae9758a7a13f74df4f61248977d8f44363baa49b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e31008d689272f5ef55f293670fc160f7dd466288ea57bca7b38bc92cb39c0b69cb9259b2104154de5ba722ed938485566d0e9ee73d9d303b6ade9772ffe3969
|
7
|
+
data.tar.gz: 17b0a41431b94d9840972d06ec6792f0325f66645162946e86a02eb1831ed899f0226ac9fb6715ec5914dac5348155b3630f2c3756ac0b247723cd439e53f651
|
data/.circleci/config.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ncco (0.1.
|
4
|
+
ncco (0.1.1)
|
5
5
|
dry-validation (~> 0.12.2)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: https://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activesupport (5.2.1)
|
11
|
-
concurrent-ruby (~> 1.0, >= 1.0.2)
|
12
|
-
i18n (>= 0.7, < 2)
|
13
|
-
minitest (~> 5.1)
|
14
|
-
tzinfo (~> 1.1)
|
15
10
|
ast (2.4.0)
|
16
11
|
coderay (1.1.2)
|
17
12
|
concurrent-ruby (1.1.3)
|
@@ -29,7 +24,7 @@ GEM
|
|
29
24
|
dry-container (~> 0.2, >= 0.2.6)
|
30
25
|
dry-core (~> 0.2)
|
31
26
|
dry-equalizer (~> 0.2)
|
32
|
-
dry-types (0.13.
|
27
|
+
dry-types (0.13.3)
|
33
28
|
concurrent-ruby (~> 1.0)
|
34
29
|
dry-container (~> 0.3)
|
35
30
|
dry-core (~> 0.4, >= 0.4.4)
|
@@ -46,11 +41,8 @@ GEM
|
|
46
41
|
gc_ruboconfig (2.3.13)
|
47
42
|
rubocop (>= 0.57, < 0.61)
|
48
43
|
rubocop-rspec (~> 1.25)
|
49
|
-
i18n (1.1.1)
|
50
|
-
concurrent-ruby (~> 1.0)
|
51
44
|
jaro_winkler (1.5.1)
|
52
45
|
method_source (0.9.2)
|
53
|
-
minitest (5.11.3)
|
54
46
|
parallel (1.12.1)
|
55
47
|
parser (2.5.3.0)
|
56
48
|
ast (~> 2.4.0)
|
@@ -84,16 +76,12 @@ GEM
|
|
84
76
|
rubocop-rspec (1.30.1)
|
85
77
|
rubocop (>= 0.60.0)
|
86
78
|
ruby-progressbar (1.10.0)
|
87
|
-
thread_safe (0.3.6)
|
88
|
-
tzinfo (1.2.5)
|
89
|
-
thread_safe (~> 0.1)
|
90
79
|
unicode-display_width (1.4.0)
|
91
80
|
|
92
81
|
PLATFORMS
|
93
82
|
ruby
|
94
83
|
|
95
84
|
DEPENDENCIES
|
96
|
-
activesupport (~> 5.2.1)
|
97
85
|
bundler (~> 1.17.a)
|
98
86
|
gc_ruboconfig (~> 2.3.13)
|
99
87
|
ncco!
|
data/lib/ncco/data/errors.yml
CHANGED
@@ -3,8 +3,8 @@ en:
|
|
3
3
|
strict_keys?: has attributes which aren't part of the NCCO specification
|
4
4
|
http_or_https_url?: must be a valid HTTP or HTTPS URL
|
5
5
|
supported_http_method?: must be a supported HTTP method
|
6
|
-
|
7
|
-
|
6
|
+
phone_keypad_digit?: must be a single digit from a phone keypad, as a string
|
7
|
+
phone_keypad_digits?: must be a series of one or more digits from a phone keypad, as a string
|
8
8
|
e164?: must be a valid E.164-formatted phone number
|
9
9
|
websocket_url?: must be a valid Websocket URL
|
10
10
|
hash_with_string_keys_and_values?: must be a hash with String keys and values
|
data/lib/ncco/predicates.rb
CHANGED
@@ -4,6 +4,7 @@ module NCCO
|
|
4
4
|
module Predicates
|
5
5
|
include ::Dry::Logic::Predicates
|
6
6
|
|
7
|
+
# TODO: Does Nexmo accept URLs relative to the current location?
|
7
8
|
predicate(:http_or_https_url?) do |value|
|
8
9
|
uri = URI.parse(value)
|
9
10
|
%w[http https].include?(uri.scheme)
|
@@ -25,16 +26,17 @@ module NCCO
|
|
25
26
|
end
|
26
27
|
|
27
28
|
NUMBERS = (0..9).map(&:to_s).freeze
|
28
|
-
|
29
|
+
PHONE_KEYPAD_DIGITS = [*NUMBERS, "*", "#"].freeze
|
29
30
|
|
30
|
-
predicate(:
|
31
|
-
|
31
|
+
predicate(:phone_keypad_digit?) do |value|
|
32
|
+
PHONE_KEYPAD_DIGITS.include?(value)
|
32
33
|
end
|
33
34
|
|
34
|
-
predicate(:
|
35
|
+
predicate(:phone_keypad_digits?) do |value|
|
35
36
|
value.is_a?(String) &&
|
36
37
|
!value.empty? &&
|
37
|
-
|
38
|
+
# There shouldn't be any characters in the input that aren't keypad digits
|
39
|
+
(value.chars - PHONE_KEYPAD_DIGITS).none?
|
38
40
|
end
|
39
41
|
|
40
42
|
predicate(:e164?) do |value|
|
@@ -6,8 +6,14 @@ module NCCO
|
|
6
6
|
input :hash?, :strict_keys?
|
7
7
|
|
8
8
|
configure do
|
9
|
+
# `dry-validations` includes a bunch of "predicates" which you can use to
|
10
|
+
# validate values. This includes some custom Nexmo-specific ones (e.g. for
|
11
|
+
# phone digits and URLs).
|
9
12
|
predicates(Predicates)
|
10
13
|
|
14
|
+
# Used to validate that the input only includes keys that are defined in
|
15
|
+
# the schema, implementing a slightly hacky "whitelisting" behaviour (which
|
16
|
+
# for some reason isn't include in `dry-validations`!)
|
11
17
|
def strict_keys?(input)
|
12
18
|
(input.keys - rules.keys).empty?
|
13
19
|
end
|
data/lib/ncco/schemas/connect.rb
CHANGED
@@ -9,9 +9,9 @@ module NCCO
|
|
9
9
|
# Phone endpoint attributes
|
10
10
|
optional(:number).value(:e164?)
|
11
11
|
optional(:onAnswer).value(:http_or_https_url?)
|
12
|
-
optional(:dtmfAnswer).value(:
|
12
|
+
optional(:dtmfAnswer).value(:phone_keypad_digits?)
|
13
13
|
|
14
|
-
#
|
14
|
+
# WebSocket endpoint attributes
|
15
15
|
optional(:uri).value(:websocket_url?) # Also used for SIP endpoints
|
16
16
|
optional("content-type").value(eql?: "audio/l16;rate=16000")
|
17
17
|
optional(:headers).value(:hash_with_string_keys_and_values?)
|
data/lib/ncco/schemas/record.rb
CHANGED
@@ -11,7 +11,7 @@ module NCCO
|
|
11
11
|
optional(:split).value(included_in?: [nil, "conversation"])
|
12
12
|
optional(:channels).value(type?: Integer, gteq?: 1, lteq?: 32)
|
13
13
|
optional(:endOnSilence).value(type?: Integer, gteq?: 3, lteq?: 10)
|
14
|
-
optional(:endOnKey).value(:
|
14
|
+
optional(:endOnKey).value(:phone_keypad_digit?)
|
15
15
|
optional(:beepStart).value(:bool?)
|
16
16
|
optional(:timeout).value(type?: Integer, gteq?: 3, lteq?: 7200)
|
17
17
|
optional(:eventUrl).value(:http_or_https_url?)
|
data/lib/ncco/version.rb
CHANGED
data/lib/ncco.rb
CHANGED
@@ -14,6 +14,8 @@ require "ncco/schemas/talk"
|
|
14
14
|
module NCCO
|
15
15
|
class InvalidActionError < StandardError; end
|
16
16
|
|
17
|
+
# Maps the "action" attribute within an action to the schema which should be used
|
18
|
+
# to validate it
|
17
19
|
SCHEMAS_BY_TYPE = {
|
18
20
|
"connect" => Schemas::Connect,
|
19
21
|
"conversation" => Schemas::Conversation,
|
@@ -62,7 +64,8 @@ module NCCO
|
|
62
64
|
index: index)
|
63
65
|
end
|
64
66
|
|
65
|
-
|
67
|
+
result = schema.call(action)
|
68
|
+
error_messages = get_error_messages(result)
|
66
69
|
|
67
70
|
raise_invalid_error(error_messages.join(", "), index: index) if error_messages.any?
|
68
71
|
end
|
@@ -105,14 +108,16 @@ module NCCO
|
|
105
108
|
end
|
106
109
|
end
|
107
110
|
|
108
|
-
#
|
111
|
+
# Gets the error messages from `Dry::Validation::Result`s in a consistent format. For
|
109
112
|
# field-level errors, we get back a `Hash` mapping the attribute name to an array of
|
110
113
|
# `String` error messages, whereas for unrecognised attributes (which is a bit of a
|
111
114
|
# hack), we just get back an array. This handles either gracefully.
|
112
115
|
#
|
113
|
-
# @param
|
116
|
+
# @param result [Dry::Valiation::Result] the result from validating an action against
|
117
|
+
# a schema
|
114
118
|
# @return [Array<String>] a list of error messages which is guaranteed to be an array
|
115
|
-
def
|
119
|
+
def get_error_messages(result)
|
120
|
+
error_messages = result.messages(full: true)
|
116
121
|
return error_messages if error_messages.is_a?(Array)
|
117
122
|
|
118
123
|
error_messages.values.flatten
|
data/ncco.gemspec
CHANGED
@@ -30,7 +30,6 @@ Gem::Specification.new do |spec|
|
|
30
30
|
|
31
31
|
spec.add_dependency "dry-validation", "~> 0.12.2"
|
32
32
|
|
33
|
-
spec.add_development_dependency "activesupport", "~> 5.2.1"
|
34
33
|
spec.add_development_dependency "bundler", "~> 1.17.a"
|
35
34
|
spec.add_development_dependency "gc_ruboconfig", "~> 2.3.13"
|
36
35
|
spec.add_development_dependency "pry", "~> 0.12.2"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ncco
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Rogers
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.12.2
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: activesupport
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 5.2.1
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 5.2.1
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: bundler
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|