fleakr 0.6.3 → 0.7.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.
- data/README.rdoc +88 -57
- data/Rakefile +28 -9
- data/lib/fleakr.rb +25 -31
- data/lib/fleakr/api/option.rb +34 -34
- data/lib/fleakr/api/parameter_list.rb +23 -23
- data/lib/fleakr/objects.rb +4 -1
- data/lib/fleakr/objects/metadata.rb +35 -0
- data/lib/fleakr/objects/metadata_collection.rb +36 -0
- data/lib/fleakr/objects/photo.rb +15 -11
- data/lib/fleakr/objects/set.rb +17 -13
- data/lib/fleakr/objects/url.rb +83 -0
- data/lib/fleakr/objects/user.rb +8 -0
- data/lib/fleakr/support.rb +3 -1
- data/lib/fleakr/support/attribute.rb +2 -2
- data/lib/fleakr/support/object.rb +44 -29
- data/lib/fleakr/support/url_expander.rb +37 -0
- data/lib/fleakr/support/utility.rb +66 -0
- data/lib/fleakr/version.rb +5 -5
- data/test/fixtures/photos.getExif.xml +362 -0
- data/test/test_helper.rb +44 -47
- data/test/unit/fleakr/api/authentication_request_test.rb +12 -12
- data/test/unit/fleakr/api/file_parameter_test.rb +15 -15
- data/test/unit/fleakr/api/method_request_test.rb +1 -1
- data/test/unit/fleakr/api/option_test.rb +44 -44
- data/test/unit/fleakr/api/parameter_list_test.rb +40 -40
- data/test/unit/fleakr/api/response_test.rb +10 -10
- data/test/unit/fleakr/api/upload_request_test.rb +28 -28
- data/test/unit/fleakr/api/value_parameter_test.rb +10 -10
- data/test/unit/fleakr/core_ext/false_class_test.rb +5 -5
- data/test/unit/fleakr/core_ext/hash_test.rb +9 -9
- data/test/unit/fleakr/core_ext/true_class_test.rb +5 -5
- data/test/unit/fleakr/objects/authentication_token_test.rb +23 -23
- data/test/unit/fleakr/objects/collection_test.rb +23 -23
- data/test/unit/fleakr/objects/comment_test.rb +15 -15
- data/test/unit/fleakr/objects/contact_test.rb +11 -11
- data/test/unit/fleakr/objects/error_test.rb +8 -8
- data/test/unit/fleakr/objects/group_test.rb +13 -13
- data/test/unit/fleakr/objects/image_test.rb +4 -4
- data/test/unit/fleakr/objects/metadata_collection_test.rb +55 -0
- data/test/unit/fleakr/objects/metadata_test.rb +27 -0
- data/test/unit/fleakr/objects/photo_context_test.rb +23 -23
- data/test/unit/fleakr/objects/photo_test.rb +71 -64
- data/test/unit/fleakr/objects/search_test.rb +22 -22
- data/test/unit/fleakr/objects/set_test.rb +62 -40
- data/test/unit/fleakr/objects/tag_test.rb +32 -31
- data/test/unit/fleakr/objects/url_test.rb +185 -0
- data/test/unit/fleakr/objects/user_test.rb +43 -16
- data/test/unit/fleakr/support/attribute_test.rb +15 -15
- data/test/unit/fleakr/support/object_test.rb +77 -33
- data/test/unit/fleakr/support/request_test.rb +12 -12
- data/test/unit/fleakr/support/url_expander_test.rb +44 -0
- data/test/unit/fleakr/support/utility_test.rb +70 -0
- data/test/unit/fleakr_test.rb +48 -41
- metadata +43 -23
data/README.rdoc
CHANGED
@@ -26,15 +26,15 @@ Now that you have your key, you can get things rolling with irb and the fleakr g
|
|
26
26
|
|
27
27
|
$ irb -r rubygems
|
28
28
|
>> require 'fleakr'
|
29
|
-
|
29
|
+
|
30
30
|
Then, set your API key (only need to do this once per session):
|
31
31
|
|
32
32
|
>> Fleakr.api_key = '<your api key here>'
|
33
33
|
|
34
34
|
=== A Brief Tour
|
35
35
|
|
36
|
-
With just an API key, you have the ability to retrieve a substantial amount of data
|
37
|
-
about users, their photosets, photos, contacts, and groups. Let's start by finding a
|
36
|
+
With just an API key, you have the ability to retrieve a substantial amount of data
|
37
|
+
about users, their photosets, photos, contacts, and groups. Let's start by finding a
|
38
38
|
user by his username:
|
39
39
|
|
40
40
|
>> user = Fleakr.user('the decapitator')
|
@@ -44,7 +44,7 @@ By email:
|
|
44
44
|
|
45
45
|
>> user = Fleakr.user('user@host.com')
|
46
46
|
=> #<Fleakr::Objects::User:0x11f484c @username="bckspcr", @id="84481630@N00">
|
47
|
-
|
47
|
+
|
48
48
|
Or even by URL:
|
49
49
|
|
50
50
|
>> user = Fleakr.user('http://www.flickr.com/photos/the_decapitator/')
|
@@ -53,7 +53,7 @@ Or even by URL:
|
|
53
53
|
Once you have a user, you can find his associated sets:
|
54
54
|
|
55
55
|
>> user.sets
|
56
|
-
=> [#<Fleakr::Objects::Set:0x671358 @title="The Decapitator", @description="">,
|
56
|
+
=> [#<Fleakr::Objects::Set:0x671358 @title="The Decapitator", @description="">,
|
57
57
|
#<Fleakr::Objects::Set:0x66d898 @title="londonpaper hijack", ...
|
58
58
|
|
59
59
|
His individual photos:
|
@@ -68,9 +68,9 @@ Or contacts:
|
|
68
68
|
@id="12289718@N00", @icon_farm="1", @icon_server="4">
|
69
69
|
|
70
70
|
Or his groups if you would like:
|
71
|
-
|
71
|
+
|
72
72
|
>> user.groups
|
73
|
-
=> [#<Fleakr::Objects::Group:0x11f2330 ...,
|
73
|
+
=> [#<Fleakr::Objects::Group:0x11f2330 ...,
|
74
74
|
#<Fleakr::Objects::Group:0x11f2308 ...
|
75
75
|
>> user.groups.first.name
|
76
76
|
=> "Rural Decay"
|
@@ -93,20 +93,20 @@ When accessing a set, you can also grab all the photos that are in that set:
|
|
93
93
|
|
94
94
|
=== Contacts
|
95
95
|
|
96
|
-
Besides pulling back a given user's public contacts list, you can also retrieve the list of
|
96
|
+
Besides pulling back a given user's public contacts list, you can also retrieve the list of
|
97
97
|
contacts for the currently authenticated user (see below about authentication). For example,
|
98
98
|
you can retrieve all contacts:
|
99
99
|
|
100
100
|
>> Fleakr.contacts
|
101
101
|
=> [#<Fleakr::Objects::Contact:0x111ff84 @username="bryan.ray" ...>]
|
102
|
-
|
102
|
+
|
103
103
|
Or just the contacts marked as 'family':
|
104
|
-
|
104
|
+
|
105
105
|
>> Fleakr.contacts(:family)
|
106
106
|
=> [#<Fleakr::Objects::Contact:0x12db42c @username="Grandbob" ...>]
|
107
|
-
|
107
|
+
|
108
108
|
Or a specific page of contacts marked as 'friends':
|
109
|
-
|
109
|
+
|
110
110
|
>> Fleakr.contacts(:friends, :page => 3, :per_page => 5)
|
111
111
|
=> [#<Fleakr::Objects::Contact:0x12a6c54 @username="Louise and BCG" ...>]
|
112
112
|
|
@@ -116,40 +116,40 @@ See the documentation for Fleakr.contacts for what options are available.
|
|
116
116
|
|
117
117
|
Each photo object contains metadata about a collection of images, each representing different
|
118
118
|
sizes. Once we have a single photo:
|
119
|
-
|
119
|
+
|
120
120
|
>> photo = user.photos.first
|
121
121
|
=> #<Fleakr::Objects::Photo:0x161b024 @title="\"Be Fabulous\"" ... >
|
122
|
-
|
122
|
+
|
123
123
|
We can get information about one of the sizes:
|
124
124
|
|
125
125
|
>> photo.small
|
126
126
|
=> #<Fleakr::Objects::Image:0x1768f1c @height="172", @size="Small", @width="240",
|
127
|
-
@url="http://farm4.static.flickr.com/3250/2924549350_cbc1804258_m.jpg",
|
127
|
+
@url="http://farm4.static.flickr.com/3250/2924549350_cbc1804258_m.jpg",
|
128
128
|
@page="http://www.flickr.com/photos/the_decapitator/2924549350/sizes/s/">
|
129
129
|
|
130
130
|
Grab the URL for the image itself:
|
131
131
|
|
132
132
|
>> photo.small.url
|
133
133
|
=> "http://farm4.static.flickr.com/3250/2924549350_cbc1804258_m.jpg"
|
134
|
-
|
134
|
+
|
135
135
|
Or grab the URL for its page on the Flickr site:
|
136
|
-
|
136
|
+
|
137
137
|
>> photo.small.page
|
138
138
|
=> "http://www.flickr.com/photos/the_decapitator/2924549350/sizes/s/"
|
139
|
-
|
139
|
+
|
140
140
|
Other sizes are available (:square, :thumbnail, :small, :medium, :large, :original) and
|
141
141
|
are accessed in the same way:
|
142
|
-
|
142
|
+
|
143
143
|
>> photo.original.url
|
144
144
|
=> "http://farm4.static.flickr.com/3250/2924549350_1cf67c2d47_o.jpg"
|
145
|
-
|
145
|
+
|
146
146
|
=== Tags
|
147
147
|
|
148
148
|
Tags are available for users and photos. Retrieving them is easy:
|
149
149
|
|
150
150
|
>> user = Fleakr.user('the decapitator')
|
151
151
|
>> user.tags
|
152
|
-
=> [#<Fleakr::Objects::Tag:0x190d5fc @value="ad">,
|
152
|
+
=> [#<Fleakr::Objects::Tag:0x190d5fc @value="ad">,
|
153
153
|
#<Fleakr::Objects::Tag:0x1908a20 @value="ads">, ...
|
154
154
|
>> user.photos.first.tags
|
155
155
|
=> [#<Fleakr::Objects::Tag:0x17b1b18 @machine_flag="0", @author_id="21775151@N06", ...
|
@@ -169,12 +169,12 @@ All tags have values, but for tags associated with photos there is some addition
|
|
169
169
|
=> false
|
170
170
|
>> tag.author
|
171
171
|
=> #<Fleakr::Objects::User:0x1a149f0 @username="the decapitator", ... >
|
172
|
-
|
172
|
+
|
173
173
|
Each tag can also have related tags:
|
174
174
|
|
175
175
|
>> user.photos.first.tags[1].related.first.related.first.to_s
|
176
176
|
=> "face"
|
177
|
-
|
177
|
+
|
178
178
|
You get the idea - see Fleakr::Objects::Tag for more information.
|
179
179
|
|
180
180
|
=== Comments
|
@@ -219,28 +219,41 @@ in turn, can have either collections or sets associated with them. For example:
|
|
219
219
|
>> user.collections.first.collections.first.sets.first.title
|
220
220
|
=> "A Trip to Yosemite"
|
221
221
|
|
222
|
-
Note that collections are limited to Flickr pro members. See Fleakr::Objects::Collection for more
|
222
|
+
Note that collections are limited to Flickr pro members. See Fleakr::Objects::Collection for more
|
223
223
|
information.
|
224
224
|
|
225
|
+
=== Accessing Resources by URL
|
226
|
+
|
227
|
+
Sometimes you want to retrieve a person, set, or photo but you only have the public Flickr URL for
|
228
|
+
that entity. Retrieval is easy:
|
229
|
+
|
230
|
+
>> Fleakr.resource_from_url('http://www.flickr.com/people/reagent/')
|
231
|
+
=> #<Fleakr::Objects::User @id="25073988@N05", @username="reagent", @authentication_options={}>
|
232
|
+
|
233
|
+
This method also supports the retrieval of photos from a shortened Flickr URL:
|
234
|
+
|
235
|
+
>> Fleakr.resource_from_url('http://flic.kr/p/95Nr83')
|
236
|
+
=> #<Fleakr::Objects::Photo @id="5305179788", @title="Comic Sans Sign", ... >
|
237
|
+
|
225
238
|
=== Saving Images
|
226
239
|
|
227
240
|
If a photo interests you, save it down to a directory of your choosing:
|
228
241
|
|
229
242
|
>> photo.original.save_to('/tmp')
|
230
243
|
=> #<File:/tmp/2924549350_1cf67c2d47_o.jpg (closed)>
|
231
|
-
|
232
|
-
Similarly, you can save down entire sets. Just specify the target directory and the size
|
244
|
+
|
245
|
+
Similarly, you can save down entire sets. Just specify the target directory and the size
|
233
246
|
of the images you're interested in:
|
234
247
|
|
235
248
|
>> user.sets.first.save_to('/tmp', :square)
|
236
249
|
=> [#<Fleakr::Objects::Photo:0x1187a1c @secret="715587b2cb" ...
|
237
|
-
|
250
|
+
|
238
251
|
This creates a subdirectory within the target directory based on the set's name and preserves
|
239
252
|
the original order of the photos:
|
240
|
-
|
253
|
+
|
241
254
|
>> Dir["/tmp/#{user.sets.first.title}/*.jpg"].map
|
242
|
-
=> ["/tmp/The Decapitator/01_2117922283_715587b2cb_s.jpg",
|
243
|
-
"/tmp/The Decapitator/02_2125604584_9c09348fd6_s.jpg",
|
255
|
+
=> ["/tmp/The Decapitator/01_2117922283_715587b2cb_s.jpg",
|
256
|
+
"/tmp/The Decapitator/02_2125604584_9c09348fd6_s.jpg",
|
244
257
|
"/tmp/The Decapitator/03_2118696542_8af5763bde_s.jpg", ... ]
|
245
258
|
|
246
259
|
=== Searching
|
@@ -248,7 +261,7 @@ the original order of the photos:
|
|
248
261
|
If you would prefer to just search photos, you can do that with search text:
|
249
262
|
|
250
263
|
>> photos = Fleakr.search('ponies!!')
|
251
|
-
=> [#<Fleakr::Objects::Photo:0x11f4e64 @title="hiroshima atomic garden", @id="3078234390">,
|
264
|
+
=> [#<Fleakr::Objects::Photo:0x11f4e64 @title="hiroshima atomic garden", @id="3078234390">,
|
252
265
|
#<Fleakr::Objects::Photo:0x11f4928 @title="PONYLOV", @id="3077360853">, ...
|
253
266
|
>> photos.first.title
|
254
267
|
=> "hiroshima atomic garden"
|
@@ -265,21 +278,38 @@ Searches can also be scoped to other entities in the system (namely Users and Gr
|
|
265
278
|
|
266
279
|
>> user.groups.first.search('awesome')
|
267
280
|
=> [#<Fleakr::Objects::Photo:0x18cb4cc @server_id="2012", @id="2181921273",
|
268
|
-
@farm_id="3", @title="", @secret="634eda7521">, ...
|
281
|
+
@farm_id="3", @title="", @secret="634eda7521">, ...
|
269
282
|
>> user.search('serpent')
|
270
283
|
=> [#<Fleakr::Objects::Photo:0x18a6960 @server_id="41", @id="81370156",
|
271
284
|
@farm_id="1", @title="Clear and Serpent Danger", @secret="013091582a">]
|
272
285
|
|
286
|
+
=== Exif Data
|
287
|
+
|
288
|
+
Exif metadata can be retrieved for a photo:
|
289
|
+
|
290
|
+
>> photo = Fleakr::Objects::Photo.find_by_id('4507120023')
|
291
|
+
>> photo.metadata.keys
|
292
|
+
=> ["ImageSize", "Optical Zoom Mode", "RedBalance", "Y-Resolution", ... ]
|
293
|
+
>> photo.metadata['ImageSize']
|
294
|
+
=> "3264x2448"
|
295
|
+
|
296
|
+
You can iterate over the available elements and grab additional information:
|
297
|
+
|
298
|
+
>> photo.metadata.map {|k, e| "#{k} => '#{e.clean}'" }
|
299
|
+
=> ["Exposure => '0.003 sec (1/400)'", "Y-Resolution => '180 dpi'", ... ]
|
300
|
+
|
301
|
+
See the documentation for Fleakr::Objects::Metadata for information on what's available.
|
302
|
+
|
273
303
|
=== Uploading Files
|
274
304
|
|
275
|
-
Before you can upload files, you need to be able to make authenticated calls to the Flickr
|
305
|
+
Before you can upload files, you need to be able to make authenticated calls to the Flickr
|
276
306
|
API. Skip to the next section (Authenticated Calls) for details on how to make this work.
|
277
307
|
|
278
308
|
Uploading single files is simple:
|
279
309
|
|
280
310
|
>> Fleakr.upload('/path/to/image.jpg')
|
281
311
|
=> [#<Fleakr::Objects::Photo:0x217fb54 @updated="1236133594", @server_id="3266", ...>]
|
282
|
-
|
312
|
+
|
283
313
|
Notice that the newly-uploaded image is returned. You can further inspect / modify this as
|
284
314
|
necessary. The real magic is in uploading multiple files - the upload method takes a file
|
285
315
|
glob:
|
@@ -291,7 +321,7 @@ glob:
|
|
291
321
|
|
292
322
|
You can also set options on the file(s) that you're uploading:
|
293
323
|
|
294
|
-
>> Fleakr.upload('/path/to/party/images/*.jpg', :viewable_by => :everyone,
|
324
|
+
>> Fleakr.upload('/path/to/party/images/*.jpg', :viewable_by => :everyone,
|
295
325
|
:title => 'Party Pics')
|
296
326
|
|
297
327
|
The full list of options can be found in the Fleakr::Objects::Photo documentation.
|
@@ -299,8 +329,8 @@ The full list of options can be found in the Fleakr::Objects::Photo documentatio
|
|
299
329
|
=== Authenticated Calls
|
300
330
|
|
301
331
|
While read-only access to the API gets you quite a bit of data, you'll need to generate an
|
302
|
-
authentication token if you want access to the more powerful features (like uploading your
|
303
|
-
own photos).
|
332
|
+
authentication token if you want access to the more powerful features (like uploading your
|
333
|
+
own photos).
|
304
334
|
|
305
335
|
Depending on how you intend to use the Flickr API, there are 2 methods for performing
|
306
336
|
authenticated calls.
|
@@ -315,22 +345,22 @@ list of keys on the Flickr site, click on the 'Edit key details' link and ensure
|
|
315
345
|
1. The value for 'Mobile Permissions' is set to either 'write' or 'delete'
|
316
346
|
|
317
347
|
Once this is set, you'll see your Authentication URL on the key details page (it will look
|
318
|
-
something like http://www.flickr.com/auth-534525246245). Paste this URL into your browser and
|
348
|
+
something like http://www.flickr.com/auth-534525246245). Paste this URL into your browser and
|
319
349
|
confirm access to get your mini-token. Now you're ready to configure your authentication token:
|
320
350
|
|
321
351
|
Fleakr.api_key = 'ABC123'
|
322
352
|
Fleakr.shared_secret = 'sekrit' # Available with your key details on the Flickr site
|
323
|
-
|
353
|
+
|
324
354
|
token = Fleakr.token_from_mini_token('294-585-410')
|
325
355
|
Fleakr.auth_token = token.value
|
326
|
-
|
356
|
+
|
327
357
|
Fleakr.upload('/path/to/my/photo.jpg')
|
328
358
|
|
329
359
|
Once you use the mini-token once it is no longer available. To use the generated auth_token
|
330
360
|
for future requests, you'll need to make sure that you set the value permanently:
|
331
361
|
|
332
362
|
Fleakr.auth_token = '72157622657341094-41241e527f325abb'
|
333
|
-
|
363
|
+
|
334
364
|
=== Multiple Users
|
335
365
|
|
336
366
|
If you need to have your application access other users photos on their behalf, you'll want to
|
@@ -340,31 +370,31 @@ use the Web authentication method. Edit your key details and make sure that:
|
|
340
370
|
1. The value for 'Authentication Type' is set to 'Web Application'
|
341
371
|
1. You configure your callback URL to point to something valid and accessible
|
342
372
|
|
343
|
-
Make sure that your key and secret are set as above. You can then begin the process by requesting
|
344
|
-
that the user authorize access to his Flickr account by redirecting to an authorization URL. I'm
|
373
|
+
Make sure that your key and secret are set as above. You can then begin the process by requesting
|
374
|
+
that the user authorize access to his Flickr account by redirecting to an authorization URL. I'm
|
345
375
|
assuming Rails conventions here, but this should work with any Ruby web framework:
|
346
376
|
|
347
377
|
redirect_to Fleakr.authorization_url
|
348
|
-
|
378
|
+
|
349
379
|
By default, we request read permission for access. This doesn't really do much more than what the
|
350
380
|
public API allows, so you can request different permissions when asking for authorization:
|
351
381
|
|
352
382
|
# The values :read, :write, and :delete are supported
|
353
383
|
redirect_to Fleakr.authorization_url(:delete)
|
354
384
|
|
355
|
-
One the user authorizes your application, he will be redirected back to your callback URL with a
|
385
|
+
One the user authorizes your application, he will be redirected back to your callback URL with a
|
356
386
|
<tt>frob</tt> parameter as part of the query string. You'll need to exchange this for a token:
|
357
387
|
|
358
388
|
token = Fleakr.token_from_frob(params[:frob])
|
359
|
-
|
360
|
-
The actual authentication token is available by calling <tt>token.value</tt> in the above
|
389
|
+
|
390
|
+
The actual authentication token is available by calling <tt>token.value</tt> in the above
|
361
391
|
example. You'll want to store this value somewhere to make future API calls on behalf of this
|
362
|
-
user. To make that process easier, there is a method that you can use that will allow you to
|
392
|
+
user. To make that process easier, there is a method that you can use that will allow you to
|
363
393
|
automatically scope your requests to the authenticated user:
|
364
394
|
|
365
395
|
user = Fleakr.user_for_token('72157622657341094-41241e527f325abb')
|
366
|
-
|
367
|
-
From there, you can make any of the usual calls available with the API. See
|
396
|
+
|
397
|
+
From there, you can make any of the usual calls available with the API. See
|
368
398
|
Fleakr::Objects::User for more information.
|
369
399
|
|
370
400
|
=== What Went Wrong?
|
@@ -374,27 +404,27 @@ what's really going on when you run into unexpected behavior. To make things ea
|
|
374
404
|
have Fleakr log all of the API traffic. Here's how:
|
375
405
|
|
376
406
|
Fleakr.logger = Logger.new('/tmp/fleakr.log')
|
377
|
-
|
378
|
-
Now any calls to the API will log both their request and response data to that file. But be
|
407
|
+
|
408
|
+
Now any calls to the API will log both their request and response data to that file. But be
|
379
409
|
warned, this can be pretty verbose by default (especially if you're doing file uploads). To see
|
380
410
|
just the requests you need to tune the log level:
|
381
411
|
|
382
412
|
logger = Logger.new('/tmp/fleakr.log')
|
383
413
|
logger.level = Logger::INFO
|
384
|
-
|
414
|
+
|
385
415
|
Fleakr.logger = logger
|
386
|
-
|
416
|
+
|
387
417
|
Even if something doesn't go wrong, this is a good way to get a sense for when you're making
|
388
418
|
API requests.
|
389
419
|
|
390
420
|
== Contributing
|
391
421
|
|
392
|
-
If there is a feature that you would like to contribute, I gladly accept pull requests. There
|
422
|
+
If there is a feature that you would like to contribute, I gladly accept pull requests. There
|
393
423
|
are a few things that make my life easier when integrating your changes:
|
394
424
|
|
395
425
|
* Verify that all tests are passing (run `rake` from the project root)
|
396
426
|
* Keep your commits small, focused, and tested - this allows me to apply changes cleanly
|
397
|
-
* Leave the Rakefile and version information intact - if you really want to make changes,
|
427
|
+
* Leave the Rakefile and version information intact - if you really want to make changes,
|
398
428
|
please do so in a separate commit.
|
399
429
|
|
400
430
|
Once your changes are applied, I will add you to the list of contributors.
|
@@ -404,6 +434,7 @@ Once your changes are applied, I will add you to the list of contributors.
|
|
404
434
|
While Fleakr started as a labor of love for me, I'm glad that others have been interested
|
405
435
|
in this project enough to contribute their ideas and code:
|
406
436
|
|
437
|
+
* {Gordon Anderson}[http://github.com/gordonbanderson]
|
407
438
|
* {Mark Dickson}[http://github.com/ideaoforder]
|
408
439
|
* {John Guenin}[http://github.com/johng]
|
409
440
|
* {Thomas Olausson}[http://github.com/latompa]
|
@@ -426,7 +457,7 @@ Thanks!
|
|
426
457
|
* Implement save-able search results (e.g. Fleakr.search('ponies').save_to('/path', :medium))
|
427
458
|
* Implement deeper associations for core elements (e.g. tags / etc..)
|
428
459
|
* Implement write methods for photos & photosets
|
429
|
-
* Implement flickr.places.* portion of API
|
460
|
+
* Implement flickr.places.* portion of API
|
430
461
|
|
431
462
|
== License
|
432
463
|
|
data/Rakefile
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake/gempackagetask'
|
3
3
|
require 'rake/testtask'
|
4
|
+
require 'hanna/rdoctask'
|
4
5
|
|
5
|
-
require 'lib/fleakr/version'
|
6
|
+
require File.expand_path('../lib/fleakr/version', __FILE__)
|
6
7
|
|
7
8
|
spec = Gem::Specification.new do |s|
|
8
9
|
s.name = 'fleakr'
|
@@ -13,11 +14,10 @@ spec = Gem::Specification.new do |s|
|
|
13
14
|
s.summary = "A small, yet powerful, gem to interface with Flickr photostreams"
|
14
15
|
s.author = 'Patrick Reagan'
|
15
16
|
s.email = 'reaganpr@gmail.com'
|
16
|
-
s.homepage = 'http://
|
17
|
+
s.homepage = 'http://fleakr.org'
|
17
18
|
s.files = %w(README.rdoc Rakefile) + Dir.glob("{lib,test}/**/*")
|
18
|
-
|
19
|
+
|
19
20
|
s.add_dependency('hpricot', '>= 0.6.164')
|
20
|
-
s.add_dependency('activesupport', '>= 2.0')
|
21
21
|
s.add_dependency('loggable', '>= 0.2.0')
|
22
22
|
end
|
23
23
|
|
@@ -25,6 +25,23 @@ Rake::GemPackageTask.new(spec) do |pkg|
|
|
25
25
|
pkg.gem_spec = spec
|
26
26
|
end
|
27
27
|
|
28
|
+
Rake::RDocTask.new(:doc) do |doc|
|
29
|
+
doc.rdoc_files.include('README.rdoc').
|
30
|
+
include('lib/**/*.rb').
|
31
|
+
exclude('lib/fleakr/version.rb')
|
32
|
+
|
33
|
+
doc.main = "README.rdoc" # page to start on
|
34
|
+
doc.title = "Fleakr #{Fleakr::Version} Documentation"
|
35
|
+
|
36
|
+
doc.rdoc_dir = "doc/#{Fleakr::Version}"
|
37
|
+
doc.options << '--quiet'
|
38
|
+
end
|
39
|
+
|
40
|
+
desc 'Install this Gem'
|
41
|
+
task :install => :gem do
|
42
|
+
sh "gem install pkg/#{spec.full_name}.gem"
|
43
|
+
end
|
44
|
+
|
28
45
|
Rake::TestTask.new do |t|
|
29
46
|
t.libs << 'test'
|
30
47
|
t.test_files = FileList["test/**/*_test.rb"]
|
@@ -34,21 +51,23 @@ end
|
|
34
51
|
begin
|
35
52
|
require 'rcov/rcovtask'
|
36
53
|
|
54
|
+
desc 'Run tests with code coverage statistics'
|
37
55
|
Rcov::RcovTask.new(:coverage) do |t|
|
38
56
|
t.libs = ['test']
|
39
57
|
t.test_files = FileList["test/**/*_test.rb"]
|
40
58
|
t.verbose = true
|
41
|
-
t.rcov_opts = ['--text-report', "-x #{Gem.path}", '-x /Library/Ruby', '-x /usr/lib/ruby']
|
59
|
+
t.rcov_opts = ['--text-report', "-x #{Gem.path}", '-x /Library/Ruby', '-x /usr/lib/ruby', "-x #{ENV['HOME']}/.rvm"]
|
42
60
|
end
|
43
|
-
|
61
|
+
|
44
62
|
task :default => :coverage
|
45
|
-
|
63
|
+
|
46
64
|
rescue LoadError
|
47
|
-
|
65
|
+
desc 'Run tests with code coverage statistics'
|
66
|
+
task(:coverage) { $stderr.puts 'Run `gem install rcov` to get coverage stats' }
|
48
67
|
task :default => :test
|
49
68
|
end
|
50
69
|
|
51
|
-
desc 'Generate the gemspec
|
70
|
+
desc 'Generate the gemspec for this Gem'
|
52
71
|
task :gemspec do
|
53
72
|
file = File.dirname(__FILE__) + "/#{spec.name}.gemspec"
|
54
73
|
File.open(file, 'w') {|f| f << spec.to_ruby }
|
data/lib/fleakr.rb
CHANGED
@@ -3,25 +3,10 @@ $:.unshift(File.dirname(__FILE__))
|
|
3
3
|
require 'uri'
|
4
4
|
require 'cgi'
|
5
5
|
require 'net/http'
|
6
|
+
require 'time'
|
6
7
|
require 'hpricot'
|
7
8
|
require 'forwardable'
|
8
9
|
|
9
|
-
# Require only what we need from ActiveSupport
|
10
|
-
require 'active_support/core_ext/array'
|
11
|
-
require 'active_support/core_ext/module'
|
12
|
-
|
13
|
-
begin
|
14
|
-
# ActiveSupport < 2.3.5
|
15
|
-
require 'active_support/core_ext/blank'
|
16
|
-
rescue NameError
|
17
|
-
# ActiveSupport >= 2.3.5 will raise a NameError exception
|
18
|
-
require 'active_support/core_ext/object/blank'
|
19
|
-
end
|
20
|
-
|
21
|
-
require 'active_support/core_ext/time'
|
22
|
-
require 'active_support/inflector'
|
23
|
-
require 'active_support/core_ext/string'
|
24
|
-
|
25
10
|
require 'digest/md5'
|
26
11
|
require 'fileutils'
|
27
12
|
require 'loggable'
|
@@ -36,7 +21,7 @@ require 'fleakr/objects'
|
|
36
21
|
# == Quick Start
|
37
22
|
#
|
38
23
|
# Getting started is easy, just make sure you have a valid API key from Flickr and you can
|
39
|
-
# then start making any non-authenticated request to pull back data for yours and others'
|
24
|
+
# then start making any non-authenticated request to pull back data for yours and others'
|
40
25
|
# photostreams, sets, contacts, groups, etc...
|
41
26
|
#
|
42
27
|
# For now, all activity originates from a single user which you can find by username or
|
@@ -57,10 +42,10 @@ require 'fleakr/objects'
|
|
57
42
|
# user.groups
|
58
43
|
#
|
59
44
|
# To see what other associations and attributes are available, see the Fleakr::Objects::User class
|
60
|
-
#
|
45
|
+
#
|
61
46
|
# == Authentication
|
62
47
|
#
|
63
|
-
# If you want to do something more than just retrieve public photos (like upload your own),
|
48
|
+
# If you want to do something more than just retrieve public photos (like upload your own),
|
64
49
|
# you'll need to generate an authentication token to use across requests and sessions.
|
65
50
|
#
|
66
51
|
# Assuming you've already applied for a key, go back and make sure you have the right settings
|
@@ -71,7 +56,7 @@ require 'fleakr/objects'
|
|
71
56
|
# 1. The value for 'Mobile Permissions' is set to either 'write' or 'delete'
|
72
57
|
#
|
73
58
|
# Once this is set, you'll see your Authentication URL on the key details page (it will look
|
74
|
-
# something like http://www.flickr.com/auth-534525246245). Paste this URL into your browser and
|
59
|
+
# something like http://www.flickr.com/auth-534525246245). Paste this URL into your browser and
|
75
60
|
# confirm access to get your mini-token. Now you're ready to make authenticated requests:
|
76
61
|
#
|
77
62
|
# require 'rubygems'
|
@@ -83,7 +68,7 @@ require 'fleakr/objects'
|
|
83
68
|
#
|
84
69
|
# Fleakr.upload('/path/to/my/photo.jpg')
|
85
70
|
# Fleakr.token.value # => "34132412341235-12341234ef34"
|
86
|
-
#
|
71
|
+
#
|
87
72
|
# Once you use the mini-token once, it is no longer available. To use the generated auth_token
|
88
73
|
# for future requests, just set Fleakr.auth_token to the generated value.
|
89
74
|
#
|
@@ -92,7 +77,9 @@ module Fleakr
|
|
92
77
|
# Generic catch-all exception for any API errors
|
93
78
|
class ApiError < StandardError; end
|
94
79
|
|
95
|
-
|
80
|
+
class << self
|
81
|
+
attr_accessor :api_key, :shared_secret, :auth_token
|
82
|
+
end
|
96
83
|
|
97
84
|
# Find a user based on some unique user data. This method will try to find
|
98
85
|
# the user based on several methods, starting with username and falling back to email and URL
|
@@ -103,6 +90,8 @@ module Fleakr
|
|
103
90
|
# Fleakr.user('user@host.com')
|
104
91
|
# Fleakr.user('http://www.flickr.com/photos/the_decapitator/')
|
105
92
|
#
|
93
|
+
|
94
|
+
# TODO: Use User.find_by_identifier for some of this
|
106
95
|
def self.user(user_data, options = {})
|
107
96
|
user = nil
|
108
97
|
[:username, :email, :url].each do |attribute|
|
@@ -112,7 +101,7 @@ module Fleakr
|
|
112
101
|
end
|
113
102
|
user
|
114
103
|
end
|
115
|
-
|
104
|
+
|
116
105
|
# Search all photos on the Flickr site. By default, this searches based on text, but you can pass
|
117
106
|
# different search parameters (passed as hash keys):
|
118
107
|
#
|
@@ -127,7 +116,7 @@ module Fleakr
|
|
127
116
|
params = {:text => params} unless params.is_a?(Hash)
|
128
117
|
Objects::Search.new(params).results
|
129
118
|
end
|
130
|
-
|
119
|
+
|
131
120
|
# Upload one or more files to your Flickr account (requires authentication). Simply provide
|
132
121
|
# a filename or a pattern to upload one or more files:
|
133
122
|
#
|
@@ -135,13 +124,13 @@ module Fleakr
|
|
135
124
|
# Fleakr.upload('/User/Pictures/Party/*.jpg')
|
136
125
|
#
|
137
126
|
# Additionally, options can be supplied as part of the upload that will apply to all files
|
138
|
-
# that are matched by the pattern passed to <tt>glob</tt>. For a full list, see
|
127
|
+
# that are matched by the pattern passed to <tt>glob</tt>. For a full list, see
|
139
128
|
# Fleakr::Objects::Photo.
|
140
129
|
#
|
141
130
|
def self.upload(glob, options = {})
|
142
131
|
Dir[glob].map {|file| Fleakr::Objects::Photo.upload(file, options) }
|
143
132
|
end
|
144
|
-
|
133
|
+
|
145
134
|
# Get all contacts for the currently authenticated user. The provided contact type can be
|
146
135
|
# one of the following:
|
147
136
|
#
|
@@ -159,11 +148,11 @@ module Fleakr
|
|
159
148
|
options = {}
|
160
149
|
options.merge!(:filter => contact_type) unless contact_type.nil?
|
161
150
|
options.merge!(additional_options)
|
162
|
-
|
151
|
+
|
163
152
|
Fleakr::Objects::Contact.find_all(options)
|
164
153
|
end
|
165
154
|
|
166
|
-
# Generate an authorization URL to redirect users to. This defaults to
|
155
|
+
# Generate an authorization URL to redirect users to. This defaults to
|
167
156
|
# 'read' permission, but others are available when passed to this method:
|
168
157
|
#
|
169
158
|
# * :read - permission to read private information (default)
|
@@ -181,7 +170,7 @@ module Fleakr
|
|
181
170
|
def self.token_from_frob(frob)
|
182
171
|
Fleakr::Objects::AuthenticationToken.from_frob(frob)
|
183
172
|
end
|
184
|
-
|
173
|
+
|
185
174
|
# Exchange a mini token for an authentication token.
|
186
175
|
#
|
187
176
|
def self.token_from_mini_token(mini_token)
|
@@ -196,10 +185,15 @@ module Fleakr
|
|
196
185
|
token.user
|
197
186
|
end
|
198
187
|
|
188
|
+
# Retrieve a photo, person, or set from a flickr.com URL:
|
189
|
+
#
|
190
|
+
def self.resource_from_url(url)
|
191
|
+
Fleakr::Objects::Url.new(url).resource
|
192
|
+
end
|
193
|
+
|
199
194
|
end
|
200
195
|
|
201
196
|
# Alias Fleakr methods as Flickr if possible
|
202
197
|
if defined?(Flickr).nil?
|
203
198
|
Flickr = Fleakr
|
204
|
-
end
|
205
|
-
|
199
|
+
end
|