fleakr 0.3.0 → 0.4.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.
Files changed (51) hide show
  1. data/README.rdoc +114 -19
  2. data/Rakefile +1 -1
  3. data/lib/fleakr/api/file_parameter.rb +47 -0
  4. data/lib/fleakr/api/method_request.rb +57 -0
  5. data/lib/fleakr/api/parameter.rb +35 -0
  6. data/lib/fleakr/api/parameter_list.rb +96 -0
  7. data/lib/fleakr/api/response.rb +2 -2
  8. data/lib/fleakr/api/upload_request.rb +64 -0
  9. data/lib/fleakr/api/value_parameter.rb +36 -0
  10. data/lib/fleakr/api.rb +7 -0
  11. data/lib/fleakr/core_ext/hash.rb +22 -0
  12. data/lib/fleakr/core_ext.rb +1 -0
  13. data/lib/fleakr/objects/authentication_token.rb +43 -0
  14. data/lib/fleakr/objects/contact.rb +5 -5
  15. data/lib/fleakr/objects/error.rb +2 -2
  16. data/lib/fleakr/objects/group.rb +2 -2
  17. data/lib/fleakr/objects/image.rb +7 -7
  18. data/lib/fleakr/objects/photo.rb +69 -5
  19. data/lib/fleakr/objects/search.rb +3 -6
  20. data/lib/fleakr/objects/set.rb +11 -5
  21. data/lib/fleakr/objects/user.rb +14 -26
  22. data/lib/fleakr/objects.rb +9 -0
  23. data/lib/fleakr/support/attribute.rb +30 -12
  24. data/lib/fleakr/support/object.rb +20 -4
  25. data/lib/fleakr/support.rb +2 -0
  26. data/lib/fleakr/version.rb +1 -1
  27. data/lib/fleakr.rb +66 -7
  28. data/test/fixtures/auth.checkToken.xml +8 -0
  29. data/test/fixtures/auth.getFullToken.xml +8 -0
  30. data/test/fixtures/people.getInfo.xml +1 -1
  31. data/test/fixtures/photos.getInfo.xml +20 -0
  32. data/test/test_helper.rb +18 -3
  33. data/test/unit/fleakr/api/file_parameter_test.rb +63 -0
  34. data/test/unit/fleakr/api/method_request_test.rb +103 -0
  35. data/test/unit/fleakr/api/parameter_list_test.rb +161 -0
  36. data/test/unit/fleakr/api/parameter_test.rb +34 -0
  37. data/test/unit/fleakr/api/upload_request_test.rb +133 -0
  38. data/test/unit/fleakr/api/value_parameter_test.rb +41 -0
  39. data/test/unit/fleakr/core_ext/hash_test.rb +32 -0
  40. data/test/unit/fleakr/objects/authentication_token_test.rb +47 -0
  41. data/test/unit/fleakr/objects/image_test.rb +10 -5
  42. data/test/unit/fleakr/objects/photo_test.rb +96 -36
  43. data/test/unit/fleakr/objects/search_test.rb +1 -1
  44. data/test/unit/fleakr/objects/set_test.rb +12 -1
  45. data/test/unit/fleakr/objects/user_test.rb +2 -16
  46. data/test/unit/fleakr/support/attribute_test.rb +82 -24
  47. data/test/unit/fleakr/support/object_test.rb +26 -3
  48. data/test/unit/fleakr_test.rb +65 -6
  49. metadata +28 -5
  50. data/lib/fleakr/api/request.rb +0 -58
  51. data/test/unit/fleakr/api/request_test.rb +0 -93
@@ -5,16 +5,52 @@ module Fleakr::Objects
5
5
 
6
6
  should_have_many :images
7
7
 
8
+ should_autoload_when_accessing :posted, :taken, :updated, :comment_count, :with => :load_info
9
+ should_autoload_when_accessing :url, :description, :with => :load_info
10
+
8
11
  describe "The Photo class" do
9
12
 
10
13
  should_find_all :photos, :by => :user_id, :call => 'people.getPublicPhotos', :path => 'rsp/photos/photo'
11
14
  should_find_all :photos, :by => :photoset_id, :call => 'photosets.getPhotos', :path => 'rsp/photoset/photo'
12
15
  should_find_all :photos, :by => :group_id, :call => 'groups.pools.getPhotos', :path => 'rsp/photos/photo'
16
+
17
+ should_find_one :photo, :by => :id, :with => :photo_id, :call => 'photos.getInfo'
18
+
19
+
20
+ it "should be able to upload a photo and return the new photo information" do
21
+ filename = '/path/to/mugshot.jpg'
22
+ photo = stub()
23
+
24
+ response = stub do |s|
25
+ s.stubs(:body).with().returns(Hpricot.XML('<photoid>123</photoid>'))
26
+ end
27
+
28
+ Fleakr::Api::UploadRequest.expects(:with_response!).with(filename).returns(response)
29
+ Photo.expects(:find_by_id).with('123', :authenticate? => true).returns(photo)
30
+
31
+ Photo.upload(filename).should == photo
32
+ end
13
33
 
14
34
  end
15
35
 
16
36
  describe "An instance of the Photo class" do
17
- context "when populating from an XML document" do
37
+
38
+ it "should be able to replace the associated photo data" do
39
+ filename = '/path/to/file.jpg'
40
+ response = stub(:body => 'body')
41
+
42
+ params = {:type => :update, :photo_id => '1'}
43
+
44
+ Fleakr::Api::UploadRequest.expects(:with_response!).with(filename, params).returns(response)
45
+
46
+ photo = Photo.new
47
+ photo.stubs(:id).returns('1')
48
+ photo.expects(:populate_from).with('body')
49
+
50
+ photo.replace_with(filename).should == photo
51
+ end
52
+
53
+ context "when populating from the people_getPublicPhotos XML data" do
18
54
  before do
19
55
  @object = Photo.new(Hpricot.XML(read_fixture('people.getPublicPhotos')).at('rsp/photos/photo'))
20
56
  end
@@ -24,11 +60,69 @@ module Fleakr::Objects
24
60
  should_have_a_value_for :farm_id => '4'
25
61
  should_have_a_value_for :server_id => '3250'
26
62
  should_have_a_value_for :secret => 'cbc1804258'
27
-
63
+ end
64
+
65
+ context "when populating from the photo upload XML data" do
66
+ before do
67
+ @object = Photo.new(Hpricot.XML('<photoid>123</photoid>'))
68
+ end
69
+
70
+ should_have_a_value_for :id => '123'
71
+ end
72
+
73
+ context "when populating from the photos_getInfo XML data" do
74
+ before do
75
+ @object = Photo.new(Hpricot.XML(read_fixture('photos.getInfo')))
76
+
77
+ end
78
+
79
+ should_have_a_value_for :id => '1'
80
+ should_have_a_value_for :title => 'Tree'
81
+ should_have_a_value_for :description => 'A Tree'
82
+ should_have_a_value_for :farm_id => '4'
83
+ should_have_a_value_for :server_id => '3085'
84
+ should_have_a_value_for :secret => 'secret'
85
+ should_have_a_value_for :posted => '1230274722'
86
+ should_have_a_value_for :taken => '2008-12-25 18:26:55'
87
+ should_have_a_value_for :updated => '1230276652'
88
+ should_have_a_value_for :comment_count => '0'
89
+ should_have_a_value_for :url => 'http://www.flickr.com/photos/yes/1'
90
+
28
91
  end
29
92
 
30
93
  context "in general" do
31
94
 
95
+ before do
96
+ @photo = Photo.new
97
+ @time = Time.parse('2009-08-01 00:00:00')
98
+ end
99
+
100
+ it "should be able to retrieve additional information about the current user" do
101
+ photo_id = '1'
102
+ photo = Photo.new
103
+ photo.expects(:id).with().returns(photo_id)
104
+ response = mock_request_cycle :for => 'photos.getInfo', :with => {:photo_id => photo_id}
105
+
106
+ photo.expects(:populate_from).with(response.body)
107
+
108
+ photo.load_info
109
+ end
110
+
111
+ it "should have a value for :posted_at" do
112
+ @photo.expects(:posted).with().returns("#{@time.to_i}")
113
+ @photo.posted_at.should == @time
114
+ end
115
+
116
+ it "should have a value for :taken_at" do
117
+ @photo.expects(:taken).with().returns(@time.strftime('%Y-%m-%d %H:%M:%S'))
118
+ @photo.taken_at.should == @time
119
+ end
120
+
121
+ it "should have a value for :updated_at" do
122
+ @photo.expects(:updated).with().returns("#{@time.to_i}")
123
+ @photo.updated_at.should == @time
124
+ end
125
+
32
126
  it "should have a collection of images by size" do
33
127
  photo = Photo.new
34
128
 
@@ -62,40 +156,6 @@ module Fleakr::Objects
62
156
  end
63
157
  end
64
158
 
65
- # context "in general" do
66
- #
67
- # before do
68
- # @photo = Photo.new
69
- #
70
- # @photo.stubs(:id).with().returns('1')
71
- # @photo.stubs(:farm_id).with().returns('2')
72
- # @photo.stubs(:server_id).with().returns('3')
73
- # @photo.stubs(:secret).with().returns('secret')
74
- # end
75
- #
76
- # it "should know the base URL to retrieve images" do
77
- # @photo.send(:base_url).should == "http://farm2.static.flickr.com/3/1_secret"
78
- # end
79
- #
80
- # end
81
-
82
- # context "with a base URL" do
83
- #
84
- # before do
85
- # @photo = Photo.new
86
- # @photo.stubs(:base_url).with().returns('url')
87
- # end
88
- #
89
- # [:square, :thumbnail, :small, :medium, :large].each do |size|
90
- # it "should have a :#{size} image" do
91
- # image = stub()
92
- # Image.expects(:new).with('url', size).returns(image)
93
- #
94
- # @photo.send(size).should == image
95
- # end
96
- # end
97
- #
98
- # end
99
159
  end
100
160
 
101
161
  end
@@ -56,7 +56,7 @@ module Fleakr::Objects
56
56
 
57
57
  should "memoize the search results" do
58
58
  response = stub(:body => Hpricot.XML(read_fixture('photos.search')))
59
- Fleakr::Api::Request.expects(:with_response!).with(kind_of(String), kind_of(Hash)).once.returns(response)
59
+ Fleakr::Api::MethodRequest.expects(:with_response!).with(kind_of(String), kind_of(Hash)).once.returns(response)
60
60
 
61
61
  (response.body/'rsp/photos/photo').each do |doc|
62
62
  Photo.expects(:new).with(doc).once
@@ -21,6 +21,7 @@ module Fleakr::Objects
21
21
  should_have_a_value_for :id => '72157609490909659'
22
22
  should_have_a_value_for :title => 'Second Set'
23
23
  should_have_a_value_for :description => 'This is the second set.'
24
+ should_have_a_value_for :count => '138'
24
25
 
25
26
  end
26
27
 
@@ -34,14 +35,24 @@ module Fleakr::Objects
34
35
  end
35
36
 
36
37
  after { FileUtils.rm_rf(@tmp_dir) }
38
+
39
+ it "should know the prefix string based on the number of photos in the set" do
40
+ set = Set.new
41
+ set.stubs(:count).with().returns('5')
42
+ set.file_prefix(0).should == '1_'
43
+
44
+ set.stubs(:count).with().returns('99')
45
+ set.file_prefix(0).should == '01_'
46
+ end
37
47
 
38
48
  it "should save all files of the specified size to the specified directory" do
39
49
  image = mock()
40
- image.expects(:save_to).with("#{@tmp_dir}/set")
50
+ image.expects(:save_to).with("#{@tmp_dir}/set", '1_')
41
51
 
42
52
  photo = stub(:small => image)
43
53
 
44
54
  @set.stubs(:photos).with().returns([photo])
55
+ @set.stubs(:file_prefix).with(0).returns('1_')
45
56
 
46
57
  FileUtils.expects(:mkdir).with("#{@tmp_dir}/set")
47
58
 
@@ -3,22 +3,11 @@ require File.dirname(__FILE__) + '/../../../test_helper'
3
3
  module Fleakr::Objects
4
4
  class UserTest < Test::Unit::TestCase
5
5
 
6
- def self.should_autoload_when_accessing(*attributes)
7
- options = attributes.extract_options!
8
- attributes.each do |accessor_name|
9
- it "should load the additional user information when accessing the :#{accessor_name} attribute" do
10
- user = User.new
11
- user.expects(options[:with]).with()
12
- user.send(accessor_name)
13
- end
14
- end
15
- end
16
-
17
6
  should_search_by :user_id
18
7
 
19
8
  should_have_many :photos, :groups, :sets, :contacts
20
9
 
21
- should_autoload_when_accessing :name, :photos_url, :profile_url, :photos_count, :with => :load_info
10
+ should_autoload_when_accessing :name, :photos_url, :profile_url, :photos_count, :location, :with => :load_info
22
11
  should_autoload_when_accessing :icon_server, :icon_farm, :pro, :admin, :icon_url, :with => :load_info
23
12
 
24
13
  describe "The User class" do
@@ -38,6 +27,7 @@ module Fleakr::Objects
38
27
  should_have_a_value_for :id => '31066442@N69'
39
28
  should_have_a_value_for :username => 'frootpantz'
40
29
  should_have_a_value_for :name => 'Sir Froot Pantz'
30
+ should_have_a_value_for :location => 'The Moon'
41
31
  should_have_a_value_for :photos_url => 'http://www.flickr.com/photos/frootpantz/'
42
32
  should_have_a_value_for :profile_url => 'http://www.flickr.com/people/frootpantz/'
43
33
  should_have_a_value_for :photos_count => '3907'
@@ -93,10 +83,6 @@ module Fleakr::Objects
93
83
  @user.admin?.should be(true)
94
84
  end
95
85
 
96
-
97
-
98
-
99
-
100
86
  end
101
87
  end
102
88
 
@@ -9,60 +9,118 @@ module Fleakr::Support
9
9
  attr.name.should == :foo
10
10
  end
11
11
 
12
- it "should infer the xpath information from the attribute name" do
13
- attr = Attribute.new('foo')
14
- attr.xpath.should == 'foo'
12
+ it "should have a default source" do
13
+ attr = Attribute.new(:foo)
14
+ attr.sources.should == ['foo']
15
15
  end
16
16
 
17
- it "should use a string value for the xpath from the inferred attribute name" do
18
- attr = Attribute.new(:foo)
19
- attr.xpath.should == 'foo'
17
+ it "should be able to assign multiple sources" do
18
+ attr = Attribute.new(:foo, ['foo1', 'foo2'])
19
+ attr.sources.should == ['foo1', 'foo2']
20
+ end
21
+
22
+ it "should pull the location from the source" do
23
+ attr = Attribute.new('foo')
24
+ attr.location('foo').should == 'foo'
20
25
  end
21
26
 
22
- it "should allow the setting of the xpath information" do
23
- attr = Attribute.new('foo', :xpath => 'bar')
24
- attr.xpath.should == 'bar'
27
+ it "should return the location when splitting" do
28
+ attr = Attribute.new('foo')
29
+ attr.split('foo').should == ['foo', nil]
25
30
  end
26
31
 
27
- it "should have a default attribute value of nil" do
32
+ it "should return the name for the location when splitting if the location isn't specified" do
28
33
  attr = Attribute.new('foo')
29
- attr.attribute.should be(nil)
34
+ attr.split('@bar').should == ['foo', 'bar']
35
+ end
36
+
37
+ it "should allow the setting of the location information" do
38
+ attr = Attribute.new('foo', 'bar')
39
+ attr.sources.should == ['bar']
30
40
  end
31
41
 
32
42
  it "should allow the setting of the attribute value" do
33
- attr = Attribute.new('foo', :attribute => 'bogon')
34
- attr.attribute.should == 'bogon'
43
+ attr = Attribute.new('foo')
44
+ attr.attribute('@bogon').should == 'bogon'
45
+ end
46
+
47
+ it "should use the location as the attribute" do
48
+ attr = Attribute.new('foo')
49
+ attr.attribute('foo').should == 'foo'
35
50
  end
36
51
 
37
- it "should not infer the xpath value when the attribute is set" do
38
- attr = Attribute.new(:foo, :attribute => 'bogon')
39
- attr.xpath.should be(nil)
52
+ it "should use the attribute for the attribute if specified" do
53
+ attr = Attribute.new(:id, '@nsid')
54
+ attr.attribute('@nsid').should == 'nsid'
55
+ end
56
+
57
+ it "should be able to retrieve the node from the path" do
58
+ document = Hpricot.XML('<name>Bassdrive</name>')
59
+ expected = document.at('name')
60
+
61
+ attr = Attribute.new(:name)
62
+ attr.node_for(document, 'name').should == expected
63
+ end
64
+
65
+ it "should be able to retrieve the node that contains the specified attribute" do
66
+ document = Hpricot.XML('<user id="1337" />')
67
+ expected = document.at('user')
68
+
69
+ attr = Attribute.new(:id)
70
+ attr.node_for(document, '@id').should == expected
71
+ end
72
+
73
+ it "should be able to retrieve the node for the specified attribute" do
74
+ document = Hpricot.XML('<user nsid="1337" />')
75
+ expected = document.at('user')
76
+
77
+ attr = Attribute.new(:id, '@nsid')
78
+ attr.node_for(document, '@nsid').should == expected
40
79
  end
41
80
 
42
81
  it "should be able to pull simple values from an XML document" do
43
82
  document = Hpricot.XML('<name>Bassdrive</name>')
44
- attr = Attribute.new('name')
83
+ attr = Attribute.new(:name)
45
84
  attr.value_from(document).should == 'Bassdrive'
46
85
  end
47
-
86
+
48
87
  it "should be able to pull an attribute value from the current XML node" do
49
- document = Hpricot.XML('<user id="1337" />').at('user')
50
- attr = Attribute.new(:id, :attribute => 'id')
88
+ document = Hpricot.XML('<user id="1337" />')
89
+ attr = Attribute.new(:id)
51
90
  attr.value_from(document).should == '1337'
52
91
  end
53
-
92
+
93
+ it "should be able to pull a specific attribute value from the current XML node" do
94
+ document = Hpricot.XML('<user nsid="1337" />')
95
+ attr = Attribute.new(:id, '@nsid')
96
+ attr.value_from(document).should == '1337'
97
+ end
98
+
54
99
  it "should be able to pull an attribute value for a node and attribute" do
55
100
  document = Hpricot.XML('<station><genre slug="dnb">Drum & Bass</genre></station>')
56
- attr = Attribute.new(:slug, :xpath => 'station/genre', :attribute => 'slug')
101
+ attr = Attribute.new(:slug, 'station/genre@slug')
57
102
  attr.value_from(document).should == 'dnb'
58
103
  end
59
-
104
+
105
+ it "should be able to pull a value from a nested XML node" do
106
+ document = Hpricot.XML('<rsp><user>blip</user></rsp>')
107
+ attr = Attribute.new(:user)
108
+ attr.value_from(document).should == 'blip'
109
+ end
110
+
60
111
  it "should return nil if it cannot find the specified node" do
61
112
  document = Hpricot.XML('<user id="1" />')
62
- attr = Attribute.new(:photoset, :attribute => 'id')
113
+ attr = Attribute.new(:photoset, '@nsid')
63
114
  attr.value_from(document).should be(nil)
64
115
  end
65
116
 
117
+ it "should be able to try a series of nodes to find a value" do
118
+ document = Hpricot.XML('<photoid>123</photoid>')
119
+
120
+ attr = Attribute.new(:id, ['photo@nsid', 'photoid'])
121
+ attr.value_from(document).should == '123'
122
+ end
123
+
66
124
  end
67
125
  end
68
126
  end
@@ -9,9 +9,11 @@ class FlickrObject
9
9
  include Fleakr::Support::Object
10
10
 
11
11
  flickr_attribute :name
12
- flickr_attribute :description, :xpath => 'desc'
13
- flickr_attribute :id, :attribute => 'nsid'
14
- flickr_attribute :photoset_id, :xpath => 'photoset', :attribute => 'id'
12
+ flickr_attribute :description, :from => 'desc'
13
+ flickr_attribute :id, :from => '@nsid'
14
+ flickr_attribute :photoset_id, :from => 'photoset@id'
15
+
16
+ find_one :by_id, :call => 'people.getInfo'
15
17
 
16
18
  end
17
19
 
@@ -28,6 +30,27 @@ module Fleakr
28
30
  FlickrObject.attributes.map {|a| a.name.to_s }.should == %w(name description id photoset_id)
29
31
  end
30
32
 
33
+ it "should be able to find by ID" do
34
+ id = 1
35
+ flickr_object = stub()
36
+
37
+ response = mock_request_cycle :for => 'people.getInfo', :with => {:id => id}
38
+ FlickrObject.expects(:new).with(response.body).returns(flickr_object)
39
+
40
+ FlickrObject.find_by_id(id).should == flickr_object
41
+ end
42
+
43
+ it "should be able to pass parameters to the :find_by_id method" do
44
+ id = 1
45
+ params = {:authenticate? => true}
46
+ flickr_object = stub()
47
+
48
+ response = mock_request_cycle :for => 'people.getInfo', :with => {:id => id, :authenticate? => true}
49
+ FlickrObject.expects(:new).with(response.body).returns(flickr_object)
50
+
51
+ FlickrObject.find_by_id(id, params).should == flickr_object
52
+ end
53
+
31
54
  end
32
55
 
33
56
  describe "An instance method provided by the Flickr::Object module" do
@@ -4,11 +4,13 @@ class FleakrTest < Test::Unit::TestCase
4
4
 
5
5
  describe "The Fleakr module" do
6
6
 
7
- it "should be able to set an API key" do
8
- key = 'f00b4r'
9
- Fleakr.api_key = key
10
-
11
- Fleakr.api_key.should == key
7
+ [:api_key, :shared_secret, :mini_token, :auth_token].each do |attribute|
8
+ it "should be able to set a value for :#{attribute}" do
9
+ value = 'value'
10
+
11
+ Fleakr.send("#{attribute}=".to_sym, value)
12
+ Fleakr.send(attribute).should == value
13
+ end
12
14
  end
13
15
 
14
16
  it "should provide a means to find a user by his username" do
@@ -21,7 +23,7 @@ class FleakrTest < Test::Unit::TestCase
21
23
  user = stub()
22
24
  email = 'user@host.com'
23
25
 
24
- Fleakr::Objects::User.stubs(:find_by_username).with(email).raises(Fleakr::Api::Request::ApiError)
26
+ Fleakr::Objects::User.stubs(:find_by_username).with(email).raises(Fleakr::ApiError)
25
27
  Fleakr::Objects::User.expects(:find_by_email).with(email).returns(user)
26
28
 
27
29
  Fleakr.user(email).should == user
@@ -38,6 +40,63 @@ class FleakrTest < Test::Unit::TestCase
38
40
  Fleakr::Objects::Search.expects(:new).with(:tags => %w(one two)).returns(stub(:results => []))
39
41
  Fleakr.search(:tags => %w(one two))
40
42
  end
43
+
44
+ it "should be able to upload a collection of images" do
45
+ glob = '*.jpg'
46
+ filenames = %w(one.jpg two.jpg)
47
+
48
+ Dir.expects(:[]).with(glob).returns(filenames)
49
+
50
+ Fleakr::Objects::Photo.expects(:upload).with('one.jpg')
51
+ Fleakr::Objects::Photo.expects(:upload).with('two.jpg')
52
+
53
+ Fleakr.upload(glob)
54
+ end
55
+
56
+ context "when generating an AuthenticationToken from an auth_token string" do
57
+
58
+ before do
59
+ @token = stub()
60
+
61
+ Fleakr.expects(:auth_token).with().at_least_once.returns('abc123')
62
+ Fleakr::Objects::AuthenticationToken.expects(:from_auth_token).with('abc123').returns(@token)
63
+ end
64
+
65
+ # Make sure to clear the cache
66
+ after { Fleakr.instance_variable_set(:@token, nil) }
67
+
68
+ it "should return the token" do
69
+ Fleakr.token.should == @token
70
+ end
71
+
72
+ it "should cache the result" do
73
+ 2.times { Fleakr.token }
74
+ end
75
+
76
+ end
77
+
78
+ context "when generating an AuthenticationToken from a mini_token string" do
79
+
80
+ before do
81
+ @token = stub()
82
+
83
+ Fleakr.expects(:auth_token).with().at_least_once.returns(nil)
84
+ Fleakr.expects(:mini_token).with().at_least_once.returns('123-123-123')
85
+ Fleakr::Objects::AuthenticationToken.expects(:from_mini_token).with('123-123-123').returns(@token)
86
+ end
87
+
88
+ # Make sure to clear the cache
89
+ after { Fleakr.instance_variable_set(:@token, nil) }
90
+
91
+ it "should return the token" do
92
+ Fleakr.token.should == @token
93
+ end
94
+
95
+ it "should cache the result" do
96
+ 2.times { Fleakr.token }
97
+ end
98
+
99
+ end
41
100
 
42
101
  end
43
102
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fleakr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick Reagan
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-12 00:00:00 -05:00
12
+ date: 2009-01-02 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -45,9 +45,19 @@ files:
45
45
  - Rakefile
46
46
  - lib/fleakr
47
47
  - lib/fleakr/api
48
- - lib/fleakr/api/request.rb
48
+ - lib/fleakr/api/file_parameter.rb
49
+ - lib/fleakr/api/method_request.rb
50
+ - lib/fleakr/api/parameter.rb
51
+ - lib/fleakr/api/parameter_list.rb
49
52
  - lib/fleakr/api/response.rb
53
+ - lib/fleakr/api/upload_request.rb
54
+ - lib/fleakr/api/value_parameter.rb
55
+ - lib/fleakr/api.rb
56
+ - lib/fleakr/core_ext
57
+ - lib/fleakr/core_ext/hash.rb
58
+ - lib/fleakr/core_ext.rb
50
59
  - lib/fleakr/objects
60
+ - lib/fleakr/objects/authentication_token.rb
51
61
  - lib/fleakr/objects/contact.rb
52
62
  - lib/fleakr/objects/error.rb
53
63
  - lib/fleakr/objects/group.rb
@@ -56,12 +66,16 @@ files:
56
66
  - lib/fleakr/objects/search.rb
57
67
  - lib/fleakr/objects/set.rb
58
68
  - lib/fleakr/objects/user.rb
69
+ - lib/fleakr/objects.rb
59
70
  - lib/fleakr/support
60
71
  - lib/fleakr/support/attribute.rb
61
72
  - lib/fleakr/support/object.rb
73
+ - lib/fleakr/support.rb
62
74
  - lib/fleakr/version.rb
63
75
  - lib/fleakr.rb
64
76
  - test/fixtures
77
+ - test/fixtures/auth.checkToken.xml
78
+ - test/fixtures/auth.getFullToken.xml
65
79
  - test/fixtures/contacts.getPublicList.xml
66
80
  - test/fixtures/groups.pools.getPhotos.xml
67
81
  - test/fixtures/people.findByEmail.xml
@@ -69,6 +83,7 @@ files:
69
83
  - test/fixtures/people.getInfo.xml
70
84
  - test/fixtures/people.getPublicGroups.xml
71
85
  - test/fixtures/people.getPublicPhotos.xml
86
+ - test/fixtures/photos.getInfo.xml
72
87
  - test/fixtures/photos.getSizes.xml
73
88
  - test/fixtures/photos.search.xml
74
89
  - test/fixtures/photosets.getList.xml
@@ -77,9 +92,17 @@ files:
77
92
  - test/unit
78
93
  - test/unit/fleakr
79
94
  - test/unit/fleakr/api
80
- - test/unit/fleakr/api/request_test.rb
95
+ - test/unit/fleakr/api/file_parameter_test.rb
96
+ - test/unit/fleakr/api/method_request_test.rb
97
+ - test/unit/fleakr/api/parameter_list_test.rb
98
+ - test/unit/fleakr/api/parameter_test.rb
81
99
  - test/unit/fleakr/api/response_test.rb
100
+ - test/unit/fleakr/api/upload_request_test.rb
101
+ - test/unit/fleakr/api/value_parameter_test.rb
102
+ - test/unit/fleakr/core_ext
103
+ - test/unit/fleakr/core_ext/hash_test.rb
82
104
  - test/unit/fleakr/objects
105
+ - test/unit/fleakr/objects/authentication_token_test.rb
83
106
  - test/unit/fleakr/objects/contact_test.rb
84
107
  - test/unit/fleakr/objects/error_test.rb
85
108
  - test/unit/fleakr/objects/group_test.rb
@@ -118,6 +141,6 @@ rubyforge_project:
118
141
  rubygems_version: 1.3.1
119
142
  signing_key:
120
143
  specification_version: 2
121
- summary: A teeny tiny gem to interface with Flickr photostreams
144
+ summary: A small, yet powerful, gem to interface with Flickr photostreams
122
145
  test_files: []
123
146
 
@@ -1,58 +0,0 @@
1
- module Fleakr
2
- module Api # :nodoc:
3
-
4
- # = Request
5
- #
6
- # Performs requests against the Flickr API and returns response objects (Flickr::Api::Response)
7
- # that contain Hpricot documents for further parsing and inspection. This class is used internally
8
- # in all the defined model objects.
9
- #
10
- class Request
11
-
12
- # Generic catch-all exception for any API errors
13
- class ApiError < StandardError; end
14
-
15
- # Makes a request to the Flickr API and returns a valid Response object. If
16
- # there are errors on the response it will rais an ApiError exception
17
- def self.with_response!(method, additional_parameters = {})
18
- request = Request.new(method, additional_parameters)
19
- response = request.send
20
-
21
- raise(ApiError, "Code: #{response.error.code} - #{response.error.message}") if response.error?
22
-
23
- response
24
- end
25
-
26
- # Create a new request for the specified API method and pass along any additional
27
- # parameters. The Flickr API uses namespacing for its methods - this is optional
28
- # when calling this method.
29
- #
30
- # This must be called after initializing the library with the required API key
31
- # see (#Fleakr.api_key=)
32
- def initialize(method, additional_parameters = {})
33
- method = method.sub(/^(flickr\.)?/, 'flickr.')
34
-
35
- default_parameters = {:api_key => Fleakr.api_key, :method => method}
36
- @parameters = default_parameters.merge(additional_parameters)
37
- end
38
-
39
- def send # :nodoc:
40
- Response.new(Net::HTTP.get(endpoint_uri))
41
- end
42
-
43
- private
44
- def endpoint_uri
45
- uri = URI.parse('http://api.flickr.com/services/rest/')
46
- uri.query = query_parameters
47
- uri
48
- end
49
-
50
- def query_parameters
51
- @parameters.map {|key,value| "#{key}=#{CGI.escape(value)}" }.join('&')
52
- end
53
-
54
-
55
-
56
- end
57
- end
58
- end