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.
Files changed (54) hide show
  1. data/README.rdoc +88 -57
  2. data/Rakefile +28 -9
  3. data/lib/fleakr.rb +25 -31
  4. data/lib/fleakr/api/option.rb +34 -34
  5. data/lib/fleakr/api/parameter_list.rb +23 -23
  6. data/lib/fleakr/objects.rb +4 -1
  7. data/lib/fleakr/objects/metadata.rb +35 -0
  8. data/lib/fleakr/objects/metadata_collection.rb +36 -0
  9. data/lib/fleakr/objects/photo.rb +15 -11
  10. data/lib/fleakr/objects/set.rb +17 -13
  11. data/lib/fleakr/objects/url.rb +83 -0
  12. data/lib/fleakr/objects/user.rb +8 -0
  13. data/lib/fleakr/support.rb +3 -1
  14. data/lib/fleakr/support/attribute.rb +2 -2
  15. data/lib/fleakr/support/object.rb +44 -29
  16. data/lib/fleakr/support/url_expander.rb +37 -0
  17. data/lib/fleakr/support/utility.rb +66 -0
  18. data/lib/fleakr/version.rb +5 -5
  19. data/test/fixtures/photos.getExif.xml +362 -0
  20. data/test/test_helper.rb +44 -47
  21. data/test/unit/fleakr/api/authentication_request_test.rb +12 -12
  22. data/test/unit/fleakr/api/file_parameter_test.rb +15 -15
  23. data/test/unit/fleakr/api/method_request_test.rb +1 -1
  24. data/test/unit/fleakr/api/option_test.rb +44 -44
  25. data/test/unit/fleakr/api/parameter_list_test.rb +40 -40
  26. data/test/unit/fleakr/api/response_test.rb +10 -10
  27. data/test/unit/fleakr/api/upload_request_test.rb +28 -28
  28. data/test/unit/fleakr/api/value_parameter_test.rb +10 -10
  29. data/test/unit/fleakr/core_ext/false_class_test.rb +5 -5
  30. data/test/unit/fleakr/core_ext/hash_test.rb +9 -9
  31. data/test/unit/fleakr/core_ext/true_class_test.rb +5 -5
  32. data/test/unit/fleakr/objects/authentication_token_test.rb +23 -23
  33. data/test/unit/fleakr/objects/collection_test.rb +23 -23
  34. data/test/unit/fleakr/objects/comment_test.rb +15 -15
  35. data/test/unit/fleakr/objects/contact_test.rb +11 -11
  36. data/test/unit/fleakr/objects/error_test.rb +8 -8
  37. data/test/unit/fleakr/objects/group_test.rb +13 -13
  38. data/test/unit/fleakr/objects/image_test.rb +4 -4
  39. data/test/unit/fleakr/objects/metadata_collection_test.rb +55 -0
  40. data/test/unit/fleakr/objects/metadata_test.rb +27 -0
  41. data/test/unit/fleakr/objects/photo_context_test.rb +23 -23
  42. data/test/unit/fleakr/objects/photo_test.rb +71 -64
  43. data/test/unit/fleakr/objects/search_test.rb +22 -22
  44. data/test/unit/fleakr/objects/set_test.rb +62 -40
  45. data/test/unit/fleakr/objects/tag_test.rb +32 -31
  46. data/test/unit/fleakr/objects/url_test.rb +185 -0
  47. data/test/unit/fleakr/objects/user_test.rb +43 -16
  48. data/test/unit/fleakr/support/attribute_test.rb +15 -15
  49. data/test/unit/fleakr/support/object_test.rb +77 -33
  50. data/test/unit/fleakr/support/request_test.rb +12 -12
  51. data/test/unit/fleakr/support/url_expander_test.rb +44 -0
  52. data/test/unit/fleakr/support/utility_test.rb +70 -0
  53. data/test/unit/fleakr_test.rb +48 -41
  54. metadata +43 -23
@@ -1,37 +1,37 @@
1
- require File.dirname(__FILE__) + '/../../../test_helper'
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
2
 
3
3
  module Fleakr::Api
4
4
  class AuthenticationRequestTest < Test::Unit::TestCase
5
-
5
+
6
6
  context "An instance of AuthenticationRequest" do
7
-
7
+
8
8
  should "know the endpoint URL" do
9
9
  request = AuthenticationRequest.new
10
10
  request.endpoint_url.should == 'http://flickr.com/services/auth/'
11
11
  end
12
-
12
+
13
13
  should "be able to make a request" do
14
14
  endpoint_uri = stub()
15
-
15
+
16
16
  request = AuthenticationRequest.new
17
17
  request.stubs(:endpoint_uri).with().returns(endpoint_uri)
18
-
18
+
19
19
  Net::HTTP.expects(:get_response).with(endpoint_uri).returns('response')
20
-
20
+
21
21
  request.response.should == 'response'
22
22
  end
23
-
23
+
24
24
  should "know the authorization_url for the authentication request" do
25
25
  response_headers = {'Location' => 'http://example.com/auth'}
26
26
  response = stub() {|r| r.stubs(:header).with().returns(response_headers) }
27
-
27
+
28
28
  request = AuthenticationRequest.new
29
29
  request.stubs(:response).with().returns(response)
30
-
30
+
31
31
  request.authorization_url.should == 'http://example.com/auth'
32
32
  end
33
-
33
+
34
34
  end
35
-
35
+
36
36
  end
37
37
  end
@@ -1,40 +1,40 @@
1
- require File.dirname(__FILE__) + '/../../../test_helper'
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
2
 
3
3
  module Fleakr::Api
4
4
  class FileParameterTest < Test::Unit::TestCase
5
-
5
+
6
6
  context "An instance of the FileParameter class" do
7
-
7
+
8
8
  setup do
9
9
  @temp_dir = File.expand_path(create_temp_directory)
10
10
  @filename = "#{@temp_dir}/image.jpg"
11
11
  end
12
-
12
+
13
13
  teardown do
14
14
  FileUtils.rm_rf(@temp_dir)
15
15
  end
16
-
16
+
17
17
  {'jpg' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif'}.each do |ext, mime_type|
18
18
  should "know the correct MIME type for an extension of #{ext}" do
19
19
  parameter = FileParameter.new('photo', "#{@temp_dir}/image.#{ext}")
20
20
  parameter.mime_type.should == mime_type
21
21
  end
22
22
  end
23
-
23
+
24
24
  should "retrieve the contents of the file when accessing the value" do
25
25
  File.expects(:read).with(@filename).returns('bopbip')
26
-
26
+
27
27
  parameter = FileParameter.new('photo', @filename)
28
28
  parameter.value.should == 'bopbip'
29
29
  end
30
-
30
+
31
31
  should "cache the file contents after retrieving them" do
32
32
  File.expects(:read).with(@filename).once.returns('bopbip')
33
-
33
+
34
34
  parameter = FileParameter.new('photo', @filename)
35
35
  2.times { parameter.value }
36
36
  end
37
-
37
+
38
38
  should "know how to generate a form representation of itself" do
39
39
  filename = 'image.jpg'
40
40
  mime_type = 'image/jpeg'
@@ -42,17 +42,17 @@ module Fleakr::Api
42
42
  parameter = FileParameter.new('photo', filename)
43
43
  parameter.stubs(:mime_type).with().returns(mime_type)
44
44
  parameter.stubs(:value).with().returns('data')
45
-
46
- expected =
45
+
46
+ expected =
47
47
  "Content-Disposition: form-data; name=\"photo\"; filename=\"#{filename}\"\r\n" +
48
48
  "Content-Type: image/jpeg\r\n" +
49
49
  "\r\n" +
50
50
  "data\r\n"
51
-
51
+
52
52
  parameter.to_form.should == expected
53
53
  end
54
-
54
+
55
55
  end
56
-
56
+
57
57
  end
58
58
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/../../../test_helper'
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
2
 
3
3
  module Fleakr::Api
4
4
  class MethodRequestTest < Test::Unit::TestCase
@@ -1,15 +1,15 @@
1
- require File.dirname(__FILE__) + '/../../../test_helper'
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
2
 
3
3
  module Fleakr::Api
4
-
4
+
5
5
  class OptionTest < Test::Unit::TestCase
6
-
6
+
7
7
  def self.should_know_the_class_for(type, options)
8
8
  should "know the class for the :#{type} type" do
9
9
  Option.class_for(type).should == options[:is]
10
10
  end
11
11
  end
12
-
12
+
13
13
  context "The Option class" do
14
14
  should_know_the_class_for :title, :is => Fleakr::Api::SimpleOption
15
15
  should_know_the_class_for :description, :is => Fleakr::Api::SimpleOption
@@ -18,64 +18,64 @@ module Fleakr::Api
18
18
  should_know_the_class_for :level, :is => Fleakr::Api::LevelOption
19
19
  should_know_the_class_for :type, :is => Fleakr::Api::TypeOption
20
20
  should_know_the_class_for :hide?, :is => Fleakr::Api::HiddenOption
21
-
21
+
22
22
  should "be able to create an option for a type" do
23
23
  option = stub()
24
-
24
+
25
25
  Option.expects(:class_for).with(:title).returns(Fleakr::Api::SimpleOption)
26
26
  Fleakr::Api::SimpleOption.expects(:new).with(:title, 'blip').returns(option)
27
-
27
+
28
28
  Option.for(:title, 'blip').should == option
29
29
  end
30
30
  end
31
-
31
+
32
32
  end
33
-
33
+
34
34
  class SimpleOptionTest < Test::Unit::TestCase
35
-
35
+
36
36
  context "An instance of the SimpleOption class" do
37
37
  should "have a type" do
38
38
  so = SimpleOption.new(:title, 'blip')
39
39
  so.type.should == :title
40
40
  end
41
-
41
+
42
42
  should "have a value" do
43
43
  so = SimpleOption.new(:title, 'blip')
44
44
  so.value.should == 'blip'
45
45
  end
46
-
46
+
47
47
  should "be able to generate a hash representation of itself" do
48
48
  so = SimpleOption.new(:title, 'blip')
49
49
  so.to_hash.should == {:title => 'blip'}
50
50
  end
51
51
  end
52
-
52
+
53
53
  end
54
54
 
55
55
  class TagOptionTest < Test::Unit::TestCase
56
-
56
+
57
57
  context "An instance of the TagOption class" do
58
-
58
+
59
59
  should "normalize the input value to an array" do
60
60
  to = TagOption.new(:tags, 'blip')
61
61
  to.value.should == ['blip']
62
62
  end
63
-
63
+
64
64
  should "be able to generate a hash representation of itself with tags joined on spaces" do
65
65
  to = TagOption.new(:tags, %w(bop bip))
66
66
  to.to_hash.should == {:tags => '"bop" "bip"'}
67
67
  end
68
-
68
+
69
69
  should "quote tag values with spaces" do
70
70
  to = TagOption.new(:tags, ['tag', 'one with spaces'])
71
71
  to.to_hash.should == {:tags => '"tag" "one with spaces"'}
72
72
  end
73
73
  end
74
-
74
+
75
75
  end
76
-
76
+
77
77
  class ViewOptionTest < Test::Unit::TestCase
78
-
78
+
79
79
  context "An instance of the ViewOption class" do
80
80
  should "be able to generate a hash representation for viewing by :everyone" do
81
81
  vo = ViewOption.new(:viewable_by, :everyone)
@@ -86,94 +86,94 @@ module Fleakr::Api
86
86
  vo = ViewOption.new(:viewable_by, :family)
87
87
  vo.to_hash.should == {:is_public => 0, :is_family => 1, :is_friend => 0}
88
88
  end
89
-
89
+
90
90
  should "be able to generate a hash representation for viewing by :friends" do
91
91
  vo = ViewOption.new(:viewable_by, :friends)
92
92
  vo.to_hash.should == {:is_public => 0, :is_family => 0, :is_friend => 1}
93
93
  end
94
-
94
+
95
95
  should "know the visibility is public if value is set to :everyone" do
96
96
  vo = ViewOption.new(:viewable_by, :everyone)
97
97
  vo.public?.should be(true)
98
98
  end
99
-
99
+
100
100
  should "know the visibility is not public if :everyone is not the only value" do
101
101
  vo = ViewOption.new(:viewable_by, [:everyone, :family])
102
102
  vo.public?.should be(false)
103
103
  end
104
-
104
+
105
105
  should "know that its visible to friends and family if specified as such" do
106
106
  vo = ViewOption.new(:viewable_by, [:friends, :family])
107
107
  vo.friends?.should be(true)
108
108
  vo.family?.should be(true)
109
109
  end
110
-
110
+
111
111
  end
112
-
112
+
113
113
  end
114
114
 
115
115
  class LevelOptionTest < Test::Unit::TestCase
116
-
116
+
117
117
  context "An instance of the LevelOption class" do
118
-
118
+
119
119
  should "be able to generate a hash representation for the :safe level" do
120
120
  lo = LevelOption.new(:level, :safe)
121
121
  lo.to_hash.should == {:safety_level => 1}
122
122
  end
123
-
123
+
124
124
  should "be able to generate a hash representation for the :moderate level" do
125
125
  lo = LevelOption.new(:level, :moderate)
126
126
  lo.to_hash.should == {:safety_level => 2}
127
127
  end
128
-
128
+
129
129
  should "be able to generate a hash representation for the :restricted level" do
130
130
  lo = LevelOption.new(:level, :restricted)
131
131
  lo.to_hash.should == {:safety_level => 3}
132
132
  end
133
-
133
+
134
134
  end
135
-
135
+
136
136
  end
137
137
 
138
138
  class TypeOptionTest < Test::Unit::TestCase
139
-
139
+
140
140
  context "An instance of the TypeOption class" do
141
-
141
+
142
142
  should "be able to generate a hash representation for the :photo type" do
143
143
  to = TypeOption.new(:type, :photo)
144
144
  to.to_hash.should == {:content_type => 1}
145
145
  end
146
-
146
+
147
147
  should "be able to generate a hash representation for the :screenshot type" do
148
148
  to = TypeOption.new(:type, :screenshot)
149
149
  to.to_hash.should == {:content_type => 2}
150
150
  end
151
-
151
+
152
152
  should "be able to generate a hash representation for the :other type" do
153
153
  to = TypeOption.new(:type, :other)
154
154
  to.to_hash.should == {:content_type => 3}
155
155
  end
156
-
156
+
157
157
  end
158
-
158
+
159
159
  end
160
-
160
+
161
161
  class HiddenOptionTest < Test::Unit::TestCase
162
-
162
+
163
163
  context "An instance of the HiddenOption class" do
164
-
164
+
165
165
  should "be able to generate a hash representation when set to true" do
166
166
  ho = HiddenOption.new(:hide?, true)
167
167
  ho.to_hash.should == {:hidden => 2}
168
168
  end
169
-
169
+
170
170
  should "be able to generate a hash representation when set to false" do
171
171
  ho = HiddenOption.new(:hide?, false)
172
172
  ho.to_hash.should == {:hidden => 1}
173
173
  end
174
-
174
+
175
175
  end
176
-
176
+
177
177
  end
178
178
 
179
179
  end
@@ -1,13 +1,13 @@
1
- require File.dirname(__FILE__) + '/../../../test_helper'
1
+ require File.expand_path('../../../../test_helper', __FILE__)
2
2
 
3
3
  module Fleakr::Api
4
4
  class ParameterListTest < Test::Unit::TestCase
5
-
5
+
6
6
  context "An instance of the ParameterList class with an available API key" do
7
7
  setup do
8
8
  @api_key_value = 'api_key_value'
9
9
  Fleakr.stubs(:api_key).with().returns(@api_key_value)
10
-
10
+
11
11
  @parameter_list = ParameterList.new
12
12
  end
13
13
 
@@ -15,146 +15,146 @@ module Fleakr::Api
15
15
  @parameter_list.stubs(:authentication_token).with().returns('toke')
16
16
  @parameter_list.send_authentication_token?.should be(true)
17
17
  end
18
-
18
+
19
19
  should "know not to send the authentication token" do
20
20
  pl = ParameterList.new({}, false)
21
21
  pl.stubs(:authentication_token).with().returns('toke')
22
-
22
+
23
23
  pl.send_authentication_token?.should be(false)
24
24
  end
25
-
25
+
26
26
  should "know not to send the authentication token if it's not available from the global value" do
27
27
  @parameter_list.stubs(:authentication_token).with().returns(nil)
28
28
  @parameter_list.send_authentication_token?.should be(false)
29
29
  end
30
-
30
+
31
31
  should "have a default list of options" do
32
32
  @parameter_list.default_options.should == {:api_key => @api_key_value}
33
33
  end
34
-
34
+
35
35
  should "use the authentication_token in the options if we're to authenticate" do
36
36
  @parameter_list.stubs(:send_authentication_token?).with().returns(true)
37
37
  @parameter_list.stubs(:authentication_token).with().returns('toke')
38
38
  @parameter_list.stubs(:default_options).with().returns({})
39
-
39
+
40
40
  @parameter_list.options.should == {:auth_token => 'toke'}
41
41
  end
42
-
42
+
43
43
  should "add additional options from the constructor" do
44
44
  pl = ParameterList.new(:foo => 'bar')
45
45
  pl.options.should == {:foo => 'bar', :api_key => @api_key_value}
46
46
  end
47
-
47
+
48
48
  should "know that it doesn't need to sign the request by default" do
49
49
  @parameter_list.sign?.should be(false)
50
50
  end
51
-
51
+
52
52
  should "know that it needs to sign the request when a shared secret is available" do
53
53
  Fleakr.expects(:shared_secret).with().returns('secrit')
54
54
  @parameter_list.sign?.should be(true)
55
55
  end
56
-
56
+
57
57
  should "be able to add an option to the list" do
58
58
  @parameter_list.stubs(:default_options).with().returns({})
59
-
59
+
60
60
  @parameter_list.add_option(:foo, 'bar')
61
61
  @parameter_list.options.should == {:foo => 'bar'}
62
62
  end
63
-
63
+
64
64
  should "have an empty list of upload options by default" do
65
65
  @parameter_list.upload_options.should == {}
66
66
  end
67
-
67
+
68
68
  should "be able to add an upload option to the list" do
69
69
  @parameter_list.add_upload_option(:file, '/path/to/foo')
70
70
  @parameter_list.upload_options.should == {:file => '/path/to/foo'}
71
71
  end
72
-
72
+
73
73
  should "be able to generate the list of parameters without a signature" do
74
74
  @parameter_list.stubs(:options).with().returns({:foo => 'bar', :api_sig => '1234'})
75
75
  @parameter_list.options_without_signature.should == {:foo => 'bar'}
76
76
  end
77
-
77
+
78
78
  should "be able to calculate the signature of the parameters" do
79
79
  Fleakr.stubs(:shared_secret).with().returns('sekrit')
80
-
80
+
81
81
  options = {:api_key => @api_key_value, :foo => 'bar', :blip => 'zeeez'}
82
82
  @parameter_list.stubs(:options_without_signature).with().returns(options)
83
83
 
84
84
  @parameter_list.signature.should == Digest::MD5.hexdigest("sekritapi_key#{@api_key_value}blipzeeezfoobar")
85
85
  end
86
-
86
+
87
87
  should "be able to generate a list of options with a signature" do
88
88
  parameters = [ValueParameter.new('foo', 'bar')]
89
-
89
+
90
90
  @parameter_list.stubs(:options_without_signature).with().returns(:foo => 'bar')
91
91
  @parameter_list.stubs(:signature).with().returns('sig')
92
-
92
+
93
93
  @parameter_list.options_with_signature.should == {:foo => 'bar', :api_sig => 'sig'}
94
94
  end
95
-
95
+
96
96
  should "know the auth token when provided to the constructor" do
97
97
  pl = ParameterList.new(:auth_token => 'toke')
98
98
  pl.authentication_token.should == 'toke'
99
99
  end
100
-
100
+
101
101
  should "know the auth token when available as a global value" do
102
102
  Fleakr.stubs(:auth_token).with().returns('toke')
103
-
103
+
104
104
  pl = ParameterList.new
105
105
  pl.authentication_token.should == 'toke'
106
106
  end
107
-
107
+
108
108
  should "know that there is no authentication token if it is not available as a param or global value" do
109
109
  Fleakr.stubs(:auth_token).with().returns(nil)
110
-
110
+
111
111
  pl = ParameterList.new
112
112
  pl.authentication_token.should be_nil
113
113
  end
114
114
 
115
115
  should "be able to generate a boundary for post data" do
116
116
  rand = '0.123'
117
-
117
+
118
118
  @parameter_list.stubs(:rand).with().returns(stub(:to_s => rand))
119
119
  @parameter_list.boundary.should == Digest::MD5.hexdigest(rand)
120
120
  end
121
121
 
122
122
  should "be able to generate a list of parameters without a signature" do
123
123
  parameter = stub()
124
-
124
+
125
125
  @parameter_list.stubs(:sign?).with().returns(false)
126
126
  @parameter_list.expects(:options_without_signature).with().returns(:foo => 'bar')
127
127
 
128
128
  ValueParameter.expects(:new).with(:foo, 'bar').returns(parameter)
129
-
129
+
130
130
  @parameter_list.list.should == [parameter]
131
131
  end
132
-
132
+
133
133
  should "be able to generate a list of parameters with a signature" do
134
134
  parameter = stub()
135
-
135
+
136
136
  @parameter_list.stubs(:sign?).with().returns(true)
137
137
  @parameter_list.expects(:options_with_signature).with().returns(:foo => 'bar')
138
138
 
139
139
  ValueParameter.expects(:new).with(:foo, 'bar').returns(parameter)
140
-
140
+
141
141
  @parameter_list.list.should == [parameter]
142
142
  end
143
-
143
+
144
144
  should "be able to generate a list of parameters with upload parameters if available" do
145
145
  value_parameter = stub()
146
146
  file_parameter = stub()
147
-
147
+
148
148
  @parameter_list.stubs(:sign?).with().returns(true)
149
149
  @parameter_list.expects(:options_with_signature).with().returns(:foo => 'bar')
150
150
  @parameter_list.expects(:upload_options).with().returns(:file => 'path')
151
-
151
+
152
152
  ValueParameter.expects(:new).with(:foo, 'bar').returns(value_parameter)
153
153
  FileParameter.expects(:new).with(:file, 'path').returns(file_parameter)
154
-
154
+
155
155
  @parameter_list.list.should == [value_parameter, file_parameter]
156
156
  end
157
-
157
+
158
158
  context "with associated parameters" do
159
159
 
160
160
  setup do
@@ -177,7 +177,7 @@ module Fleakr::Api
177
177
  should "be able to represent a form representation of itself" do
178
178
  @parameter_list.stubs(:boundary).returns('bound')
179
179
 
180
- expected =
180
+ expected =
181
181
  "--bound\r\n" +
182
182
  "f1" +
183
183
  "--bound\r\n" +
@@ -190,6 +190,6 @@ module Fleakr::Api
190
190
  end
191
191
 
192
192
  end
193
-
193
+
194
194
  end
195
195
  end