simple_json_api 0.0.3 → 0.0.4
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/Gemfile +14 -2
- data/README.md +1 -1
- data/lib/generators/simple_json_api/resource/USAGE +8 -0
- data/lib/generators/simple_json_api/resource/resource_generator.rb +73 -0
- data/lib/generators/simple_json_api/resource/templates/controller_template.rb.erb +34 -0
- data/lib/generators/simple_json_api/resource/templates/serializer_template.rb.erb +14 -0
- data/lib/simple_json_api/api_node.rb +68 -0
- data/lib/simple_json_api/array_serializer.rb +15 -1
- data/lib/simple_json_api/association.rb +16 -0
- data/lib/simple_json_api/attribute.rb +9 -0
- data/lib/simple_json_api/builder.rb +35 -0
- data/lib/simple_json_api/dsl.rb +35 -5
- data/lib/simple_json_api/field_list.rb +2 -7
- data/lib/simple_json_api/helper.rb +5 -0
- data/lib/simple_json_api/include_list.rb +12 -7
- data/lib/simple_json_api/json_api_wrapper.rb +46 -0
- data/lib/simple_json_api/member/data.rb +14 -0
- data/lib/simple_json_api/member/included.rb +38 -0
- data/lib/simple_json_api/member/links.rb +9 -0
- data/lib/simple_json_api/member/meta.rb +9 -0
- data/lib/simple_json_api/refinements/active_record.rb +23 -0
- data/lib/simple_json_api/refinements/array.rb +13 -0
- data/lib/simple_json_api/refinements/symbol.rb +17 -0
- data/lib/simple_json_api/resource.rb +23 -0
- data/lib/simple_json_api/resource_serializer.rb +25 -24
- data/lib/simple_json_api/serializer.rb +39 -2
- data/lib/simple_json_api/serializer_factory.rb +22 -0
- data/lib/simple_json_api/version.rb +1 -1
- data/lib/simple_json_api.rb +7 -29
- data/simple_json_api.gemspec +2 -7
- data/test/generators/simple_json_api/resource_generator_test.rb +31 -0
- data/test/integration/render_basic_test.rb +10 -7
- data/test/integration/render_fields_test.rb +35 -16
- data/test/integration/render_include_test.rb +66 -63
- data/test/integration/render_nested_include_test.rb +38 -83
- data/test/integration/serializers_test.rb +1 -1
- data/test/setup/data.rb +7 -3
- data/test/setup/serializers.rb +2 -0
- data/test/test_helper.rb +3 -9
- data/test/unit/field_list_test.rb +0 -10
- data/test/unit/include_list_test.rb +35 -5
- data/test/unit/symbol_refinement_test.rb +16 -0
- metadata +25 -89
- data/lib/simple_json_api/active_record_refinements.rb +0 -21
- data/lib/simple_json_api/array_refinements.rb +0 -14
- data/lib/simple_json_api/json_api_builder.rb +0 -84
data/test/setup/data.rb
CHANGED
@@ -15,10 +15,14 @@ list1 = project1.create_todolist(id: 200, description: 'Groceries')
|
|
15
15
|
list1.tags << tag3
|
16
16
|
todo1 = list1.todos.create(id: 300, action: 'Milk')
|
17
17
|
todo1.tags << tag1
|
18
|
-
todo1.tags <<
|
18
|
+
todo1.tags << tag3
|
19
|
+
|
20
|
+
todo2 = list1.todos.create(id: 301, action: 'Bread')
|
21
|
+
todo2.tags << tag1
|
22
|
+
|
19
23
|
|
20
24
|
list2 = project2.create_todolist(id: 210, description: 'Work')
|
21
25
|
list2.todos.create(id: 310, action: 'Timesheet')
|
22
26
|
list2.todos.create(id: 320, action: 'Meeting')
|
23
|
-
|
24
|
-
|
27
|
+
todo3 = list2.todos.create(id: 330, action: 'Present Agenda')
|
28
|
+
todo3.tags << tag1
|
data/test/setup/serializers.rb
CHANGED
@@ -20,6 +20,7 @@ end
|
|
20
20
|
# TodoSerializer for testing
|
21
21
|
class TodoSerializer < SimpleJsonApi::ResourceSerializer
|
22
22
|
serializes :todos, model: Todo
|
23
|
+
default_fields %w(id action)
|
23
24
|
attribute :id
|
24
25
|
attribute :action
|
25
26
|
attribute :location
|
@@ -45,6 +46,7 @@ end
|
|
45
46
|
# ProjectSerializer for testing
|
46
47
|
class ProjectSerializer < SimpleJsonApi::ResourceSerializer
|
47
48
|
serializes :projects, model: Project
|
49
|
+
required_associations %w(todolists)
|
48
50
|
attribute :id
|
49
51
|
attribute :name, key: :project_name
|
50
52
|
attribute :description
|
data/test/test_helper.rb
CHANGED
@@ -22,13 +22,7 @@ Minitest::Reporters.use!(
|
|
22
22
|
require 'ap'
|
23
23
|
require 'simple_json_api'
|
24
24
|
require 'test_setup'
|
25
|
-
require '
|
26
|
-
|
27
|
-
|
28
|
-
# compare_json(actual_projects, expected_projects.to_json)
|
29
|
-
def compare_json(actual_json, expected_json)
|
30
|
-
actual_pretty = JSON.pretty_generate(JSON.parse(actual_json))
|
31
|
-
expected_pretty = JSON.pretty_generate(JSON.parse(expected_json))
|
32
|
-
diff = Diffy::Diff.new(actual_pretty, expected_pretty)
|
33
|
-
puts "\n#{diff}\n" unless diff.to_s.empty?
|
25
|
+
require 'minitest-match_json'
|
26
|
+
Minitest::MatchJson.configure do |config|
|
27
|
+
config.format = :color
|
34
28
|
end
|
@@ -3,15 +3,6 @@ require 'test_helper'
|
|
3
3
|
# SimpleJsonApi
|
4
4
|
module SimpleJsonApi
|
5
5
|
describe 'FieldListTest' do
|
6
|
-
it 'should parse string field list' do
|
7
|
-
fl = FieldList.new(
|
8
|
-
'id,name',
|
9
|
-
ProjectSerializer
|
10
|
-
)
|
11
|
-
fl.fields_for(:projects).must_equal %w(id name)
|
12
|
-
fl.fields_for(:todos).must_equal nil
|
13
|
-
end
|
14
|
-
|
15
6
|
it 'should parse hash field list' do
|
16
7
|
fl = FieldList.new(
|
17
8
|
{
|
@@ -23,6 +14,5 @@ module SimpleJsonApi
|
|
23
14
|
fl.fields_for(:projects).must_equal %w(id name)
|
24
15
|
fl.fields_for(:todos).must_equal %w(id description)
|
25
16
|
end
|
26
|
-
|
27
17
|
end
|
28
18
|
end
|
@@ -5,15 +5,45 @@ module SimpleJsonApi
|
|
5
5
|
describe 'IncludeListTest' do
|
6
6
|
it 'should parse string include list' do
|
7
7
|
il = IncludeList.new('todos,projects').parse
|
8
|
-
|
9
|
-
|
8
|
+
expected = {
|
9
|
+
todos: {
|
10
|
+
include: true
|
11
|
+
},
|
12
|
+
projects: {
|
13
|
+
include: true
|
14
|
+
}
|
15
|
+
}
|
16
|
+
il.include_hash.must_equal expected
|
10
17
|
end
|
11
18
|
|
12
19
|
it 'should parse string for nested include list' do
|
13
20
|
il = IncludeList.new('todos,projects.todolists').parse
|
14
|
-
|
15
|
-
|
16
|
-
|
21
|
+
expected = {
|
22
|
+
todos: {
|
23
|
+
include: true
|
24
|
+
},
|
25
|
+
projects: {
|
26
|
+
todolists: {
|
27
|
+
include: true
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
il.include_hash.must_equal expected
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should parse string for nested include list skipping middle' do
|
35
|
+
il = IncludeList.new('todolist,todolist.todos.tags').parse
|
36
|
+
expected = {
|
37
|
+
todolists: {
|
38
|
+
include: true,
|
39
|
+
todos: {
|
40
|
+
tags: {
|
41
|
+
include: true
|
42
|
+
}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
il.include_hash.must_equal expected
|
17
47
|
end
|
18
48
|
end
|
19
49
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'simple_json_api/refinements/symbol'
|
3
|
+
|
4
|
+
# SimpleJsonApi
|
5
|
+
module SimpleJsonApi
|
6
|
+
describe 'SymbolRefinementTest' do
|
7
|
+
using Refinements::Symbol
|
8
|
+
it 'should pluralize a symbol' do
|
9
|
+
:dog.pluralize.must_equal(:dogs)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should singularize a symbol' do
|
13
|
+
:dogs.singularize.must_equal(:dog)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_json_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gary Gordon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -52,90 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '10.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: rdoc
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: awesome_print
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: diffy
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: minitest
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: minitest-reporters
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - ">="
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - ">="
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: sqlite3
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ">="
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
132
|
-
type: :development
|
133
|
-
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ">="
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
55
|
description: A basic serializer implementing the JSON API spec.
|
140
56
|
email:
|
141
57
|
- gfgordon@gmail.com
|
@@ -152,19 +68,36 @@ files:
|
|
152
68
|
- LICENSE.txt
|
153
69
|
- README.md
|
154
70
|
- Rakefile
|
71
|
+
- lib/generators/simple_json_api/resource/USAGE
|
72
|
+
- lib/generators/simple_json_api/resource/resource_generator.rb
|
73
|
+
- lib/generators/simple_json_api/resource/templates/controller_template.rb.erb
|
74
|
+
- lib/generators/simple_json_api/resource/templates/serializer_template.rb.erb
|
155
75
|
- lib/simple_json_api.rb
|
156
|
-
- lib/simple_json_api/
|
157
|
-
- lib/simple_json_api/array_refinements.rb
|
76
|
+
- lib/simple_json_api/api_node.rb
|
158
77
|
- lib/simple_json_api/array_serializer.rb
|
78
|
+
- lib/simple_json_api/association.rb
|
79
|
+
- lib/simple_json_api/attribute.rb
|
80
|
+
- lib/simple_json_api/builder.rb
|
159
81
|
- lib/simple_json_api/dsl.rb
|
160
82
|
- lib/simple_json_api/field_list.rb
|
83
|
+
- lib/simple_json_api/helper.rb
|
161
84
|
- lib/simple_json_api/include_list.rb
|
162
|
-
- lib/simple_json_api/
|
85
|
+
- lib/simple_json_api/json_api_wrapper.rb
|
86
|
+
- lib/simple_json_api/member/data.rb
|
87
|
+
- lib/simple_json_api/member/included.rb
|
88
|
+
- lib/simple_json_api/member/links.rb
|
89
|
+
- lib/simple_json_api/member/meta.rb
|
90
|
+
- lib/simple_json_api/refinements/active_record.rb
|
91
|
+
- lib/simple_json_api/refinements/array.rb
|
92
|
+
- lib/simple_json_api/refinements/symbol.rb
|
93
|
+
- lib/simple_json_api/resource.rb
|
163
94
|
- lib/simple_json_api/resource_serializer.rb
|
164
95
|
- lib/simple_json_api/serializer.rb
|
96
|
+
- lib/simple_json_api/serializer_factory.rb
|
165
97
|
- lib/simple_json_api/version.rb
|
166
98
|
- simple_json_api.gemspec
|
167
99
|
- test/fixtures/projects.yml
|
100
|
+
- test/generators/simple_json_api/resource_generator_test.rb
|
168
101
|
- test/integration/render_basic_test.rb
|
169
102
|
- test/integration/render_fields_test.rb
|
170
103
|
- test/integration/render_include_test.rb
|
@@ -181,6 +114,7 @@ files:
|
|
181
114
|
- test/unit/attribute_test.rb
|
182
115
|
- test/unit/field_list_test.rb
|
183
116
|
- test/unit/include_list_test.rb
|
117
|
+
- test/unit/symbol_refinement_test.rb
|
184
118
|
homepage: ''
|
185
119
|
licenses:
|
186
120
|
- MIT
|
@@ -207,6 +141,7 @@ specification_version: 4
|
|
207
141
|
summary: A Simple JSON API Serializer.
|
208
142
|
test_files:
|
209
143
|
- test/fixtures/projects.yml
|
144
|
+
- test/generators/simple_json_api/resource_generator_test.rb
|
210
145
|
- test/integration/render_basic_test.rb
|
211
146
|
- test/integration/render_fields_test.rb
|
212
147
|
- test/integration/render_include_test.rb
|
@@ -223,3 +158,4 @@ test_files:
|
|
223
158
|
- test/unit/attribute_test.rb
|
224
159
|
- test/unit/field_list_test.rb
|
225
160
|
- test/unit/include_list_test.rb
|
161
|
+
- test/unit/symbol_refinement_test.rb
|
@@ -1,21 +0,0 @@
|
|
1
|
-
require 'active_record'
|
2
|
-
|
3
|
-
# SimpleJsonApi
|
4
|
-
module SimpleJsonApi
|
5
|
-
# Refinements on ActiveRecord
|
6
|
-
module ActiveRecordRefinements
|
7
|
-
refine ActiveRecord::Base do
|
8
|
-
def typed_json_id
|
9
|
-
[self.class.to_s.downcase.pluralize, json_id]
|
10
|
-
end
|
11
|
-
|
12
|
-
def json_id
|
13
|
-
send(json_pk).to_s
|
14
|
-
end
|
15
|
-
|
16
|
-
def json_pk
|
17
|
-
self.class.primary_key.to_sym
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
require 'active_record'
|
2
|
-
|
3
|
-
# SimpleJsonApi
|
4
|
-
module SimpleJsonApi
|
5
|
-
# Refinements on Hash
|
6
|
-
module ArrayRefinements
|
7
|
-
refine Array do
|
8
|
-
using ActiveRecordRefinements
|
9
|
-
def already_linked?(key, id)
|
10
|
-
find { |elem| elem[key] == id }
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
# SimpleJsonApi
|
2
|
-
module SimpleJsonApi
|
3
|
-
# The Builder to walk the hierarchy and contruct the JSON
|
4
|
-
class JsonApiBuilder
|
5
|
-
using ActiveRecordRefinements
|
6
|
-
using ArrayRefinements
|
7
|
-
|
8
|
-
extend Forwardable
|
9
|
-
|
10
|
-
attr_reader :serializer
|
11
|
-
attr_reader :model
|
12
|
-
attr_reader :_included_resources
|
13
|
-
attr_reader :include
|
14
|
-
attr_reader :field_list
|
15
|
-
attr_reader :result
|
16
|
-
|
17
|
-
def_delegators :@field_list, :fields_for
|
18
|
-
|
19
|
-
# TODO: sort: nil
|
20
|
-
def initialize(model, serializer, options = {})
|
21
|
-
@model = model
|
22
|
-
handle_options(options, serializer)
|
23
|
-
@serializer = get_serializer(serializer)
|
24
|
-
@_included_resources = {}
|
25
|
-
@result = {}
|
26
|
-
@linked = {}
|
27
|
-
end
|
28
|
-
|
29
|
-
def handle_options(options, serializer)
|
30
|
-
@field_list = FieldList.new(
|
31
|
-
options.fetch(:fields, nil),
|
32
|
-
serializer
|
33
|
-
)
|
34
|
-
@include = IncludeList.new(options.fetch(:include, nil)).parse
|
35
|
-
end
|
36
|
-
|
37
|
-
def as_json(options = nil)
|
38
|
-
build.as_json(options)
|
39
|
-
end
|
40
|
-
|
41
|
-
def build
|
42
|
-
result[@serializer._root_name] = @serializer.serialize
|
43
|
-
@result[:linked] = @linked unless @linked.empty?
|
44
|
-
@result
|
45
|
-
end
|
46
|
-
|
47
|
-
def add_linked_elem(elem, obj, association, base)
|
48
|
-
resource_name = elem.to_s.pluralize
|
49
|
-
obj = Array(obj) unless obj.respond_to?(:each)
|
50
|
-
obj.each do |item|
|
51
|
-
serialize_association(item, resource_name, association, base)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def serialize_association(item, resource_name, association, base)
|
56
|
-
# TODO: don't include middle unless explicitly requested.
|
57
|
-
return unless include.include?(resource_name, base)
|
58
|
-
assoc_base = [base, resource_name].compact.join('.')
|
59
|
-
serializer = ResourceSerializer.for(item, association)
|
60
|
-
add_to_linked(assoc_base, item, serializer)
|
61
|
-
end
|
62
|
-
|
63
|
-
def add_to_linked(assoc_base, item, serializer)
|
64
|
-
linked = @linked[serializer._root_name] ||= []
|
65
|
-
return if linked.already_linked?(item.json_pk, item.json_id)
|
66
|
-
linked << serializer.new(item, self, nil, assoc_base).serialize
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def get_serializer(serializer)
|
72
|
-
if use_array_serializer?
|
73
|
-
ArraySerializer.new(@model, self, serializer)
|
74
|
-
else
|
75
|
-
serializer.new(@model, self)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def use_array_serializer?
|
80
|
-
@model.is_a?(Array) ||
|
81
|
-
@model.is_a?(ActiveRecord::Associations::CollectionProxy)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|