commonthread-flickr_fu 0.1.6 → 0.2.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 CHANGED
@@ -23,6 +23,12 @@
23
23
 
24
24
  http://www.commonthread.com/projects/flickr_fu/rdoc/
25
25
 
26
+ == Example flickr.yml
27
+ --- !map:HashWithIndifferentAccess
28
+ key: "YOUR KEY"
29
+ secret: "YOUR SECRET"
30
+ token_cache: "token_cache.yml"
31
+
26
32
  == Authorization
27
33
 
28
34
  To authorise your application to access Flickr using your API key you will
@@ -32,6 +38,12 @@
32
38
  access it from your browser. Confirm the application has permission at
33
39
  the level you have specified.
34
40
 
41
+ Note that flickr has different types of keys. If you use one for a webapplication,
42
+ which is most likely, you need to define a callback and somehow make sure that
43
+ you connect the parameter :frob that flickr send via the callback is assigned
44
+ to the right user account. The best way to do this is to loop over all the current
45
+ user's flickr accounts and try flickr.auth.token with the :frob.
46
+
35
47
  Finally, cache the token (this will create the token cache file)
36
48
 
37
49
  If you have an invalid API key you will see errors such as:
@@ -44,7 +56,7 @@
44
56
  "98: Login failed / Invalid auth token" or
45
57
  "99: User not logged in / Insufficient permissions"
46
58
 
47
- == Authorization Example
59
+ == Authorization Example for non-webapplication
48
60
 
49
61
  require 'flickr_fu'
50
62
 
@@ -59,6 +71,28 @@
59
71
 
60
72
  flickr.auth.cache_token
61
73
 
74
+ == Authorization Example for a webapplication
75
+
76
+ flickr.auth.token also contains the nsid and username, this
77
+ example only stores the token and no other userdata.
78
+
79
+ require 'flickr_fu'
80
+ class FlickrController < ActionController::Base
81
+ def create
82
+ flickr = Flickr.new('flickr.yml')
83
+ redirect_to flickr.auth.url(:write)
84
+ end
85
+ def flickr_callback
86
+ flickr = Flickr.new('flickr.yml')
87
+ flickr.auth.frob = params[:frob]
88
+ current_user.update_attribute :flickr_token, flickr.auth.token.token
89
+ end
90
+ def something_else_with_flickr
91
+ flickr = Flickr.new(YAML.load_file('flickr.yml').merge(:token => current_user.flickr_token))
92
+ # now you have full access on the user's data :)
93
+ end
94
+ end
95
+
62
96
  == Search Example
63
97
 
64
98
  require 'flickr_fu'
@@ -108,3 +142,5 @@
108
142
  Mike Perham
109
143
  Chris Anderton
110
144
  Luke Francl
145
+ Thomas R. Koll
146
+ P. Mark Anderson
data/Rakefile CHANGED
@@ -1,17 +1,6 @@
1
1
  require 'rake'
2
- require 'rake/testtask'
3
2
  require 'rake/rdoctask'
4
3
 
5
- desc 'Default: run unit tests.'
6
- task :default => :test
7
-
8
- desc 'Test the contact_info plugin.'
9
- Rake::TestTask.new(:test) do |t|
10
- t.libs << 'lib'
11
- t.pattern = 'test/**/*_test.rb'
12
- t.verbose = true
13
- end
14
-
15
4
  desc 'Generate documentation for the contact_info plugin.'
16
5
  Rake::RDocTask.new(:rdoc) do |rdoc|
17
6
  rdoc.rdoc_dir = 'rdoc'
@@ -20,3 +9,33 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
20
9
  rdoc.rdoc_files.include('README')
21
10
  rdoc.rdoc_files.include('lib/**/*.rb')
22
11
  end
12
+
13
+ # RSpec support
14
+ begin
15
+ require 'spec'
16
+ rescue LoadError
17
+ require 'rubygems'
18
+ require 'spec'
19
+ end
20
+ begin
21
+ require 'spec/rake/spectask'
22
+ rescue LoadError
23
+ puts <<-EOS
24
+ To use rspec for testing you must install rspec gem:
25
+ gem install rspec
26
+ EOS
27
+ exit(0)
28
+ end
29
+
30
+ task :default => :spec
31
+
32
+ desc "Run the specs under spec/models"
33
+ Spec::Rake::SpecTask.new do |t|
34
+ t.spec_opts = ['--options', "spec/spec.opts"]
35
+ t.spec_files = FileList['spec/**/*_spec.rb']
36
+ end
37
+
38
+ desc "Run rcov"
39
+ task :rcov do
40
+ system "rcov spec/**/*.rb -x /var/lib -x spec/"
41
+ end
data/flickr_fu.gemspec CHANGED
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "flickr_fu"
3
- s.version = "0.1.6"
4
- s.date = "2008-09-12"
3
+ s.version = "0.2.0"
4
+ s.date = "2008-12-30"
5
5
  s.summary = "Provides a ruby interface to flickr via the REST api"
6
6
  s.email = "ben@commonthread.com"
7
7
  s.homepage = "http://github.com/commonthread/flickr_fu"
@@ -15,6 +15,7 @@ Gem::Specification.new do |s|
15
15
  "lib/flickr/auth.rb",
16
16
  "lib/flickr/base.rb",
17
17
  "lib/flickr/comment.rb",
18
+ "lib/flickr/errors.rb",
18
19
  "lib/flickr/license.rb",
19
20
  "lib/flickr/note.rb",
20
21
  "lib/flickr/people.rb",
data/lib/flickr/auth.rb CHANGED
@@ -7,6 +7,11 @@ class Flickr::Auth < Flickr::Base
7
7
  def frob
8
8
  @frob ||= get_frob
9
9
  end
10
+
11
+ # set the frob
12
+ def frob= frob
13
+ @frob=frob
14
+ end
10
15
 
11
16
  # generates the authorization url to allow access to a flickr account.
12
17
  #
@@ -58,7 +63,9 @@ class Flickr::Auth < Flickr::Base
58
63
  end
59
64
 
60
65
  def get_token(pass_through)
61
- if @flickr.token_cache and File.exists?(@flickr.token_cache)
66
+ if @flickr.token
67
+ @flickr.token
68
+ elsif @flickr.token_cache and File.exists?(@flickr.token_cache)
62
69
  YAML.load_file(@flickr.token_cache)
63
70
  elsif pass_through
64
71
  rsp = @flickr.send_request('flickr.auth.getToken', {:frob => self.frob})
data/lib/flickr/base.rb CHANGED
@@ -4,7 +4,7 @@ module Flickr
4
4
  end
5
5
 
6
6
  class Base
7
- attr_reader :api_key, :api_secret, :token_cache
7
+ attr_reader :api_key, :api_secret, :token_cache, :token
8
8
 
9
9
  REST_ENDPOINT = 'http://api.flickr.com/services/rest/'
10
10
  AUTH_ENDPOINT = 'http://flickr.com/services/auth/'
@@ -12,30 +12,44 @@ module Flickr
12
12
 
13
13
  # create a new flickr object
14
14
  #
15
- # Params
15
+ # You can either pass a hash with the following attributes:
16
+ #
17
+ # * :key (Required)
18
+ # the API key
19
+ # * :secret (Required)
20
+ # the API secret
21
+ # * :token (Optional)
22
+ # Flickr::Auth::Token object
23
+ #
24
+ # or:
16
25
  # * config_file (Required)
17
26
  # yaml file to load configuration from
18
27
  # * token_cache (Optional)
19
28
  # location of the token cache file. This will override the setting in the config file
20
29
  #
21
30
  # Config Example (yaml file)
22
- #
23
31
  # ---
24
32
  # key: YOUR_API_KEY
25
33
  # secret: YOUR_API_SECRET
26
34
  # token_cache: token.yml
27
35
  #
28
- def initialize(config_file, token_cache = nil)
29
- config = YAML.load_file(config_file)
36
+ def initialize(config_hash_or_file, token_cache = nil)
37
+ if config_hash_or_file.is_a? Hash
38
+ @api_key = config_hash_or_file[:key]
39
+ @api_secret = config_hash_or_file[:secret]
40
+ @token = config_hash_or_file[:token]
41
+ raise 'config_hash must contain api key and secret' unless @api_key and @api_secret
42
+ else
43
+ config = YAML.load_file(config_hash_or_file)
30
44
 
31
- @api_key = config['key']
32
- @api_secret = config['secret']
33
- @token_cache = token_cache || config['token_cache']
34
-
35
- raise 'flickr config file must contain an api key and secret' unless @api_key and @api_secret
45
+ @api_key = config['key']
46
+ @api_secret = config['secret']
47
+ @token_cache = token_cache || config['token_cache']
48
+ raise 'flickr config file must contain an api key and secret' unless @api_key and @api_secret
49
+ end
36
50
  end
37
51
 
38
- # sends a request to the flcikr REST api
52
+ # sends a request to the flickr REST api
39
53
  #
40
54
  # Params
41
55
  # * method (Required)
@@ -53,12 +67,7 @@ module Flickr
53
67
  options.merge!(:api_key => @api_key, :method => method)
54
68
  sign_request(options)
55
69
 
56
- if http_method == :get
57
- api_call = endpoint + "?" + options.collect{|k,v| "#{k}=#{CGI.escape(v.to_s)}"}.join('&')
58
- rsp = Net::HTTP.get(URI.parse(api_call))
59
- else
60
- rsp = Net::HTTP.post_form(URI.parse(endpoint), options).body
61
- end
70
+ rsp = request_over_http(options, http_method, endpoint)
62
71
 
63
72
  rsp = '<rsp stat="ok"></rsp>' if rsp == ""
64
73
  xm = XmlMagic.new(rsp)
@@ -66,7 +75,7 @@ module Flickr
66
75
  if xm[:stat] == 'ok'
67
76
  xm
68
77
  else
69
- raise "#{xm.err[:code]}: #{xm.err[:msg]}"
78
+ raise Flickr::Errors.error_for(xm.err[:code], xm.err[:msg])
70
79
  end
71
80
  end
72
81
 
@@ -98,5 +107,18 @@ module Flickr
98
107
 
99
108
  # creates and/or returns the Flickr::Uploader object
100
109
  def uploader() @uploader ||= Flickr::Uploader.new(self) end
110
+
111
+ protected
112
+
113
+ # For easier testing. You can mock this method with a XML file you're expecting to receive
114
+ def request_over_http(options, http_method, endpoint)
115
+ if http_method == :get
116
+ api_call = endpoint + "?" + options.collect{|k,v| "#{k}=#{CGI.escape(v.to_s)}"}.join('&')
117
+ Net::HTTP.get(URI.parse(api_call))
118
+ else
119
+ Net::HTTP.post_form(URI.parse(endpoint), options).body
120
+ end
121
+ end
122
+
101
123
  end
102
124
  end
@@ -0,0 +1,20 @@
1
+ module Flickr
2
+ class Error < RuntimeError
3
+ attr_accessor :code
4
+ end
5
+
6
+
7
+ class Errors
8
+
9
+ # Method used for raising the appropriate error class for a given error code.
10
+ # Currently raises only Flickr::Error
11
+ def self.error_for(code, message)
12
+ raise RuntimeError.new("Internal error. Flickr API error not identified or unknown error.") if (code.nil? || message.nil? || message.empty?)
13
+ raise RuntimeError.new("Internal error. Unknown error.") if code.to_i == 0 # We assume that error code 0 is never returned
14
+ e = Flickr::Error.new("#{code}: #{message}")
15
+ e.code = code
16
+ raise e
17
+ end
18
+ end
19
+
20
+ end
@@ -11,4 +11,14 @@ class Flickr::Photos::License
11
11
  send("#{k}=", v)
12
12
  end
13
13
  end
14
+
15
+ def == o
16
+ return false unless o.respond_to?(:id) && o.respond_to?(:name) && o.respond_to?(:url)
17
+ return true if id == o.id && name == o.name && url == o.url
18
+ false
19
+ end
20
+
21
+ def eql? o
22
+ return self == o
23
+ end
14
24
  end
data/lib/flickr/photo.rb CHANGED
@@ -1,11 +1,9 @@
1
1
  # wrapping class to hold an flickr photo
2
- #
3
2
  class Flickr::Photos::Photo
4
3
  attr_accessor :id, :owner, :secret, :server, :farm, :title, :is_public, :is_friend, :is_family # standard attributes
5
4
  attr_accessor :license_id, :uploaded_at, :taken_at, :owner_name, :icon_server, :original_format, :updated_at, :geo, :tags, :machine_tags, :o_dims, :views, :media # extra attributes
6
5
  attr_accessor :info_added, :description, :original_secret, :owner_username, :owner_realname, :url_photopage, :notes # info attributes
7
- attr_accessor :sizes_added, :sizes, :url_square, :url_thumbnail, :url_small, :url_medium, :url_large, :url_original # size attributes
8
- attr_accessor :comments_added, :comments # comment attributes
6
+ attr_accessor :comments # comment attributes
9
7
 
10
8
  # create a new instance of a flickr photo.
11
9
  #
@@ -21,8 +19,13 @@ class Flickr::Photos::Photo
21
19
  end
22
20
  end
23
21
 
22
+ # Alias to image_url method
23
+ def url(size = :medium)
24
+ image_url(size)
25
+ end
26
+
24
27
  # retreive the url to the image stored on flickr
25
- #
28
+ #
26
29
  # == Params
27
30
  # * size (Optional)
28
31
  # the size of the image to return. Optional sizes are:
@@ -32,10 +35,24 @@ class Flickr::Photos::Photo
32
35
  # :medium - 500 on longest side
33
36
  # :large - 1024 on longest side (only exists for very large original images)
34
37
  # :original - original image, either a jpg, gif or png, depending on source format
35
- #
36
- def url(size = :medium)
37
- attach_sizes
38
- send("url_#{size}")
38
+ #
39
+ def image_url(size = :medium)
40
+ # It turns out that flickr always stores all the sizes of the picture even when getSizes call returns otherwise.
41
+ # Not calling getSizes is also very important for performance reasons.
42
+ # Retrieving 30 search results means calling the API 31 times if you call getSizes every time.
43
+ # Mind that you still need to call getSizes if you go out for the original image.
44
+ if size == :original
45
+ size_hash[size.to_s].source if size_hash.has_key? size.to_s
46
+ else
47
+ key = "_#{size_key(size.to_sym)}"
48
+ key = "" if key == "_"
49
+ "http://farm#{farm}.static.flickr.com/#{server}/#{id}_#{secret}#{key}.jpg"
50
+ end
51
+ end
52
+
53
+ def photopage_url
54
+ # Keeping the same convention as image_url (foo_url)
55
+ url_photopage
39
56
  end
40
57
 
41
58
  # save the current photo to the local computer
@@ -73,7 +90,7 @@ class Flickr::Photos::Photo
73
90
  # comma seperated list of tags
74
91
  #
75
92
  def add_tags(tags)
76
- rsp = @flickr.send_request('flickr.photos.addTags', {:photo_id => self.id, :tags => tags}, :post)
93
+ @flickr.send_request('flickr.photos.addTags', {:photo_id => self.id, :tags => tags}, :post)
77
94
  true
78
95
  end
79
96
 
@@ -84,7 +101,7 @@ class Flickr::Photos::Photo
84
101
  # text of the comment
85
102
  #
86
103
  def add_comment(message)
87
- rsp = @flickr.send_request('flickr.photos.comments.addComment', {:photo_id => self.id, :comment_text => message}, :post)
104
+ @flickr.send_request('flickr.photos.comments.addComment', {:photo_id => self.id, :comment_text => message}, :post)
88
105
  true
89
106
  end
90
107
 
@@ -103,7 +120,7 @@ class Flickr::Photos::Photo
103
120
  # The height of the note
104
121
  #
105
122
  def add_note(message, x, y, w, h)
106
- rsp = @flickr.send_request('flickr.photos.notes.add', {:photo_id => self.id, :note_x => x, :note_y => y, :note_w => w, :note_h => h, :note_text => message}, :post)
123
+ @flickr.send_request('flickr.photos.notes.add', {:photo_id => self.id, :note_x => x, :note_y => y, :note_w => w, :note_h => h, :note_text => message}, :post)
107
124
  true
108
125
  end
109
126
 
@@ -114,7 +131,7 @@ class Flickr::Photos::Photo
114
131
  # The amount of degrees by which to rotate the photo (clockwise) from it's current orientation. Valid values are 90, 180 and 270.
115
132
  #
116
133
  def rotate(degrees)
117
- rsp = @flickr.send_request('flickr.photos.transform.rotate', {:photo_id => self.id, :degrees => degrees}, :post)
134
+ @flickr.send_request('flickr.photos.transform.rotate', {:photo_id => self.id, :degrees => degrees}, :post)
118
135
  true
119
136
  end
120
137
 
@@ -130,7 +147,7 @@ class Flickr::Photos::Photo
130
147
  # * license_id (Required)
131
148
  # The license to apply, or 0 (zero) to remove the current license.
132
149
  def set_license(license_id)
133
- rsp = @flickr.send_request('flickr.photos.licenses.setLicense', {:photo_id => self.id, :license_id => license_id}, :post)
150
+ @flickr.send_request('flickr.photos.licenses.setLicense', {:photo_id => self.id, :license_id => license_id}, :post)
134
151
  true
135
152
  end
136
153
 
@@ -160,13 +177,39 @@ class Flickr::Photos::Photo
160
177
  end
161
178
 
162
179
  def comments # :nodoc:
163
- attach_comments
164
- @comments
180
+ @comments ||= begin
181
+ if @comment_count == 0
182
+ self.comments = []
183
+ self.comments_added = true
184
+ elsif not self.comments_added
185
+ rsp = @flickr.send_request('flickr.photos.comments.getList', :photo_id => self.id)
186
+
187
+ self.comments = []
188
+ self.comments_added = true
189
+
190
+ rsp.comments.comment.each do |comment|
191
+ self.comments << Flickr::Photos::Comment.new(:id => comment[:id],
192
+ :comment => comment.to_s,
193
+ :author => comment[:author],
194
+ :author_name => comment[:authorname],
195
+ :permalink => comment[:permalink],
196
+ :created_at => (Time.at(comment[:datecreate].to_i) rescue nil))
197
+ end
198
+ end
199
+ end
165
200
  end
166
201
 
167
202
  def sizes # :nodoc:
168
- attach_sizes
169
- @sizes
203
+ @sizes ||= begin
204
+ rsp = @flickr.send_request('flickr.photos.getSizes', :photo_id => self.id)
205
+
206
+ _sizes = []
207
+ rsp.sizes.size.each do |size|
208
+ _sizes << Flickr::Photos::Size.new(:label => size[:label], :width => size[:width],
209
+ :height => size[:height], :source => size[:source], :url => size[:url])
210
+ end
211
+ _sizes
212
+ end
170
213
  end
171
214
 
172
215
  def notes # :nodoc:
@@ -175,34 +218,14 @@ class Flickr::Photos::Photo
175
218
  end
176
219
 
177
220
  protected
178
- def url_square # :nodoc:
179
- attach_sizes
180
- @url_square
181
- end
182
-
183
- def url_thumbnail # :nodoc:
184
- attach_sizes
185
- @url_thumbnail
186
- end
187
-
188
- def url_small # :nodoc:
189
- attach_sizes
190
- @url_small
191
- end
192
-
193
- def url_medium # :nodoc:
194
- attach_sizes
195
- @url_medium
196
- end
197
-
198
- def url_large # :nodoc:
199
- attach_sizes
200
- @url_large
201
- end
202
-
203
- def url_original # :nodoc:
204
- attach_sizes
205
- @url_original
221
+ def size_hash
222
+ @size_hash ||= begin
223
+ hash = {}
224
+ sizes.each do |size|
225
+ hash[size.label.downcase] = size
226
+ end
227
+ hash
228
+ end
206
229
  end
207
230
 
208
231
  private
@@ -211,12 +234,12 @@ class Flickr::Photos::Photo
211
234
  # convert the size to the key used in the flickr url
212
235
  def size_key(size)
213
236
  case size.to_sym
214
- when :square : 's'
215
- when :thumb, :thumbnail : 't'
216
- when :small : 'm'
217
- when :medium : '-'
218
- when :large : 'b'
219
- when :original : 'o'
237
+ when :square then 's'
238
+ when :thumb, :thumbnail then 't'
239
+ when :small then 'm'
240
+ when :medium then ''
241
+ when :large then 'b'
242
+ when :original then 'o'
220
243
  else ''
221
244
  end
222
245
  end
@@ -227,7 +250,7 @@ class Flickr::Photos::Photo
227
250
  rsp = @flickr.send_request('flickr.photos.getInfo', :photo_id => self.id, :secret => self.secret)
228
251
 
229
252
  self.info_added = true
230
- self.description = rsp.photo.description.to_s
253
+ self.description = rsp.photo.description.to_s.strip
231
254
  self.original_secret = rsp.photo[:originalsecret]
232
255
  self.owner_username = rsp.photo.owner[:username]
233
256
  self.owner_realname = rsp.photo.owner[:realname]
@@ -238,61 +261,14 @@ class Flickr::Photos::Photo
238
261
 
239
262
  rsp.photo.notes.note.each do |note|
240
263
  self.notes << Flickr::Photos::Note.new(:id => note[:id],
241
- :note => note.to_s,
242
- :author => note[:author],
243
- :author_name => note[:authorname],
244
- :x => note[:x],
245
- :y => note[:y],
246
- :width => note[:w],
247
- :height => note[:h])
264
+ :note => note.to_s,
265
+ :author => note[:author],
266
+ :author_name => note[:authorname],
267
+ :x => note[:x],
268
+ :y => note[:y],
269
+ :width => note[:w],
270
+ :height => note[:h])
248
271
  end if rsp.photo.notes.note
249
272
  end
250
273
  end
251
-
252
- # loads picture sizes only after one has been requested
253
- def attach_sizes
254
- unless self.sizes_added
255
- rsp = @flickr.send_request('flickr.photos.getSizes', :photo_id => self.id)
256
-
257
- self.sizes_added = true
258
- self.sizes = []
259
-
260
- # TODO: investigate the new video features and integrate better
261
- rsp.sizes.size.each do |size|
262
- method = "url_#{size[:label].downcase}="
263
- next unless respond_to? method
264
- send(method, size[:source])
265
-
266
- # send("url_#{size[:label].downcase}=", size[:source])
267
-
268
- self.sizes << Flickr::Photos::Size.new(:label => size[:label],
269
- :width => size[:width],
270
- :height => size[:height],
271
- :source => size[:source],
272
- :url => size[:url])
273
- end
274
- end
275
- end
276
-
277
- # loads comments once they have been requested
278
- def attach_comments
279
- if @comment_count == 0
280
- self.comments = []
281
- self.comments_added = true
282
- elsif not self.comments_added
283
- rsp = @flickr.send_request('flickr.photos.comments.getList', :photo_id => self.id)
284
-
285
- self.comments = []
286
- self.comments_added = true
287
-
288
- rsp.comments.comment.each do |comment|
289
- self.comments << Flickr::Photos::Comment.new(:id => comment[:id],
290
- :comment => comment.to_s,
291
- :author => comment[:author],
292
- :author_name => comment[:authorname],
293
- :permalink => comment[:permalink],
294
- :created_at => (Time.at(comment[:datecreate].to_i) rescue nil))
295
- end
296
- end
297
- end
298
274
  end
data/lib/flickr/photos.rb CHANGED
@@ -187,7 +187,25 @@ class Flickr::Photos < Flickr::Base
187
187
  end
188
188
 
189
189
  def licenses
190
- @licenses ||= get_licenses
190
+ @licenses ||= begin
191
+ rsp = @flickr.send_request('flickr.photos.licenses.getInfo')
192
+
193
+ returning Hash.new do |licenses|
194
+ rsp.licenses.license.each do |license|
195
+ licenses[license[:id].to_i] = Flickr::Photos::License.new(:id => license[:id].to_i, :name => license[:name], :url => license[:url])
196
+ end
197
+ end
198
+ end
199
+ end
200
+
201
+ # Returns a Flickr::Photos::Photo object of the given id.
202
+ # Raises an error if photo not found
203
+ def find_by_id(photo_id)
204
+ rsp = @flickr.send_request('flickr.photos.getInfo', :photo_id => photo_id)
205
+ Photo.new(@flickr, :id => rsp.photo[:id].to_i, :owner => rsp.photo.owner,
206
+ :secret => rsp.photo[:secret], :server => rsp.photo[:server].to_i, :farm => rsp.photo[:farm],
207
+ :title => rsp.photo.title,
208
+ :is_public => rsp.photo.visibility[:public], :is_friend => rsp.photo.visibility[:is_friend], :is_family => rsp.photo.visibility[:is_family])
191
209
  end
192
210
 
193
211
  protected
@@ -216,13 +234,4 @@ class Flickr::Photos < Flickr::Base
216
234
  :media => photo[:media]}
217
235
  end
218
236
 
219
- def get_licenses
220
- rsp = @flickr.send_request('flickr.photos.licenses.getInfo')
221
-
222
- returning Hash.new do |licenses|
223
- rsp.licenses.license.each do |license|
224
- licenses[license[:id].to_i] = Flickr::Photos::License.new(:id => license[:id].to_i, :name => license[:name], :url => license[:url])
225
- end
226
- end
227
- end
228
237
  end
data/lib/flickr/token.rb CHANGED
@@ -10,7 +10,7 @@ class Flickr::Auth::Token
10
10
  # a hash of attributes used to set the initial values of the token object
11
11
  def initialize(attributes)
12
12
  attributes.each do |k,v|
13
- send("#{k}=", v)
13
+ send("#{k}=", v) if respond_to?("#{k}=")
14
14
  end
15
15
  end
16
16
 
data/lib/flickr_fu.rb CHANGED
@@ -10,7 +10,7 @@ require 'time'
10
10
  require 'date'
11
11
 
12
12
  # base must load first
13
- %w(base test auth token photos photo photo_response comment note size uploader status people person license).each do |file|
13
+ %w(base test auth token photos photo photo_response comment note size uploader status people person license errors).each do |file|
14
14
  require File.join(File.dirname(__FILE__), 'flickr', file)
15
15
  end
16
16
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: commonthread-flickr_fu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Wyrosdick
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-09-12 00:00:00 -07:00
12
+ date: 2008-12-30 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -46,6 +46,7 @@ files:
46
46
  - lib/flickr/auth.rb
47
47
  - lib/flickr/base.rb
48
48
  - lib/flickr/comment.rb
49
+ - lib/flickr/errors.rb
49
50
  - lib/flickr/license.rb
50
51
  - lib/flickr/note.rb
51
52
  - lib/flickr/people.rb