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
@@ -0,0 +1,64 @@
1
+ require 'httparty'
2
+ require 'json'
3
+ require 'hashie/mash'
4
+
5
+ module Chute
6
+ class Connection
7
+ include HTTParty
8
+ format :json
9
+
10
+ def self.base_uri
11
+ Chute.api_endpoint
12
+ end
13
+
14
+ def self.headers
15
+ {
16
+ 'Authorization' => "OAuth #{Chute.access_token}",
17
+ 'Content-Type' => 'application/json',
18
+ 'Accepts' => 'application/json',
19
+ 'x-client_id' => Chute.app_id
20
+ }
21
+ end
22
+
23
+ def self.request(request_type, url, body="")
24
+ body = body.to_json unless String === body
25
+ options = body.empty? ? {:headers => headers} : {:headers => headers, :body => body}
26
+ begin
27
+ response = self.send(request_type, "#{base_uri}#{url}", options)
28
+ =begin
29
+
30
+ puts "----------------------------------------"
31
+ puts "Requesting url: #{base_uri}#{url}"
32
+ puts response.parsed_response
33
+ puts "----------------------------------------"
34
+ =end
35
+
36
+ parse(response)
37
+ rescue Errno::ECONNREFUSED
38
+ p 'Service Unavailable'
39
+ Chute::Response.with_code_and_error(503, 'Service Unavailable')
40
+ raise ChuteApiUnavailableException.new('Could not connect to the Server')
41
+ rescue MultiJson::DecodeError
42
+ p 'Internal Server Error'
43
+ Chute::Response.with_code_and_error(500, 'Internal Server Error')
44
+ raise ChuteApiInternalException.new('Chute API Exception')
45
+ rescue Exception => ex
46
+ p 'Unknown Error'
47
+ raise
48
+ end
49
+ end
50
+
51
+ def self.parse(object)
52
+ if object.respond_to?(:each_pair)
53
+ Chute::Response.new(object)
54
+ else
55
+ [200, 201].include?(object.code)
56
+ end
57
+ end
58
+ end
59
+
60
+ class ChuteApiUnavailableException < Exception;
61
+ end
62
+ class ChuteApiInternalException < Exception;
63
+ end
64
+ end
@@ -0,0 +1,22 @@
1
+ require 'hashie/mash'
2
+
3
+ module Chute
4
+ class Response < Hashie::Mash
5
+
6
+ def self.with_code_and_error(code, error)
7
+ object = Chute::Response.new
8
+ object.code = code
9
+ object.errors = [error]
10
+ object
11
+ end
12
+
13
+ def success?
14
+ [200, 201].include?(response.code)
15
+ end
16
+
17
+ def pretty_print
18
+ puts JSON.pretty_generate self
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,60 @@
1
+ module Chute
2
+ module V2
3
+ class Albums
4
+ class << self
5
+ # Album Listing
6
+ def all(page=nil, per_page=nil)
7
+ Chute::Client.get("/v2/albums", :page=> page, :per_page=> per_page)
8
+ end
9
+
10
+ # Album Details
11
+ def find(id)
12
+ Chute::Client.get("/v2/albums/#{id}")
13
+ end
14
+
15
+ # Album Assets Geo Search
16
+ def geo_locate(id, lat, lng, radius)
17
+ Chute::Client.get("/v2/albums/#{id}/assets/geo/#{lat},#{lng}/#{radius}")
18
+ end
19
+
20
+ # Album Assets
21
+ def assets(id, page, per_page)
22
+ Chute::Client.get("/v2/albums/#{id}/assets", :page=> page, :per_page=> per_page)
23
+ end
24
+
25
+ # Import Album Assets
26
+ def import(album_id, *urls)
27
+ Chute::Client.post("/v2/albums/#{album_id}/assets/import", :urls=> urls)
28
+ end
29
+
30
+ # Album Create
31
+ def create(album)
32
+ Chute::Client.post("/v2/albums", :album => album)
33
+ end
34
+
35
+ # Album Update
36
+ def update(id, album={})
37
+ Chute::Client.put("/v2/albums/#{id}", :album => album)
38
+ end
39
+
40
+ # Album Delete
41
+ def delete(id)
42
+ Chute::Client.delete("/v2/albums/#{id}")
43
+ end
44
+
45
+ def stats(album_id)
46
+ Chute::Client.get("/v2/albums/#{album_id}/stats")
47
+ end
48
+
49
+ def add_assets(album_id, *asset_ids)
50
+ Chute::Client.post("/v2/albums/#{album_id}/add_assets", :asset_ids => asset_ids)
51
+ end
52
+
53
+ def remove_assets(album_id, *asset_ids)
54
+ Chute::Client.post("/v2/albums/#{album_id}/remove_assets",:asset_ids => asset_ids)
55
+ end
56
+
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,55 @@
1
+ module Chute
2
+ module V2
3
+ class Assets
4
+ class << self
5
+ # Asset Listing
6
+ def all(album_id)
7
+ Chute::Client.get("/v2/albums/#{album_id}/assets")
8
+ end
9
+
10
+ # Asset Details
11
+ def find(id)
12
+ Chute::Client.get("/v2/assets/#{id}")
13
+ end
14
+
15
+ # Asset Geo Locate
16
+ def geo_locate(lat, lng, radius)
17
+ Chute::Client.get("/v2/assets/geo/#{lat},#{lng}/#{radius}")
18
+ end
19
+
20
+ # Asset Exif
21
+ def exif(id)
22
+ Chute::Client.get("/v2/assets/#{id}/exif")
23
+ end
24
+
25
+ # Asset Geo
26
+ def geo(id)
27
+ Chute::Client.get("/v2/assets/#{id}/geo")
28
+ end
29
+
30
+ # TODO Implement on server: Asset Create
31
+ def upload(data)
32
+ Chute::Client.post("/v2/assets/upload", :urls => urls)
33
+ end
34
+
35
+ def import(urls, shortcuts)
36
+ params = Hash.new
37
+ params[:urls] = urls unless urls==nil
38
+ params[:shortcuts] = shortcuts unless shortcuts==nil
39
+ Chute::Client.post("/v2/assets/import", params)
40
+ end
41
+
42
+ # Asset Update
43
+ # Title
44
+ def update(id, asset={})
45
+ Chute::Client.put("/v2/assets/#{id}", asset)
46
+ end
47
+
48
+ # Album Delete
49
+ def delete(id)
50
+ Chute::Client.delete("/v2/assets/#{id}")
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,29 @@
1
+ module Chute
2
+ module V2
3
+ class Comments
4
+ class << self
5
+
6
+ # Assets Comments
7
+ def all(album_id, asset_id)
8
+ Chute::Client.get("/v2/albums/#{album_id}/assets/#{asset_id}/comments")
9
+ end
10
+
11
+ # Comment params
12
+ # Params
13
+ # comment_text
14
+ # name
15
+ # email
16
+ def create(album_id, asset_id, comment={})
17
+ Chute::Client.post("/v2/albums/#{album_id}/assets/#{asset_id}/comments", comment)
18
+ end
19
+
20
+
21
+ def delete(comment_id)
22
+ Chute::Client.delete("/v2/comments/#{comment_id}")
23
+ end
24
+
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,21 @@
1
+ module Chute
2
+ module V2
3
+ class Flags
4
+ class << self
5
+
6
+ def count(album_id, asset_id)
7
+ Chute::Client.get("/v2/albums/#{album_id}/assets/#{asset_id}/flags")
8
+ end
9
+
10
+ def flag(album_id, asset_id)
11
+ Chute::Client.post("/v2/albums/#{album_id}/assets/#{asset_id}/flags")
12
+ end
13
+
14
+ def unflag(album_id, asset_id)
15
+ Chute::Client.delete("/v2/albums/#{album_id}/assets/#{asset_id}/flags")
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Chute
2
+ module V2
3
+ class Hearts
4
+ class << self
5
+
6
+ def count(album_id, asset_id)
7
+ Chute::Client.get("/v2/albums/#{album_id}/assets/#{asset_id}/hearts")
8
+ end
9
+
10
+ def heart(album_id, asset_id)
11
+ Chute::Client.post("/v2/albums/#{album_id}/assets/#{asset_id}/hearts")
12
+ end
13
+
14
+ def unheart(album_id, asset_id, id)
15
+ Chute::Client.delete("/v2/albums/#{album_id}/assets/#{asset_id}/hearts/#{id}")
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ module Chute
2
+ module V2
3
+ class Parcels
4
+ class << self
5
+
6
+ def all_parcel_assets(parcel_id)
7
+ Chute::Client.get("/v2/parcels/#{parcel_id}/assets")
8
+ end
9
+
10
+ def find(id)
11
+ Chute::Client.get("/v2/parcels/#{id}")
12
+ end
13
+
14
+ def all_album_parcels(album_id)
15
+ Chute::Client.get("/v2/albums/#{album_id}/parcels")
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,36 @@
1
+ module Chute
2
+ module V2
3
+ class Tags
4
+ class << self
5
+
6
+ # Asset Tags
7
+ def all_asset_tags(album_id, asset_id)
8
+ Chute::Client.get("/v2/albums/#{album_id}/assets/#{asset_id}/tags")
9
+ end
10
+
11
+ # Change the complete list of tags for an asset inside an album
12
+ def update_asset_tags(album_id, asset_id, *tags)
13
+ Chute::Client.put("/v2/albums/#{album_id}/assets/#{asset_id}/tags", :tags => process_array(tags))
14
+ end
15
+
16
+ # Add new tags to existing assets, without replacing the current ones
17
+ def add_asset_tags(album_id, asset_id, *tags)
18
+ Chute::Client.post("/v2/albums/#{album_id}/assets/#{asset_id}/tags", :tags => process_array(tags))
19
+ end
20
+
21
+ # Delete all tags from an asset
22
+ def delete_asset_tags(album_id, asset_id, *tags)
23
+ Chute::Client.delete("/v2/albums/#{album_id}/assets/#{asset_id}/tags", :tags => process_array(tags))
24
+ end
25
+
26
+ private
27
+
28
+ def process_array(*args)
29
+ args.flatten.uniq
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
36
+
@@ -0,0 +1,26 @@
1
+ module Chute
2
+ module V2
3
+ class Triggers
4
+ class << self
5
+
6
+ # Asset Tags
7
+ def all
8
+ Chute::Client.get("/v2/triggers")
9
+ end
10
+
11
+ def create(url, event)
12
+ Chute::Client.post("/v2/triggers", :url => url, :event => event)
13
+ end
14
+
15
+ def update(trigger_id,url, event)
16
+ Chute::Client.put("/v2/triggers/#{trigger_id}", :url => url, :event => event)
17
+ end
18
+
19
+ def delete(trigger_id)
20
+ Chute::Client.delete("/v2/triggers/#{trigger_id}")
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,18 @@
1
+ module Chute
2
+ module V2
3
+ class Users
4
+ class << self
5
+
6
+ def find(id)
7
+ Chute::Client.get("/v2/users/#{id}")
8
+ end
9
+
10
+ def me
11
+ Chute::Client.get("/v2/me")
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
18
+
@@ -0,0 +1,21 @@
1
+ module Chute
2
+ module V2
3
+ class Votes
4
+ class << self
5
+
6
+ def count(album_id, asset_id)
7
+ Chute::Client.get("/v2/albums/#{album_id}/assets/#{asset_id}/votes")
8
+ end
9
+
10
+ def vote(album_id, asset_id)
11
+ Chute::Client.post("/v2/albums/#{album_id}/assets/#{asset_id}/votes")
12
+ end
13
+
14
+ def remove_vote(album_id, asset_id)
15
+ Chute::Client.delete("/v2/albums/#{album_id}/assets/#{asset_id}/votes")
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,3 +1,9 @@
1
1
  module Chute
2
- VERSION = "0.0.2"
2
+ module Version
3
+ MAJOR = 2
4
+ MINOR = 0
5
+ PATCH = 0
6
+
7
+ STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
+ end
3
9
  end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chute do
4
+
5
+ # test/awesome/configuration_test.rbrequire 'helper'
6
+
7
+ describe 'configuration' do
8
+
9
+ describe '.api_endpoint' do
10
+ it 'should return default api_endpoint' do
11
+ Chute.api_endpoint.should == Chute::Configuration::DEFAULT_API_ENDPOINT
12
+ end
13
+ end
14
+
15
+ describe '.auth_endpoint' do
16
+ it 'should return default auth_endpoint' do
17
+ Chute.auth_endpoint.should == Chute::Configuration::DEFAULT_AUTH_ENDPOINT
18
+ end
19
+ end
20
+
21
+ describe '.app_id' do
22
+ it 'should return default app_id' do
23
+ Chute.app_id.should == Chute::Configuration::DEFAULT_APP_ID
24
+ end
25
+ end
26
+
27
+ describe '.app_secret' do
28
+ it 'should return default app_secret' do
29
+ Chute.app_secret.should == Chute::Configuration::DEFAULT_APP_SECRET
30
+ end
31
+ end
32
+
33
+ describe '.access_token' do
34
+ it 'should return default access_token' do
35
+ Chute.access_token.should == Chute::Configuration::DEFAULT_ACCESS_TOKEN
36
+ end
37
+ end
38
+
39
+ after do
40
+ Chute.reset
41
+ end
42
+
43
+ describe '.configure' do
44
+ Chute::Configuration::VALID_CONFIG_KEYS.each do |key|
45
+ it "should set the #{key}" do
46
+ Chute.configure do |config|
47
+ config.send("#{key}=", key)
48
+ Chute.send(key).should == key
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+ Chute::Configuration::VALID_CONFIG_KEYS.each do |key|
55
+ describe ".#{key}" do
56
+ it 'should return the default value' do
57
+ Chute.send(key).should == Chute::Configuration.const_get("DEFAULT_#{key.upcase}")
58
+ end
59
+ end
60
+ end
61
+
62
+
63
+ end
64
+ end