ocean-rails 3.1.0 → 3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8b43f4ba84984a518c763a6f6617afb5bbe60c5c
4
- data.tar.gz: 7d4407aebaa0e24ba645980c6481deebd93e2b86
3
+ metadata.gz: 098dd40c3f091686952bd78105c343ee87535f61
4
+ data.tar.gz: 9d2cd112b855fd23afd076990794aad0793c4a9b
5
5
  SHA512:
6
- metadata.gz: 4d6296a69023769b3a80d548d50a6ae3eed1ad63a29922f43f22868a349a440ebd90daef77699525929d1de85435ff4743e36954c2446420275b875d8b0d2fc1
7
- data.tar.gz: b47bfae2f6afb2345f8a530dc8794cbd4e70ed18787fee9dd8a67a1d05f4ed30e193c74e277244f4a6f19ad2c52f7464583a4bfaeb79d5255caeeda60a6a53ab
6
+ metadata.gz: 2de952ef104e432eead8554f0f5a7d6a2113c080f1b84b2a0a303937d51bf9dc8ce92574fc5fa53e3cd1bd47eba1e6decb20f2d7e8d9ae10a131741a9b62b128
7
+ data.tar.gz: 7a13f27912aecad17c15a54e93f300071053f9fcda62fb77b6af64425a48a81182fb5322570d053b26e65a7f4e6d020e364ce314079985a959f0e5d6239d8fc4
data/lib/ocean-rails.rb CHANGED
@@ -10,7 +10,7 @@ require "ocean/zero_log"
10
10
  require "ocean/zeromq_logger"
11
11
  require "ocean/selective_rack_logger"
12
12
  require "ocean/flooding"
13
-
13
+ require "ocean/api_remote_resource"
14
14
 
15
15
 
16
16
  INVALIDATE_MEMBER_DEFAULT = ["($|/|\\?)"]
@@ -0,0 +1,176 @@
1
+ class Api
2
+
3
+ #
4
+ # This class represents an Ocean resource accessed by a URI.
5
+ #
6
+ # The resource is read lazily. Retries and back off properties are available.
7
+ # Conditional GETs are used whenever possible.
8
+ #
9
+ # thing = Api::RemoteResource.new("http://api.example.com/things/1")
10
+ # thing.present? => false
11
+ # thing['some_attr'] => {"this" => "is", "just" => "an example"}
12
+ # thing.present? => true
13
+ #
14
+ # thing.resource_type => 'thing'
15
+ # thing.status => 200
16
+ # thing.success? => true
17
+ #
18
+ # The last raw body can be read:
19
+ #
20
+ # thing.raw => nil or {"foo" => {...}}
21
+ #
22
+ # Headers can be read or set:
23
+ #
24
+ # thing.headers => {...}
25
+ # thing.headers['X-Some-Header'] = "Zalagadoola"
26
+ #
27
+ # Attributes can be read or set:
28
+ #
29
+ # thing['foo'] = "bar"
30
+ # thing['foo'] = "newbar"
31
+ #
32
+ # Hyperlinks can be read:
33
+ #
34
+ # thing.hyperlink['self'] => {"href"=>"http://api.example.com/things/1",
35
+ # "type"=>"application/json"}
36
+ #
37
+ # These are defined for convenience:
38
+ #
39
+ # thing.href => "http://api.example.com/things/1"
40
+ # thing.type => "application/json"
41
+ #
42
+ # The following two are equivalent:
43
+ #
44
+ # Api::RemoteResource.new("foo").get
45
+ # Api::RemoteResource.get("foo")
46
+ #
47
+ # as are:
48
+ #
49
+ # Api::RemoteResource.new("foo").get!
50
+ # Api::RemoteResource.get!("foo")
51
+ #
52
+ # #post, #post!, #put, #put!, #delete, and #delete! are also available.
53
+ #
54
+ # If get or get! retrieve an Ocean collection, they will return an array of RemoteResources.
55
+ #
56
+ # <tt>thing.get!</tt> returns an Api::RemoteResource if successful. If not, raises an exception.
57
+ # <tt>thing.get</tt> does the same, but returns nil if unsuccessful.
58
+ #
59
+ class RemoteResource
60
+
61
+ attr_reader :uri, :content_type, :retries, :backoff_time, :backoff_rate, :backoff_max
62
+ attr_reader :raw, :resource, :resource_type, :status, :headers
63
+
64
+ def initialize(uri, type="application/json",
65
+ retries: 3, backoff_time: 1, backoff_rate: 2, backoff_max: 30)
66
+ super()
67
+ @uri = uri
68
+ @content_type = type
69
+ @retries = retries
70
+ @backoff_time = backoff_time
71
+ @backoff_rate = backoff_rate
72
+ @backoff_max = backoff_max
73
+ @present = false
74
+ @raw = nil
75
+ @resource = nil
76
+ @resource_type = nil
77
+ @status = nil
78
+ @headers = nil
79
+ end
80
+
81
+ def present?
82
+ @present
83
+ end
84
+
85
+
86
+ def self.get!(*args)
87
+ _retrieve new(*args)
88
+ end
89
+
90
+ def get!
91
+ RemoteResource._retrieve self
92
+ end
93
+
94
+ def self.get(*args)
95
+ begin
96
+ get!(*args)
97
+ rescue
98
+ nil
99
+ end
100
+ end
101
+
102
+ def get
103
+ begin
104
+ get!
105
+ rescue
106
+ nil
107
+ end
108
+ end
109
+
110
+ def [](key)
111
+ get! unless present?
112
+ resource[key]
113
+ end
114
+
115
+ def []=(key, value)
116
+ resource[key] = value
117
+ end
118
+
119
+ def hyperlink
120
+ self['_links']
121
+ end
122
+
123
+ def href
124
+ hyperlink['self']['href']
125
+ end
126
+
127
+ def type
128
+ hyperlink['self']['type']
129
+ end
130
+
131
+
132
+ class WrongContentType < StandardError; end
133
+ class UnparseableJson < StandardError; end
134
+ class JsonIsNoResource < StandardError; end
135
+
136
+
137
+ private
138
+
139
+ attr_accessor :present
140
+ attr_writer :raw, :resource, :resource_type, :status, :headers
141
+
142
+
143
+ def self._retrieve(rr)
144
+ response = Api.request rr.uri, :get, headers: {}, x_api_token: Api.service_token
145
+ return unless response.success?
146
+ raise WrongContentType unless response.headers['Content-Type'] == rr.content_type
147
+ begin
148
+ raw = response.body
149
+ rescue JSON::ParserError
150
+ raise UnparseableJson
151
+ end
152
+ rr.send(:_setup, raw, response)
153
+ rr
154
+ end
155
+
156
+
157
+ def _setup(body, response)
158
+ self.raw = body
159
+ raise JsonIsNoResource unless raw.is_a? Hash
160
+ raise JsonIsNoResource unless raw.size == 1
161
+ resource_type, value = raw.to_a.first
162
+ raise JsonIsNoResource unless value.is_a? Hash
163
+ raise JsonIsNoResource unless value['_links'].is_a? Hash
164
+ raise JsonIsNoResource unless value['_links']['self'].is_a? Hash
165
+ raise JsonIsNoResource unless value['_links']['self']['href'].is_a? String
166
+ raise JsonIsNoResource unless value['_links']['self']['type'].is_a? String
167
+ self.resource = value
168
+ self.resource_type = resource_type
169
+ self.status = response.status
170
+ self.headers = response.headers
171
+ self.present = true
172
+ end
173
+
174
+
175
+ end
176
+ end
data/lib/ocean/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ocean
2
- VERSION = "3.1.0"
2
+ VERSION = "3.2.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ocean-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Bengtson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-25 00:00:00.000000000 Z
11
+ date: 2014-09-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: typhoeus
@@ -250,6 +250,7 @@ files:
250
250
  - lib/generators/ocean_setup/templates/spec_helper.rb
251
251
  - lib/ocean-rails.rb
252
252
  - lib/ocean/api.rb
253
+ - lib/ocean/api_remote_resource.rb
253
254
  - lib/ocean/api_resource.rb
254
255
  - lib/ocean/engine.rb
255
256
  - lib/ocean/flooding.rb