fotonauts-flickr_fu 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.gitignore +13 -0
  2. data/LICENSE +22 -0
  3. data/README +147 -0
  4. data/Rakefile +73 -0
  5. data/VERSION.yml +4 -0
  6. data/flickr_fu.gemspec +117 -0
  7. data/lib/flickr/auth.rb +76 -0
  8. data/lib/flickr/base.rb +151 -0
  9. data/lib/flickr/comment.rb +16 -0
  10. data/lib/flickr/contact.rb +16 -0
  11. data/lib/flickr/contacts.rb +55 -0
  12. data/lib/flickr/errors.rb +20 -0
  13. data/lib/flickr/geo.rb +42 -0
  14. data/lib/flickr/license.rb +24 -0
  15. data/lib/flickr/location.rb +15 -0
  16. data/lib/flickr/note.rb +16 -0
  17. data/lib/flickr/people.rb +54 -0
  18. data/lib/flickr/person.rb +82 -0
  19. data/lib/flickr/photo.rb +321 -0
  20. data/lib/flickr/photo_response.rb +37 -0
  21. data/lib/flickr/photos.rb +252 -0
  22. data/lib/flickr/photoset.rb +37 -0
  23. data/lib/flickr/photosets.rb +39 -0
  24. data/lib/flickr/size.rb +16 -0
  25. data/lib/flickr/status.rb +19 -0
  26. data/lib/flickr/test.rb +31 -0
  27. data/lib/flickr/token.rb +22 -0
  28. data/lib/flickr/uploader.rb +162 -0
  29. data/lib/flickr/urls.rb +44 -0
  30. data/lib/flickr_fu.rb +48 -0
  31. data/spec/fixtures/flickr/contacts/get_list-fail-99.xml +4 -0
  32. data/spec/fixtures/flickr/contacts/get_public_list-0.xml +7 -0
  33. data/spec/fixtures/flickr/photos/geo/get_location-0.xml +11 -0
  34. data/spec/fixtures/flickr/photos/geo/get_location-fail-2.xml +4 -0
  35. data/spec/fixtures/flickr/photos/get_info-0.xml +41 -0
  36. data/spec/fixtures/flickr/photos/get_info-1.xml +19 -0
  37. data/spec/fixtures/flickr/photos/get_sizes-0.xml +10 -0
  38. data/spec/fixtures/flickr/photos/get_sizes-1.xml +8 -0
  39. data/spec/fixtures/flickr/photos/licenses/get_info.xml +12 -0
  40. data/spec/fixtures/flickr/photosets/get_list-0.xml +13 -0
  41. data/spec/fixtures/flickr/photosets/get_photos-0.xml +7 -0
  42. data/spec/fixtures/flickr/test/echo-0.xml +5 -0
  43. data/spec/fixtures/flickr/test/null-fail-99.xml +4 -0
  44. data/spec/fixtures/flickr/urls/get_group-0.xml +4 -0
  45. data/spec/fixtures/flickr/urls/get_group-fail-1.xml +4 -0
  46. data/spec/fixtures/flickr/urls/get_user_photos-0.xml +4 -0
  47. data/spec/fixtures/flickr/urls/get_user_photos-fail-1.xml +4 -0
  48. data/spec/fixtures/flickr/urls/get_user_photos-fail-2.xml +4 -0
  49. data/spec/fixtures/flickr/urls/get_user_profile-0.xml +4 -0
  50. data/spec/fixtures/flickr/urls/get_user_profile-fail-1.xml +4 -0
  51. data/spec/fixtures/flickr/urls/get_user_profile-fail-2.xml +4 -0
  52. data/spec/fixtures/flickr/urls/lookup_group-0.xml +6 -0
  53. data/spec/fixtures/flickr/urls/lookup_group-fail-1.xml +4 -0
  54. data/spec/fixtures/flickr/urls/lookup_user-0.xml +6 -0
  55. data/spec/fixtures/flickr/videos/get_info-0.xml +31 -0
  56. data/spec/fixtures/flickr/videos/get_sizes-0.xml +13 -0
  57. data/spec/flickr/base_spec.rb +97 -0
  58. data/spec/flickr/contacts_spec.rb +47 -0
  59. data/spec/flickr/errors_spec.rb +21 -0
  60. data/spec/flickr/geo_spec.rb +20 -0
  61. data/spec/flickr/photo_spec.rb +140 -0
  62. data/spec/flickr/photos_spec.rb +50 -0
  63. data/spec/flickr/photosets_spec.rb +49 -0
  64. data/spec/flickr/test_spec.rb +34 -0
  65. data/spec/flickr/urls_spec.rb +99 -0
  66. data/spec/spec.opts +4 -0
  67. data/spec/spec_helper.rb +20 -0
  68. metadata +176 -0
data/.gitignore ADDED
@@ -0,0 +1,13 @@
1
+ rdoc
2
+ .DS_Store
3
+ *.gem
4
+ demo*
5
+ *~
6
+ *.sw*
7
+ .specification
8
+ nbproject/
9
+ doc/rspec_report.html
10
+ doc/rspec_profile.txt
11
+ spec/spec.local.opts
12
+ coverage/
13
+ pkg/
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2008 CommonThread, LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,147 @@
1
+ = flickr-fu
2
+
3
+ == Contact
4
+
5
+ Author: Ben Wyrosdick
6
+ Email: ben [at] commonthread.com
7
+ Lighthouse: http://commonthread.lighthouseapp.com/projects/12069-flickr_fu/overview
8
+ Main Repository: http://github.com/commonthread/flickr_fu/tree/master
9
+
10
+ == Getting Started
11
+
12
+ You need to first get an API key as detailed here:
13
+
14
+ http://www.flickr.com/services/api/misc.api_keys.html
15
+
16
+ == Installation
17
+
18
+ sudo gem install flickr-fu
19
+
20
+ == Documentation
21
+
22
+ RDoc Documentation can be found here:
23
+
24
+ http://www.commonthread.com/projects/flickr_fu/rdoc/
25
+
26
+ == Example flickr.yml
27
+ --- !map:HashWithIndifferentAccess
28
+ key: "YOUR KEY"
29
+ secret: "YOUR SECRET"
30
+ token_cache: "token_cache.yml"
31
+
32
+ == Authorization
33
+
34
+ To authorise your application to access Flickr using your API key you will
35
+ need to access a specific URL.
36
+
37
+ To generate this URL run the following and when presented with the URL
38
+ access it from your browser. Confirm the application has permission at
39
+ the level you have specified.
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
+
47
+ Finally, cache the token (this will create the token cache file)
48
+
49
+ If you have an invalid API key you will see errors such as:
50
+
51
+ "100: Invalid API Key"
52
+
53
+ If you don't follow the process below to authorise your application
54
+ you will see errors such as:
55
+
56
+ "98: Login failed / Invalid auth token" or
57
+ "99: User not logged in / Insufficient permissions"
58
+
59
+ == Authorization Example for non-webapplication
60
+
61
+ require 'flickr_fu'
62
+
63
+ flickr = Flickr.new('flickr.yml')
64
+
65
+ puts "visit the following url, then click <enter> once you have authorized:"
66
+
67
+ # request write permissions
68
+ puts flickr.auth.url(:write)
69
+
70
+ gets
71
+
72
+ flickr.auth.cache_token
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
+
96
+ == Search Example
97
+
98
+ require 'flickr_fu'
99
+
100
+ flickr = Flickr.new('flickr.yml')
101
+
102
+ photos = flickr.photos.search(:tags => 'ruby-flickr')
103
+
104
+ puts "found #{photos.size} photo(s)"
105
+
106
+ photos.each do |photo|
107
+ puts photo.title
108
+ puts photo.description unless [nil, ''].include?(photo.description)
109
+ [:square, :thumbnail, :small, :medium, :large, :original].each do |size|
110
+ puts "#{size}: #{photo.url(size)}"
111
+ end
112
+ puts "comments: #{photo.comments.size}"
113
+ photo.comments.each do |comment|
114
+ intro = "#{comment.author_name} says - "
115
+ puts "#{intro}\"#{comment.comment.gsub("\n", "\n"+(" "*intro.length))}\""
116
+ end
117
+ puts "notes: #{photo.notes.size}"
118
+ photo.notes.each do |note|
119
+ puts "[#{note.x},#{note.y} ~ #{note.width}x#{note.height}] - \"#{note.note}\""
120
+ end
121
+ puts
122
+ puts
123
+ end
124
+
125
+ == Another Search Example
126
+
127
+ If searching for photos by user id then you need to specify the 'alias' - without
128
+ intervention this is usually set by Flickr and is an alphanumeric string.
129
+
130
+ To find out the user id for a given user, you can use the tool at:
131
+
132
+ http://idgettr.com/
133
+
134
+ And replace the line in the above sample to query on user id:
135
+
136
+ photos = flickr.photos.search(:user_id => 'your_user_id_here')
137
+
138
+ == Patch Contributers
139
+
140
+ Chris Ledet
141
+ Maciej Biłas
142
+ Mike Perham
143
+ Chris Anderton
144
+ Luke Francl
145
+ Thomas R. Koll
146
+ P. Mark Anderson
147
+ Josh Nichols
data/Rakefile ADDED
@@ -0,0 +1,73 @@
1
+ require 'rake'
2
+ require 'rake/rdoctask'
3
+
4
+ # Gem building
5
+ begin
6
+ begin
7
+ require 'jeweler'
8
+ rescue LoadError
9
+ require 'rubygems'
10
+ require 'jeweler'
11
+ end
12
+ Jeweler::Tasks.new do |s|
13
+ s.name = "flickr_fu"
14
+ s.summary = "Provides a ruby interface to flickr via the REST api"
15
+ s.email = "ben@commonthread.com"
16
+ s.homepage = "http://github.com/commonthread/flickr_fu"
17
+ s.description = "Provides a ruby interface to flickr via the REST api"
18
+ s.authors = ["Ben Wyrosdick", "Maciej Bilas"]
19
+ s.rdoc_options = ["--main", "README"]
20
+ s.extra_rdoc_files = ["README"]
21
+ s.add_dependency("mime-types", ["> 0.0.0"])
22
+ s.add_dependency("xml-magic", ["> 0.0.0"])
23
+ s.files.exclude("spec/spec.local.opts")
24
+ end
25
+ rescue LoadError
26
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
27
+ end
28
+
29
+ desc 'Generate documentation for flickr_fu.'
30
+ Rake::RDocTask.new(:rdoc) do |rdoc|
31
+ rdoc.rdoc_dir = 'rdoc'
32
+ rdoc.title = 'flickr_fu'
33
+ rdoc.options << '--line-numbers' << '--inline-source'
34
+ rdoc.rdoc_files.include('README')
35
+ rdoc.rdoc_files.include('lib/**/*.rb')
36
+ end
37
+
38
+ # RSpec support
39
+ begin
40
+ require 'spec'
41
+ rescue LoadError
42
+ require 'rubygems'
43
+ require 'spec'
44
+ end
45
+ begin
46
+ require 'spec/rake/spectask'
47
+ rescue LoadError
48
+ puts <<-EOS
49
+ To use rspec for testing you must install rspec gem:
50
+ gem install rspec
51
+ EOS
52
+ exit(0)
53
+ end
54
+
55
+ task :default => :spec
56
+
57
+ spec_common = Proc.new do |t|
58
+ t.spec_opts = ['--options', "spec/spec.opts"]
59
+ t.spec_opts << ['--options', "spec/spec.local.opts" ] if File.exist?(File.dirname(__FILE__) + "/spec/spec.local.opts")
60
+ t.spec_files = FileList['spec/**/*_spec.rb']
61
+ end
62
+
63
+ desc "Run the specs under spec/models"
64
+ Spec::Rake::SpecTask.new do |t|
65
+ spec_common.call(t)
66
+ end
67
+
68
+ desc "Analyze code coverage with tests"
69
+ Spec::Rake::SpecTask.new("rcov") do |t|
70
+ spec_common.call(t)
71
+ t.rcov = true
72
+ t.rcov_opts = ["-x", "/var/lib", "-x", "spec/", "-T"]
73
+ end
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 0
3
+ :minor: 3
4
+ :patch: 2
data/flickr_fu.gemspec ADDED
@@ -0,0 +1,117 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{fotonauts-flickr_fu}
5
+ s.version = "0.3.2"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Ben Wyrosdick", "Maciej Bilas", "Fotonauts"]
9
+ s.date = %q{2009-05-19}
10
+ s.description = %q{Provides a ruby interface to flickr via the REST api}
11
+ s.email = %q{ben@commonthread.com}
12
+ s.extra_rdoc_files = [
13
+ "README"
14
+ ]
15
+ s.files = [
16
+ ".gitignore",
17
+ "LICENSE",
18
+ "README",
19
+ "Rakefile",
20
+ "VERSION.yml",
21
+ "flickr_fu.gemspec",
22
+ "lib/flickr/auth.rb",
23
+ "lib/flickr/base.rb",
24
+ "lib/flickr/comment.rb",
25
+ "lib/flickr/contact.rb",
26
+ "lib/flickr/contacts.rb",
27
+ "lib/flickr/errors.rb",
28
+ "lib/flickr/geo.rb",
29
+ "lib/flickr/license.rb",
30
+ "lib/flickr/location.rb",
31
+ "lib/flickr/note.rb",
32
+ "lib/flickr/people.rb",
33
+ "lib/flickr/person.rb",
34
+ "lib/flickr/photo.rb",
35
+ "lib/flickr/photo_response.rb",
36
+ "lib/flickr/photos.rb",
37
+ "lib/flickr/photoset.rb",
38
+ "lib/flickr/photosets.rb",
39
+ "lib/flickr/size.rb",
40
+ "lib/flickr/status.rb",
41
+ "lib/flickr/test.rb",
42
+ "lib/flickr/token.rb",
43
+ "lib/flickr/uploader.rb",
44
+ "lib/flickr/urls.rb",
45
+ "lib/flickr_fu.rb",
46
+ "spec/fixtures/flickr/contacts/get_list-fail-99.xml",
47
+ "spec/fixtures/flickr/contacts/get_public_list-0.xml",
48
+ "spec/fixtures/flickr/photos/geo/get_location-0.xml",
49
+ "spec/fixtures/flickr/photos/geo/get_location-fail-2.xml",
50
+ "spec/fixtures/flickr/photos/get_info-0.xml",
51
+ "spec/fixtures/flickr/photos/get_info-1.xml",
52
+ "spec/fixtures/flickr/photos/get_sizes-0.xml",
53
+ "spec/fixtures/flickr/photos/get_sizes-1.xml",
54
+ "spec/fixtures/flickr/photos/licenses/get_info.xml",
55
+ "spec/fixtures/flickr/photosets/get_list-0.xml",
56
+ "spec/fixtures/flickr/photosets/get_photos-0.xml",
57
+ "spec/fixtures/flickr/test/echo-0.xml",
58
+ "spec/fixtures/flickr/test/null-fail-99.xml",
59
+ "spec/fixtures/flickr/urls/get_group-0.xml",
60
+ "spec/fixtures/flickr/urls/get_group-fail-1.xml",
61
+ "spec/fixtures/flickr/urls/get_user_photos-0.xml",
62
+ "spec/fixtures/flickr/urls/get_user_photos-fail-1.xml",
63
+ "spec/fixtures/flickr/urls/get_user_photos-fail-2.xml",
64
+ "spec/fixtures/flickr/urls/get_user_profile-0.xml",
65
+ "spec/fixtures/flickr/urls/get_user_profile-fail-1.xml",
66
+ "spec/fixtures/flickr/urls/get_user_profile-fail-2.xml",
67
+ "spec/fixtures/flickr/urls/lookup_group-0.xml",
68
+ "spec/fixtures/flickr/urls/lookup_group-fail-1.xml",
69
+ "spec/fixtures/flickr/urls/lookup_user-0.xml",
70
+ "spec/fixtures/flickr/videos/get_info-0.xml",
71
+ "spec/fixtures/flickr/videos/get_sizes-0.xml",
72
+ "spec/flickr/base_spec.rb",
73
+ "spec/flickr/contacts_spec.rb",
74
+ "spec/flickr/errors_spec.rb",
75
+ "spec/flickr/geo_spec.rb",
76
+ "spec/flickr/photo_spec.rb",
77
+ "spec/flickr/photos_spec.rb",
78
+ "spec/flickr/photosets_spec.rb",
79
+ "spec/flickr/test_spec.rb",
80
+ "spec/flickr/urls_spec.rb",
81
+ "spec/spec.opts",
82
+ "spec/spec_helper.rb"
83
+ ]
84
+ s.homepage = %q{http://github.com/commonthread/flickr_fu}
85
+ s.rdoc_options = ["--main", "README"]
86
+ s.require_paths = ["lib"]
87
+ s.rubygems_version = %q{1.3.3}
88
+ s.summary = %q{Provides a ruby interface to flickr via the REST api}
89
+ s.test_files = [
90
+ "spec/spec_helper.rb",
91
+ "spec/flickr/test_spec.rb",
92
+ "spec/flickr/geo_spec.rb",
93
+ "spec/flickr/contacts_spec.rb",
94
+ "spec/flickr/urls_spec.rb",
95
+ "spec/flickr/errors_spec.rb",
96
+ "spec/flickr/base_spec.rb",
97
+ "spec/flickr/photo_spec.rb",
98
+ "spec/flickr/photosets_spec.rb",
99
+ "spec/flickr/photos_spec.rb"
100
+ ]
101
+
102
+ if s.respond_to? :specification_version then
103
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
104
+ s.specification_version = 3
105
+
106
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
107
+ s.add_runtime_dependency(%q<mime-types>, ["> 0.0.0"])
108
+ s.add_runtime_dependency(%q<xml-magic>, ["> 0.0.0"])
109
+ else
110
+ s.add_dependency(%q<mime-types>, ["> 0.0.0"])
111
+ s.add_dependency(%q<xml-magic>, ["> 0.0.0"])
112
+ end
113
+ else
114
+ s.add_dependency(%q<mime-types>, ["> 0.0.0"])
115
+ s.add_dependency(%q<xml-magic>, ["> 0.0.0"])
116
+ end
117
+ end
@@ -0,0 +1,76 @@
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
+ # set the frob
12
+ def frob= frob
13
+ @frob=frob
14
+ end
15
+
16
+ # generates the authorization url to allow access to a flickr account.
17
+ #
18
+ # Params
19
+ # * perms (Optional)
20
+ # sets the permision level to grant on the flickr account.
21
+ # :read - permission to read private information (DEFAULT)
22
+ # :write - permission to add, edit and delete photo metadata (includes 'read')
23
+ # :delete - permission to delete photos (includes 'write' and 'read')
24
+ #
25
+ def url(perms = :read)
26
+ options = {:api_key => @flickr.api_key, :perms => perms, :frob => self.frob}
27
+ @flickr.sign_request(options)
28
+ Flickr::Base::AUTH_ENDPOINT + "?" + options.collect{|k,v| "#{k}=#{v}"}.join('&')
29
+ end
30
+
31
+ # gets the token object for the current frob
32
+ #
33
+ # Params
34
+ # * pass_through (Optional)
35
+ # Boolean value that determines if a call will be made to flickr to find a taken for the current frob if empty
36
+ #
37
+ def token(pass_through = true)
38
+ @token ||= get_token(pass_through) rescue nil
39
+ end
40
+
41
+ # saves the current token to the cache file if token exists
42
+ #
43
+ # Param
44
+ # * filename (Optional)
45
+ # filename of the cache file. defaults to the file passed into Flickr.new
46
+ #
47
+ def cache_token(filename = @flickr.token_cache)
48
+ if filename and self.token
49
+ cache_file = File.open(filename, 'w+')
50
+ cache_file.puts self.token.to_yaml
51
+ cache_file.close
52
+ true
53
+ else
54
+ false
55
+ end
56
+ end
57
+
58
+ private
59
+ def get_frob
60
+ rsp = @flickr.send_request('flickr.auth.getFrob')
61
+
62
+ rsp.frob.to_s
63
+ end
64
+
65
+ def get_token(pass_through)
66
+ if @flickr.token
67
+ @flickr.token
68
+ elsif @flickr.token_cache and File.exists?(@flickr.token_cache)
69
+ YAML.load_file(@flickr.token_cache)
70
+ elsif pass_through
71
+ rsp = @flickr.send_request('flickr.auth.getToken', {:frob => self.frob})
72
+
73
+ Token.new(:token => rsp.auth.token.to_s, :permisions => rsp.auth.perms.to_s, :user_id => rsp.auth.user[:nsid], :username => rsp.auth.user[:username], :user_real_name => rsp.auth.user[:fullname])
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,151 @@
1
+ module Flickr
2
+ def self.new(*params)
3
+ Flickr::Base.new(*params)
4
+ end
5
+
6
+ class Base
7
+ attr_reader :api_key, :api_secret, :token_cache, :token
8
+
9
+ REST_ENDPOINT = 'http://api.flickr.com/services/rest/'
10
+ AUTH_ENDPOINT = 'http://flickr.com/services/auth/'
11
+ UPLOAD_ENDPOINT = 'http://api.flickr.com/services/upload/'
12
+
13
+ # create a new flickr object
14
+ #
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:
25
+ #
26
+ # * config_file (Required)
27
+ # yaml file to load configuration from
28
+ # * options (Optional)
29
+ # hash containing any of the two options
30
+ # * token_cache
31
+ # location of the token cache file. This will override the setting in the config file
32
+ # * environment
33
+ # section in the config file that flickr_fu should look for the API key and secret
34
+ # Useful when using with Rails
35
+ #
36
+ # Config Example (yaml file)
37
+ # ---
38
+ # key: YOUR_API_KEY
39
+ # secret: YOUR_API_SECRET
40
+ # token_cache: token.yml
41
+ #
42
+ # Example config file with two environments:
43
+ # ---
44
+ # development:
45
+ # key: YOUR_DEVELOPMENT_API_KEY
46
+ # secret: YOUR_DEVELOPMENT_API_SECRET
47
+ # production:
48
+ # key: YOUR_PRODUCTION_API_KEY
49
+ # secret: YOUR_PRODUCTION_API_SECRET
50
+ def initialize(config_param, options_param = {})
51
+ if options_param.is_a? String
52
+ options = {:token_cache => options_param}
53
+ else
54
+ options = options_param
55
+ end
56
+ if config_param.is_a? String
57
+ config = YAML.load_file(config_param)
58
+ config = config[options[:environment]] if options.has_key? :environment
59
+ else
60
+ config = config_param
61
+ end
62
+ @api_key = config[:key] || config["key"]
63
+ @api_secret = config[:secret] || config["secret"]
64
+ @token_cache = options[:token_cache] || config["token_cache"]
65
+ @token = config[:token] || options[:token]
66
+ raise 'config file must contain an api key and secret' unless @api_key and @api_secret
67
+ raise 'you cannot specify both the token and token_cache' if @token and @token_cache
68
+ end
69
+
70
+ # sends a request to the flickr REST api
71
+ #
72
+ # Params
73
+ # * method (Required)
74
+ # name of the flickr method (ex. flickr.photos.search)
75
+ # * options (Optional)
76
+ # hash of query parameters, you do not need to include api_key, api_sig or auth_token because these are added automatically
77
+ # * http_method (Optional)
78
+ # choose between a GET and POST http request. Valid options are:
79
+ # :get (DEFAULT)
80
+ # :post
81
+ # * endpoint (Optional)
82
+ # url of the api endpoint
83
+ #
84
+ def send_request(method, options = {}, http_method = :get, endpoint = REST_ENDPOINT)
85
+ options.merge!(:api_key => @api_key, :method => method)
86
+ sign_request(options)
87
+
88
+ rsp = request_over_http(options, http_method, endpoint)
89
+
90
+ rsp = '<rsp stat="ok"></rsp>' if rsp == ""
91
+ xm = XmlMagic.new(rsp)
92
+
93
+ if xm[:stat] == 'ok'
94
+ xm
95
+ else
96
+ raise Flickr::Errors.error_for(xm.err[:code].to_i, xm.err[:msg])
97
+ end
98
+ end
99
+
100
+ # alters your api parameters to include a signiture and authorization token
101
+ #
102
+ # Params
103
+ # * options (Required)
104
+ # the hash of parameters to be passed to the send_request
105
+ # * authorize (Optional)
106
+ # boolean value to determine if the call with include an auth_token (Defaults to true)
107
+ #
108
+ def sign_request(options, authorize = true)
109
+ options.merge!(:auth_token => self.auth.token(false).to_s, :api_key => @api_key) if authorize and self.auth.token(false)
110
+ options.delete(:api_sig)
111
+ options.merge!(:api_sig => Digest::MD5.hexdigest(@api_secret + options.to_a.sort_by{|k| k[0].to_s}.flatten.join)) if @api_secret
112
+ end
113
+
114
+ # creates and/or returns the Flickr::Test object
115
+ def test() @test ||= Flickr::Test.new(self) end
116
+
117
+ # creates and/or returns the Flickr::Photos object
118
+ def photos() @photos ||= Flickr::Photos.new(self) end
119
+
120
+ # creates and/or returns the Flickr::Photos object
121
+ def photosets() @photosets ||= Flickr::Photosets.new(self) end
122
+
123
+ # creates and/or returns the Flickr::People object
124
+ def people() @people ||= Flickr::People.new(self) end
125
+
126
+ # creates and/or returns the Flickr::Auth object
127
+ def auth() @auth ||= Flickr::Auth.new(self) end
128
+
129
+ # creates and/or returns the Flickr::Uploader object
130
+ def uploader() @uploader ||= Flickr::Uploader.new(self) end
131
+
132
+ # creates and/or returns the Flickr::Contacts object
133
+ def contacts() @contacts ||= Flickr::Contacts.new(self) end
134
+
135
+ # creates and/or returns the Flickr::Urls object
136
+ def urls() @urls ||= Flickr::Urls.new(self) end
137
+
138
+ protected
139
+
140
+ # For easier testing. You can mock this method with a XML file you're expecting to receive
141
+ def request_over_http(options, http_method, endpoint)
142
+ if http_method == :get
143
+ api_call = endpoint + "?" + options.collect{|k,v| "#{k}=#{CGI.escape(v.to_s)}"}.join('&')
144
+ Net::HTTP.get(URI.parse(api_call))
145
+ else
146
+ Net::HTTP.post_form(URI.parse(endpoint), options).body
147
+ end
148
+ end
149
+
150
+ end
151
+ end
@@ -0,0 +1,16 @@
1
+ # wrapping class to hold a flickr comment
2
+ #
3
+ class Flickr::Photos::Comment
4
+ attr_accessor :id, :comment, :author, :author_name, :created_at, :permalink
5
+
6
+ # create a new instance of a flickr comment.
7
+ #
8
+ # Params
9
+ # * attributes (Required)
10
+ # a hash of attributes used to set the initial values of the comment object
11
+ def initialize(attributes)
12
+ attributes.each do |k,v|
13
+ send("#{k}=", v)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,16 @@
1
+ # wrapping class to hold a flickr contact
2
+ #
3
+ class Flickr::Contacts::Contact
4
+ attr_accessor :nsid, :friend, :family, :iconfarm, :iconserver, :location, :username, :ignored, :realname, :path_alias
5
+
6
+ # create a new instance of a flickr note.
7
+ #
8
+ # Params
9
+ # * attributes (Required)
10
+ # a hash of attributes used to set the initial values of the contact object
11
+ def initialize(attributes)
12
+ attributes.each do |k,v|
13
+ send("#{k}=", v)
14
+ end
15
+ end
16
+ end