chute 0.0.2 → 2.0.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.
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