json_roa-client 1.0.0.pre.beta.0 → 1.0.0.pre.beta.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cdb807bb844107ea3e10f62f2abb7e779cec235a
4
- data.tar.gz: 0c7ca17cf23edd53294942f1d3b4ab159b8c161c
3
+ metadata.gz: a343d233e0c8c79b865158eefdfa6294c079ba80
4
+ data.tar.gz: d3c1da41839add17ac785165b4e3e8696d1352b3
5
5
  SHA512:
6
- metadata.gz: 8d86b3da965f3688cc2d7d9b44a96b5b98c309266c2d9b34f3ad796d4261e5325ea4ac7d667873f56bc6e6c71daed46e68902fecee7b2ec829a919fe3df7a3c9
7
- data.tar.gz: 7bbbe259b42137273fd758374cbe72dfebe8056339b981bcb2a3aec61eea5f6a23c89952cfd63525ae6ecf09ebbe3716ea4325dbc65afdc4b5d745775f1b16ba
6
+ metadata.gz: f1e660f2cbe03948725619ebee7f7d53467207f64119e693ea60c17f09197d21c9c573d46849dbef057c46ea7ec4e9cf924da18e4d3ad82121441cd858773894
7
+ data.tar.gz: cdae12606a74ce5a99b3ee3928cab9877500209292f719208db32090f0c22df9d9d49cc09ccc6c69e603a7414aaac5d1db2842d44a09028dc041ab4ff0b98fe5
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --format documentation
data/README.md CHANGED
@@ -9,7 +9,7 @@ A ruby client for `JSON_ROA`.
9
9
  ```ruby
10
10
  require 'json_roa/client'
11
11
 
12
- @root_resource = JSON_ROA::Client.connect @base_url do |conn|
12
+ @root_relation= JSON_ROA::Client.connect @base_url do |conn|
13
13
  conn.basic_auth(@username,@password)
14
14
  end
15
15
  ```
@@ -19,6 +19,12 @@ end
19
19
 
20
20
  ### Resources
21
21
 
22
+ #### Retrieving the Resource of the Root Relation
23
+
24
+ ```ruby
25
+ @root_resource= @root_relation.get()
26
+ ```
27
+
22
28
  #### Data
23
29
 
24
30
  ```ruby
@@ -20,11 +20,12 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.6"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
- spec.add_development_dependency "pry", "~> 0.10"
23
+ spec.add_development_dependency "pry", '~> 0.10'
24
+ spec.add_development_dependency 'simplecov', '~> 0.9'
25
+ spec.add_development_dependency 'rspec', '~> 3'
24
26
 
25
27
  spec.add_dependency 'addressable', '~> 2'
26
28
  spec.add_dependency 'faraday', '~> 0.9'
27
29
  spec.add_dependency 'faraday_middleware', '~> 0.9'
28
- # spec.add_dependency "pry", "~> 0.10"
29
30
 
30
31
  end
@@ -3,11 +3,8 @@ require 'addressable/uri'
3
3
 
4
4
  module JSON_ROA
5
5
  module Client
6
-
7
6
  class Relation
8
7
 
9
- SUPPORTED_METHODS= %w(get put post delete)
10
-
11
8
  attr_reader :data
12
9
  attr_reader :key
13
10
 
@@ -15,27 +12,35 @@ module JSON_ROA
15
12
  @conn= conn
16
13
  @key= key
17
14
  @data= data
15
+
16
+ Faraday::Connection::METHODS.intersection(available_methods) \
17
+ .each do |method_name|
18
+ define_http_method method_name
19
+ end
18
20
  end
19
21
 
20
- def run_request method, query_parameters, body, headers, &block
21
- unless available_methods.keys.include? method
22
- raise ArgumentError, "method: #{method} is not supported by this relation"
22
+ def define_http_method method_name
23
+ define_singleton_method method_name \
24
+ do |query_parameters={}, body=nil, headers=nil, &block|
25
+ run_request method_name, query_parameters, body, headers, &block
23
26
  end
27
+ end
28
+
29
+ def run_request method, query_parameters, body, headers, &block
24
30
  href= @data['href']
25
31
  template= ::Addressable::Template.new(href)
26
32
  expanded_url= template.expand(query_parameters)
27
- response=@conn.run_request method.to_sym, expanded_url, body, headers, &block
33
+ response=@conn.run_request( \
34
+ method.to_sym, expanded_url, body, headers, &block)
28
35
  ::JSON_ROA::Client::Resource.new(@conn,response)
29
36
  end
30
37
 
31
- SUPPORTED_METHODS.each do |method_name|
32
- define_method method_name do |query_parameters={}, body=nil, headers=nil, &block|
33
- run_request method_name, query_parameters, body, headers, &block
34
- end
38
+ def available_methods_data
39
+ @data['methods'] ||= {"get" => {}}
35
40
  end
36
41
 
37
42
  def available_methods
38
- @data['methods'] ||= {"get" => {}}
43
+ available_methods_data.keys.map(&:to_sym)
39
44
  end
40
45
 
41
46
  end
@@ -14,10 +14,15 @@ module JSON_ROA
14
14
  end
15
15
 
16
16
  def relation key
17
- relhash= @response.env.json_roa_data['relations'][key]
17
+ relhash= json_roa_data['relations'][key]
18
18
  ::JSON_ROA::Client::Relation.new @conn, key, relhash
19
19
  end
20
20
 
21
+ def self_relation
22
+ ::JSON_ROA::Client::Relation.new( \
23
+ @conn, "self", json_roa_data['self_relation']) rescue nil
24
+ end
25
+
21
26
  def data
22
27
  @response.body
23
28
  end
@@ -1,5 +1,5 @@
1
1
  module JSON_ROA
2
2
  module Client
3
- VERSION = "1.0.0-beta.0"
3
+ VERSION = "1.0.0-beta.1"
4
4
  end
5
5
  end
@@ -0,0 +1,46 @@
1
+ require_relative 'spec_helper.rb'
2
+
3
+
4
+ describe "API: traversing from root to resource to some relation" do
5
+
6
+ describe "root relation" do
7
+
8
+ let :root_relation do
9
+ JSON_ROA::Client.connect("/")
10
+ end
11
+
12
+ describe "root_resource via get" do
13
+
14
+ subject(:root_resource) {root_relation.get() }
15
+
16
+ it do
17
+ expect(root_resource.class).to be== JSON_ROA::Client::Resource
18
+ end
19
+
20
+ describe "data" do
21
+ subject(:data) {root_resource.data}
22
+
23
+ it do
24
+ expect(data).to be== {"x" => 42}
25
+ end
26
+
27
+ end
28
+
29
+ describe "task relation " do
30
+ subject(:task_relation) { root_resource.relation('task')}
31
+
32
+ it "is of class Relation" do
33
+ expect(task_relation.class).to be== JSON_ROA::Client::Relation
34
+ end
35
+
36
+ it "responds to get" do
37
+ expect(task_relation.respond_to? :get).to be
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,49 @@
1
+ require_relative 'spec_helper.rb'
2
+
3
+ describe JSON_ROA::Client::Collection do
4
+
5
+ let :root_relation do
6
+ JSON_ROA::Client.connect("/")
7
+ end
8
+
9
+ describe "tasks resource via get" do
10
+ subject(:tasks_resource) {root_relation.get().relation('tasks').get() }
11
+
12
+ it "is a resource" do
13
+ expect(tasks_resource.class).to be== JSON_ROA::Client::Resource
14
+ end
15
+
16
+ it "responds to collection" do
17
+ expect(tasks_resource.respond_to? :collection).to be
18
+ end
19
+
20
+ describe "tasks collection" do
21
+ subject(:tasks_collection) {tasks_resource.collection}
22
+
23
+ it "is a collection" do
24
+ expect(tasks_collection.class).to be== JSON_ROA::Client::Collection
25
+ end
26
+
27
+ it "has exactly one element" do
28
+ expect(tasks_collection.count).to be== 1
29
+ end
30
+
31
+ describe "the first task" do
32
+ subject(:first_task) {tasks_collection.first}
33
+
34
+ it "is a relation" do
35
+ expect(first_task.class).to be== JSON_ROA::Client::Relation
36
+ end
37
+
38
+ it "leads to /task/t1" do
39
+ expect(first_task.data["href"]).to be== "/tasks/t1"
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ end
49
+
@@ -0,0 +1,21 @@
1
+ require 'rspec'
2
+ require 'json_roa/client'
3
+ require 'pry'
4
+
5
+ describe JSON_ROA::Client do
6
+ context "when calling connect" do
7
+
8
+ it "returns an instance of JSON_ROA::Client::Relation" do
9
+ expect(JSON_ROA::Client.connect("http://example.com").class).to \
10
+ be== JSON_ROA::Client::Relation
11
+ end
12
+
13
+ it "exposes Faraday::Connection via the block" do
14
+ JSON_ROA::Client.connect("http://example.com") do |conn|
15
+ expect(conn.class).to be== Faraday::Connection
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+
@@ -0,0 +1,12 @@
1
+ x: 42
2
+ _json-roa:
3
+ version: 0.0.0
4
+ relations:
5
+ tasks:
6
+ href: /tasks/
7
+ task:
8
+ href: /tasks/{id}
9
+ methods:
10
+ get: {}
11
+ put: {}
12
+ delete: {}
@@ -0,0 +1,13 @@
1
+ state: 'done'
2
+ _json-roa:
3
+ version: 0.0.0
4
+ self_relation:
5
+ href: /tasks/t1
6
+ methods:
7
+ get: {}
8
+ put: {}
9
+ delete: {}
10
+ relations:
11
+ tasks:
12
+ href: /tasks/
13
+
@@ -0,0 +1,11 @@
1
+ tasks:
2
+ - id: "t1"
3
+ _json-roa:
4
+ relations:
5
+ root: /
6
+ collection:
7
+ next:
8
+ href: /tasks/?page=1
9
+ relations:
10
+ 0:
11
+ href: /tasks/t1
@@ -0,0 +1,7 @@
1
+ tasks: []
2
+ _json-roa:
3
+ version: 0.0.0
4
+ relations:
5
+ root: /
6
+ collection:
7
+ relations: {}
@@ -0,0 +1,30 @@
1
+ require_relative 'spec_helper.rb'
2
+
3
+ describe "methods of the relation /tasks/t1" do
4
+
5
+ let :root_relation do
6
+ JSON_ROA::Client.connect("/")
7
+ end
8
+
9
+ subject(:task1_self_relation) \
10
+ {root_relation.get().relation("task").get(id: "t1").self_relation}
11
+
12
+ it "is a relation" do
13
+ expect(task1_self_relation.class).to be== JSON_ROA::Client::Relation
14
+ end
15
+
16
+ describe "defined get" do
17
+ it "does not raise" do
18
+ expect{task1_self_relation.get()}.not_to raise_error
19
+ end
20
+ end
21
+
22
+ describe "not defined post" do
23
+ it "does raise" do
24
+ expect{task1_self_relation.post()}.to raise_error
25
+ end
26
+ end
27
+
28
+ end
29
+
30
+
@@ -0,0 +1,65 @@
1
+ require 'simplecov'
2
+ SimpleCov.start
3
+
4
+ require 'faraday'
5
+ require 'rspec'
6
+ require 'pry'
7
+ require 'YAML'
8
+ require 'json_roa/client'
9
+
10
+ module JSON_ROA
11
+ module Client
12
+
13
+ class Relation
14
+ attr_accessor :conn
15
+ end
16
+
17
+ class << self
18
+ alias_method :original_connect, :connect
19
+
20
+ def connect url, &block
21
+ res= original_connect url, &block
22
+ res.conn= test_api
23
+ res
24
+ end
25
+
26
+ end
27
+ end
28
+ end
29
+
30
+
31
+ def root_data
32
+ YAML.load_file(File.expand_path("./data/root.yml",
33
+ File.dirname(__FILE__)))
34
+ end
35
+
36
+ def tasks_page0_data
37
+ YAML.load_file( File.expand_path("./data/tasks_page0.yml",
38
+ File.dirname(__FILE__)))
39
+ end
40
+
41
+ def tasks_page1_data
42
+ YAML.load_file( File.expand_path("./data/tasks_page1.yml",
43
+ File.dirname(__FILE__)))
44
+ end
45
+
46
+ def task1_data
47
+ YAML.load_file( File.expand_path("./data/task1.yml",
48
+ File.dirname(__FILE__)))
49
+ end
50
+
51
+
52
+ def test_api
53
+ Faraday.new do |conn|
54
+ headers= {content_type: "application/json-roa+json"}
55
+ conn.use ::JSON_ROA::Middleware
56
+ conn.response :json, :content_type => /\bjson$/
57
+ conn.adapter :test do |stub|
58
+ stub.get('/') { |env| [ 200, headers, root_data.to_json]}
59
+ stub.get('/tasks/') { |env| [ 200, headers, tasks_page0_data.to_json]}
60
+ stub.get('/tasks/?page=0') { |env| [ 200, headers, tasks_page0_data.to_json]}
61
+ stub.get('/tasks/?page=1') { |env| [ 200, headers, tasks_page1_data.to_json]}
62
+ stub.get('/tasks/t1') { |env| [ 200, headers, task1_data.to_json]}
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,31 @@
1
+ require_relative 'spec_helper.rb'
2
+
3
+ describe "template expansion of task with id" do
4
+
5
+ let :root_relation do
6
+ JSON_ROA::Client.connect("/")
7
+ end
8
+
9
+ subject(:task_relation) {root_relation.get().relation("task")}
10
+
11
+ it "is a relation" do
12
+ expect(task_relation.class).to be== JSON_ROA::Client::Relation
13
+ end
14
+
15
+ it "is templated" do
16
+ expect(task_relation.data['href']).to be== "/tasks/{id}"
17
+ end
18
+
19
+ describe "get with parameter to expand" do
20
+ subject(:task_resource){task_relation.get(id: "t1")}
21
+
22
+ it "is a resource of t1" do
23
+ expect(task_resource.class).to be== JSON_ROA::Client::Resource
24
+ expect(task_resource.self_relation.data["href"]).to be== "/tasks/t1"
25
+ end
26
+
27
+ end
28
+
29
+ end
30
+
31
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: json_roa-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre.beta.0
4
+ version: 1.0.0.pre.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Schank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-01 00:00:00.000000000 Z
11
+ date: 2014-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0.10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3'
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: addressable
57
85
  requirement: !ruby/object:Gem::Requirement
@@ -102,6 +130,7 @@ extensions: []
102
130
  extra_rdoc_files: []
103
131
  files:
104
132
  - ".gitignore"
133
+ - ".rspec"
105
134
  - Gemfile
106
135
  - LICENSE.txt
107
136
  - README.md
@@ -112,6 +141,16 @@ files:
112
141
  - lib/json_roa/client/relation.rb
113
142
  - lib/json_roa/client/resource.rb
114
143
  - lib/json_roa/client/version.rb
144
+ - spec/api_query_spec.rb
145
+ - spec/collection_spec.rb
146
+ - spec/connect_spec.rb
147
+ - spec/data/root.yml
148
+ - spec/data/task1.yml
149
+ - spec/data/tasks_page0.yml
150
+ - spec/data/tasks_page1.yml
151
+ - spec/methods_spec.rb
152
+ - spec/spec_helper.rb
153
+ - spec/template_expansion_spec.rb
115
154
  homepage: ''
116
155
  licenses:
117
156
  - MIT
@@ -136,4 +175,14 @@ rubygems_version: 2.2.2
136
175
  signing_key:
137
176
  specification_version: 4
138
177
  summary: The Ruby JSON-ROA Client Reference Implementation
139
- test_files: []
178
+ test_files:
179
+ - spec/api_query_spec.rb
180
+ - spec/collection_spec.rb
181
+ - spec/connect_spec.rb
182
+ - spec/data/root.yml
183
+ - spec/data/task1.yml
184
+ - spec/data/tasks_page0.yml
185
+ - spec/data/tasks_page1.yml
186
+ - spec/methods_spec.rb
187
+ - spec/spec_helper.rb
188
+ - spec/template_expansion_spec.rb