ruby-flickr 0.1.1 → 0.1.2

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.
@@ -0,0 +1,69 @@
1
+ class Flickr::Auth < Flickr::Base
2
+ def initialize(flickr)
3
+ @flickr = flickr
4
+ end
5
+
6
+ # get or return a frob to use for authentication
7
+ def frob
8
+ @frob ||= get_frob
9
+ end
10
+
11
+ # generates the authorization url to allow access to a flickr account.
12
+ #
13
+ # Params
14
+ # * perms (Optional)
15
+ # sets the permision level to grant on the flickr account.
16
+ # :read - permission to read private information (DEFAULT)
17
+ # :write - permission to add, edit and delete photo metadata (includes 'read')
18
+ # :delete - permission to delete photos (includes 'write' and 'read')
19
+ #
20
+ def url(perms = :read)
21
+ options = {:api_key => @flickr.api_key, :perms => perms, :frob => self.frob}
22
+ @flickr.sign_request(options)
23
+ Flickr::Base::AUTH_ENDPOINT + "?" + options.collect{|k,v| "#{k}=#{v}"}.join('&')
24
+ end
25
+
26
+ # gets the token for the current frob
27
+ #
28
+ # Params
29
+ # * pass_through (Optional)
30
+ # Boolean value that determines if a call will be made to flickr to find a taken for the current frob if empty
31
+ #
32
+ def token(pass_through = true)
33
+ @token ||= get_token(pass_through) rescue nil
34
+ end
35
+
36
+ # saves the current token to the cache file if token exists
37
+ #
38
+ # Param
39
+ # * filename (Optional)
40
+ # filename of the cache file. defaults to the file passed into Flickr.new
41
+ #
42
+ def cache_token(filename = @flickr.token_cache)
43
+ if filename and self.token
44
+ cache_file = File.open(filename, 'w+')
45
+ cache_file.print self.token
46
+ cache_file.close
47
+ true
48
+ else
49
+ false
50
+ end
51
+ end
52
+
53
+ private
54
+ def get_frob
55
+ rsp = @flickr.send_request('flickr.auth.getFrob')
56
+
57
+ rsp.frob.to_s
58
+ end
59
+
60
+ def get_token(pass_through)
61
+ if @flickr.token_cache and File.exists?(@flickr.token_cache)
62
+ File.open(@flickr.token_cache, 'r').read
63
+ elsif pass_through
64
+ rsp = @flickr.send_request('flickr.auth.getToken', {:frob => self.frob})
65
+
66
+ rsp.auth.token.to_s
67
+ end
68
+ end
69
+ end
data/lib/flickr/base.rb CHANGED
@@ -4,24 +4,50 @@ module Flickr
4
4
  end
5
5
 
6
6
  class Base
7
- ENDPOINT = 'http://api.flickr.com/services/rest/'
7
+ attr_reader :api_key, :api_secret, :token_cache
8
+
9
+ REST_ENDPOINT = 'http://api.flickr.com/services/rest/'
10
+ AUTH_ENDPOINT = 'http://flickr.com/services/auth/'
8
11
 
9
12
  # create a new flickr object
10
13
  #
11
14
  # Params
12
15
  # * api_key (Required)
16
+ # The api key given to you by flickr.
13
17
  # * api_secret (Optional)
14
- def initialize(api_key, api_secret = nil)
18
+ # The api secret given to you by flickr. This is used to generate a signiture for signed request.
19
+ # * token_cache (Optional)
20
+ # File path to a cache file that holds a flickr token.
21
+ #
22
+ def initialize(api_key, api_secret = nil, token_cache = nil)
15
23
  @api_key = api_key
16
24
  @api_secret = api_secret
25
+ @token_cache = token_cache
17
26
  end
18
27
 
19
- def send_request(method, options = {})
28
+ # sends a request to the flcikr REST api
29
+ #
30
+ # Params
31
+ # * method (Required)
32
+ # name of the flickr method (ex. flickr.photos.search)
33
+ # * options (Optional)
34
+ # hash of query parameters, you do not need to include api_key, api_sig or auth_token because these are added automatically
35
+ # * http_method (Optional)
36
+ # choose between a GET and POST http request. Valid options are:
37
+ # :get (DEFAULT)
38
+ # :post
39
+ #
40
+ def send_request(method, options = {}, http_method = :get)
20
41
  options.merge!(:api_key => @api_key, :method => method)
21
- options.merge!(:api_sig => Digest::MD5.hexdigest(@api_secret + options.keys.sort_by{|k| k.to_s}.collect{|k| k.to_s + options[k]}.join)) if @api_secret
22
-
23
- api_call = ENDPOINT + "?" + options.collect{|k,v| "#{k}=#{v}"}.join('&')
24
- rsp = open(api_call).read
42
+ sign_request(options)
43
+
44
+ if http_method == :get
45
+ api_call = REST_ENDPOINT + "?" + options.collect{|k,v| "#{k}=#{v}"}.join('&')
46
+ rsp = Net::HTTP.get(URI.parse(api_call))
47
+ else
48
+ rsp = Net::HTTP.post_form(URI.parse(REST_ENDPOINT), options).body
49
+ end
50
+
25
51
  xm = XmlMagic.new(rsp)
26
52
 
27
53
  if xm[:stat] == 'ok'
@@ -30,7 +56,13 @@ module Flickr
30
56
  raise "#{xm.err[:code]}: #{xm.err[:msg]}"
31
57
  end
32
58
  end
59
+
60
+ def sign_request(options, authorize = true)
61
+ options.merge!(:auth_token => self.auth.token(false)) if authorize and self.auth.token(false)
62
+ options.merge!(:api_sig => Digest::MD5.hexdigest(@api_secret + options.keys.sort_by{|k| k.to_s}.collect{|k| k.to_s + options[k].to_s}.join)) if @api_secret
63
+ end
33
64
 
34
65
  def photos() @photos ||= Photos.new(self) end
66
+ def auth() @auth ||= Auth.new(self) end
35
67
  end
36
68
  end
data/lib/flickr/photos.rb CHANGED
@@ -133,7 +133,13 @@ class Flickr::Photos < Flickr::Base
133
133
 
134
134
  rsp = @flickr.send_request('flickr.photos.search', options)
135
135
 
136
- returning PhotoResponse.new(:page => rsp.photos[:page], :pages => rsp.photos[:pages], :per_page => rsp.photos[:perpage], :total => rsp.photos[:total], :photos => [], :api => self, :method => 'flickr.photos.search', :options => options) do |photos|
136
+ returning PhotoResponse.new(:page => rsp.photos[:page].to_i,
137
+ :pages => rsp.photos[:pages].to_i,
138
+ :per_page => rsp.photos[:perpage].to_i,
139
+ :total => rsp.photos[:total].to_i,
140
+ :photos => [], :api => self,
141
+ :method => 'flickr.photos.search',
142
+ :options => options) do |photos|
137
143
  rsp.photos.photo.each do |photo|
138
144
  all_attributes = {:id => photo[:id],
139
145
  :owner => photo[:owner],
@@ -155,7 +161,7 @@ class Flickr::Photos < Flickr::Base
155
161
  :tags => photo[:tags],
156
162
  :machine_tags => photo[:machine_tags],
157
163
  :o_dims => photo[:o_dims],
158
- :views => photo[:views]}
164
+ :views => photo[:views].to_i}
159
165
 
160
166
  used_attributes = {}
161
167
 
@@ -271,6 +277,18 @@ class Flickr::Photos < Flickr::Base
271
277
  true
272
278
  end
273
279
  end
280
+
281
+ # Add tags to a photo.
282
+ #
283
+ # Params
284
+ # * tags (Required)
285
+ # comma seperated list of tags
286
+ #
287
+ def add_tags(tags)
288
+ rsp = @flickr.send_request('flickr.photos.addTags', {:photo_id => self.id, :tags => tags}, :post)
289
+
290
+ true
291
+ end
274
292
 
275
293
  def description # :nodoc:
276
294
  attach_info
data/lib/ruby_flickr.rb CHANGED
@@ -1,10 +1,14 @@
1
1
  require 'rubygems'
2
2
  require 'xml_magic'
3
- require 'open-uri'
3
+ require 'net/http'
4
+ require 'uri'
4
5
  require 'digest/md5'
5
- include CommonThread::XML
6
6
 
7
- Dir[File.join(File.dirname(__FILE__), 'flickr/**/*.rb')].sort.each { |lib| require lib }
7
+ require File.join(File.dirname(__FILE__), 'flickr', 'base')
8
+ require File.join(File.dirname(__FILE__), 'flickr', 'auth')
9
+ require File.join(File.dirname(__FILE__), 'flickr', 'photos')
10
+
11
+ include CommonThread::XML
8
12
 
9
13
  class Object
10
14
  # returning allows you to pass an object to a block that you can manipulate returning the manipulated object
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-flickr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Wyrosdick
@@ -9,10 +9,18 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-03-29 00:00:00 -05:00
12
+ date: 2008-03-31 00:00:00 -05:00
13
13
  default_executable:
14
- dependencies: []
15
-
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: xml-magic
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: "0"
23
+ version:
16
24
  description:
17
25
  email: ben@commonthread.com
18
26
  executables: []
@@ -23,6 +31,7 @@ extra_rdoc_files: []
23
31
 
24
32
  files:
25
33
  - lib/flickr
34
+ - lib/flickr/auth.rb
26
35
  - lib/flickr/base.rb
27
36
  - lib/flickr/photos.rb
28
37
  - lib/ruby_flickr.rb