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,13 +1,13 @@
1
1
  module Fleakr
2
2
  module Version # :nodoc:
3
-
3
+
4
4
  MAJOR = 0
5
- MINOR = 6
6
- TINY = 3
7
-
5
+ MINOR = 7
6
+ TINY = 0
7
+
8
8
  def self.to_s
9
9
  [MAJOR, MINOR, TINY].join('.')
10
10
  end
11
-
11
+
12
12
  end
13
13
  end
@@ -0,0 +1,362 @@
1
+ <?xml version="1.0" encoding="utf-8" ?>
2
+ <rsp stat="ok">
3
+ <photo id="1" secret="37efb9102f" server="2683" farm="3">
4
+ <exif tagspace="System" tagspaceid="0" tag="FileName" label="FileName">
5
+ <raw>ORI9141194487814365231.img</raw>
6
+ </exif>
7
+ <exif tagspace="System" tagspaceid="0" tag="Directory" label="Directory">
8
+ <raw>/home/y/tmp/3</raw>
9
+ </exif>
10
+ <exif tagspace="System" tagspaceid="0" tag="FileSize" label="File Size">
11
+ <raw>3.2 MB</raw>
12
+ </exif>
13
+ <exif tagspace="System" tagspaceid="0" tag="FileModifyDate" label="FileModifyDate">
14
+ <raw>2010:04:10 11:55:56+00:00</raw>
15
+ </exif>
16
+ <exif tagspace="File" tagspaceid="0" tag="FileType" label="File Type">
17
+ <raw>JPEG</raw>
18
+ </exif>
19
+ <exif tagspace="File" tagspaceid="0" tag="MIMEType" label="MIME Type">
20
+ <raw>image/jpeg</raw>
21
+ </exif>
22
+ <exif tagspace="File" tagspaceid="0" tag="ImageWidth" label="Image Width">
23
+ <raw>3264</raw>
24
+ </exif>
25
+ <exif tagspace="File" tagspaceid="0" tag="ImageHeight" label="Image Height">
26
+ <raw>2448</raw>
27
+ </exif>
28
+ <exif tagspace="File" tagspaceid="0" tag="EncodingProcess" label="Encoding Process">
29
+ <raw>Baseline DCT, Huffman coding</raw>
30
+ </exif>
31
+ <exif tagspace="File" tagspaceid="0" tag="BitsPerSample" label="Bits Per Sample">
32
+ <raw>8</raw>
33
+ </exif>
34
+ <exif tagspace="File" tagspaceid="0" tag="ColorComponents" label="Color Components">
35
+ <raw>3</raw>
36
+ </exif>
37
+ <exif tagspace="File" tagspaceid="0" tag="YCbCrSubSampling" label="YCbCrSubSampling">
38
+ <raw>YCbCr4:2:2 (2 1)</raw>
39
+ </exif>
40
+ <exif tagspace="IFD0" tagspaceid="0" tag="Make" label="Make">
41
+ <raw>Panasonic</raw>
42
+ </exif>
43
+ <exif tagspace="IFD0" tagspaceid="0" tag="Model" label="Model">
44
+ <raw>DMC-LZ8</raw>
45
+ </exif>
46
+ <exif tagspace="IFD0" tagspaceid="0" tag="Orientation" label="Orientation">
47
+ <raw>Horizontal (normal)</raw>
48
+ </exif>
49
+ <exif tagspace="IFD0" tagspaceid="0" tag="XResolution" label="X-Resolution">
50
+ <raw>180</raw>
51
+ <clean>180 dpi</clean>
52
+ </exif>
53
+ <exif tagspace="IFD0" tagspaceid="0" tag="YResolution" label="Y-Resolution">
54
+ <raw>180</raw>
55
+ <clean>180 dpi</clean>
56
+ </exif>
57
+ <exif tagspace="IFD0" tagspaceid="0" tag="ResolutionUnit" label="ResolutionUnit">
58
+ <raw>inches</raw>
59
+ </exif>
60
+ <exif tagspace="IFD0" tagspaceid="0" tag="Software" label="Software">
61
+ <raw>Ver.1.0 </raw>
62
+ </exif>
63
+ <exif tagspace="IFD0" tagspaceid="0" tag="ModifyDate" label="Date and Time (Modified)">
64
+ <raw>2010:04:08 12:19:06</raw>
65
+ </exif>
66
+ <exif tagspace="IFD0" tagspaceid="0" tag="YCbCrPositioning" label="YCbCr Positioning">
67
+ <raw>Co-sited</raw>
68
+ </exif>
69
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ExposureTime" label="Exposure">
70
+ <raw>1/400</raw>
71
+ <clean>0.003 sec (1/400)</clean>
72
+ </exif>
73
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="FNumber" label="Aperture">
74
+ <raw>5.9</raw>
75
+ <clean>f/5.9</clean>
76
+ </exif>
77
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ExposureProgram" label="Exposure Program">
78
+ <raw>Program AE</raw>
79
+ </exif>
80
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ISO" label="ISO Speed">
81
+ <raw>200</raw>
82
+ </exif>
83
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ExifVersion" label="ExifVersion">
84
+ <raw>0221</raw>
85
+ </exif>
86
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="DateTimeOriginal" label="Date and Time (Original)">
87
+ <raw>2010:04:08 12:19:06</raw>
88
+ </exif>
89
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="CreateDate" label="Date and Time (Digitized)">
90
+ <raw>2010:04:08 12:19:06</raw>
91
+ </exif>
92
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ComponentsConfiguration" label="ComponentsConfiguration">
93
+ <raw>Y, Cb, Cr, -</raw>
94
+ </exif>
95
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="CompressedBitsPerPixel" label="Compressed Bits Per Pixel">
96
+ <raw>4</raw>
97
+ </exif>
98
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ExposureCompensation" label="Exposure Bias">
99
+ <raw>0</raw>
100
+ <clean>0 EV</clean>
101
+ </exif>
102
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="MaxApertureValue" label="Max Aperture Value">
103
+ <raw>3.3</raw>
104
+ </exif>
105
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="MeteringMode" label="Metering Mode">
106
+ <raw>Multi-segment</raw>
107
+ </exif>
108
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="LightSource" label="Light Source">
109
+ <raw>Unknown</raw>
110
+ </exif>
111
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="Flash" label="Flash">
112
+ <raw>Off, Did not fire</raw>
113
+ </exif>
114
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="FocalLength" label="Focal Length">
115
+ <raw>26.0 mm</raw>
116
+ <clean>26 mm</clean>
117
+ </exif>
118
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="FlashpixVersion" label="FlashpixVersion">
119
+ <raw>0100</raw>
120
+ </exif>
121
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ColorSpace" label="Color Space">
122
+ <raw>sRGB</raw>
123
+ </exif>
124
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ExifImageWidth" label="ExifImageWidth">
125
+ <raw>3264</raw>
126
+ </exif>
127
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ExifImageHeight" label="ExifImageHeight">
128
+ <raw>2448</raw>
129
+ </exif>
130
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="SensingMethod" label="Sensing Method">
131
+ <raw>One-chip color area</raw>
132
+ </exif>
133
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="FileSource" label="FileSource">
134
+ <raw>Digital Camera</raw>
135
+ </exif>
136
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="SceneType" label="SceneType">
137
+ <raw>Directly photographed</raw>
138
+ </exif>
139
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="CustomRendered" label="Custom Rendered">
140
+ <raw>Normal</raw>
141
+ </exif>
142
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="ExposureMode" label="Exposure Mode">
143
+ <raw>Auto</raw>
144
+ </exif>
145
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="WhiteBalance" label="White Balance">
146
+ <raw>Auto</raw>
147
+ </exif>
148
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="DigitalZoomRatio" label="Digital Zoom Ratio">
149
+ <raw>0</raw>
150
+ </exif>
151
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="FocalLengthIn35mmFormat" label="Focal Length In35mm Format">
152
+ <raw>160 mm</raw>
153
+ </exif>
154
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="SceneCaptureType" label="Scene Capture Type">
155
+ <raw>Standard</raw>
156
+ </exif>
157
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="GainControl" label="Gain Control">
158
+ <raw>Low gain up</raw>
159
+ </exif>
160
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="Contrast" label="Contrast">
161
+ <raw>Normal</raw>
162
+ </exif>
163
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="Saturation" label="Saturation">
164
+ <raw>Normal</raw>
165
+ </exif>
166
+ <exif tagspace="ExifIFD" tagspaceid="0" tag="Sharpness" label="Sharpness">
167
+ <raw>Normal</raw>
168
+ </exif>
169
+ <exif tagspace="Panasonic" tagspaceid="0" tag="ImageQuality" label="Image Quality">
170
+ <raw>High</raw>
171
+ </exif>
172
+ <exif tagspace="Panasonic" tagspaceid="0" tag="FirmwareVersion" label="Firmware Version">
173
+ <raw>0.1.0.8</raw>
174
+ </exif>
175
+ <exif tagspace="Panasonic" tagspaceid="0" tag="WhiteBalance" label="White Balance">
176
+ <raw>Auto</raw>
177
+ </exif>
178
+ <exif tagspace="Panasonic" tagspaceid="0" tag="FocusMode" label="Focus Mode">
179
+ <raw>Auto</raw>
180
+ </exif>
181
+ <exif tagspace="Panasonic" tagspaceid="0" tag="AFMode" label="AFMode">
182
+ <raw>Auto or Face Detect</raw>
183
+ </exif>
184
+ <exif tagspace="Panasonic" tagspaceid="0" tag="ImageStabilization" label="Image Stabilization">
185
+ <raw>On, Mode 1</raw>
186
+ </exif>
187
+ <exif tagspace="Panasonic" tagspaceid="0" tag="MacroMode" label="Macro Mode">
188
+ <raw>Off</raw>
189
+ </exif>
190
+ <exif tagspace="Panasonic" tagspaceid="0" tag="ShootingMode" label="Shooting Mode">
191
+ <raw>Intelligent Auto</raw>
192
+ </exif>
193
+ <exif tagspace="Panasonic" tagspaceid="0" tag="Audio" label="Audio">
194
+ <raw>No</raw>
195
+ </exif>
196
+ <exif tagspace="Panasonic" tagspaceid="0" tag="DataDump" label="Data Dump">
197
+ <raw>(Binary data 8200 bytes, use -b option to extract)</raw>
198
+ </exif>
199
+ <exif tagspace="Panasonic" tagspaceid="0" tag="WhiteBalanceBias" label="White Balance Bias">
200
+ <raw>0</raw>
201
+ </exif>
202
+ <exif tagspace="Panasonic" tagspaceid="0" tag="FlashBias" label="Flash Bias">
203
+ <raw>0</raw>
204
+ </exif>
205
+ <exif tagspace="Panasonic" tagspaceid="0" tag="InternalSerialNumber" label="Internal Serial Number">
206
+ <raw>(X02) 2008:03:07 no. 0037</raw>
207
+ </exif>
208
+ <exif tagspace="Panasonic" tagspaceid="0" tag="PanasonicExifVersion" label="Panasonic Exif Version">
209
+ <raw>0260</raw>
210
+ </exif>
211
+ <exif tagspace="Panasonic" tagspaceid="0" tag="ColorEffect" label="Color Effect">
212
+ <raw>Off</raw>
213
+ </exif>
214
+ <exif tagspace="Panasonic" tagspaceid="0" tag="TimeSincePowerOn" label="Time Since Power On">
215
+ <raw>00:00:25.53</raw>
216
+ </exif>
217
+ <exif tagspace="Panasonic" tagspaceid="0" tag="BurstMode" label="Burst Mode">
218
+ <raw>Off</raw>
219
+ </exif>
220
+ <exif tagspace="Panasonic" tagspaceid="0" tag="SequenceNumber" label="Sequence Number">
221
+ <raw>0</raw>
222
+ </exif>
223
+ <exif tagspace="Panasonic" tagspaceid="0" tag="Contrast" label="Contrast">
224
+ <raw>Normal</raw>
225
+ </exif>
226
+ <exif tagspace="Panasonic" tagspaceid="0" tag="NoiseReduction" label="Noise Reduction">
227
+ <raw>Standard</raw>
228
+ </exif>
229
+ <exif tagspace="Panasonic" tagspaceid="0" tag="SelfTimer" label="Self Timer">
230
+ <raw>Off</raw>
231
+ </exif>
232
+ <exif tagspace="Panasonic" tagspaceid="0" tag="Rotation" label="Rotation">
233
+ <raw>Horizontal (normal)</raw>
234
+ </exif>
235
+ <exif tagspace="Panasonic" tagspaceid="0" tag="AFAssistLamp" label="AFAssist Lamp">
236
+ <raw>Enabled but Not Used</raw>
237
+ </exif>
238
+ <exif tagspace="Panasonic" tagspaceid="0" tag="ColorMode" label="Color Mode">
239
+ <raw>Normal</raw>
240
+ </exif>
241
+ <exif tagspace="Panasonic" tagspaceid="0" tag="BabyAge" label="Baby Age">
242
+ <raw>(not set)</raw>
243
+ </exif>
244
+ <exif tagspace="Panasonic" tagspaceid="0" tag="OpticalZoomMode" label="Optical Zoom Mode">
245
+ <raw>Standard</raw>
246
+ </exif>
247
+ <exif tagspace="Panasonic" tagspaceid="0" tag="ConversionLens" label="Conversion Lens">
248
+ <raw>Off</raw>
249
+ </exif>
250
+ <exif tagspace="Panasonic" tagspaceid="0" tag="TravelDay" label="Travel Day">
251
+ <raw>n/a</raw>
252
+ </exif>
253
+ <exif tagspace="Panasonic" tagspaceid="0" tag="WorldTimeLocation" label="World Time Location">
254
+ <raw>Home</raw>
255
+ </exif>
256
+ <exif tagspace="Panasonic" tagspaceid="0" tag="TextStamp" label="Text Stamp">
257
+ <raw>Off</raw>
258
+ </exif>
259
+ <exif tagspace="Panasonic" tagspaceid="0" tag="ProgramISO" label="Program ISO">
260
+ <raw>n/a</raw>
261
+ </exif>
262
+ <exif tagspace="Panasonic" tagspaceid="0" tag="AdvancedSceneMode" label="Advanced Scene Mode">
263
+ <raw>Auto</raw>
264
+ </exif>
265
+ <exif tagspace="Panasonic" tagspaceid="0" tag="FacesDetected" label="Faces Detected">
266
+ <raw>0</raw>
267
+ </exif>
268
+ <exif tagspace="Panasonic" tagspaceid="0" tag="Saturation" label="Saturation">
269
+ <raw>Normal</raw>
270
+ </exif>
271
+ <exif tagspace="Panasonic" tagspaceid="0" tag="Sharpness" label="Sharpness">
272
+ <raw>Normal</raw>
273
+ </exif>
274
+ <exif tagspace="Panasonic" tagspaceid="0" tag="AFPointPosition" label="AFPoint Position">
275
+ <raw>0.5 0.5</raw>
276
+ </exif>
277
+ <exif tagspace="Panasonic" tagspaceid="0" tag="NumFacePositions" label="Num Face Positions">
278
+ <raw>0</raw>
279
+ </exif>
280
+ <exif tagspace="Panasonic" tagspaceid="0" tag="MakerNoteVersion" label="Maker Note Version">
281
+ <raw>0121</raw>
282
+ </exif>
283
+ <exif tagspace="Panasonic" tagspaceid="0" tag="SceneMode" label="Scene Mode">
284
+ <raw>Intelligent Auto</raw>
285
+ </exif>
286
+ <exif tagspace="Panasonic" tagspaceid="0" tag="WBRedLevel" label="WBRed Level">
287
+ <raw>1713</raw>
288
+ </exif>
289
+ <exif tagspace="Panasonic" tagspaceid="0" tag="WBGreenLevel" label="WBGreen Level">
290
+ <raw>1054</raw>
291
+ </exif>
292
+ <exif tagspace="Panasonic" tagspaceid="0" tag="WBBlueLevel" label="WBBlue Level">
293
+ <raw>1905</raw>
294
+ </exif>
295
+ <exif tagspace="Panasonic" tagspaceid="0" tag="FlashFired" label="Flash Fired">
296
+ <raw>No</raw>
297
+ </exif>
298
+ <exif tagspace="InteropIFD" tagspaceid="0" tag="InteropIndex" label="InteropIndex">
299
+ <raw>R98 - DCF basic file (sRGB)</raw>
300
+ </exif>
301
+ <exif tagspace="InteropIFD" tagspaceid="0" tag="InteropVersion" label="InteropVersion">
302
+ <raw>0100</raw>
303
+ </exif>
304
+ <exif tagspace="IFD1" tagspaceid="0" tag="Compression" label="Compression">
305
+ <raw>JPEG (old-style)</raw>
306
+ </exif>
307
+ <exif tagspace="IFD1" tagspaceid="0" tag="Orientation" label="Orientation">
308
+ <raw>Horizontal (normal)</raw>
309
+ </exif>
310
+ <exif tagspace="IFD1" tagspaceid="0" tag="XResolution" label="XResolution">
311
+ <raw>180</raw>
312
+ </exif>
313
+ <exif tagspace="IFD1" tagspaceid="0" tag="YResolution" label="YResolution">
314
+ <raw>180</raw>
315
+ </exif>
316
+ <exif tagspace="IFD1" tagspaceid="0" tag="ResolutionUnit" label="ResolutionUnit">
317
+ <raw>inches</raw>
318
+ </exif>
319
+ <exif tagspace="IFD1" tagspaceid="0" tag="ThumbnailOffset" label="ThumbnailOffset">
320
+ <raw>10176</raw>
321
+ </exif>
322
+ <exif tagspace="IFD1" tagspaceid="0" tag="ThumbnailLength" label="ThumbnailLength">
323
+ <raw>8121</raw>
324
+ </exif>
325
+ <exif tagspace="IFD1" tagspaceid="0" tag="YCbCrPositioning" label="YCbCrPositioning">
326
+ <raw>Co-sited</raw>
327
+ </exif>
328
+ <exif tagspace="Composite" tagspaceid="0" tag="Aperture" label="Aperture">
329
+ <raw>5.9</raw>
330
+ </exif>
331
+ <exif tagspace="Composite" tagspaceid="0" tag="BlueBalance" label="BlueBalance">
332
+ <raw>1.8074</raw>
333
+ </exif>
334
+ <exif tagspace="Composite" tagspaceid="0" tag="ImageSize" label="ImageSize">
335
+ <raw>3264x2448</raw>
336
+ </exif>
337
+ <exif tagspace="Composite" tagspaceid="0" tag="RedBalance" label="RedBalance">
338
+ <raw>1.625237</raw>
339
+ </exif>
340
+ <exif tagspace="Composite" tagspaceid="0" tag="ScaleFactor35efl" label="ScaleFactor35efl">
341
+ <raw>6.2</raw>
342
+ </exif>
343
+ <exif tagspace="Composite" tagspaceid="0" tag="ShutterSpeed" label="ShutterSpeed">
344
+ <raw>1/400</raw>
345
+ </exif>
346
+ <exif tagspace="Composite" tagspaceid="0" tag="CircleOfConfusion" label="CircleOfConfusion">
347
+ <raw>0.005 mm</raw>
348
+ </exif>
349
+ <exif tagspace="Composite" tagspaceid="0" tag="FOV" label="FOV">
350
+ <raw>12.8 deg</raw>
351
+ </exif>
352
+ <exif tagspace="Composite" tagspaceid="0" tag="FocalLength35efl" label="FocalLength35efl">
353
+ <raw>26.0 mm (35 mm equivalent: 160.0 mm)</raw>
354
+ </exif>
355
+ <exif tagspace="Composite" tagspaceid="0" tag="HyperfocalDistance" label="HyperfocalDistance">
356
+ <raw>23.47 m</raw>
357
+ </exif>
358
+ <exif tagspace="Composite" tagspaceid="0" tag="LightValue" label="LightValue">
359
+ <raw>12.8</raw>
360
+ </exif>
361
+ </photo>
362
+ </rsp>
@@ -11,11 +11,13 @@ require File.dirname(__FILE__) + '/../lib/fleakr'
11
11
  class Test::Unit::TestCase
12
12
 
13
13
  def self.should_autoload_when_accessing(*attributes)
14
- options = attributes.extract_options!
14
+ attributes, options = Fleakr::Support::Utility.extract_options(attributes)
15
+
15
16
  attributes.each do |accessor_name|
16
17
  should "load the additional user information when accessing the :#{accessor_name} attribute" do
17
- klass = self.class.name.sub(/Test$/, '').constantize
18
-
18
+ class_name = self.class.name.match(/([^:]+)Test$/)[1]
19
+ klass = Fleakr::Objects.const_get(class_name)
20
+
19
21
  object = klass.new
20
22
  object.expects(options[:with]).with()
21
23
  object.send(accessor_name)
@@ -33,51 +35,51 @@ class Test::Unit::TestCase
33
35
  should "be able to perform a scoped search by :#{key}" do
34
36
  photos = [stub()]
35
37
  search = stub(:results => photos)
36
-
37
- klass = self.class.name.sub(/Test$/, '').constantize
38
-
38
+
39
+ class_name = self.class.name.match(/([^:]+)Test$/)[1]
40
+ klass = Fleakr::Objects.const_get(class_name)
41
+
39
42
  instance = klass.new
40
43
  instance.stubs(:id).with().returns('1')
41
-
44
+
42
45
  Fleakr::Objects::Search.expects(:new).with('foo', key => '1').returns(search)
43
-
46
+
44
47
  instance.search('foo').should == photos
45
48
  end
46
49
  end
47
50
 
48
51
  def self.should_have_many(*attributes)
49
- class_name = self.name.demodulize.sub(/Test$/, '')
50
- this_klass = "Fleakr::Objects::#{class_name}".constantize
52
+ attributes, options = Fleakr::Support::Utility.extract_options(attributes)
53
+
54
+ class_name = self.name.to_s.match(/([^:]+)Test$/)[1]
55
+ klass = Fleakr::Objects.const_get(class_name)
56
+
57
+ association_class = options[:class]
58
+
59
+ finder_attribute = options[:using].nil? ? Fleakr::Support::Utility.id_attribute_for(class_name) : options[:using]
51
60
 
52
- options = attributes.extract_options!
53
- finder_attribute = options[:using].nil? ? "#{class_name.downcase}_id" : options[:using]
54
-
55
61
  attributes.each do |attribute|
56
- target_klass = "Fleakr::Objects::#{attribute.to_s.singularize.classify}".constantize
62
+
57
63
  should "be able to retrieve the #{class_name.downcase}'s #{attribute}" do
58
64
  results = [stub()]
59
- object = this_klass.new
65
+ object = klass.new
60
66
  object.stubs(:id).with().returns('1')
61
67
 
62
- target_klass.expects("find_all_by_#{finder_attribute}".to_sym).with('1', {}).returns(results)
68
+ association_class.expects("find_all_by_#{finder_attribute}".to_sym).with('1', {}).returns(results)
63
69
  object.send(attribute).should == results
64
70
  end
65
-
71
+
66
72
  should "memoize the results for the #{class_name.downcase}'s #{attribute}" do
67
- object = this_klass.new
68
-
69
- target_klass.expects("find_all_by_#{finder_attribute}".to_sym).once.returns([])
73
+ object = klass.new
74
+
75
+ association_class.expects("find_all_by_#{finder_attribute}".to_sym).once.returns([])
70
76
  2.times { object.send(attribute) }
71
77
  end
72
-
78
+
73
79
  end
74
80
  end
75
81
 
76
82
  def self.should_find_one(thing, options)
77
- class_name = thing.to_s.singularize.camelcase
78
- klass = "Fleakr::Objects::#{class_name}".constantize
79
- object_type = class_name.downcase
80
-
81
83
  condition_value = '1'
82
84
 
83
85
  options[:with] = options[:by] if options[:with].nil?
@@ -87,55 +89,50 @@ class Test::Unit::TestCase
87
89
  stub = stub()
88
90
  response = mock_request_cycle :for => options[:call], :with => params
89
91
 
90
- klass.expects(:new).with(response.body, params).returns(stub)
91
- klass.send("find_by_#{options[:by]}".to_sym, condition_value).should == stub
92
+ options[:class].expects(:new).with(response.body, params).returns(stub)
93
+ options[:class].send("find_by_#{options[:by]}".to_sym, condition_value).should == stub
92
94
  end
93
95
  end
94
96
 
95
97
  def self.should_find_all(thing, options)
96
- class_name = thing.to_s.singularize.camelcase
97
- klass = "Fleakr::Objects::#{class_name}".constantize
98
- object_type = class_name.downcase
99
-
100
98
  should "be able to find all #{thing} by #{options[:by]}" do
101
99
  condition_value = '1'
102
100
  finder_options = {(options[:using] || options[:by]) => condition_value}
103
-
101
+
104
102
  response = mock_request_cycle :for => options[:call], :with => finder_options
105
-
103
+
106
104
  stubs = []
107
105
  elements = (response.body/options[:path]).map
108
-
109
-
106
+
110
107
  elements.each do |element|
111
108
  stub = stub()
112
109
  stubs << stub
113
-
114
- klass.expects(:new).with(element, finder_options).returns(stub)
110
+
111
+ options[:class].expects(:new).with(element, finder_options).returns(stub)
115
112
  end
116
-
117
- klass.send("find_all_by_#{options[:by]}".to_sym, condition_value).should == stubs
113
+
114
+ options[:class].send("find_all_by_#{options[:by]}".to_sym, condition_value).should == stubs
118
115
  end
119
-
116
+
120
117
  end
121
-
118
+
122
119
  def read_fixture(method_call)
123
120
  fixture_path = File.dirname(__FILE__) + '/fixtures'
124
121
  File.read("#{fixture_path}/#{method_call}.xml")
125
122
  end
126
-
123
+
127
124
  def mock_request_cycle(options)
128
125
  response = stub(:body => Hpricot.XML(read_fixture(options[:for])))
129
126
  Fleakr::Api::MethodRequest.expects(:with_response!).with(options[:for], options[:with]).returns(response)
130
-
127
+
131
128
  response
132
129
  end
133
-
130
+
134
131
  def create_temp_directory
135
132
  tmp_dir = File.dirname(__FILE__) + '/tmp'
136
- FileUtils.mkdir(tmp_dir)
137
-
133
+ FileUtils.mkdir(tmp_dir)
134
+
138
135
  tmp_dir
139
136
  end
140
-
137
+
141
138
  end