jsonapi-client 0.1.1.beta1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b2e9034a41c293b47e0e8316f9f44b61769b1d99
4
+ data.tar.gz: 457f801e7143c2e03f25716590ced6315acfc855
5
+ SHA512:
6
+ metadata.gz: abba8780cd184a180682b68c9f1d3f72754c618a344477c7b32ff4d3d962031a6c1e0e4927d2352f93d866aa4a1b4f69231ac5037ea5bbe42982466e4992322c
7
+ data.tar.gz: 0dbaf0e531dd275d687c971af1157dcac0b6c39d016a58023838e897544ff8600e0cba0e26d068824432bb71a62c5d71542123ae1f0cb0503ceffe791cc58be3
@@ -0,0 +1,121 @@
1
+ # jsonapi-client
2
+ Ruby gem for consuming [JSON API](http://jsonapi.org) documents.
3
+
4
+ ## Status
5
+
6
+ [![Gem Version](https://badge.fury.io/rb/jsonapi-client.svg)](https://badge.fury.io/rb/jsonapi-client)
7
+ [![Build Status](https://secure.travis-ci.org/jsonapi-rb/client.svg?branch=master)](http://travis-ci.org/jsonapi-rb/client?branch=master)
8
+
9
+ ## Installation
10
+ ```ruby
11
+ # In Gemfile
12
+ gem 'jsonapi-client'
13
+ ```
14
+ then
15
+ ```
16
+ $ bundle
17
+ ```
18
+ or manually via
19
+ ```
20
+ $ gem install jsonapi-client
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ First, require the gem:
26
+ ```ruby
27
+ require 'jsonapi/client'
28
+ ```
29
+
30
+ Then
31
+ ```ruby
32
+ payload = {
33
+ "links" => {
34
+ "self" => "http://example.com/articles",
35
+ "next" => "http://example.com/articles?page[offset]=2",
36
+ "last" => "http://example.com/articles?page[offset]=10"
37
+ },
38
+ "data" => [
39
+ {
40
+ "type" => "articles",
41
+ "id" => "1",
42
+ "attributes" => {
43
+ "title" => "JSON API paints my bikeshed!"
44
+ },
45
+ "relationships" => {
46
+ "author" => {
47
+ "links" => {
48
+ "self" => "http://example.com/articles/1/relationships/author",
49
+ "related" => "http://example.com/articles/1/author"
50
+ },
51
+ "data" => { "type" => "people", "id" => "9" }
52
+ },
53
+ "comments" => {
54
+ "links" => {
55
+ "self" => "http://example.com/articles/1/relationships/comments",
56
+ "related" => "http://example.com/articles/1/comments"
57
+ },
58
+ "data" => [
59
+ { "type" => "comments", "id" => "5" },
60
+ { "type" => "comments", "id" => "12" }
61
+ ]
62
+ }
63
+ },
64
+ "links" => {
65
+ "self" => "http://example.com/articles/1"
66
+ }
67
+ }
68
+ ],
69
+ "included" => [
70
+ {
71
+ "type" => "people",
72
+ "id" => "9",
73
+ "attributes" => {
74
+ "first-name" => "Dan",
75
+ "last-name" => "Gebhardt",
76
+ "twitter" => "dgeb"
77
+ },
78
+ "links" => {
79
+ "self" => "http://example.com/people/9"
80
+ }
81
+ }, {
82
+ "type" => "comments",
83
+ "id" => "5",
84
+ "attributes" => {
85
+ "body" => "First!"
86
+ },
87
+ "relationships" => {
88
+ "author" => {
89
+ "data" => { "type" => "people", "id" => "2" }
90
+ }
91
+ },
92
+ "links" => {
93
+ "self" => "http://example.com/comments/5"
94
+ }
95
+ }, {
96
+ "type" => "comments",
97
+ "id" => "12",
98
+ "attributes" => {
99
+ "body" => "I like XML better"
100
+ },
101
+ "relationships" => {
102
+ "author" => {
103
+ "data" => { "type" => "people", "id" => "9" }
104
+ }
105
+ },
106
+ "links" => {
107
+ "self" => "http://example.com/comments/12"
108
+ }
109
+ }
110
+ ]
111
+ }
112
+
113
+ document = JSONAPI::Client::Document.new(json_hash)
114
+
115
+ document.data[0].relationships['author'].data.attributes['first-name']
116
+ # => "Dan"
117
+ ```
118
+
119
+ ## License
120
+
121
+ jsonapi-client is released under the [MIT License](http://www.opensource.org/licenses/MIT).
@@ -0,0 +1,7 @@
1
+ require 'jsonapi/parser'
2
+
3
+ require 'jsonapi/client/document'
4
+ require 'jsonapi/client/resource'
5
+ require 'jsonapi/client/relationship'
6
+ require 'jsonapi/client/link'
7
+ require 'jsonapi/client/error'
@@ -0,0 +1,63 @@
1
+ module JSONAPI
2
+ module Client
3
+ class Document
4
+ attr_reader :data, :included, :errors, :links, :meta
5
+
6
+ def initialize(document, link_data = true)
7
+ JSONAPI::Parser::Document.parse!(document)
8
+ parse_data!(document['data'], document['included'])
9
+ link_data! if link_data
10
+ parse_errors!(document['errors'])
11
+ parse_links!(document['links'])
12
+ parse_meta!(document['meta'])
13
+ end
14
+
15
+ private
16
+
17
+ def parse_data!(data, included)
18
+ return unless data
19
+ @data =
20
+ if data.respond_to?(:each)
21
+ data.map { |h| Resource.new(h) }
22
+ else
23
+ Resource.new(data)
24
+ end
25
+ @included = Array(included).map { |h| Resource.new(h) }
26
+ end
27
+
28
+ def index
29
+ return @index unless @index.nil?
30
+ @index = {}
31
+ (Array(@data) + @included).each do |resource|
32
+ resource_identifier = [resource.type, resource.id]
33
+ @index[resource_identifier] = resource
34
+ end
35
+
36
+ @index
37
+ end
38
+
39
+ def link_data!
40
+ (Array(@data) + @included).each do |resource|
41
+ resource.relationships.each do |_, rel|
42
+ rel.link_data!(index)
43
+ end
44
+ end
45
+ end
46
+
47
+ def parse_errors!(errors)
48
+ @errors = Array(errors).map { |h| Error.new(h) }
49
+ end
50
+
51
+ def parse_links!(links)
52
+ @links = {}
53
+ (links || {}).map do |key, h|
54
+ @links[key] = Link.new(h)
55
+ end
56
+ end
57
+
58
+ def parse_meta!(meta)
59
+ @meta = meta
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,52 @@
1
+ module JSONAPI
2
+ module Client
3
+ class Error
4
+ attr_reader :id, :links, :status, :code, :title, :detail, :source, :meta
5
+
6
+ def initialize(error)
7
+ parse_id!(error['id'])
8
+ parse_links!(error['links'])
9
+ parse_status!(error['status'])
10
+ parse_code!(error['code'])
11
+ parse_title!(error['title'])
12
+ parse_detail!(error['detail'])
13
+ parse_source!(error['source'])
14
+ parse_meta!(error['meta'])
15
+ end
16
+
17
+ def parse_id!(id)
18
+ @id = id
19
+ end
20
+
21
+ def parse_links!(links)
22
+ (links || {}).map do |key, h|
23
+ @links[key] = Link.new(h)
24
+ end
25
+ end
26
+
27
+ def parse_status!(status)
28
+ @status = status
29
+ end
30
+
31
+ def parse_code!(code)
32
+ @code = code
33
+ end
34
+
35
+ def parse_title!(title)
36
+ @title = title
37
+ end
38
+
39
+ def parse_detail!(detail)
40
+ @detail = detail
41
+ end
42
+
43
+ def parse_source!(source)
44
+ @source = source
45
+ end
46
+
47
+ def parse_meta!(meta)
48
+ @meta = meta
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,26 @@
1
+ module JSONAPI
2
+ module Client
3
+ class Link
4
+ attr_reader :href, :meta
5
+
6
+ def initialize(relationship)
7
+ if relationship.is_a?(String)
8
+ parse_href!(relationship)
9
+ else
10
+ parse_href!(relationship['href'])
11
+ parse_meta!(relationship['meta'])
12
+ end
13
+ end
14
+
15
+ private
16
+
17
+ def parse_href!(href)
18
+ @href = href
19
+ end
20
+
21
+ def parse_meta!(meta)
22
+ @meta = meta
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,43 @@
1
+ module JSONAPI
2
+ module Client
3
+ class Relationship
4
+ attr_reader :data, :links, :meta
5
+
6
+ def initialize(relationship)
7
+ parse_data!(relationship['data'])
8
+ parse_links!(relationship['links'])
9
+ parse_meta!(relationship['meta'])
10
+ end
11
+
12
+ # @api private
13
+ def link_data!(index)
14
+ if @data.is_a?(Array)
15
+ @data.map! do |ri|
16
+ ri = [ri['type'], ri['id']]
17
+ index[ri]
18
+ end
19
+ elsif !@data.nil?
20
+ ri = [@data['type'], @data['id']]
21
+ @data = index[ri]
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def parse_data!(data)
28
+ @data = data
29
+ end
30
+
31
+ def parse_links!(links)
32
+ @links = {}
33
+ (links || {}).map do |key, h|
34
+ @links[key] = Link.new(h)
35
+ end
36
+ end
37
+
38
+ def parse_meta!(meta)
39
+ @meta = meta
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,40 @@
1
+ module JSONAPI
2
+ module Client
3
+ class Resource
4
+ attr_reader :id, :type, :attributes, :relationships, :links, :meta
5
+
6
+ def initialize(resource)
7
+ @id = resource['id']
8
+ @type = resource['type']
9
+ parse_attributes!(resource['attributes'])
10
+ parse_relationships!(resource['relationships'])
11
+ parse_links!(resource['links'])
12
+ parse_meta!(resource['meta'])
13
+ end
14
+
15
+ private
16
+
17
+ def parse_attributes!(attributes)
18
+ @attributes = attributes || {}
19
+ end
20
+
21
+ def parse_relationships!(relationships)
22
+ @relationships = {}
23
+ (relationships || {}).map do |key, h|
24
+ @relationships[key] = Relationship.new(h)
25
+ end
26
+ end
27
+
28
+ def parse_links!(links)
29
+ @links = {}
30
+ (links || {}).map do |key, h|
31
+ @links[key] = Link.new(h)
32
+ end
33
+ end
34
+
35
+ def parse_meta!(meta)
36
+ @meta = meta
37
+ end
38
+ end
39
+ end
40
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jsonapi-client
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1.beta1
5
+ platform: ruby
6
+ authors:
7
+ - Lucas Hosseini
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-10-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jsonapi-parser
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.1.beta2
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.1.beta2
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0.9'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.4'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.4'
55
+ description: Client library for the JSON API spec.
56
+ email: lucas.hosseini@gmail.com
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - README.md
62
+ - lib/jsonapi/client.rb
63
+ - lib/jsonapi/client/document.rb
64
+ - lib/jsonapi/client/error.rb
65
+ - lib/jsonapi/client/link.rb
66
+ - lib/jsonapi/client/relationship.rb
67
+ - lib/jsonapi/client/resource.rb
68
+ homepage: https://github.com/jsonapi-rb/client
69
+ licenses:
70
+ - MIT
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">"
84
+ - !ruby/object:Gem::Version
85
+ version: 1.3.1
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.5.1
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: Consume JSON API documents.
92
+ test_files: []