jsonapi-utils 0.1.3 → 0.2.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/jsonapi-utils.gemspec +1 -1
- data/lib/jsonapi/utils.rb +57 -17
- data/lib/jsonapi/utils/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbc9435ea77e7a938e5c3cd34b701e48509294aa
|
4
|
+
data.tar.gz: af2c51ee9c5bb6f5baffa1aa8bec5706befd546f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f60cd55bdc532063292bdddb6fca175f25d9b82d8fc3d1359481f053499b13eae60174884fd77847131ec3996f5f7ec4e9ca50f5f20c04d51cd0dc036de9aaed
|
7
|
+
data.tar.gz: c37add6ab91aa7a08c2c49131eea9ce478f403250a43cafaed81d3d39273de1db5bf330aadafe5028a502c07e78eeef84cf417583bc7fb7d83b6db2d050b99b3
|
data/jsonapi-utils.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["tiagopog@gmail.com", "douglas@beautydate.com.br"]
|
11
11
|
|
12
12
|
spec.summary = %q{Full-featured JSON API serialization in a simple way}
|
13
|
-
spec.description = %q{A Rails-
|
13
|
+
spec.description = %q{A Rails-way to get your API's data serialized following the JSON API's specs (http://jsosapi.org)}
|
14
14
|
spec.homepage = "https://github.com/b2beauty/jsonapi-utils"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
data/lib/jsonapi/utils.rb
CHANGED
@@ -10,23 +10,40 @@ module JSONAPI
|
|
10
10
|
|
11
11
|
def jsonapi_render(options)
|
12
12
|
if options.has_key?(:json)
|
13
|
-
|
14
|
-
render json:
|
13
|
+
response = build_response(options)
|
14
|
+
render json: response[:body], status: options[:status] || response[:status] || :ok
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
def jsonapi_render_not_found
|
19
|
+
jsonapi_render json: nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def jsonapi_render_not_found_with_null
|
23
|
+
jsonapi_render json: nil, options: { allow_null: true }
|
24
|
+
end
|
25
|
+
|
18
26
|
def jsonapi_serialize(records, options = {})
|
19
|
-
|
27
|
+
return build_nil if records.nil? && options[:allow_null]
|
20
28
|
results = JSONAPI::OperationResults.new
|
21
29
|
|
22
|
-
if records.
|
23
|
-
|
24
|
-
|
25
|
-
results.add_result(JSONAPI::
|
30
|
+
if records.nil?
|
31
|
+
id = extract_ids(@request.params)
|
32
|
+
record_not_found = JSONAPI::Exceptions::RecordNotFound.new(id)
|
33
|
+
results.add_result(JSONAPI::ErrorsOperationResult.new(record_not_found.errors[0].code, record_not_found.errors))
|
26
34
|
else
|
27
|
-
|
28
|
-
|
35
|
+
fix_request_options(params, records)
|
36
|
+
|
37
|
+
if records.respond_to?(:to_ary)
|
38
|
+
records = fix_when_hash(records, options) if records.all? { |e| e.is_a?(Hash) }
|
39
|
+
@resources = build_collection(records, options)
|
40
|
+
results.add_result(JSONAPI::ResourcesOperationResult.new(:ok, @resources, result_options(options)))
|
41
|
+
else
|
42
|
+
@resource = turn_into_resource(records, options)
|
43
|
+
results.add_result(JSONAPI::ResourceOperationResult.new(:ok, @resource))
|
44
|
+
end
|
29
45
|
end
|
46
|
+
|
30
47
|
create_response_document(results).contents
|
31
48
|
end
|
32
49
|
|
@@ -36,6 +53,22 @@ module JSONAPI
|
|
36
53
|
|
37
54
|
private
|
38
55
|
|
56
|
+
def build_response(options)
|
57
|
+
{
|
58
|
+
body: jsonapi_serialize(options[:json], options[:options] || {}),
|
59
|
+
status: options[:json].nil? && !options[:allow_null] ? :not_found : :ok
|
60
|
+
}
|
61
|
+
end
|
62
|
+
|
63
|
+
def build_nil
|
64
|
+
{ data: nil }
|
65
|
+
end
|
66
|
+
|
67
|
+
def extract_ids(hash)
|
68
|
+
ids = hash.keys.select { |e| e =~ /id$/i }.map { |e| hash[e] }
|
69
|
+
ids.first rescue '(id not identified)'
|
70
|
+
end
|
71
|
+
|
39
72
|
def fix_request_options(params, records)
|
40
73
|
return if request.method !~ /get/i ||
|
41
74
|
params.nil? ||
|
@@ -62,31 +95,38 @@ module JSONAPI
|
|
62
95
|
@paginator ||= paginator(params)
|
63
96
|
if @paginator && JSONAPI.configuration.top_level_links_include_pagination
|
64
97
|
options = {}
|
65
|
-
|
98
|
+
@paginator.class.requires_record_count &&
|
99
|
+
options[:record_count] = count_records(@resources, options)
|
66
100
|
return @paginator.links_page_params(options)
|
67
101
|
else
|
68
102
|
return {}
|
69
103
|
end
|
70
104
|
end
|
71
105
|
|
72
|
-
|
73
106
|
def build_collection(records, options = {})
|
74
|
-
return []
|
75
|
-
|
76
|
-
|
77
|
-
|
107
|
+
return [] if records.nil? || records.empty?
|
108
|
+
JSONAPI.configuration.default_paginator == :none ||
|
109
|
+
records = paginator(@request.params).apply(records, nil)
|
110
|
+
records.map { |record| turn_into_resource(record, options) }
|
78
111
|
end
|
79
112
|
|
80
113
|
def turn_into_resource(record, options = {})
|
81
114
|
if options[:resource]
|
82
|
-
options[:resource].new(record)
|
115
|
+
options[:resource].to_s.constantize.new(record)
|
83
116
|
else
|
84
117
|
@request.resource_klass.new(record)
|
85
118
|
end
|
86
119
|
end
|
87
120
|
|
88
121
|
def paginator(params)
|
89
|
-
|
122
|
+
page_params = ActionController::Parameters.new(params[:page])
|
123
|
+
|
124
|
+
@paginator ||=
|
125
|
+
if JSONAPI.configuration.default_paginator == :paged
|
126
|
+
PagedPaginator.new(page_params)
|
127
|
+
elsif JSONAPI.configuration.default_paginator == :offset
|
128
|
+
OffsetPaginator.new(page_params)
|
129
|
+
end
|
90
130
|
end
|
91
131
|
|
92
132
|
def fix_when_hash(records, options)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi-utils
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tiago Guedes
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-09-
|
12
|
+
date: 2015-09-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -53,8 +53,8 @@ dependencies:
|
|
53
53
|
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
|
-
description: A Rails-
|
57
|
-
|
56
|
+
description: A Rails-way to get your API's data serialized following the JSON API's
|
57
|
+
specs (http://jsosapi.org)
|
58
58
|
email:
|
59
59
|
- tiagopog@gmail.com
|
60
60
|
- douglas@beautydate.com.br
|