chute 0.0.2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/Gemfile +16 -2
  2. data/Gemfile.lock +52 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.md +46 -0
  5. data/Rakefile +48 -6
  6. data/VERSION +1 -0
  7. data/chute.gemspec +120 -16
  8. data/lib/chute.rb +7 -20
  9. data/lib/chute/client.rb +42 -0
  10. data/lib/chute/configuration.rb +40 -0
  11. data/lib/chute/connection.rb +64 -0
  12. data/lib/chute/response.rb +22 -0
  13. data/lib/chute/v2/albums.rb +60 -0
  14. data/lib/chute/v2/assets.rb +55 -0
  15. data/lib/chute/v2/comments.rb +29 -0
  16. data/lib/chute/v2/flags.rb +21 -0
  17. data/lib/chute/v2/hearts.rb +21 -0
  18. data/lib/chute/v2/parcels.rb +21 -0
  19. data/lib/chute/v2/tags.rb +36 -0
  20. data/lib/chute/v2/triggers.rb +26 -0
  21. data/lib/chute/v2/users.rb +18 -0
  22. data/lib/chute/v2/votes.rb +21 -0
  23. data/lib/chute/version.rb +7 -1
  24. data/spec/chute/chute_spec.rb +64 -0
  25. data/spec/chute/client_spec.rb +82 -0
  26. data/spec/chute/connection_spec.rb +47 -0
  27. data/spec/chute/response_spec.rb +16 -0
  28. data/spec/chute/v2/albums_spec.rb +197 -0
  29. data/spec/chute/v2/assets_spec.rb +171 -0
  30. data/spec/chute/v2/comments_spec.rb +88 -0
  31. data/spec/chute/v2/flags_spec.rb +56 -0
  32. data/spec/chute/v2/hearts_spec.rb +57 -0
  33. data/spec/chute/v2/parcels_spec.rb +24 -0
  34. data/spec/chute/v2/tags_spec.rb +79 -0
  35. data/spec/chute/v2/trigger_spec.rb +127 -0
  36. data/spec/chute/v2/users_spec.rb +53 -0
  37. data/spec/chute/v2/votes_spec.rb +56 -0
  38. data/spec/fixtures/chute_cassettes/albums/album_create_with_permission_view.yml +69 -0
  39. data/spec/fixtures/chute_cassettes/albums/albums_add_remove_assets.yml +187 -0
  40. data/spec/fixtures/chute_cassettes/albums/albums_create.yml +69 -0
  41. data/spec/fixtures/chute_cassettes/albums/albums_delete.yml +128 -0
  42. data/spec/fixtures/chute_cassettes/albums/albums_get.yml +135 -0
  43. data/spec/fixtures/chute_cassettes/albums/albums_list.yml +89 -0
  44. data/spec/fixtures/chute_cassettes/albums/albums_stats.yml +128 -0
  45. data/spec/fixtures/chute_cassettes/albums/albums_update.yml +135 -0
  46. data/spec/fixtures/chute_cassettes/assets/assets_delete.yml +131 -0
  47. data/spec/fixtures/chute_cassettes/assets/assets_geo.yml +197 -0
  48. data/spec/fixtures/chute_cassettes/assets/assets_get.yml +138 -0
  49. data/spec/fixtures/chute_cassettes/assets/assets_import.yml +76 -0
  50. data/spec/fixtures/chute_cassettes/assets/assets_list.yml +77 -0
  51. data/spec/fixtures/chute_cassettes/assets/assets_update.yml +138 -0
  52. data/spec/fixtures/chute_cassettes/comments/comments_create.yml +196 -0
  53. data/spec/fixtures/chute_cassettes/comments/comments_list.yml +259 -0
  54. data/spec/fixtures/chute_cassettes/flags/flags_methods.yml +313 -0
  55. data/spec/fixtures/chute_cassettes/hearts/hearts_methods.yml +254 -0
  56. data/spec/fixtures/chute_cassettes/tags/tags_assets.yml +311 -0
  57. data/spec/fixtures/chute_cassettes/triggers/trigger_errors.yml +62 -0
  58. data/spec/fixtures/chute_cassettes/triggers/triggers_cleanup.yml +184 -0
  59. data/spec/fixtures/chute_cassettes/triggers/triggers_create.yml +65 -0
  60. data/spec/fixtures/chute_cassettes/triggers/triggers_delete.yml +124 -0
  61. data/spec/fixtures/chute_cassettes/triggers/triggers_list.yml +66 -0
  62. data/spec/fixtures/chute_cassettes/triggers/triggers_update.yml +127 -0
  63. data/spec/fixtures/chute_cassettes/users/users_get.yml +128 -0
  64. data/spec/fixtures/chute_cassettes/users/users_me.yml +66 -0
  65. data/spec/fixtures/chute_cassettes/votes/votes_methods.yml +313 -0
  66. data/spec/spec_helper.rb +27 -0
  67. metadata +210 -33
  68. data/.gitignore +0 -5
  69. data/README +0 -125
  70. data/config/chute.rb +0 -0
  71. data/lib/chute/account.rb +0 -58
  72. data/lib/chute/app.rb +0 -32
  73. data/lib/chute/asset.rb +0 -124
  74. data/lib/chute/bundle.rb +0 -72
  75. data/lib/chute/chute.rb +0 -203
  76. data/lib/chute/collection.rb +0 -47
  77. data/lib/chute/comment.rb +0 -32
  78. data/lib/chute/exception.rb +0 -7
  79. data/lib/chute/http_service.rb +0 -114
  80. data/lib/chute/inbox.rb +0 -41
  81. data/lib/chute/parcel.rb +0 -45
  82. data/lib/chute/resource.rb +0 -354
  83. data/lib/chute/user.rb +0 -113
  84. data/lib/chute/util.rb +0 -14
  85. data/test/test_sudoku.rb +0 -7
@@ -1,32 +0,0 @@
1
- module Chute
2
- class GCComment < GCResource
3
- attr_accessor :id,
4
- :status,
5
- :comment
6
-
7
- def initialize(attributes = {})
8
- super
9
- @id = id
10
- @status = status
11
- @comment = comment
12
- end
13
-
14
- # Public: Returns pluralized name of the resource.
15
- def resource_name
16
- "comments"
17
- end
18
-
19
- def save
20
- raise NotImplementedError
21
- end
22
-
23
- def update
24
- raise NotImplementedError
25
- end
26
-
27
- # Public: Returns pluralized name of the resource.
28
- def class_path
29
- "comments"
30
- end
31
- end
32
- end
@@ -1,7 +0,0 @@
1
- # lib/exceptions.rb
2
- module Chute
3
- module Exceptions
4
- class UnAuthorized < StandardError; end
5
- class InValidResponse < StandardError; end
6
- end
7
- end
@@ -1,114 +0,0 @@
1
- module Chute
2
- class GCRequest
3
- include HTTParty
4
-
5
- HEADERS = {"authorization" => API_KEY}
6
-
7
- base_uri API_URL
8
-
9
- # Public: Get request to a specific URL.
10
- #
11
- # url - relative url.
12
- # params - parameters hash.
13
- # headers - headers hash.
14
- #
15
- # Returns a GCResponse.
16
-
17
- def get(url, params=nil, header_options=nil)
18
- GCResponse.new(GCRequest.get(url, {:body => params, :headers => get_headers(header_options)}))
19
- end
20
-
21
- # Public: Post request to a specific URL.
22
- #
23
- # url - relative url.
24
- # params - parameters hash.
25
- # headers - headers hash.
26
- #
27
- # Returns a GCResponse.
28
-
29
- def post(url, params=nil, header_options=nil)
30
- GCResponse.new(GCRequest.post(url, {:body => params, :headers => get_headers(header_options)}))
31
- end
32
-
33
- # Public: Put request to a specific URL.
34
- #
35
- # url - relative url.
36
- # params - parameters hash.
37
- # headers - headers hash.
38
- #
39
- # Returns a GCResponse.
40
-
41
- def put(url, params=nil, header_options=nil)
42
- GCResponse.new(GCRequest.put(url, {:body => params, :headers => get_headers(header_options)}))
43
- end
44
-
45
- # Public: Delete request to a specific URL.
46
- #
47
- # url - relative url.
48
- # params - parameters hash.
49
- # headers - headers hash.
50
- #
51
- # Returns a GCResponse.
52
-
53
- def delete(url, params=nil, header_options=nil)
54
- GCResponse.new(GCRequest.delete(url, {:body => params, :headers => get_headers(header_options)}))
55
- end
56
-
57
- protected
58
-
59
- # Protected: Add custom headers to default header options.
60
- #
61
- # header_options - Hash, header options.
62
- #
63
- # Returns final header Hash
64
-
65
- def get_headers(header_options)
66
- Hash === header_options ? header_options.merge(HEADERS) : HEADERS
67
- end
68
-
69
- end
70
-
71
- class GCResponse
72
- attr_reader :raw_response, :data, :errors, :status, :is_success
73
- def initialize(attributes = {})
74
- @raw_response = attributes
75
- @status = attributes.response.code
76
- @errors = []
77
- parse(attributes.parsed_response)
78
- end
79
-
80
- protected
81
-
82
- # Protected: Parse the data from the response
83
- #
84
- # parsed_response - HTTParty parsed response
85
- #
86
- # In case,
87
- # status code is,
88
- # < 300 - successful, set GCResponse.data as the returned data
89
- # 401 - failed, Raise UnAuthorized Exception (like API key invalid or missing)
90
- # other - failed, set GCResponse.errors as the returned errors
91
- #
92
- # Returns a GCResponse.
93
-
94
- def parse(parsed_response)
95
- if status.to_i <= 300
96
- if parsed_response["errors"]
97
- @is_success = false
98
- parsed_response["errors"].each do |error|
99
- @errors << error
100
- end
101
- else
102
- @is_success = true
103
- @data = parsed_response["data"]
104
- end
105
- else
106
- @is_success = false
107
- @errors << parsed_response["error"]
108
- if status == "401"
109
- raise Chute::Exceptions::UnAuthorized, parsed_response["error"]
110
- end
111
- end
112
- end
113
- end
114
- end
@@ -1,41 +0,0 @@
1
- module Chute
2
- class GCInbox
3
-
4
- # Public: Fetch inbox information.
5
- #
6
- # Returns photo, comments, requests and invite count.
7
- def self.info
8
- request = GCRequest.new()
9
- response = request.get("/#{class_path}")
10
- response.data
11
- end
12
-
13
- # Public: Fetch list of invitations.
14
- def self.invitations
15
- request = GCRequest.new()
16
- response = request.get("/#{class_path}/invites")
17
- response.data
18
- end
19
-
20
- # Public: Fetch list of parcels.
21
- def self.parcels
22
- request = GCRequest.new()
23
- Chute::GCParcel.perform(request.get("/#{class_path}/parcels"))
24
- end
25
-
26
- # Public: Fetch specific parcel data.
27
- # parcel_id - String, Identifier for parcel
28
- def self.parcel(parcel_id)
29
- request = GCRequest.new()
30
- parcel = Chute::GCParcel.new
31
- parcel.perform(request.get("/#{class_path}/parcels/#{parcel_id}"))
32
- parcel
33
- end
34
-
35
- # Public: Resource Name
36
- def self.class_path
37
- 'inbox'
38
- end
39
-
40
- end
41
- end
@@ -1,45 +0,0 @@
1
- module Chute
2
- class GCParcel < GCResource
3
- attr_accessor :id,
4
- :status,
5
- :share_url,
6
- :device_id,
7
- :asset_count
8
-
9
- def initialize(attributes = {})
10
- super
11
- @id = attributes[:id]
12
- @status = attributes[:status]
13
- @share_url = attributes[:share_url]
14
- @device_id = attributes[:device_id]
15
- @asset_count = attributes[:asset_count]
16
- end
17
-
18
- # Public: Returns pluralized name of the resource.
19
- def resource_name
20
- "parcels"
21
- end
22
-
23
- # Public: Returns pluralized name of the resource.
24
- def class_path
25
- "parcels"
26
- end
27
-
28
- # Public: Fetch parcel from its id.
29
- # id - Integer: identifier.
30
- #
31
- # Example
32
- #
33
- # Chute::GCParcel.find_by_id(23)
34
- # # => parcel
35
- # # => false if not found
36
- # Returns GCParcel
37
-
38
- def self.find_by_id(id)
39
- parcel = Chute::GCParcel.new
40
- parcel.perform(get("/parcels/#{id}"))
41
- parcel
42
- end
43
-
44
- end
45
- end
@@ -1,354 +0,0 @@
1
- module Chute
2
- class GCResource
3
- attr_accessor :attributes, :errors, :meta, :prefix_options
4
-
5
- def initialize(attributes = {})
6
- @errors = []
7
- @attributes = attributes
8
- @prefix_options = {}
9
- end
10
-
11
- # Public: Save the resource instance
12
- #
13
- # Examples
14
- #
15
- # chute = GCChute.new(:name => "Test Chute")
16
- # # => GCChute instance
17
- #
18
- # For valid sttributes
19
- # chute.save
20
- # # => true
21
- # chute.id
22
- # # => 23
23
- # For invalid attributes
24
- # chute.save
25
- # # => false
26
- # chute.id
27
- # # => nil
28
- # chute.errors
29
- # # => {"name already taken"}
30
- def save
31
- options = {}
32
- options["#{resource_name.singularize}"] = attributes
33
- options.merge!(prefix_options)
34
- perform(self.class.post("/#{resource_name}", options))
35
- end
36
-
37
- # Public: Update the resource instance
38
- #
39
- # Examples
40
- #
41
- # chute = GCChute.new(:name => "Test Chute")
42
- # # => GCChute instance
43
- # chute.save
44
- # # => true
45
- # chute.name = "Name Changed"
46
- # chute.update
47
- # # => true
48
- # Return errors in case the request failed
49
-
50
- def update
51
- options = {}
52
- options["#{resource_name.singularize}"] = attributes
53
- options.merge!(prefix_options)
54
- perform(self.class.put("/#{resource_name}/#{id}", options))
55
- end
56
-
57
- # Public: Delete a resource instance
58
- #
59
- # Examples
60
- #
61
- # chute = GCChute.new(:name => "Test Chute")
62
- # # => GCChute instance
63
- # chute.save
64
- # # => true
65
- # chute.destroy
66
- # # => true
67
- # Return false in case the request failed or chute not found
68
-
69
- def destroy
70
- response = self.class.delete("/#{resource_name}/#{id}", prefix_options)
71
- response.is_success
72
- end
73
-
74
- # Public: Pluralized name of the resource.
75
- def resource_name
76
- raise NotImplementedError
77
- end
78
-
79
- # Public: Relative path to the resource path.
80
- def resource_path
81
- "#{resource_name}/#{id}"
82
- end
83
-
84
- # Public: Returns if the resource is valid.
85
- def valid?
86
- errors.size == 0
87
- end
88
-
89
- # Public: Returns if the resource is new.
90
- def new?
91
- !self.id.blank?
92
- end
93
-
94
- # Public: Fetch collection of resources.
95
- # Implemented in the inherited classes.
96
-
97
- def self.all
98
- raise NotImplementedError
99
- end
100
-
101
- # Public: Fetch resource from its id.
102
- # Implemented in the inherited classes.
103
- # id - Identifier.
104
-
105
- def self.find_by_id(id)
106
- raise NotImplementedError
107
- end
108
-
109
- # Public: Search all chutes with specified key.
110
- #
111
- # key - key to be searched.
112
- # value - Optional, value of the key.
113
- #
114
- # Example
115
- #
116
- # Chute::GCChute.search("title")
117
- # # => GCollection of the chutes with a key "title" in meta data
118
- #
119
- # Chute::GCChute.search("title", "Testing")
120
- # # => GCollection of the chutes with a key "title" and its value "Testing" in meta data
121
-
122
- def self.search(key, value=nil)
123
- self.perform(get("/#{class_path}/meta/#{key}/#{value}"))
124
- end
125
-
126
- # Public: Set meta data for one or more keys for the resource.
127
- #
128
- # data - Hash or String.
129
- # Hash of key/value pair to be added to the meta data.
130
- # String value for a key specified as the next parameter.
131
- #
132
- # key - Optional. String if a specific key value to be set.
133
- #
134
- # Examples
135
- #
136
- # chute = GCChute.find_by_id(23)
137
- # # => GCChute instance
138
- #
139
- # For a key.
140
- # chute.set_meta_data("Testing", :title)
141
- # # => true
142
- # chute.get_meta_data(:title)
143
- # # => "Testing"
144
- #
145
- # Add a Hash to meta data.
146
- # chute.set_meta_data({:details => "Testing the methods", :source => "Mobile"})
147
- # # => true
148
- # chute.get_meta_data
149
- # # => {:title => "Testing", :details => "Testing the methods", :source => "Mobile"}
150
-
151
- def set_meta_data(data, key=nil)
152
- response = (key.blank? and Hash === data) ? (self.class.post("/#{resource_path}/meta", data.to_json)) : (self.class.post("/#{resource_path}/meta/#{key}", data))
153
- if response.is_success
154
- Hash === data ? (self.meta = data) : (self.meta[key] = data)
155
- true
156
- else
157
- false
158
- end
159
- end
160
-
161
- # Public: Get complete meta data or a specific key for the resource.
162
- #
163
- # key - Optional. String if a specific key value to be fetched.
164
- #
165
- # Examples
166
- #
167
- # chute = GCChute.find_by_id(23)
168
- # # => GCChute instance
169
- #
170
- # With a key.
171
- # chute.get_meta_data(:title)
172
- # # => "Testing"
173
- #
174
- # Returns String value of meta data for a key
175
- #
176
- # Without a key.
177
- # chute.get_meta_data
178
- # # => {:title => "Testing", :source => "Mobile"}
179
- #
180
- # Returns meta data Hash without a key
181
-
182
- def get_meta_data(key=nil)
183
- if key.blank?
184
- response = self.class.get("/#{resource_path}/meta")
185
- else
186
- response = self.class.get("/#{resource_path}/meta/#{key}")
187
- end
188
- if response.is_success
189
- Hash === response.data ? (self.meta = response.data) : (self.meta[key] = response.data)
190
- else
191
- false
192
- end
193
- end
194
-
195
- # Public: Deletes complete meta data or a specific key for the resource.
196
- #
197
- # key - Optional. String if a specific key to be deleted.
198
- #
199
- # Examples
200
- #
201
- # chute = GCChute.find_by_id(23)
202
- # # => GCChute instance
203
- #
204
- # chute.get_meta_data
205
- # # => {:title => "Testing", :source => "Mobile"}
206
- #
207
- # With a key.
208
- # chute.delete_meta_data(:title)
209
- # # => "Testing"
210
- # chute.get_meta_data
211
- # # => {:source => "Mobile"}
212
- #
213
- # Without a key.
214
- # chute.delete_meta_data
215
- # # => {}
216
- # chute.get_meta_data
217
- # # => {}
218
-
219
- def delete_meta_data(key = nil)
220
- if key.blank?
221
- response = self.class.delete("/#{resource_path}/meta")
222
- response.is_success ? self.meta = {} : false
223
- else
224
- response = self.class.delete("/#{resource_path}/meta/#{key}")
225
- response.is_success ? self.meta.delete(key) : false
226
- end
227
- end
228
-
229
- # Protected: Handles GCResponse object and updates chute instance with the updated values
230
- #
231
- # response - GCResponse object
232
- #
233
- # Returns a resource instance
234
- def perform(response)
235
- if response.is_success
236
- response.data.each do |key, value|
237
- attributes[key.to_sym] = response.data[key] if (self.instance_variable_defined?("@#{key}") rescue nil)
238
- end
239
- return true
240
- else
241
- self.errors = response.errors
242
- return false
243
- end
244
- end
245
-
246
- # Protected: Handles GCResponse object.
247
- #
248
- # response - GCResponse object
249
- #
250
- # Returns a collection of the resources
251
-
252
- def self.perform(response)
253
- collection = Chute::GCCollection.new
254
- if response.is_success
255
- data = Hash === response.data ? response.data["#{class_path}"] : response.data
256
- data = [] unless (data and !data.empty?)
257
- data.each do |item|
258
- new_resource = self.new
259
- item.each do |key, value|
260
- new_resource.attributes[key.to_sym] = value if (new_resource.instance_variable_defined?("@#{key}") rescue nil)
261
- end
262
- collection << new_resource
263
- end
264
- return collection
265
- else
266
- debugger
267
- raise Chute::Exceptions::InValidResponse, response.errors
268
- end
269
- end
270
-
271
- protected
272
-
273
- # Protected: Overriding attr_accessor.
274
- # It keeps attributes hash in sync with class attributes.
275
-
276
- class << self
277
- def attr_accessor(*names)
278
- super
279
- unless name.match(/^x_/)
280
- names.each do |name|
281
- self.class_eval do
282
- define_method name do
283
- attributes[name]
284
- end
285
-
286
- define_method("#{name}=") do |value|
287
- attributes[name] = value
288
- end
289
- end
290
- end
291
- end
292
- end
293
- end
294
-
295
- # Protected: Custom get request to a specific URL.
296
- #
297
- # url - relative url.
298
- # params - parameters hash.
299
- # headers - headers hash.
300
- #
301
- # Returns a GCResponse.
302
-
303
- def self.get(url, params=nil, headers=nil)
304
- @request = GCRequest.new()
305
- @request.get(url, params)
306
- end
307
-
308
- # Protected: Custom post request to a specific URL.
309
- #
310
- # url - relative url.
311
- # params - parameters hash.
312
- # headers - headers hash.
313
- #
314
- # Returns a GCResponse.
315
-
316
- def self.post(url, params=nil, headers=nil)
317
- @request = GCRequest.new()
318
- @request.post(url, params)
319
- end
320
-
321
- # Protected: Custom put request to a specific URL.
322
- #
323
- # url - relative url.
324
- # params - parameters hash.
325
- # headers - headers hash.
326
- #
327
- # Returns a GCResponse.
328
-
329
- def self.put(url, params=nil, headers=nil)
330
- @request = GCRequest.new()
331
- @request.put(url, params)
332
- end
333
-
334
- # Protected: Custom delete request to a specific URL.
335
- #
336
- # url - relative url.
337
- # params - parameters hash.
338
- # headers - headers hash.
339
- #
340
- # Returns a GCResponse.
341
-
342
- def self.delete(url, params=nil, headers=nil)
343
- @request = GCRequest.new()
344
- @request.delete(url, params)
345
- end
346
-
347
- # Protected: Set whether the resource has meta data or not
348
-
349
- def has_meta?
350
- true
351
- end
352
-
353
- end
354
- end