github_api 0.14.2 → 0.14.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/github_api/error/client_error.rb +64 -0
- data/lib/github_api/error/service_error.rb +153 -26
- data/lib/github_api/error.rb +0 -6
- data/lib/github_api/version.rb +1 -1
- metadata +6 -19
- data/lib/github_api/error/bad_request.rb +0 -14
- data/lib/github_api/error/forbidden.rb +0 -14
- data/lib/github_api/error/internal_server_error.rb +0 -15
- data/lib/github_api/error/invalid_options.rb +0 -18
- data/lib/github_api/error/not_acceptable.rb +0 -15
- data/lib/github_api/error/not_found.rb +0 -14
- data/lib/github_api/error/required_params.rb +0 -18
- data/lib/github_api/error/service_unavailable.rb +0 -15
- data/lib/github_api/error/unauthorized.rb +0 -15
- data/lib/github_api/error/unknown_media.rb +0 -18
- data/lib/github_api/error/unknown_value.rb +0 -18
- data/lib/github_api/error/unprocessable_entity.rb +0 -14
- data/lib/github_api/error/validations.rb +0 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7fe5afce457fa73fed135b79c28fc1083e1d0f9d
|
4
|
+
data.tar.gz: fc77be5cbda3f746328797d7e1b1e9de5c5fdafb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c37cb56444c0a0a02546eb7960bbfdfb18308afad58a31f32da34fdf103e99cb25a7de3dc127066dd199d45e52e7703b0fd2e1b56162d40b341d53bd7e22a22
|
7
|
+
data.tar.gz: 9f7a7b7daabd4ff6094e2cc222522f8ad19c3403f024c071deb7880f86fb171b5ea86b5f21e73f2d47c244f949a38e29de349e41b945a26335613f313ee70875
|
@@ -19,5 +19,69 @@ module Github #:nodoc
|
|
19
19
|
"\nResolution:\n #{@resolution}"
|
20
20
|
end
|
21
21
|
end
|
22
|
+
|
23
|
+
# Raised when invalid options are passed to a request body
|
24
|
+
class InvalidOptions < ClientError
|
25
|
+
def initialize(invalid, valid)
|
26
|
+
super(
|
27
|
+
generate_message(
|
28
|
+
problem: "Invalid option #{invalid.keys.join(', ')} provided for this request.",
|
29
|
+
summary: "Github gem checks the request parameters passed to ensure that github api is not hit unnecessairly and to fail fast.",
|
30
|
+
resolution: "Valid options are: #{valid.join(', ')}, make sure these are the ones you are using"
|
31
|
+
)
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Raised when invalid options are passed to a request body
|
37
|
+
class RequiredParams < ClientError
|
38
|
+
def initialize(provided, required)
|
39
|
+
super(
|
40
|
+
generate_message(
|
41
|
+
problem: "Missing required parameters: #{provided.keys.join(', ')} provided for this request.",
|
42
|
+
summary: "Github gem checks the request parameters passed to ensure that github api is not hit unnecessairly and to fail fast.",
|
43
|
+
resolution: "Required parameters are: #{required.join(', ')}, make sure these are the ones you are using"
|
44
|
+
)
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Raised when invalid options are passed to a request body
|
50
|
+
class UnknownMedia < ClientError
|
51
|
+
def initialize(file)
|
52
|
+
super(
|
53
|
+
generate_message(
|
54
|
+
problem: "Unknown content type for: '#{file}' provided for this request.",
|
55
|
+
summary: "Github gem infers the content type of the resource by calling the mime-types gem type inference.",
|
56
|
+
resolution: "Please install mime-types gem to infer the resource content type."
|
57
|
+
)
|
58
|
+
)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Raised when invalid options are passed to a request body
|
63
|
+
class UnknownValue < ClientError
|
64
|
+
def initialize(key, value, permitted)
|
65
|
+
super(
|
66
|
+
generate_message(
|
67
|
+
problem: "Wrong value of '#{value}' for the parameter: #{key} provided for this request.",
|
68
|
+
summary: "Github gem checks the request parameters passed to ensure that github api is not hit unnecessairly and fails fast.",
|
69
|
+
resolution: "Permitted values are: #{permitted}, make sure these are the ones you are using"
|
70
|
+
)
|
71
|
+
)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class Validations < ClientError
|
76
|
+
def initialize(errors)
|
77
|
+
super(
|
78
|
+
generate_message(
|
79
|
+
problem: "Attempted to send request with nil arguments for #{errors.keys.join(', ')}.",
|
80
|
+
summary: 'Each request expects certain number of required arguments.',
|
81
|
+
resolution: 'Double check that the provided arguments are set to some value that is neither nil nor empty string.'
|
82
|
+
)
|
83
|
+
)
|
84
|
+
end
|
85
|
+
end
|
22
86
|
end # Error
|
23
87
|
end # Github
|
@@ -6,56 +6,183 @@ module Github
|
|
6
6
|
# Raised when GitHub returns any of the HTTP status codes
|
7
7
|
module Error
|
8
8
|
class ServiceError < GithubError
|
9
|
-
|
9
|
+
# Add http status code method to error type
|
10
|
+
#
|
11
|
+
# @param [Integer] code
|
12
|
+
# the status code
|
13
|
+
#
|
14
|
+
# @api public
|
15
|
+
def self.http_status_code(code)
|
16
|
+
define_method(:http_status_code) { code }
|
17
|
+
end
|
18
|
+
|
19
|
+
# A mapping of status codes and error types
|
20
|
+
#
|
21
|
+
# @return [Hash[Integer, Object]]
|
22
|
+
#
|
23
|
+
# @api public
|
24
|
+
def self.errors
|
25
|
+
@errors ||= Hash[
|
26
|
+
descendants.map { |klass| [klass.new({}).http_status_code, klass] }
|
27
|
+
]
|
28
|
+
end
|
10
29
|
|
11
30
|
MIN_BODY_LENGTH = 2
|
12
31
|
|
32
|
+
# Crate a ServiceError
|
33
|
+
#
|
34
|
+
# @param [Hash[Symbol]] response
|
35
|
+
#
|
36
|
+
# @api public
|
13
37
|
def initialize(response)
|
14
|
-
@
|
15
|
-
@body
|
16
|
-
@status
|
38
|
+
@headers = response[:response_headers]
|
39
|
+
@body = response[:body]
|
40
|
+
@status = response[:status]
|
17
41
|
|
18
42
|
super(create_message(response))
|
19
43
|
end
|
20
44
|
|
45
|
+
private
|
46
|
+
|
47
|
+
# Create full error message
|
48
|
+
#
|
49
|
+
# @param [Hash[Symbol]] response
|
50
|
+
# the http response
|
51
|
+
#
|
52
|
+
# @return [String]
|
53
|
+
# the error message
|
54
|
+
#
|
55
|
+
# @api private
|
21
56
|
def create_message(response)
|
22
|
-
|
57
|
+
return if response.nil?
|
58
|
+
|
59
|
+
message = "#{response[:method].to_s.upcase} "
|
60
|
+
message << "#{response[:url]}: "
|
61
|
+
message << "#{@status} - #{parse_body(@body)}"
|
62
|
+
message
|
23
63
|
end
|
24
64
|
|
25
|
-
|
26
|
-
|
65
|
+
# Decode body information if in JSON format
|
66
|
+
#
|
67
|
+
# @param [String] body
|
68
|
+
# the response body
|
69
|
+
#
|
70
|
+
# @api private
|
71
|
+
def decode_data(body)
|
72
|
+
if body.respond_to?(:to_str) &&
|
73
|
+
body.length >= MIN_BODY_LENGTH &&
|
74
|
+
@headers[:content_type] =~ /json/
|
75
|
+
|
27
76
|
JSON.parse(body, symbolize_names: true)
|
28
77
|
else
|
29
78
|
body
|
30
79
|
end
|
31
80
|
end
|
32
81
|
|
82
|
+
# @api private
|
33
83
|
def parse_body(body)
|
34
|
-
|
84
|
+
data = decode_data(body)
|
35
85
|
|
36
|
-
return '' if
|
86
|
+
return '' if data.nil? || data.empty?
|
37
87
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
error
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
88
|
+
case data
|
89
|
+
when Hash
|
90
|
+
message = data[:message] ? data[:message] : ' '
|
91
|
+
docs = data[:documentation_url]
|
92
|
+
error = create_error_summary(data)
|
93
|
+
message << error if error
|
94
|
+
message << "\nSee: #{docs}" if docs
|
95
|
+
message
|
96
|
+
when String
|
97
|
+
data
|
47
98
|
end
|
48
99
|
end
|
49
100
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
101
|
+
# Create error summary from response body
|
102
|
+
#
|
103
|
+
# @return [String]
|
104
|
+
#
|
105
|
+
# @api private
|
106
|
+
def create_error_summary(data)
|
107
|
+
if data[:error]
|
108
|
+
return "\nError: #{data[:error]}"
|
109
|
+
elsif data[:errors]
|
110
|
+
message = "\nErrors:\n"
|
111
|
+
message << data[:errors].map do |error|
|
112
|
+
"Error: #{error.map { |k, v| "#{k}: #{v}" }.join(', ')}"
|
113
|
+
end.join("\n")
|
114
|
+
end
|
58
115
|
end
|
59
116
|
end # ServiceError
|
117
|
+
|
118
|
+
# Raised when Github returns the HTTP status code 400
|
119
|
+
class BadRequest < ServiceError
|
120
|
+
http_status_code 400
|
121
|
+
end
|
122
|
+
|
123
|
+
# Raised when GitHub returns the HTTP status code 401
|
124
|
+
class Unauthorized < ServiceError
|
125
|
+
http_status_code 401
|
126
|
+
end
|
127
|
+
|
128
|
+
# Raised when Github returns the HTTP status code 403
|
129
|
+
class Forbidden < ServiceError
|
130
|
+
http_status_code 403
|
131
|
+
end
|
132
|
+
|
133
|
+
# Raised when Github returns the HTTP status code 404
|
134
|
+
class NotFound < ServiceError
|
135
|
+
http_status_code 404
|
136
|
+
end
|
137
|
+
|
138
|
+
# Raised when Github returns the HTTP status code 405
|
139
|
+
class MethodNotAllowed < ServiceError
|
140
|
+
http_status_code 405
|
141
|
+
end
|
142
|
+
|
143
|
+
# Raised when Github returns the HTTP status code 406
|
144
|
+
class NotAcceptable < ServiceError
|
145
|
+
http_status_code 406
|
146
|
+
end
|
147
|
+
|
148
|
+
# Raised when GitHub returns the HTTP status code 409
|
149
|
+
class Conflict < ServiceError
|
150
|
+
http_status_code 409
|
151
|
+
end
|
152
|
+
|
153
|
+
# Raised when GitHub returns the HTTP status code 414
|
154
|
+
class UnsupportedMediaType < ServiceError
|
155
|
+
http_status_code 414
|
156
|
+
end
|
157
|
+
|
158
|
+
# Raised when GitHub returns the HTTP status code 422
|
159
|
+
class UnprocessableEntity < ServiceError
|
160
|
+
http_status_code 422
|
161
|
+
end
|
162
|
+
|
163
|
+
# Raised when GitHub returns the HTTP status code 451
|
164
|
+
class UnavailableForLegalReasons < ServiceError
|
165
|
+
http_status_code 451
|
166
|
+
end
|
167
|
+
|
168
|
+
# Raised when Github returns the HTTP status code 500
|
169
|
+
class InternalServerError < ServiceError
|
170
|
+
http_status_code 500
|
171
|
+
end
|
172
|
+
|
173
|
+
# Raised when Github returns the HTTP status code 501
|
174
|
+
class NotImplemented < ServiceError
|
175
|
+
http_status_code 501
|
176
|
+
end
|
177
|
+
|
178
|
+
# Raised when Github returns the HTTP status code 502
|
179
|
+
class BadGateway < ServiceError
|
180
|
+
http_status_code 502
|
181
|
+
end
|
182
|
+
|
183
|
+
# Raised when GitHub returns the HTTP status code 503
|
184
|
+
class ServiceUnavailable < ServiceError
|
185
|
+
http_status_code 503
|
186
|
+
end
|
60
187
|
end # Error
|
61
188
|
end # Github
|
data/lib/github_api/error.rb
CHANGED
@@ -23,15 +23,9 @@ module Github
|
|
23
23
|
def backtrace
|
24
24
|
@response_message ? @response_message.backtrace : super
|
25
25
|
end
|
26
|
-
|
27
26
|
end # GithubError
|
28
27
|
end # Error
|
29
28
|
end # Github
|
30
29
|
|
31
30
|
require 'github_api/error/service_error'
|
32
31
|
require 'github_api/error/client_error'
|
33
|
-
Dir[File.dirname(__FILE__) + '/error/*.rb'].sort.each do |path|
|
34
|
-
filename = File.basename(path)
|
35
|
-
next if ['service_error.rb', 'client_error.rb'].include?(filename)
|
36
|
-
require "github_api/error/#{filename}"
|
37
|
-
end
|
data/lib/github_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: github_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.14.
|
4
|
+
version: 0.14.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -62,16 +62,16 @@ dependencies:
|
|
62
62
|
name: oauth2
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - "
|
65
|
+
- - "~>"
|
66
66
|
- !ruby/object:Gem::Version
|
67
|
-
version:
|
67
|
+
version: 1.0.0
|
68
68
|
type: :runtime
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
|
-
- - "
|
72
|
+
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
74
|
+
version: 1.0.0
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: descendants_tracker
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -204,21 +204,8 @@ files:
|
|
204
204
|
- lib/github_api/core_ext/ordered_hash.rb
|
205
205
|
- lib/github_api/deprecation.rb
|
206
206
|
- lib/github_api/error.rb
|
207
|
-
- lib/github_api/error/bad_request.rb
|
208
207
|
- lib/github_api/error/client_error.rb
|
209
|
-
- lib/github_api/error/forbidden.rb
|
210
|
-
- lib/github_api/error/internal_server_error.rb
|
211
|
-
- lib/github_api/error/invalid_options.rb
|
212
|
-
- lib/github_api/error/not_acceptable.rb
|
213
|
-
- lib/github_api/error/not_found.rb
|
214
|
-
- lib/github_api/error/required_params.rb
|
215
208
|
- lib/github_api/error/service_error.rb
|
216
|
-
- lib/github_api/error/service_unavailable.rb
|
217
|
-
- lib/github_api/error/unauthorized.rb
|
218
|
-
- lib/github_api/error/unknown_media.rb
|
219
|
-
- lib/github_api/error/unknown_value.rb
|
220
|
-
- lib/github_api/error/unprocessable_entity.rb
|
221
|
-
- lib/github_api/error/validations.rb
|
222
209
|
- lib/github_api/ext/faraday.rb
|
223
210
|
- lib/github_api/middleware.rb
|
224
211
|
- lib/github_api/mime_type.rb
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when Github returns the HTTP status code 403
|
5
|
-
module Error
|
6
|
-
class Forbidden < ServiceError
|
7
|
-
http_status_code 403
|
8
|
-
|
9
|
-
def initialize(response)
|
10
|
-
super(response)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end # Error
|
14
|
-
end # Github
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when Github returns the HTTP status code 500
|
5
|
-
module Error
|
6
|
-
class InternalServerError < ServiceError
|
7
|
-
http_status_code 500
|
8
|
-
|
9
|
-
def initialize(response)
|
10
|
-
super(response)
|
11
|
-
end
|
12
|
-
|
13
|
-
end # InternalServerError
|
14
|
-
end # Error
|
15
|
-
end # Github
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when invalid options are passed to a request body
|
5
|
-
module Error
|
6
|
-
class InvalidOptions < ClientError
|
7
|
-
def initialize(invalid, valid)
|
8
|
-
super(
|
9
|
-
generate_message(
|
10
|
-
:problem => "Invalid option #{invalid.keys.join(', ')} provided for this request.",
|
11
|
-
:summary => "Github gem checks the request parameters passed to ensure that github api is not hit unnecessairly and to fail fast.",
|
12
|
-
:resolution => "Valid options are: #{valid.join(', ')}, make sure these are the ones you are using"
|
13
|
-
)
|
14
|
-
)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end # Error
|
18
|
-
end # Github
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when GitHub returns the HTTP status code 406
|
5
|
-
module Error
|
6
|
-
class NotAcceptable < ServiceError
|
7
|
-
http_status_code 406
|
8
|
-
|
9
|
-
def initialize(response)
|
10
|
-
super(response)
|
11
|
-
end
|
12
|
-
|
13
|
-
end # NotAcceptable
|
14
|
-
end # Error
|
15
|
-
end # Github
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when invalid options are passed to a request body
|
5
|
-
module Error
|
6
|
-
class RequiredParams < ClientError
|
7
|
-
def initialize(provided, required)
|
8
|
-
super(
|
9
|
-
generate_message(
|
10
|
-
:problem => "Missing required parameters: #{provided.keys.join(', ')} provided for this request.",
|
11
|
-
:summary => "Github gem checks the request parameters passed to ensure that github api is not hit unnecessairly and to fail fast.",
|
12
|
-
:resolution => "Required parameters are: #{required.join(', ')}, make sure these are the ones you are using"
|
13
|
-
)
|
14
|
-
)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end # Error
|
18
|
-
end # Github
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when Github returns the HTTP status code 503
|
5
|
-
module Error
|
6
|
-
class ServiceUnavailable < ServiceError
|
7
|
-
http_status_code 503
|
8
|
-
|
9
|
-
def initialize(response)
|
10
|
-
super(response)
|
11
|
-
end
|
12
|
-
|
13
|
-
end # ServiceUnavailable
|
14
|
-
end # Error
|
15
|
-
end # Github
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when Github returns the HTTP status code 401
|
5
|
-
module Error
|
6
|
-
class Unauthorized < ServiceError
|
7
|
-
http_status_code 401
|
8
|
-
|
9
|
-
def initialize(response)
|
10
|
-
super(response)
|
11
|
-
end
|
12
|
-
|
13
|
-
end # Unauthorized
|
14
|
-
end # Error
|
15
|
-
end # Github
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when invalid options are passed to a request body
|
5
|
-
module Error
|
6
|
-
class UnknownMedia < ClientError
|
7
|
-
def initialize(file)
|
8
|
-
super(
|
9
|
-
generate_message(
|
10
|
-
:problem => "Unknown content type for: '#{file}' provided for this request.",
|
11
|
-
:summary => "Github gem infers the content type of the resource by calling the mime-types gem type inference.",
|
12
|
-
:resolution => "Please install mime-types gem to infer the resource content type."
|
13
|
-
)
|
14
|
-
)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end # Error
|
18
|
-
end # Github
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when invalid options are passed to a request body
|
5
|
-
module Error
|
6
|
-
class UnknownValue < ClientError
|
7
|
-
def initialize(key, value, permitted)
|
8
|
-
super(
|
9
|
-
generate_message(
|
10
|
-
:problem => "Wrong value of '#{value}' for the parameter: #{key} provided for this request.",
|
11
|
-
:summary => "Github gem checks the request parameters passed to ensure that github api is not hit unnecessairly and fails fast.",
|
12
|
-
:resolution => "Permitted values are: #{permitted}, make sure these are the ones you are using"
|
13
|
-
)
|
14
|
-
)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end # Error
|
18
|
-
end # Github
|
@@ -1,14 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when Github returns the HTTP status code 422
|
5
|
-
module Error
|
6
|
-
class UnprocessableEntity < ServiceError
|
7
|
-
http_status_code 422
|
8
|
-
|
9
|
-
def initialize(response)
|
10
|
-
super(response)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end # Error
|
14
|
-
end # Github
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Github #:nodoc
|
4
|
-
# Raised when passed parameters are missing or contain wrong values.
|
5
|
-
module Error
|
6
|
-
class Validations < ClientError
|
7
|
-
def initialize(errors)
|
8
|
-
super(
|
9
|
-
generate_message(
|
10
|
-
:problem => "Attempted to send request with nil arguments for #{errors.keys.join(', ')}.",
|
11
|
-
:summary => 'Each request expects certain number of required arguments.',
|
12
|
-
:resolution => 'Double check that the provided arguments are set to some value that is neither nil nor empty string.'
|
13
|
-
)
|
14
|
-
)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end # Error
|
18
|
-
end # Github
|