excon-hypermedia 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 375d919cb0b7562e0664ae44c30d3bdd7b71acf3
4
- data.tar.gz: 5d48e0eff3d6f00c2968bb32a330949833a81745
3
+ metadata.gz: 6c0a3189fb4185c1db3c29a86b699ea1de7549db
4
+ data.tar.gz: b4d04af297a0ea267d0a2dce0765385bfd5d8483
5
5
  SHA512:
6
- metadata.gz: cc9e8bfd092cef7babc130b59e8debd50eb84680a37d91da238ec84888ebdae22ea9808035cc324a52ba81833eb67daffb4a5cdd68856fe8c4209bb5d0ca5d77
7
- data.tar.gz: 080f93835dba3d7648c37377293428dadaf1e60281511f8d014debf4dacb5f65555cb96de919461229c718fa0fa253481275a4beff9f9b383d0888184d9c0c56
6
+ metadata.gz: f7576259b25677acc8f9b23171705babafff2bd0510c055723bee712e1f77a329355b090be9544631aabdd199c0e4c068f0818765ffcf1c4abdd5f03a94b004a
7
+ data.tar.gz: eb29ba745ea6cf03434f3232fd459e7e9bf3db791fba56fc88772e95a10800510f54e5c793e8771df9b77bae240522fd024b305f8bbf5186236d7a0681c815fd
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Excon::Hypermedia
1
+ # Excon::Hypermedia [![wercker status](https://app.wercker.com/status/f3fd6cf2045566072ef26354d5a73e9f/s/master "wercker status")](https://app.wercker.com/project/bykey/f3fd6cf2045566072ef26354d5a73e9f)
2
2
 
3
3
  Teaches [Excon][] how to talk to [HyperMedia APIs][hypermedia].
4
4
 
@@ -24,18 +24,13 @@ gem install excon-hypermedia
24
24
 
25
25
  ## Usage
26
26
 
27
- **NOTE**: This library is in very early development. Right now, it only talks
28
- the `HAL/JSON` protocol, and it only knows how to follow (non-curie) link
29
- relations. It returns raw response bodies in string format.
30
-
31
- This gem adds a thin layer on top of [Excon][excon] to make it talk with an
32
- HyperMedia-enabled API. To let Excon know the connection supports HyperMedia,
33
- simply enable the correct middleware (either globally, or per-connection):
27
+ To let Excon know the API supports HyperMedia, simply enable the correct
28
+ middleware (either globally, or per-connection):
34
29
 
35
30
  ```ruby
36
31
  Excon.defaults[:middlewares].push(Excon::HyperMedia::Middleware)
37
32
 
38
- api = Excon.get('http://www.example.com/api.json')
33
+ api = Excon.get('https://www.example.org/api.json')
39
34
  api.class # => Excon::Response
40
35
  ```
41
36
 
@@ -43,7 +38,7 @@ Using the `HyperMedia` middleware, the `Excon::Response` object now knows how
43
38
  to handle the HyperMedia aspect of the API:
44
39
 
45
40
  ```ruby
46
- product = api.product(expand: { uid: 'hello' })
41
+ product = api.product(expand: { uid: 'bicycle' })
47
42
  product.class # => Excon::Connection
48
43
 
49
44
  response = product.get
@@ -62,14 +57,47 @@ are available as well:
62
57
  product.get(idempotent: true, retry_limit: 6)
63
58
  ```
64
59
 
65
- ## License
60
+ ### Links
66
61
 
67
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
62
+ You can access all links in a resource using the `links` method:
63
+
64
+ ```ruby
65
+ api.links.first.class # => Excon::HyperMedia::Link
66
+ api.links.first.name # => 'product'
67
+ api.links.first.href # => 'https://www.example.org/product/{uid}'
68
+ ```
68
69
 
69
- ## TODO
70
+ You can also access a link directly, using its name:
71
+
72
+ ```ruby
73
+ api.link('product').href # => 'https://www.example.org/product/{uid}'
74
+ ```
75
+
76
+ If you want to access a relation through its link, but can't use the implicit
77
+ naming, you can use the `rel` method:
78
+
79
+ ```ruby
80
+ api.links.last.name # => 'customer-orders'
70
81
 
71
- * make it easy to access attributes in response objects
72
- * properly handle curied-links and/or non-valid Ruby method name links
82
+ # won't work, due to invalid ruby method name:
83
+ api.customer-orders(expand: { sort: 'desc' }) # => NoMethodError: undefined method `customer'
84
+
85
+ # works
86
+ api.rel('customer-orders', expand: { sort: 'desc' })
87
+ ```
88
+
89
+ ### Attributes
90
+
91
+ Attributes are available through the `attributes` method:
92
+
93
+ ```ruby
94
+ product.attributes.to_h # => { uid: 'bicycle', stock: 5 }
95
+ product.attributes.uid # => 'bicycle'
96
+ ```
97
+
98
+ ## License
99
+
100
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
73
101
 
74
102
  [excon]: https://github.com/excon/excon
75
103
  [hypermedia]: https://en.wikipedia.org/wiki/HATEOAS
@@ -22,8 +22,8 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency 'minitest', '~> 5.0'
23
23
  spec.add_development_dependency 'rubocop', '~> 0.40'
24
24
  spec.add_development_dependency 'pry', '~> 0.10'
25
- spec.add_development_dependency 'm', '~> 1.5.0'
25
+ spec.add_development_dependency 'm', '~> 1.5'
26
26
 
27
27
  spec.add_dependency 'excon', '~> 0.49'
28
- spec.add_dependency 'excon-addressable', '~> 0.1'
28
+ spec.add_dependency 'excon-addressable', '~> 0.2'
29
29
  end
@@ -10,8 +10,6 @@ module Excon
10
10
  # requests and attribute values.
11
11
  #
12
12
  class Response
13
- attr_reader :response
14
-
15
13
  def initialize(response)
16
14
  @response = response
17
15
  end
@@ -21,23 +19,22 @@ module Excon
21
19
  # Correctly handle the hypermedia request.
22
20
  #
23
21
  def handle(method_name, *params)
24
- return false if disabled?
25
-
26
- case resource.type?(method_name)
27
- when :link then return handle_link(method_name, params)
28
- when :attribute then return handle_attribute(method_name)
22
+ return false unless enabled?
23
+
24
+ if method_name == :rel
25
+ handle_link(params.shift, params)
26
+ elsif resource.type?(method_name) == :link
27
+ handle_link(method_name, params)
28
+ elsif resource.respond_to?(method_name, false)
29
+ resource.send(method_name, *params)
30
+ else
31
+ false
29
32
  end
30
-
31
- respond_to?(method_name) ? send(method_name) : false
32
33
  end
33
34
 
34
- def links
35
- resource.links
36
- end
35
+ private
37
36
 
38
- def attributes
39
- resource.attributes
40
- end
37
+ attr_reader :response
41
38
 
42
39
  def resource
43
40
  @resource ||= Resource.new(response.body)
@@ -47,19 +44,9 @@ module Excon
47
44
  response.data[:hypermedia] == true
48
45
  end
49
46
 
50
- def disabled?
51
- !enabled?
52
- end
53
-
54
- private
55
-
56
47
  def handle_link(name, params)
57
48
  Excon.new(resource.link(name).href, params.first.to_h.merge(hypermedia: true))
58
49
  end
59
-
60
- def handle_attribute(name)
61
- attributes[name.to_s]
62
- end
63
50
  end
64
51
  end
65
52
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Excon
4
4
  module HyperMedia
5
- VERSION = '0.2.0'
5
+ VERSION = '0.3.0'
6
6
  end
7
7
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # rubocop:disable Metrics/LineLength
3
4
  require_relative '../test_helper'
4
5
 
@@ -47,6 +48,12 @@ module Excon
47
48
  assert response.body.include?('http://www.example.com/hello/world/goodbye{?message}')
48
49
  end
49
50
 
51
+ def test_request_using_link
52
+ response = client.rel('hello', expand: { location: 'world' }).get
53
+
54
+ assert response.body.include?('http://www.example.com/hello/world/goodbye{?message}')
55
+ end
56
+
50
57
  def test_nested_request
51
58
  hello = client.hello(expand: { location: 'world' })
52
59
  response = hello.get.goodbye.get
@@ -67,22 +74,22 @@ module Excon
67
74
  assert response.body.include?('http://www.example.com/hello/world/goodbye{?message}')
68
75
  end
69
76
 
70
- def test_attribute
77
+ def test_links
71
78
  response = client.hello(expand: { location: 'world' }).get
72
79
 
73
- assert_equal response.uid, 'hello'
74
- assert_equal response.message, 'goodbye!'
80
+ assert_equal response.links.first.name, 'goodbye'
75
81
  end
76
82
 
77
- def test_links
83
+ def test_link
78
84
  response = client.hello(expand: { location: 'world' }).get
79
85
 
80
- assert_equal response.links.first.name, 'goodbye'
86
+ assert_equal response.link('goodbye').name, 'goodbye'
81
87
  end
82
88
 
83
89
  def test_attributes
84
90
  response = client.hello(expand: { location: 'world' }).get
85
91
 
92
+ assert_equal response.attributes.to_h, uid: 'hello', message: 'goodbye!'
86
93
  assert_equal response.attributes.uid, 'hello'
87
94
  end
88
95
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: excon-hypermedia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean
@@ -87,14 +87,14 @@ dependencies:
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: 1.5.0
90
+ version: '1.5'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: 1.5.0
97
+ version: '1.5'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: excon
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -115,14 +115,14 @@ dependencies:
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '0.1'
118
+ version: '0.2'
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '0.1'
125
+ version: '0.2'
126
126
  description: Excon, with Hypermedia traversing baked in.
127
127
  email:
128
128
  - jean@mertz.fm