flickr_oauth 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/README.md +14 -0
  2. data/flickr_oauth.gemspec +3 -1
  3. data/lib/flickr.rb +188 -1
  4. data/lib/flickr/client.rb +17 -46
  5. data/lib/flickr/client/authentication.rb +17 -0
  6. data/lib/flickr/client/connection.rb +44 -0
  7. data/lib/flickr/client/requests.rb +69 -0
  8. data/lib/flickr/client/upload.rb +22 -0
  9. data/lib/flickr/node.rb +2 -28
  10. data/lib/flickr_oauth/version.rb +1 -1
  11. data/spec/.DS_Store +0 -0
  12. data/spec/fixtures/.DS_Store +0 -0
  13. data/spec/fixtures/cassettes/.DS_Store +0 -0
  14. data/spec/fixtures/cassettes/flickr_reflection_getMethodInfo/_format_json.yml +133 -0
  15. data/spec/fixtures/cassettes/flickr_reflection_getMethodInfo/_format_rest.yml +133 -0
  16. data/spec/fixtures/cassettes/flickr_reflection_getMethods/.yml +65 -0
  17. data/spec/fixtures/cassettes/flickr_reflection_getMethods/_format_json.yml +65 -0
  18. data/spec/fixtures/cassettes/flickr_reflection_getMethods/_format_rest.yml +64 -0
  19. data/spec/fixtures/cassettes/{JSON_format/it_should_behave_like_Flickr_with_specified_format/Flickr/flickr_test_echo/with_oauth_token.yml → flickr_test_echo/_format_json.yml} +12 -12
  20. data/spec/fixtures/cassettes/{REST_format/it_should_behave_like_Flickr_with_specified_format/Flickr/flickr_test_echo/with_oauth_token.yml → flickr_test_echo/_format_rest.yml} +13 -13
  21. data/spec/fixtures/cassettes/flickr_upload.yml +1798 -0
  22. data/spec/fixtures/test.jpg +0 -0
  23. data/spec/fixtures/test_2.jpg +0 -0
  24. data/spec/flickr/reflection/getMethodInfo_spec.rb +73 -0
  25. data/spec/flickr/reflection/getMethods_spec.rb +53 -0
  26. data/spec/flickr/test/echo_spec.rb +51 -0
  27. data/spec/flickr/upload_spec.rb +33 -0
  28. data/spec/spec_helper.rb +4 -5
  29. metadata +70 -25
  30. data/spec/fixtures/cassettes/JSON_format/it_should_behave_like_Flickr_with_specified_format/Flickr/flickr_test_echo/no_oauth_token.yml +0 -40
  31. data/spec/fixtures/cassettes/REST_format/it_should_behave_like_Flickr_with_specified_format/Flickr/flickr_test_echo/no_oauth_token.yml +0 -39
  32. data/spec/json/flickr_spec.rb +0 -6
  33. data/spec/rest/flickr_spec.rb +0 -6
  34. data/spec/shared_examples.rb +0 -65
data/README.md CHANGED
@@ -28,6 +28,20 @@ Or, you can use the `flickr` method:
28
28
  :token_secret => OAUTH_ACCESS_TOKEN_SECRET,
29
29
  :format => :json
30
30
  )
31
+
32
+ For photo upload:
33
+
34
+ flickr.upload(
35
+ PATH_TO_IMAGE_FILE
36
+ :title => 'test upload', # optional
37
+ :description => 'this is a test', # optional
38
+ :tags => 'test upload', # optional
39
+ :content_type => 'image/jpeg', # optional
40
+ :consumer_key => CONSUMER_KEY,
41
+ :consumer_secret => CONSUMER_SECRET,
42
+ :token => OAUTH_ACCESS_TOKEN,
43
+ :token_secret => OAUTH_ACCESS_TOKEN_SECRET
44
+ )
31
45
 
32
46
  TODO
33
47
  -
data/flickr_oauth.gemspec CHANGED
@@ -23,8 +23,10 @@ Gem::Specification.new do |s|
23
23
 
24
24
  s.add_dependency 'faraday', '>= 0.7'
25
25
  s.add_dependency 'faraday_middleware', '>= 0.7.0.rc1'
26
- s.add_dependency 'multi_xml'
26
+ s.add_dependency 'mime-types'
27
+ s.add_dependency 'multipart-post'
27
28
  s.add_dependency 'multi_json'
29
+ s.add_dependency 'multi_xml'
28
30
  s.add_dependency 'simple_oauth'
29
31
  s.add_development_dependency 'rspec', '>= 2.6'
30
32
  s.add_development_dependency 'webmock', '>= 1.6'
data/lib/flickr.rb CHANGED
@@ -3,9 +3,196 @@ require 'flickr/client'
3
3
  module Flickr
4
4
  extend self
5
5
 
6
+ DEFAULT_ENDPOINT = 'http://api.flickr.com'.freeze
7
+ SECURE_ENDPOINT = 'https://secure.flickr.com'.freeze
8
+ REST_PATH = '/services/rest'.freeze
9
+ UPLOAD_PATH = '/services/upload'.freeze
10
+ REPLACE_PATH = '/services/replace'.freeze
11
+
12
+ METHODS = %w(
13
+ flickr.activity.userComments
14
+ flickr.activity.userPhotos
15
+ flickr.auth.checkToken
16
+ flickr.auth.getFrob
17
+ flickr.auth.getFullToken
18
+ flickr.auth.getToken
19
+ flickr.auth.oauth.getAccessToken
20
+ flickr.blogs.getList
21
+ flickr.blogs.getServices
22
+ flickr.blogs.postPhoto
23
+ flickr.collections.getInfo
24
+ flickr.collections.getTree
25
+ flickr.commons.getInstitutions
26
+ flickr.contacts.getList
27
+ flickr.contacts.getListRecentlyUploaded
28
+ flickr.contacts.getPublicList
29
+ flickr.favorites.add
30
+ flickr.favorites.getList
31
+ flickr.favorites.getPublicList
32
+ flickr.favorites.remove
33
+ flickr.galleries.addPhoto
34
+ flickr.galleries.create
35
+ flickr.galleries.editMeta
36
+ flickr.galleries.editPhoto
37
+ flickr.galleries.editPhotos
38
+ flickr.galleries.getInfo
39
+ flickr.galleries.getList
40
+ flickr.galleries.getListForPhoto
41
+ flickr.galleries.getPhotos
42
+ flickr.groups.browse
43
+ flickr.groups.getInfo
44
+ flickr.groups.members.getList
45
+ flickr.groups.pools.add
46
+ flickr.groups.pools.getContext
47
+ flickr.groups.pools.getGroups
48
+ flickr.groups.pools.getPhotos
49
+ flickr.groups.pools.remove
50
+ flickr.groups.search
51
+ flickr.interestingness.getList
52
+ flickr.machinetags.getNamespaces
53
+ flickr.machinetags.getPairs
54
+ flickr.machinetags.getPredicates
55
+ flickr.machinetags.getRecentValues
56
+ flickr.machinetags.getValues
57
+ flickr.panda.getList
58
+ flickr.panda.getPhotos
59
+ flickr.people.findByEmail
60
+ flickr.people.findByUsername
61
+ flickr.people.getInfo
62
+ flickr.people.getPhotos
63
+ flickr.people.getPhotosOf
64
+ flickr.people.getPublicGroups
65
+ flickr.people.getPublicPhotos
66
+ flickr.people.getUploadStatus
67
+ flickr.photos.addTags
68
+ flickr.photos.comments.addComment
69
+ flickr.photos.comments.deleteComment
70
+ flickr.photos.comments.editComment
71
+ flickr.photos.comments.getList
72
+ flickr.photos.comments.getRecentForContacts
73
+ flickr.photos.delete
74
+ flickr.photos.geo.batchCorrectLocation
75
+ flickr.photos.geo.correctLocation
76
+ flickr.photos.geo.getLocation
77
+ flickr.photos.geo.getPerms
78
+ flickr.photos.geo.photosForLocation
79
+ flickr.photos.geo.removeLocation
80
+ flickr.photos.geo.setContext
81
+ flickr.photos.geo.setLocation
82
+ flickr.photos.geo.setPerms
83
+ flickr.photos.getAllContexts
84
+ flickr.photos.getContactsPhotos
85
+ flickr.photos.getContactsPublicPhotos
86
+ flickr.photos.getContext
87
+ flickr.photos.getCounts
88
+ flickr.photos.getExif
89
+ flickr.photos.getFavorites
90
+ flickr.photos.getInfo
91
+ flickr.photos.getNotInSet
92
+ flickr.photos.getPerms
93
+ flickr.photos.getRecent
94
+ flickr.photos.getSizes
95
+ flickr.photos.getUntagged
96
+ flickr.photos.getWithGeoData
97
+ flickr.photos.getWithoutGeoData
98
+ flickr.photos.licenses.getInfo
99
+ flickr.photos.licenses.setLicense
100
+ flickr.photos.notes.add
101
+ flickr.photos.notes.delete
102
+ flickr.photos.notes.edit
103
+ flickr.photos.people.add
104
+ flickr.photos.people.delete
105
+ flickr.photos.people.deleteCoords
106
+ flickr.photos.people.editCoords
107
+ flickr.photos.people.getList
108
+ flickr.photos.recentlyUpdated
109
+ flickr.photos.removeTag
110
+ flickr.photos.search
111
+ flickr.photos.setContentType
112
+ flickr.photos.setDates
113
+ flickr.photos.setMeta
114
+ flickr.photos.setPerms
115
+ flickr.photos.setSafetyLevel
116
+ flickr.photos.setTags
117
+ flickr.photos.transform.rotate
118
+ flickr.photos.upload.checkTickets
119
+ flickr.photosets.addPhoto
120
+ flickr.photosets.comments.addComment
121
+ flickr.photosets.comments.deleteComment
122
+ flickr.photosets.comments.editComment
123
+ flickr.photosets.comments.getList
124
+ flickr.photosets.create
125
+ flickr.photosets.delete
126
+ flickr.photosets.editMeta
127
+ flickr.photosets.editPhotos
128
+ flickr.photosets.getContext
129
+ flickr.photosets.getInfo
130
+ flickr.photosets.getList
131
+ flickr.photosets.getPhotos
132
+ flickr.photosets.orderSets
133
+ flickr.photosets.removePhoto
134
+ flickr.photosets.removePhotos
135
+ flickr.photosets.reorderPhotos
136
+ flickr.photosets.setPrimaryPhoto
137
+ flickr.places.find
138
+ flickr.places.findByLatLon
139
+ flickr.places.getChildrenWithPhotosPublic
140
+ flickr.places.getInfo
141
+ flickr.places.getInfoByUrl
142
+ flickr.places.getPlaceTypes
143
+ flickr.places.getShapeHistory
144
+ flickr.places.getTopPlacesList
145
+ flickr.places.placesForBoundingBox
146
+ flickr.places.placesForContacts
147
+ flickr.places.placesForTags
148
+ flickr.places.placesForUser
149
+ flickr.places.resolvePlaceId
150
+ flickr.places.resolvePlaceURL
151
+ flickr.places.tagsForPlace
152
+ flickr.prefs.getContentType
153
+ flickr.prefs.getGeoPerms
154
+ flickr.prefs.getHidden
155
+ flickr.prefs.getPrivacy
156
+ flickr.prefs.getSafetyLevel
157
+ flickr.reflection.getMethodInfo
158
+ flickr.reflection.getMethods
159
+ flickr.stats.getCollectionDomains
160
+ flickr.stats.getCollectionReferrers
161
+ flickr.stats.getCollectionStats
162
+ flickr.stats.getCSVFiles
163
+ flickr.stats.getPhotoDomains
164
+ flickr.stats.getPhotoReferrers
165
+ flickr.stats.getPhotosetDomains
166
+ flickr.stats.getPhotosetReferrers
167
+ flickr.stats.getPhotosetStats
168
+ flickr.stats.getPhotoStats
169
+ flickr.stats.getPhotostreamDomains
170
+ flickr.stats.getPhotostreamReferrers
171
+ flickr.stats.getPhotostreamStats
172
+ flickr.stats.getPopularPhotos
173
+ flickr.stats.getTotalViews
174
+ flickr.tags.getClusterPhotos
175
+ flickr.tags.getClusters
176
+ flickr.tags.getHotList
177
+ flickr.tags.getListPhoto
178
+ flickr.tags.getListUser
179
+ flickr.tags.getListUserPopular
180
+ flickr.tags.getListUserRaw
181
+ flickr.tags.getRelated
182
+ flickr.test.echo
183
+ flickr.test.login
184
+ flickr.test.null
185
+ flickr.urls.getGroup
186
+ flickr.urls.getUserPhotos
187
+ flickr.urls.getUserProfile
188
+ flickr.urls.lookupGallery
189
+ flickr.urls.lookupGroup
190
+ flickr.urls.lookupUser
191
+ )
192
+
6
193
  def new(options = {})
7
194
  Flickr::Client.new(options)
8
- end
195
+ end
9
196
  end
10
197
 
11
198
  def flickr
data/lib/flickr/client.rb CHANGED
@@ -1,15 +1,16 @@
1
- require 'faraday'
2
- require 'faraday_middleware'
3
- require 'faraday/response/raise_flickr_error'
1
+ require 'flickr/client/authentication'
2
+ require 'flickr/client/connection'
3
+ require 'flickr/client/requests'
4
+ require 'flickr/client/upload'
5
+
4
6
  require 'flickr/node'
5
7
 
6
- module Flickr
8
+ module Flickr
7
9
  class Client
8
- DEFAULT_ENDPOINT = 'http://api.flickr.com'.freeze
9
- SECURE_ENDPOINT = 'https://secure.flickr.com'.freeze
10
- REST_PATH = '/services/rest'.freeze
11
- UPLOAD_PATH = '/services/upload'.freeze
12
- REPLACE_PATH = '/services/resplace'.freeze
10
+ include Flickr::Client::Authentication
11
+ include Flickr::Client::Connection
12
+ include Flickr::Client::Requests
13
+ include Flickr::Client::Upload
13
14
 
14
15
  CONFIGURATION_KEYS = [
15
16
  :consumer_key,
@@ -18,8 +19,9 @@ module Flickr
18
19
  :token_secret,
19
20
  :secure,
20
21
  :format,
21
- :enable_logging
22
- ]
22
+ :enable_logging,
23
+ :normalize
24
+ ]
23
25
 
24
26
  attr_accessor *CONFIGURATION_KEYS
25
27
 
@@ -30,46 +32,15 @@ module Flickr
30
32
  end
31
33
 
32
34
  def endpoint(secure = false)
33
- secure or self.secure ? SECURE_ENDPOINT : DEFAULT_ENDPOINT
34
- end
35
-
36
- def authentication(options = {})
37
- {
38
- :consumer_key => consumer_key,
39
- :consumer_secret => consumer_secret,
40
- :token => token,
41
- :token_secret => token_secret
42
- }.merge(options.select{|k,v| [:consumer_key, :consumer_secret, :token, :token_secret].include?(k.to_sym)})
43
- end
44
-
45
- def adapter
46
- @adapter || Faraday.default_adapter
47
- end
48
-
49
- def connection(options = {})
50
- @connection = Faraday.new(:url => endpoint(options[:secure])) do |builder|
51
- builder.use Faraday::Request::OAuth, authentication(options)
52
- builder.use Faraday::Request::Multipart
53
- builder.use Faraday::Request::UrlEncoded
54
-
55
- builder.use Faraday::Response::RaiseFlickrError
56
- if (options[:format] or format).to_s == 'json'
57
- builder.use Faraday::Response::ParseJson
58
- else
59
- builder.use Faraday::Response::ParseXml
60
- end
61
- builder.use Faraday::Response::RaiseError
62
- builder.use Faraday::Response::Logger if options[:enable_logging] or enable_logging
63
-
64
- builder.adapter adapter
65
- end
35
+ secure or self.secure ? Flickr::SECURE_ENDPOINT : Flickr::DEFAULT_ENDPOINT
66
36
  end
67
37
 
68
- protected
38
+ protected
69
39
 
70
40
  def method_missing(method_name, *args)
41
+ # super unless ['reflection'].include?(method_name.to_s)
71
42
  args.empty? ? Flickr::Node.new(self, ['flickr', method_name].join('.')) : super
72
- end
43
+ end
73
44
 
74
45
  end
75
46
  end
@@ -0,0 +1,17 @@
1
+ module Flickr
2
+ class Client
3
+ module Authentication
4
+ AUTHENTICATION_KEYS = [:consumer_key, :consumer_secret, :token, :token_secret]
5
+
6
+ def authentication_options(options = {})
7
+ {
8
+ :consumer_key => consumer_key,
9
+ :consumer_secret => consumer_secret,
10
+ :token => token,
11
+ :token_secret => token_secret
12
+ }.merge(options.select{|k,v| AUTHENTICATION_KEYS.include?(k.to_sym)})
13
+ end
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,44 @@
1
+ require 'faraday'
2
+ require 'faraday_middleware'
3
+ require 'faraday/response/raise_flickr_error'
4
+
5
+ module Flickr
6
+ class Client
7
+ module Connection
8
+
9
+ def connection(options = {})
10
+ @connection = Faraday.new(:url => endpoint(options[:secure])) do |builder|
11
+ builder.use Faraday::Request::OAuth, authentication_options(options)
12
+ builder.use Faraday::Request::Multipart
13
+ builder.use Faraday::Request::UrlEncoded
14
+
15
+ builder.use Faraday::Response::RaiseFlickrError
16
+ if (options[:format] or format).to_s == 'json'
17
+ builder.use Faraday::Response::ParseJson
18
+ else
19
+ builder.use Faraday::Response::ParseXml
20
+ end
21
+ builder.use Faraday::Response::RaiseError
22
+ builder.use Faraday::Response::Logger if options[:enable_logging] or enable_logging
23
+
24
+ builder.adapter adapter
25
+ end
26
+ end
27
+
28
+ def adapter
29
+ @adapter || Faraday.default_adapter
30
+ end
31
+
32
+ protected
33
+
34
+ def extract_connection_options(params = {})
35
+ CONFIGURATION_KEYS.inject({}) do |options, k|
36
+ if params.has_key?(k)
37
+ options[k.to_sym] = (k == :format ? params.fetch(k) : params.delete(k))
38
+ end
39
+ options
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,69 @@
1
+ module Flickr
2
+ class Client
3
+ module Requests
4
+
5
+ def get(path, params = {})
6
+ request :get, path, params
7
+ end
8
+
9
+ def post(path, params = {})
10
+ request :post, path, params
11
+ end
12
+
13
+ def put(path, params = {})
14
+ request :put, path, params
15
+ end
16
+
17
+ def delete(path, params = {})
18
+ request :delete, path, params
19
+ end
20
+
21
+ def request(method, path, params = {})
22
+ params = params.dup
23
+ options = extract_connection_options(params)
24
+
25
+ if method.to_sym == :get
26
+ response = connection(options).send(method, build_rest_query(path, params))
27
+ else
28
+ response = connection(options).send(method, path, params)
29
+ end
30
+
31
+ if options[:normalize]
32
+ options[:format].to_s == 'json' ? normalize_json(response.body) : normalize_xml(response.body)
33
+ else
34
+ response.body
35
+ end
36
+ end
37
+
38
+ protected
39
+
40
+ def build_rest_query(path, params = {})
41
+ params[:format] ||= self.format
42
+ params[:nojsoncallback] = (params[:format].to_s == 'json' ? 1 : nil)
43
+ query = params.map{|k,v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" unless v.nil?}.compact.join("&")
44
+ [path, query].join("?")
45
+ end
46
+
47
+ def normalize_json(raw)
48
+ if raw.is_a?(Hash)
49
+ if raw.keys.size == 1 and raw.has_key?('_content')
50
+ raw['_content']
51
+ else
52
+ raw.each_pair do |k, v|
53
+ raw[k] = normalize_json(v)
54
+ end
55
+ end
56
+ elsif raw.is_a?(Array)
57
+ raw.collect{|r| normalize_json(r) }
58
+ else
59
+ raw
60
+ end
61
+ end
62
+
63
+ def normalize_xml(xml_result)
64
+ xml_result['rsp']
65
+ end
66
+
67
+ end
68
+ end
69
+ end