jsender 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +50 -50
- data/jsender.gemspec +3 -3
- data/lib/jsender.rb +2 -132
- data/lib/jsender/json.rb +30 -0
- data/lib/jsender/rack.rb +44 -0
- data/lib/jsender/version.rb +1 -1
- metadata +9 -9
- data/CODE_OF_CONDUCT.md +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d54b8d2efe09a714ff7297af5afe424b569460ba
|
4
|
+
data.tar.gz: 2200fa05c6037642b3230290968326d35ea34ae7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a12515fd684d1502c917f289a55d65e9fc0dc87f11f13127711fea0f099385059bfc4d5f3f253d166a559086c7c814c125d279fc4f56c2eee8cd792cd6aedd65
|
7
|
+
data.tar.gz: 4e47367fdc446fc5f3da1063580942b4fe82775e1ba3c32e8f127bc122c5654ddabe66014fa3ab77e4c3c30c6d0014a81ed0f14407dc25ba07a3eda46b0dafe5
|
data/README.md
CHANGED
@@ -19,81 +19,81 @@ gem 'jsender'
|
|
19
19
|
|
20
20
|
And then execute:
|
21
21
|
|
22
|
-
|
22
|
+
```bash
|
23
|
+
bundle
|
24
|
+
```
|
23
25
|
|
24
26
|
Or install it yourself as:
|
25
27
|
|
26
|
-
|
28
|
+
```bash
|
29
|
+
gem install jsender
|
30
|
+
```
|
27
31
|
|
28
32
|
## Usage
|
29
|
-
### Returns
|
30
|
-
|
31
|
-
```
|
32
|
-
Jsender.success
|
33
|
-
=> {"status"=>"success", "data"=>{"result"=>nil, "notifications"=>["success"]}}
|
33
|
+
### Returns JSON
|
34
34
|
|
35
|
-
|
36
|
-
=> {"status"=>"success", "data"=>{"result"=>nil, "notifications"=>["happy day"]}}
|
35
|
+
Basic usage without any parameters yielding default json encoded jsend format:
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
=> true
|
37
|
+
```ruby
|
38
|
+
Jsender::Json.success
|
39
|
+
=> "{\"status\":\"success\",\"data\":null}"
|
42
40
|
|
43
|
-
|
44
|
-
|
45
|
-
Jsender.has_data?(result, 'result')
|
46
|
-
=> true
|
47
|
-
Jsender.notifications_include?(result, 'ata fo')
|
48
|
-
=> true
|
41
|
+
Jsender::Json.failure
|
42
|
+
=> "{\"status\":\"fail\",\"data\":{\"message\":\"A failure has occurred\"}}"
|
49
43
|
|
50
|
-
|
51
|
-
|
44
|
+
Jsender::Json.error
|
45
|
+
=> "{\"status\":\"error\",\"message\":\"An error has occurred\"}"
|
46
|
+
```
|
52
47
|
|
53
|
-
|
54
|
-
=> {"status"=>"error", "message"=>"something went wrong"}
|
48
|
+
Or with parameters yielding the correct json encoded jsend format:
|
55
49
|
|
56
|
-
|
57
|
-
|
50
|
+
```ruby
|
51
|
+
Jsender::Json.success(data: {'key' => 'value'})
|
52
|
+
=> "{\"status\":\"success\",\"data\":{\"key\":\"value\"}}"
|
58
53
|
|
59
|
-
|
60
|
-
|
54
|
+
Jsender::Json.failure(message: 'custom message')
|
55
|
+
=> "{\"status\":\"fail\",\"data\":{\"message\":\"custom message\"}}"
|
61
56
|
|
62
|
-
|
63
|
-
|
57
|
+
Jsender::Json.error(message: 'custom message')
|
58
|
+
=> "{\"status\":\"error\",\"message\":\"custom message\"}"
|
64
59
|
```
|
65
60
|
|
66
|
-
### Returns
|
67
|
-
|
68
|
-
```
|
69
|
-
Jsender.success_json
|
70
|
-
=> "{\"status\":\"success\", \"data\": null}"
|
61
|
+
### Returns Rack Response Tuple
|
71
62
|
|
72
|
-
|
73
|
-
=> "{\"status\":\"success\",\"data\":{\"key1\":\"value1\"}}"
|
63
|
+
Basic usage without any parameters yielding default json encoded jsend format in a Rack tuple:
|
74
64
|
|
75
|
-
|
76
|
-
|
65
|
+
```ruby
|
66
|
+
Jsender::Rack.success
|
67
|
+
=> [200, {"Content-Type"=>"application/json", "X-Flow-Identifier"=>nil}, "{\"status\":\"success\",\"data\":null}"]
|
77
68
|
|
78
|
-
|
79
|
-
|
69
|
+
Jsender::Rack.failure
|
70
|
+
=> [400, {"Content-Type"=>"application/json", "X-Flow-Identifier"=>nil}, "{\"status\":\"fail\",\"data\":{\"message\":\"A failure has occurred\"}}"]
|
80
71
|
|
81
|
-
|
82
|
-
|
72
|
+
Jsender::Rack.error
|
73
|
+
=> [500, {"Content-Type"=>"application/json", "X-Flow-Identifier"=>nil}, "{\"status\":\"error\",\"message\":\"An error has occurred\"}"]
|
74
|
+
```
|
83
75
|
|
84
|
-
|
85
|
-
=> "{\"status\":\"error\", \"message\":\"My little error\"}"
|
76
|
+
Or with parameters yielding the correct json encoded jsend format in a Rack tuple for use in controllers (including Sinatra):
|
86
77
|
|
87
|
-
|
88
|
-
|
78
|
+
```ruby
|
79
|
+
Jsender::Rack.success(data: {'key' => 'value'}, code: 201, flow_id: '123')
|
80
|
+
=> [201, {"Content-Type"=>"application/json", "X-Flow-Identifier"=>"123"}, "{\"status\":\"success\",\"data\":{\"key\":\"value\"}}"]
|
89
81
|
|
90
|
-
|
91
|
-
|
82
|
+
Jsender::Rack.failure(message: 'some custom failure message', code: 201, flow_id: '123')
|
83
|
+
=> [201, {"Content-Type"=>"application/json", "X-Flow-Identifier"=>"123"}, "{\"status\":\"fail\",\"data\":{\"message\":\"some custom failure message\"}}"]
|
92
84
|
|
93
|
-
|
94
|
-
|
85
|
+
Jsender::Rack.error(message: 'some custom failure message', code: 201, flow_id: '123')
|
86
|
+
=> [201, {"Content-Type"=>"application/json", "X-Flow-Identifier"=>"123"}, "{\"status\":\"error\",\"message\":\"some custom failure message\"}"]
|
95
87
|
```
|
96
88
|
|
89
|
+
### Returns Rack Response Tuple for Middlewares
|
90
|
+
|
91
|
+
Rack middlware responses require that the body of the response tuple is in an array. Enable this using the body_as_array parameter (false by default):
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
Jsender::Rack.error(body_as_array: true)
|
95
|
+
=> [500, {"Content-Type"=>"application/json", "X-Flow-Identifier"=>nil}, ["{\"status\":\"error\",\"message\":\"An error has occurred\"}"]]
|
96
|
+
```
|
97
97
|
|
98
98
|
## Development
|
99
99
|
|
data/jsender.gemspec
CHANGED
@@ -6,11 +6,11 @@ require 'jsender/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "jsender"
|
8
8
|
spec.version = Jsender::VERSION
|
9
|
-
spec.authors = ["
|
10
|
-
spec.email = ["
|
9
|
+
spec.authors = ["Hetzner Seals Team"]
|
10
|
+
spec.email = ["seals@hetzner.co.za"]
|
11
11
|
|
12
12
|
spec.summary = %q{JSender facilitates a simple jsend implementation for ruby}
|
13
|
-
spec.description = %q{JSender facilitates a simple jsend implementation for ruby}
|
13
|
+
spec.description = %q{JSender facilitates a simple jsend implementation for ruby with json and rack helpers}
|
14
14
|
spec.homepage = "https://github.com/hetznerZA/jsender"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
data/lib/jsender.rb
CHANGED
@@ -1,136 +1,6 @@
|
|
1
1
|
require 'jsender/version'
|
2
|
+
require 'jsender/json'
|
3
|
+
require 'jsender/rack'
|
2
4
|
|
3
5
|
module Jsender
|
4
|
-
extend self
|
5
|
-
|
6
|
-
def report(status, message, result = nil)
|
7
|
-
return {'status' => 'error', 'message' => message} if status == 'error'
|
8
|
-
data = compile_data(result)
|
9
|
-
data['notifications'] = message.is_a?(Array) ? message : [message]
|
10
|
-
{'status' => status, 'data' => data}
|
11
|
-
end
|
12
|
-
|
13
|
-
def error(message = nil)
|
14
|
-
report('error', message)
|
15
|
-
end
|
16
|
-
|
17
|
-
def failure(message = nil, data = nil)
|
18
|
-
message ||= 'fail'
|
19
|
-
report('fail', message, data)
|
20
|
-
end
|
21
|
-
|
22
|
-
def fail_data(data = nil)
|
23
|
-
failure(nil, data)
|
24
|
-
end
|
25
|
-
|
26
|
-
def success_data(data = nil)
|
27
|
-
success(nil, data)
|
28
|
-
end
|
29
|
-
|
30
|
-
def success(message = nil, data = nil)
|
31
|
-
message ||= 'success'
|
32
|
-
report('success', message, data)
|
33
|
-
end
|
34
|
-
|
35
|
-
def has_data?(result, key = nil)
|
36
|
-
return false if key.nil?
|
37
|
-
return false if (result.nil?) or (result['data'].nil?)
|
38
|
-
return false if (not key.nil?) and (result['data'][key].nil?)
|
39
|
-
true
|
40
|
-
end
|
41
|
-
|
42
|
-
def notifications_include?(result, pattern)
|
43
|
-
return false unless has_data?(result, 'notifications')
|
44
|
-
result['data']['notifications'].to_s.include?(pattern)
|
45
|
-
end
|
46
|
-
|
47
|
-
##
|
48
|
-
# @param data optional [Hash]
|
49
|
-
# @return [String] jsend json
|
50
|
-
def success_json(data = nil)
|
51
|
-
raise ArgumentError, 'Optional data argument should be of type Hash' if invalid_hash?(data)
|
52
|
-
return JSON.generate({
|
53
|
-
:status => 'success',
|
54
|
-
:data => data
|
55
|
-
})
|
56
|
-
end
|
57
|
-
|
58
|
-
##
|
59
|
-
# @param data optional [Hash]
|
60
|
-
# @return [String] jsend json
|
61
|
-
def fail_json(data = nil)
|
62
|
-
raise ArgumentError, 'Optional data argument should be of type Hash' if invalid_hash?(data)
|
63
|
-
return JSON.generate({
|
64
|
-
:status => 'fail',
|
65
|
-
:data => data
|
66
|
-
})
|
67
|
-
end
|
68
|
-
|
69
|
-
##
|
70
|
-
# @param msg [String]
|
71
|
-
# @param code optional [Integer]
|
72
|
-
# @param data optional [Hash]
|
73
|
-
# @return [String] jsend json
|
74
|
-
def error_json(msg, code = nil, data = nil)
|
75
|
-
code, data = validate_and_sanitize(msg, code, data)
|
76
|
-
jsend = {
|
77
|
-
:status => 'error',
|
78
|
-
:message => msg
|
79
|
-
}
|
80
|
-
generate_error_json(jsend, code, data)
|
81
|
-
end
|
82
|
-
|
83
|
-
private
|
84
|
-
|
85
|
-
def invalid_integer?(value)
|
86
|
-
(not value.nil?) and (not value.is_a? Integer)
|
87
|
-
end
|
88
|
-
|
89
|
-
def invalid_hash?(data)
|
90
|
-
if not data.nil?
|
91
|
-
return true if not data.is_a? Hash
|
92
|
-
end
|
93
|
-
false
|
94
|
-
end
|
95
|
-
|
96
|
-
def generate_error_json(jsend, code, data)
|
97
|
-
jsend['code'] = code unless code.nil?
|
98
|
-
jsend['data'] = data unless data.nil?
|
99
|
-
return JSON.generate(jsend)
|
100
|
-
end
|
101
|
-
|
102
|
-
def validate_and_sanitize(msg, code, data)
|
103
|
-
validate_message(msg)
|
104
|
-
code, data = set_code_and_data(code, data)
|
105
|
-
validate_data(data)
|
106
|
-
validate_code(code)
|
107
|
-
return code, data
|
108
|
-
end
|
109
|
-
|
110
|
-
def set_code_and_data(code, data)
|
111
|
-
code, data = nil, code if not code.is_a? Integer and code.is_a? Hash and data.nil?
|
112
|
-
return code, data
|
113
|
-
end
|
114
|
-
|
115
|
-
def validate_message(msg)
|
116
|
-
raise ArgumentError, 'Missing required message of type String' if msg.empty? or not msg.is_a? String
|
117
|
-
end
|
118
|
-
|
119
|
-
def validate_data(data)
|
120
|
-
raise ArgumentError, 'Optional data argument should be of type Hash' if invalid_hash?(data)
|
121
|
-
end
|
122
|
-
|
123
|
-
def validate_code(code)
|
124
|
-
raise ArgumentError, 'Optional code argument should be of type Integer' if invalid_integer?(code)
|
125
|
-
end
|
126
|
-
|
127
|
-
def compile_data(result)
|
128
|
-
data ||= {}
|
129
|
-
result = {'result' => result} unless result.is_a? Hash
|
130
|
-
result.each do |key, value|
|
131
|
-
data[key] = value
|
132
|
-
end
|
133
|
-
data
|
134
|
-
end
|
135
|
-
|
136
6
|
end
|
data/lib/jsender/json.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Jsender
|
4
|
+
module Json
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def error(message: "An error has occurred")
|
8
|
+
{
|
9
|
+
'status' => 'error',
|
10
|
+
'message' => message
|
11
|
+
}.to_json
|
12
|
+
end
|
13
|
+
|
14
|
+
def failure(message: "A failure has occurred")
|
15
|
+
{
|
16
|
+
'status' => 'fail',
|
17
|
+
'data' => {
|
18
|
+
'message' => message
|
19
|
+
}
|
20
|
+
}.to_json
|
21
|
+
end
|
22
|
+
|
23
|
+
def success(data: nil)
|
24
|
+
{
|
25
|
+
'status' => 'success',
|
26
|
+
'data' => data
|
27
|
+
}.to_json
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/jsender/rack.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
module Jsender
|
2
|
+
module Rack
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def error(code: 500, flow_id: nil, message: "An error has occurred", body_as_array: false)
|
6
|
+
[
|
7
|
+
code,
|
8
|
+
headers(flow_id: flow_id),
|
9
|
+
body(data: Jsender::Json.error(message: message), body_as_array: body_as_array)
|
10
|
+
]
|
11
|
+
end
|
12
|
+
|
13
|
+
def failure(code: 400, flow_id: nil, message: "A failure has occurred", body_as_array: false)
|
14
|
+
[
|
15
|
+
code,
|
16
|
+
headers(flow_id: flow_id),
|
17
|
+
body(data: Jsender::Json.failure(message: message), body_as_array: body_as_array)
|
18
|
+
]
|
19
|
+
end
|
20
|
+
|
21
|
+
def success(code: 200, flow_id: nil, data: nil, body_as_array: false)
|
22
|
+
[
|
23
|
+
code,
|
24
|
+
headers(flow_id: flow_id),
|
25
|
+
body(data: Jsender::Json.success(data: data), body_as_array: body_as_array)
|
26
|
+
]
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def body(data:, body_as_array: false)
|
32
|
+
return [data] if body_as_array
|
33
|
+
data
|
34
|
+
end
|
35
|
+
|
36
|
+
def headers(flow_id:)
|
37
|
+
{
|
38
|
+
'Content-Type' => 'application/json',
|
39
|
+
'X-Flow-Identifier' => flow_id
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
data/lib/jsender/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsender
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
8
|
-
- Charles Mulder
|
7
|
+
- Hetzner Seals Team
|
9
8
|
autorequire:
|
10
9
|
bindir: exe
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2018-01-18 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bundler
|
@@ -81,10 +80,10 @@ dependencies:
|
|
81
80
|
- - ">="
|
82
81
|
- !ruby/object:Gem::Version
|
83
82
|
version: '0'
|
84
|
-
description: JSender facilitates a simple jsend implementation for ruby
|
83
|
+
description: JSender facilitates a simple jsend implementation for ruby with json
|
84
|
+
and rack helpers
|
85
85
|
email:
|
86
|
-
-
|
87
|
-
- charles.mulder@hetzner.co.za
|
86
|
+
- seals@hetzner.co.za
|
88
87
|
executables: []
|
89
88
|
extensions: []
|
90
89
|
extra_rdoc_files: []
|
@@ -92,7 +91,6 @@ files:
|
|
92
91
|
- ".gitignore"
|
93
92
|
- ".rspec"
|
94
93
|
- ".travis.yml"
|
95
|
-
- CODE_OF_CONDUCT.md
|
96
94
|
- Gemfile
|
97
95
|
- LICENSE.txt
|
98
96
|
- README.md
|
@@ -101,6 +99,8 @@ files:
|
|
101
99
|
- bin/setup
|
102
100
|
- jsender.gemspec
|
103
101
|
- lib/jsender.rb
|
102
|
+
- lib/jsender/json.rb
|
103
|
+
- lib/jsender/rack.rb
|
104
104
|
- lib/jsender/version.rb
|
105
105
|
homepage: https://github.com/hetznerZA/jsender
|
106
106
|
licenses:
|
@@ -122,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
122
122
|
version: '0'
|
123
123
|
requirements: []
|
124
124
|
rubyforge_project:
|
125
|
-
rubygems_version: 2.6.
|
125
|
+
rubygems_version: 2.6.13
|
126
126
|
signing_key:
|
127
127
|
specification_version: 4
|
128
128
|
summary: JSender facilitates a simple jsend implementation for ruby
|
data/CODE_OF_CONDUCT.md
DELETED
File without changes
|