smile 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +3 -0
- data/Rakefile +47 -52
- data/VERSION.yml +2 -2
- data/bin/smile +1 -1
- data/lib/smile/album.rb +107 -184
- data/lib/smile/base.rb +9 -44
- data/lib/smile/common.rb +56 -0
- data/lib/smile/exception.rb +12 -0
- data/lib/smile/json.rb +24 -0
- data/lib/smile/param_converter.rb +17 -87
- data/lib/smile/photo.rb +18 -55
- data/lib/smile/session.rb +37 -0
- data/lib/smile/smug.rb +12 -35
- data/lib/smile.rb +9 -5
- data/smile.gemspec +6 -3
- data/test/smile_test.rb +63 -44
- data/test/test_helper.rb +3 -5
- metadata +8 -5
- data/config/metric_fu_config.rb +0 -31
data/.gitignore
CHANGED
data/Rakefile
CHANGED
@@ -1,7 +1,51 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rake'
|
3
|
-
require '
|
4
|
-
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
#############################################################################
|
6
|
+
##
|
7
|
+
## Helper functions
|
8
|
+
##
|
9
|
+
##############################################################################
|
10
|
+
|
11
|
+
def name
|
12
|
+
@name ||= Dir['*.gemspec'].first.split('.').first
|
13
|
+
end
|
14
|
+
|
15
|
+
def version
|
16
|
+
line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
|
17
|
+
line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
|
18
|
+
end
|
19
|
+
|
20
|
+
def date
|
21
|
+
Date.today.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def rubyforge_project
|
25
|
+
name
|
26
|
+
end
|
27
|
+
|
28
|
+
def gemspec_file
|
29
|
+
"#{name}.gemspec"
|
30
|
+
end
|
31
|
+
|
32
|
+
def gem_file
|
33
|
+
"#{name}-#{version}.gem"
|
34
|
+
end
|
35
|
+
|
36
|
+
def replace_header(head, header_name)
|
37
|
+
head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Open an irb session preloaded with this library"
|
41
|
+
task :console do
|
42
|
+
sh "irb -rubygems -r ./lib/#{name}.rb"
|
43
|
+
end
|
44
|
+
|
45
|
+
desc "Run Shindo rake tasks"
|
46
|
+
task :test do
|
47
|
+
sh "shindo #{Dir.glob( 'test/**/*_test.rb' ).join(' ')}"
|
48
|
+
end
|
5
49
|
|
6
50
|
begin
|
7
51
|
require 'jeweler'
|
@@ -22,56 +66,7 @@ rescue LoadError
|
|
22
66
|
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
23
67
|
end
|
24
68
|
|
25
|
-
|
26
|
-
# These are new tasks
|
27
|
-
begin
|
28
|
-
require 'rake/contrib/sshpublisher'
|
29
|
-
namespace :rubyforge do
|
30
|
-
|
31
|
-
desc "Release gem and RDoc documentation to RubyForge"
|
32
|
-
task :release => ["rubyforge:release:gem", "rubyforge:release:docs"]
|
33
|
-
|
34
|
-
namespace :release do
|
35
|
-
desc "Publish RDoc to RubyForge."
|
36
|
-
task :docs => [:rdoc] do
|
37
|
-
config = YAML.load(
|
38
|
-
File.read(File.expand_path('~/.rubyforge/user-config.yml'))
|
39
|
-
)
|
40
|
-
|
41
|
-
host = "#{config['username']}@rubyforge.org"
|
42
|
-
remote_dir = "/var/www/gforge-projects/cajun-gems/"
|
43
|
-
local_dir = 'rdoc'
|
44
|
-
|
45
|
-
Rake::SshDirPublisher.new(host, remote_dir, local_dir).upload
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
rescue LoadError
|
50
|
-
puts "Rake SshDirPublisher is unavailable or your rubyforge environment is not configured."
|
51
|
-
end
|
52
|
-
|
53
|
-
require 'rake/testtask'
|
54
|
-
Rake::TestTask.new(:test) do |test|
|
55
|
-
test.libs << 'lib' << 'test'
|
56
|
-
test.pattern = 'test/**/*_test.rb'
|
57
|
-
test.verbose = true
|
58
|
-
end
|
59
|
-
|
60
|
-
begin
|
61
|
-
require 'rcov/rcovtask'
|
62
|
-
Rcov::RcovTask.new do |test|
|
63
|
-
test.libs << 'test'
|
64
|
-
test.pattern = 'test/**/*_test.rb'
|
65
|
-
test.verbose = true
|
66
|
-
end
|
67
|
-
rescue LoadError
|
68
|
-
task :rcov do
|
69
|
-
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
|
74
|
-
task :default => :test
|
69
|
+
task :default => :test
|
75
70
|
|
76
71
|
require 'rake/rdoctask'
|
77
72
|
Rake::RDocTask.new do |rdoc|
|
data/VERSION.yml
CHANGED
data/bin/smile
CHANGED
data/lib/smile/album.rb
CHANGED
@@ -1,88 +1,71 @@
|
|
1
1
|
# The Album class will fetch any public/private album hosted on SmugMug.
|
2
|
-
# The Album Objects will have the following fields on the response
|
3
2
|
#
|
4
|
-
#
|
3
|
+
# the album objects will have the following fields on the response
|
5
4
|
#
|
6
|
-
#
|
5
|
+
# result
|
6
|
+
#
|
7
|
+
# standard response
|
8
|
+
#
|
7
9
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
# string id
|
15
|
-
# string Name
|
16
|
-
# string id
|
17
|
-
# string Name
|
18
|
-
# struct SubCategory
|
19
|
-
# string id
|
20
|
-
# string Name
|
21
|
-
# string id
|
22
|
-
# string Name
|
10
|
+
# Album
|
11
|
+
# album_id
|
12
|
+
# album_key
|
13
|
+
# title
|
14
|
+
# category { id, name }
|
15
|
+
# subcategory { id, name }
|
23
16
|
#
|
24
|
-
# HEAVY RESPONSE
|
17
|
+
# HEAVY RESPONSE ( DEFAULT )
|
18
|
+
#
|
19
|
+
# Album
|
20
|
+
# album_id
|
21
|
+
# album_key
|
22
|
+
# title
|
23
|
+
# category { id, name }
|
24
|
+
# subcategory { id, name }
|
25
|
+
# string description
|
26
|
+
# string keywords
|
27
|
+
# boolean geography (owner)
|
28
|
+
# integer position
|
29
|
+
# struct hightlight (owner) { id }
|
30
|
+
# integer imagecount
|
31
|
+
# string lastupdated
|
32
|
+
# boolean header (owner, power & pro only)
|
33
|
+
# boolean clean (owner)
|
34
|
+
# boolean exif (owner)
|
35
|
+
# boolean filenames (owner)
|
36
|
+
# struct template (owner) { id }
|
37
|
+
# string sortmethod (owner)
|
38
|
+
# boolean sortdirection (owner)
|
39
|
+
# string password (owner)
|
40
|
+
# string passwordhint (owner)
|
41
|
+
# boolean public (owner)
|
42
|
+
# boolean worldsearchable (owner)
|
43
|
+
# boolean smugsearchable (owner)
|
44
|
+
# boolean external (owner)
|
45
|
+
# boolean protected (owner, power & pro only)
|
46
|
+
# boolean watermarking (owner, pro only)
|
47
|
+
# struct watermark (owner, pro only) { id }
|
48
|
+
# boolean hideowner (owner)
|
49
|
+
# boolean larges (owner, pro only)
|
50
|
+
# boolean xlarges (owner, pro only)
|
51
|
+
# boolean x2larges (owner)
|
52
|
+
# boolean x3larges (owner)
|
53
|
+
# boolean originals (owner)
|
54
|
+
# boolean canrank (owner)
|
55
|
+
# boolean friendedit (owner)
|
56
|
+
# boolean familyedit (owner)
|
57
|
+
# boolean comments (owner)
|
58
|
+
# boolean share (owner)
|
59
|
+
# boolean printable (owner)
|
60
|
+
# int colorcorrection (owner)
|
61
|
+
# integer proofdays (owner, pro only)
|
62
|
+
# string backprinting (owner, pro only)
|
63
|
+
# float unsharpamount (owner, power & pro only)
|
64
|
+
# float unsharpradius (owner, power & pro only)
|
65
|
+
# float unsharpthreshold (owner, power & pro only)
|
66
|
+
# float unsharpsigma (owner, power & pro only)
|
67
|
+
# struct community (owner) id
|
25
68
|
#
|
26
|
-
# array Albums
|
27
|
-
# Album
|
28
|
-
# integer id
|
29
|
-
# string Key
|
30
|
-
# string Title
|
31
|
-
# struct Category
|
32
|
-
# string id
|
33
|
-
# string Name
|
34
|
-
# struct SubCategory
|
35
|
-
# string id
|
36
|
-
# string Name
|
37
|
-
# string Description
|
38
|
-
# string Keywords
|
39
|
-
# boolean Geography (owner)
|
40
|
-
# integer Position
|
41
|
-
# struct Hightlight (owner)
|
42
|
-
# string id
|
43
|
-
# integer ImageCount
|
44
|
-
# string LastUpdated
|
45
|
-
# boolean Header (owner, power & pro only)
|
46
|
-
# boolean Clean (owner)
|
47
|
-
# boolean EXIF (owner)
|
48
|
-
# boolean Filenames (owner)
|
49
|
-
# struct Template (owner)
|
50
|
-
# string id
|
51
|
-
# string SortMethod (owner)
|
52
|
-
# boolean SortDirection (owner)
|
53
|
-
# string Password (owner)
|
54
|
-
# string PasswordHint (owner)
|
55
|
-
# boolean Public (owner)
|
56
|
-
# boolean WorldSearchable (owner)
|
57
|
-
# boolean SmugSearchable (owner)
|
58
|
-
# boolean External (owner)
|
59
|
-
# boolean Protected (owner, power & pro only)
|
60
|
-
# boolean Watermarking (owner, pro only)
|
61
|
-
# struct Watermark (owner, pro only)
|
62
|
-
# string id
|
63
|
-
# boolean HideOwner (owner)
|
64
|
-
# boolean Larges (owner, pro only)
|
65
|
-
# boolean XLarges (owner, pro only)
|
66
|
-
# boolean X2Larges (owner)
|
67
|
-
# boolean X3Larges (owner)
|
68
|
-
# boolean Originals (owner)
|
69
|
-
# boolean CanRank (owner)
|
70
|
-
# boolean FriendEdit (owner)
|
71
|
-
# boolean FamilyEdit (owner)
|
72
|
-
# boolean Comments (owner)
|
73
|
-
# boolean Share (owner)
|
74
|
-
# boolean Printable (owner)
|
75
|
-
# int ColorCorrection (owner)
|
76
|
-
# boolean DefaultColor (owner, pro only) deprecated
|
77
|
-
# integer ProofDays (owner, pro only)
|
78
|
-
# string Backprinting (owner, pro only)
|
79
|
-
# float UnsharpAmount (owner, power & pro only)
|
80
|
-
# float UnsharpRadius (owner, power & pro only)
|
81
|
-
# float UnsharpThreshold (owner, power & pro only)
|
82
|
-
# float UnsharpSigma (owner, power & pro only)
|
83
|
-
# struct Community (owner)
|
84
|
-
# string id
|
85
|
-
#
|
86
69
|
# @author Zac Kleinpeter
|
87
70
|
# @date 2009-04-28.
|
88
71
|
class Smile::Album < Smile::Base
|
@@ -90,16 +73,12 @@ class Smile::Album < Smile::Base
|
|
90
73
|
class << self
|
91
74
|
# Converts the json results from the web service into
|
92
75
|
# Album object to use
|
93
|
-
def from_json( json
|
94
|
-
|
95
|
-
|
96
|
-
album = upper_hash_to_lower_hash( album_upcase )
|
97
|
-
|
76
|
+
def from_json( json )
|
77
|
+
json["albums"].map do |album_upper|
|
78
|
+
album = upper_hash_to_lower_hash( album_upper )
|
98
79
|
album.merge!( :album_id => album["id"] )
|
99
|
-
|
100
|
-
|
101
|
-
a.session_id = session_id
|
102
|
-
a
|
80
|
+
|
81
|
+
Smile::Album.new( album )
|
103
82
|
end
|
104
83
|
end
|
105
84
|
|
@@ -112,23 +91,12 @@ class Smile::Album < Smile::Base
|
|
112
91
|
# @param options [optional, String] :password password for the albums
|
113
92
|
# @param options [optional, String] :site_password password for the site
|
114
93
|
def find( options={} )
|
115
|
-
|
116
|
-
:method => 'smugmug.albums.getInfo'
|
117
|
-
)
|
94
|
+
json = web_method_call( { :method => 'smugmug.albums.getInfo' }, options )
|
118
95
|
|
119
|
-
|
120
|
-
params.merge!( options ) if( options )
|
121
|
-
|
122
|
-
json = RestClient.post( Smile::Base::BASE, params ).body
|
123
|
-
|
124
|
-
album_upper = JSON.parse(json)
|
125
|
-
|
126
|
-
album = upper_hash_to_lower_hash( album_upper['Album'] )
|
96
|
+
album = json['album']
|
127
97
|
album.merge!( :album_id => album["id"] )
|
128
98
|
|
129
|
-
|
130
|
-
a.session_id = session_id
|
131
|
-
a
|
99
|
+
Smile::Album.new( album )
|
132
100
|
end
|
133
101
|
|
134
102
|
# Update the album from the following params
|
@@ -196,18 +164,9 @@ class Smile::Album < Smile::Base
|
|
196
164
|
# Community
|
197
165
|
# @option options [optional, Fixnum] :community_id ( 0 ) join the group
|
198
166
|
def create( title, options )
|
199
|
-
|
200
|
-
:method => 'smugmug.albums.create',
|
201
|
-
:AlbumID => album_id
|
202
|
-
)
|
203
|
-
options = Smile::ParamConverter.clean_hash_keys( options )
|
204
|
-
params.merge!( options ) if( options )
|
167
|
+
json = web_method_call( { :method => 'smugmug.albums.create', :AlbumID => album_id })
|
205
168
|
|
206
|
-
|
207
|
-
json = JSON.parse( json )
|
208
|
-
raise json["message"] if json["stat"] == 'fail'
|
209
|
-
find( :album_id => json["Album"]["id"], :album_key => json["Album"]["key"] )
|
210
|
-
true
|
169
|
+
self.from_json( json )
|
211
170
|
end
|
212
171
|
end
|
213
172
|
|
@@ -276,16 +235,8 @@ class Smile::Album < Smile::Base
|
|
276
235
|
# Community
|
277
236
|
# @option options [optional, Fixnum] :community_id join the group
|
278
237
|
def update( options )
|
279
|
-
|
280
|
-
|
281
|
-
:AlbumID => album_id
|
282
|
-
)
|
283
|
-
options = Smile::ParamConverter.clean_hash_keys( options )
|
284
|
-
params.merge!( options ) if( options )
|
285
|
-
|
286
|
-
json = RestClient.post( BASE, params ).body
|
287
|
-
json = JSON.parse( json )
|
288
|
-
raise json["message"] if json["stat"] == 'fail'
|
238
|
+
json = web_method_call( { :method => 'smugmug.albums.changeSettings', :AlbumID => album_id } )
|
239
|
+
|
289
240
|
true
|
290
241
|
end
|
291
242
|
|
@@ -297,18 +248,16 @@ class Smile::Album < Smile::Base
|
|
297
248
|
# @option options [optional, string] :password password for the pics
|
298
249
|
# @option options [optional, string] :site_password access via site password
|
299
250
|
def photos( options=nil )
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
251
|
+
json = web_method_call(
|
252
|
+
{
|
253
|
+
:method => 'smugmug.images.get',
|
254
|
+
:AlbumID => self.album_id,
|
255
|
+
:AlbumKey => self.key,
|
256
|
+
:Heavy => 1
|
257
|
+
},
|
258
|
+
options
|
305
259
|
)
|
306
|
-
|
307
|
-
params.merge!( options ) if( options )
|
308
|
-
|
309
|
-
json = RestClient.post( BASE, params ).body
|
310
|
-
|
311
|
-
Smile::Photo.from_json( json, session_id )
|
260
|
+
Smile::Photo.from_json( json )
|
312
261
|
end
|
313
262
|
|
314
263
|
# Pull stats for an Album for a given Month and Year
|
@@ -318,23 +267,12 @@ class Smile::Album < Smile::Base
|
|
318
267
|
# @option options [optional, Fixnum] :year (Date.today.year) the year and stuff
|
319
268
|
# @option options [optional, 1 or 0] :heavy more details
|
320
269
|
def stats( options =nil )
|
321
|
-
|
322
|
-
:method => 'smugmug.albums.getStats',
|
323
|
-
|
324
|
-
:month => Date.today.month,
|
325
|
-
:year => Date.today.year
|
270
|
+
json = web_method_call(
|
271
|
+
{ :method => 'smugmug.albums.getStats', :AlbumID => album_id, :month => Date.today.month, :year => Date.today.year },
|
272
|
+
options
|
326
273
|
)
|
327
|
-
options = Smile::ParamConverter.clean_hash_keys( options )
|
328
|
-
|
329
|
-
params.merge!( options ) if( options )
|
330
|
-
|
331
|
-
json = RestClient.post( Smile::Base::BASE, params ).body
|
332
|
-
|
333
|
-
json = JSON.parse( json )
|
334
|
-
raise json["message"] if json["stat"] == 'fail'
|
335
274
|
|
336
|
-
|
337
|
-
OpenStruct.new( stat )
|
275
|
+
OpenStruct.new( json['album'] )
|
338
276
|
end
|
339
277
|
|
340
278
|
# Add an image or vid to the existing album
|
@@ -352,9 +290,9 @@ class Smile::Album < Smile::Base
|
|
352
290
|
json = RestClient.put( UPLOAD + "/#{image}", File.read( image ),
|
353
291
|
:content_length => File.size( image ),
|
354
292
|
:content_md5 => MD5.hexdigest( File.read( image ) ),
|
355
|
-
:x_smug_sessionid =>
|
293
|
+
:x_smug_sessionid => self.session.id,
|
356
294
|
:x_smug_version => VERSION,
|
357
|
-
:x_smug_responseType => "
|
295
|
+
:x_smug_responseType => "Smile::Json",
|
358
296
|
:x_smug_albumid => album_id,
|
359
297
|
:x_smug_filename => File.basename( image ),
|
360
298
|
:x_smug_caption => options[:caption],
|
@@ -363,35 +301,21 @@ class Smile::Album < Smile::Base
|
|
363
301
|
:x_smug_longitude => options[:longitude],
|
364
302
|
:x_smug_altitude => options[:altitude] ).body
|
365
303
|
|
366
|
-
image =
|
367
|
-
if( image && image["
|
368
|
-
Smile::Photo.find( :image_id => image["
|
304
|
+
image = Smile::Json.parse( json )
|
305
|
+
if( image && image["image"] && image["image"]["id"] )
|
306
|
+
Smile::Photo.find( :image_id => image["image"]["id"] )
|
369
307
|
else
|
370
|
-
raise Exception.new( "Failed to upload #{image}" )
|
308
|
+
raise Smile::Exception.new( "Failed to upload #{image}" )
|
371
309
|
end
|
372
310
|
else
|
373
|
-
raise Exception.new( "Cannot find file #{image}." )
|
311
|
+
raise Smile::Exception.new( "Cannot find file #{image}." )
|
374
312
|
end
|
375
313
|
end
|
376
314
|
|
377
315
|
# Want to get rid of that album? Call this guy and see what gets removed!
|
378
316
|
def delete!
|
379
|
-
|
380
|
-
|
381
|
-
:AlbumID => album_id
|
382
|
-
)
|
383
|
-
|
384
|
-
options = Smile::ParamConverter.clean_hash_keys( options )
|
385
|
-
|
386
|
-
params.merge!( options ) if( options )
|
387
|
-
|
388
|
-
json = RestClient.post( Smile::Base::BASE, params ).body
|
389
|
-
|
390
|
-
json = JSON.parse( json )
|
391
|
-
raise json["message"] if json["stat"] == 'fail'
|
392
|
-
|
393
|
-
album_id = nil
|
394
|
-
album_key = nil
|
317
|
+
json = web_method_call( { :method => 'smugmug.albums.delete', :AlbumID => album_id })
|
318
|
+
|
395
319
|
nil
|
396
320
|
end
|
397
321
|
|
@@ -400,22 +324,21 @@ class Smile::Album < Smile::Base
|
|
400
324
|
# @option options [String] :by valid values: FileName, Caption, DateTime
|
401
325
|
# @option options [String] :direction valid values: ASC, DESC
|
402
326
|
def resort!( options =nil )
|
403
|
-
|
404
|
-
|
405
|
-
:AlbumID => album_id
|
406
|
-
)
|
407
|
-
|
408
|
-
json = RestClient.post( Smile::Base::BASE, params ).body
|
409
|
-
|
410
|
-
json = JSON.parse( json )
|
411
|
-
raise json["message"] if json["stat"] == 'fail'
|
412
|
-
|
413
|
-
album_id = nil
|
414
|
-
album_key = nil
|
327
|
+
json = web_method_call( { :method => 'smugmug.albums.reSort', :AlbumID => album_id }, options)
|
328
|
+
|
415
329
|
nil
|
416
330
|
end
|
417
331
|
|
332
|
+
def reload!
|
333
|
+
replace_with = Smile::Album.find(self.album_id, self.album_key )
|
334
|
+
# self = replace_with
|
335
|
+
end
|
336
|
+
|
418
337
|
def category
|
419
338
|
['category']
|
420
339
|
end
|
340
|
+
|
341
|
+
def subcategory
|
342
|
+
['subcategory']
|
343
|
+
end
|
421
344
|
end
|
data/lib/smile/base.rb
CHANGED
@@ -7,54 +7,19 @@
|
|
7
7
|
#
|
8
8
|
module Smile
|
9
9
|
class Base < OpenStruct
|
10
|
-
|
11
|
-
BASE_SECURE = 'https://api.smugmug.com/hack/json/1.2.0/'
|
12
|
-
API = 'HSoqGCJ8ilF42BeThMGDZqqqOgj1eXqN'
|
13
|
-
UPLOAD = "http://upload.smugmug.com/"
|
10
|
+
include Smile::Common
|
14
11
|
|
15
|
-
VERSION = '1.2.0'
|
16
|
-
|
17
12
|
class << self
|
18
|
-
|
19
|
-
|
20
|
-
def
|
21
|
-
|
22
|
-
if( session_id )
|
23
|
-
base.merge!( :SessionID => session_id )
|
24
|
-
end
|
25
|
-
base
|
26
|
-
end
|
27
|
-
|
28
|
-
def set_session
|
29
|
-
if( session_id.nil? )
|
30
|
-
smug = Smug.new
|
31
|
-
smug.auth_anonymously
|
32
|
-
self.session_id = smug.session_id
|
33
|
-
end
|
13
|
+
include Smile::Common
|
14
|
+
|
15
|
+
def configure
|
16
|
+
yield( session )
|
34
17
|
end
|
35
|
-
|
36
|
-
def
|
37
|
-
|
38
|
-
lower ={}
|
39
|
-
upper.each_pair do |key, value|
|
40
|
-
lower[key.downcase] = upper_hash_to_lower_hash( value )
|
41
|
-
end
|
42
|
-
lower
|
43
|
-
else
|
44
|
-
upper
|
45
|
-
end
|
18
|
+
|
19
|
+
def clear_config!
|
20
|
+
session.clear_config!
|
46
21
|
end
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
attr_accessor :session_id
|
51
|
-
def default_params
|
52
|
-
self.class.session_id = self.session_id
|
53
|
-
self.class.default_params
|
54
22
|
end
|
55
23
|
|
56
|
-
def upper_hash_to_lower_hash( hash )
|
57
|
-
self.class.upper_hash_to_lower_hash( hash )
|
58
|
-
end
|
59
24
|
end
|
60
|
-
end
|
25
|
+
end
|
data/lib/smile/common.rb
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
module Smile
|
2
|
+
module Common
|
3
|
+
BASE = 'http://api.smugmug.com/hack/json/1.2.0/'
|
4
|
+
BASE_SECURE = 'https://api.smugmug.com/hack/json/1.2.0/'
|
5
|
+
UPLOAD = "http://upload.smugmug.com/"
|
6
|
+
|
7
|
+
VERSION = '1.2.0'
|
8
|
+
|
9
|
+
def session
|
10
|
+
@session ||= Session.instance
|
11
|
+
end
|
12
|
+
|
13
|
+
# This will be included in every request once you have logged in
|
14
|
+
def default_params
|
15
|
+
@params ||= { :APIKey => session.api_key }
|
16
|
+
@params.merge!( :SessionID => session.id ) if( session.id )
|
17
|
+
@params
|
18
|
+
end
|
19
|
+
|
20
|
+
# This is the base work that will need to be done on ALL
|
21
|
+
# web calls. Given a set of web options and other params
|
22
|
+
# call the web service and convert it to json
|
23
|
+
def web_method_call( web_options, options = {} )
|
24
|
+
params = default_params.merge( web_options )
|
25
|
+
options = Smile::ParamConverter.clean_hash_keys( options )
|
26
|
+
params.merge!( options ) if( options )
|
27
|
+
|
28
|
+
logger.info( params.inspect )
|
29
|
+
|
30
|
+
json = RestClient.post( BASE, params ).body
|
31
|
+
upper_hash_to_lower_hash(Smile::Json.parse( json ) )
|
32
|
+
end
|
33
|
+
|
34
|
+
# This converts a hash that has mixed case
|
35
|
+
# into all lower case
|
36
|
+
def upper_hash_to_lower_hash( upper )
|
37
|
+
if( Hash === upper )
|
38
|
+
lower ={}
|
39
|
+
upper.each_pair do |key, value|
|
40
|
+
lower[key.downcase] = upper_hash_to_lower_hash( value )
|
41
|
+
end
|
42
|
+
lower
|
43
|
+
else
|
44
|
+
upper
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def logger
|
49
|
+
session.logger
|
50
|
+
end
|
51
|
+
|
52
|
+
def logger_on?
|
53
|
+
session.logger_on?
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Smile
|
2
|
+
class Exception < StandardError
|
3
|
+
def initialize( message =nil )
|
4
|
+
Smile::Base.logger.error( message )
|
5
|
+
super( message )
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
exceptions = %w[ InvalidLogin ]
|
10
|
+
|
11
|
+
exceptions.each { |ex| const_set( ex, Class.new(Smile::Exception) ) }
|
12
|
+
end
|
data/lib/smile/json.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
module Smile
|
2
|
+
class Json
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def parse( text )
|
6
|
+
@result = JSON.parse(text) # This is the default JSON parse
|
7
|
+
raise_exception! if has_error?
|
8
|
+
@result
|
9
|
+
end
|
10
|
+
|
11
|
+
def has_error?
|
12
|
+
@result["stat"] == 'fail'
|
13
|
+
end
|
14
|
+
|
15
|
+
def error_message
|
16
|
+
@result["message"] if has_error?
|
17
|
+
end
|
18
|
+
|
19
|
+
def raise_exception!
|
20
|
+
raise Smile::Exception.new( error_message )
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -4,101 +4,27 @@ module Smile::ParamConverter
|
|
4
4
|
def convert( param, value=nil )
|
5
5
|
key = nil
|
6
6
|
key = case param.to_s.downcase.to_sym
|
7
|
-
when :popular_category
|
8
|
-
:
|
9
|
-
|
10
|
-
:
|
11
|
-
|
12
|
-
:geoKeyword
|
13
|
-
when :geo_search
|
14
|
-
:geoSearch
|
15
|
-
when :geo_community
|
16
|
-
:geoCommunity
|
17
|
-
when :open_search_keyword
|
18
|
-
:openSearchKeyword
|
19
|
-
when :user_keyword
|
20
|
-
:userkeyword
|
21
|
-
when :nickname_recent
|
22
|
-
:nicknameRecent
|
23
|
-
when :nickname_popular
|
24
|
-
:nicknamePopular
|
25
|
-
when :user_comments
|
26
|
-
:userComments
|
27
|
-
when :geo_user
|
28
|
-
:geoUser
|
29
|
-
when :geo_album
|
30
|
-
:geoAlbum
|
7
|
+
when :popular_category, :geo_all, :geo_keyword,
|
8
|
+
:geo_search, :geo_community, :open_search_keyword, :user_keyword,
|
9
|
+
:nickname_recent, :nickname_popular, :user_comments, :geo_user,
|
10
|
+
:geo_album
|
11
|
+
first_letter_downcase( param.to_s.classify ).to_sym
|
31
12
|
when :size
|
32
13
|
value = value.titlecase
|
33
14
|
:Size
|
34
|
-
when :image_count
|
35
|
-
:ImageCount
|
36
15
|
when :data, :type, :description, :keywords, :geography, :position, :header,
|
37
16
|
:clean, :filenames, :password, :public, :external, :protected, :watermarking,
|
38
17
|
:larges, :originals, :comments, :share, :printable, :backprinting
|
39
18
|
param.to_s.upcase.to_sym
|
40
|
-
when :image_id
|
41
|
-
:
|
42
|
-
|
43
|
-
:
|
44
|
-
|
45
|
-
:
|
46
|
-
|
47
|
-
:NickName
|
48
|
-
when :category_id
|
49
|
-
:CategoryID
|
50
|
-
when :sub_categroy_id
|
51
|
-
:SubCategoryID
|
52
|
-
when :album_template_id
|
53
|
-
:AlbumTemplateID
|
54
|
-
when :highlight_id
|
55
|
-
:HighlightID
|
19
|
+
when :image_id, :image_key, :image_count, :nick_name, :category_id,
|
20
|
+
:sub_category_id, :album_template_id, :highlight_id, :square_thumbs,
|
21
|
+
:template_id, :sort_method, :sort_direction, :password_hint, :word_searchable,
|
22
|
+
:smug_searchable, :watermark_id, :hide_owner, :x_larges, :x2_larges, :x3_larges,
|
23
|
+
:can_rank, :friend_edit, :family_edit, :color_correction, :default_color, :proof_days,
|
24
|
+
:unsharp_amount, :unsharp_radius, :unsharp_sigma, :community_id
|
25
|
+
param.to_s.classify.to_sym
|
56
26
|
when :exif
|
57
27
|
:EXIF
|
58
|
-
when :square_thumbs
|
59
|
-
:Square_Thumbs
|
60
|
-
when :tempate_id
|
61
|
-
:TemplateID
|
62
|
-
when :sort_method
|
63
|
-
:SortMethod
|
64
|
-
when :sort_direction
|
65
|
-
:SortDirection
|
66
|
-
when :password_hint
|
67
|
-
:PasswordHint
|
68
|
-
when :word_searchable
|
69
|
-
:WordSearchable
|
70
|
-
when :smug_searchable
|
71
|
-
:SmugSearchable
|
72
|
-
when :watermark_id
|
73
|
-
:WatermarkID
|
74
|
-
when :hide_owner
|
75
|
-
:HideOwner
|
76
|
-
when :x_larges, :xlarges
|
77
|
-
:XLarges
|
78
|
-
when :x2_larges, :x2larges
|
79
|
-
:X2Larges
|
80
|
-
when :x3_larges, :x3larges
|
81
|
-
:X3Larges
|
82
|
-
when :can_rank
|
83
|
-
:CanRank
|
84
|
-
when :friend_edit
|
85
|
-
:FriendEdit
|
86
|
-
when :family_edit
|
87
|
-
:FamilyEdit
|
88
|
-
when :color_correction
|
89
|
-
:ColorCorrection
|
90
|
-
when :default_color
|
91
|
-
:DefaultColor
|
92
|
-
when :proof_days
|
93
|
-
:ProofDays
|
94
|
-
when :unsharp_amount
|
95
|
-
:UnsharpAmount
|
96
|
-
when :unsharp_radius
|
97
|
-
:UnsharpRadius
|
98
|
-
when :unsharp_sigma
|
99
|
-
:UnsharpSigma
|
100
|
-
when :community_id
|
101
|
-
:CommunityID
|
102
28
|
else
|
103
29
|
key = param
|
104
30
|
end
|
@@ -113,5 +39,9 @@ module Smile::ParamConverter
|
|
113
39
|
end if( hash_to_clean )
|
114
40
|
cleaned_hash
|
115
41
|
end
|
116
|
-
|
42
|
+
|
43
|
+
def first_letter_downcase( stuff )
|
44
|
+
stuff.to_s.gsub( /^(\w)/, $1.downcase )
|
45
|
+
end
|
46
|
+
|
117
47
|
end
|
data/lib/smile/photo.rb
CHANGED
@@ -7,19 +7,15 @@ class Smile::Photo < Smile::Base
|
|
7
7
|
|
8
8
|
class << self
|
9
9
|
# Convert the given xml into photo objects to play with
|
10
|
-
def from_json( json
|
11
|
-
|
12
|
-
|
13
|
-
result["Images"].map do |image_upper|
|
10
|
+
def from_json( json )
|
11
|
+
json["images"].map do |image_upper|
|
14
12
|
image = upper_hash_to_lower_hash( image_upper )
|
15
13
|
image.merge!( :image_id => image["id"] )
|
16
14
|
image.merge!( :album_key => image["album"]["key"] )
|
17
15
|
image.merge!( :album_id => image["album"]["id"] )
|
18
16
|
image.delete( 'album' )
|
19
|
-
|
20
|
-
|
21
|
-
p.session_id = session_id
|
22
|
-
p
|
17
|
+
|
18
|
+
Smile::Photo.new( image )
|
23
19
|
end
|
24
20
|
end
|
25
21
|
|
@@ -31,26 +27,17 @@ class Smile::Photo < Smile::Base
|
|
31
27
|
# @option options [optional, String] :site_password password word for the site
|
32
28
|
# @option options [optional, String] :image_key image key maybe?
|
33
29
|
def find( options={} )
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
params = default_params.merge(
|
38
|
-
:method => 'smugmug.images.getInfo'
|
30
|
+
image = web_method_call(
|
31
|
+
{ :method => 'smugmug.images.getInfo' },
|
32
|
+
options
|
39
33
|
)
|
40
34
|
|
41
|
-
params.merge!( options ) if( options )
|
42
|
-
json = RestClient.post( Smile::Base::BASE, params ).body
|
43
|
-
image_upper = JSON.parse( json )
|
44
|
-
image = upper_hash_to_lower_hash( image_upper['Image'] )
|
45
|
-
|
46
35
|
image.merge!( :image_id => image["id"] )
|
47
36
|
image.merge!( :album_key => image["album"]["key"] )
|
48
37
|
image.merge!( :album_id => image["album"]["id"] )
|
49
38
|
image.delete( 'album' )
|
50
39
|
|
51
|
-
|
52
|
-
p.session_id = session_id
|
53
|
-
p
|
40
|
+
Smile::Photo.new( image )
|
54
41
|
end
|
55
42
|
end
|
56
43
|
|
@@ -97,19 +84,11 @@ class Smile::Photo < Smile::Base
|
|
97
84
|
# @option options [String] :password a password field
|
98
85
|
# @option options [String] :site_password site password field
|
99
86
|
def details( options =nil )
|
100
|
-
|
101
|
-
:method => "smugmug.images.getEXIF",
|
102
|
-
|
103
|
-
:ImageKey => self.key
|
87
|
+
image = web_method_call(
|
88
|
+
{ :method => "smugmug.images.getEXIF", :ImageID => self.image_id, :ImageKey => self.key },
|
89
|
+
options
|
104
90
|
)
|
105
91
|
|
106
|
-
params.merge!( options ) if( options )
|
107
|
-
json = RestClient.post( Smile::Base::BASE, params ).body
|
108
|
-
|
109
|
-
json = JSON.parse( json )
|
110
|
-
raise json["message"] if json["stat"] == 'fail'
|
111
|
-
|
112
|
-
image = upper_hash_to_lower_hash( json['Image'] )
|
113
92
|
image.merge!( :image_id => image["id"] )
|
114
93
|
|
115
94
|
OpenStruct.new( image )
|
@@ -156,19 +135,11 @@ class Smile::Photo < Smile::Base
|
|
156
135
|
# integer "id"
|
157
136
|
# String "Key"
|
158
137
|
def info( options =nil )
|
159
|
-
|
160
|
-
:method => "smugmug.images.getInfo",
|
161
|
-
|
162
|
-
:ImageKey => self.key
|
138
|
+
image = web_method_call(
|
139
|
+
{ :method => "smugmug.images.getInfo", :ImageID => self.image_id, :ImageKey => self.key },
|
140
|
+
options
|
163
141
|
)
|
164
|
-
|
165
|
-
params.merge!( options ) if( options )
|
166
|
-
json = RestClient.post( Smile::Base::BASE, params ).body
|
167
|
-
|
168
|
-
json = JSON.parse( json )
|
169
|
-
raise json["message"] if json["stat"] == 'fail'
|
170
142
|
|
171
|
-
image = upper_hash_to_lower_hash( json['Image'] )
|
172
143
|
image.merge!( :image_id => image["id"] )
|
173
144
|
|
174
145
|
OpenStruct.new( image )
|
@@ -207,25 +178,17 @@ class Smile::Photo < Smile::Base
|
|
207
178
|
# String "X3LargeURL" (if available)
|
208
179
|
# String "OriginalURL" (if available)
|
209
180
|
def urls( options =nil )
|
210
|
-
|
211
|
-
:method => "smugmug.images.getURLs",
|
212
|
-
|
213
|
-
:ImageKey => self.key
|
181
|
+
image = web_method_call(
|
182
|
+
{ :method => "smugmug.images.getURLs", :ImageID => self.image_id, :ImageKey => self.key },
|
183
|
+
options
|
214
184
|
)
|
215
|
-
|
216
|
-
params.merge!( options ) if( options )
|
217
|
-
json = RestClient.post( Smile::Base::BASE, params ).body
|
218
|
-
|
219
|
-
json = JSON.parse( json )
|
220
|
-
raise json["message"] if json["stat"] == 'fail'
|
221
185
|
|
222
|
-
image = upper_hash_to_lower_hash( json['Image'] )
|
223
186
|
image.merge!( :image_id => image["id"] )
|
224
187
|
|
225
188
|
OpenStruct.new( image )
|
226
189
|
end
|
227
190
|
|
228
191
|
def album
|
229
|
-
Smile::Album.find( :AlbumID => album_id, :AlbumKey => album_key )
|
192
|
+
Smile::Album.find( :AlbumID => self.album_id, :AlbumKey => self.album_key )
|
230
193
|
end
|
231
194
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Smile
|
2
|
+
class Session
|
3
|
+
include Singleton
|
4
|
+
API = 'HSoqGCJ8ilF42BeThMGDZqqqOgj1eXqN'
|
5
|
+
|
6
|
+
attr_accessor :id, :api_key, :logger_on
|
7
|
+
attr_reader :log
|
8
|
+
|
9
|
+
def has_id?
|
10
|
+
@id.nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
def api_key
|
14
|
+
@api_key || API
|
15
|
+
end
|
16
|
+
|
17
|
+
def logger
|
18
|
+
if( logger_on? )
|
19
|
+
@log ||= Logger.new( STDOUT )
|
20
|
+
RestClient.log ||= @log
|
21
|
+
@log
|
22
|
+
else
|
23
|
+
@blank ||= Logger.new nil
|
24
|
+
RestClient.log ||= @blank
|
25
|
+
@blank
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def logger_on?
|
30
|
+
@logger_on
|
31
|
+
end
|
32
|
+
|
33
|
+
def clear_config!
|
34
|
+
@api_key, @log, @logger_on = nil,nil,nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/smile/smug.rb
CHANGED
@@ -15,19 +15,12 @@ module Smile
|
|
15
15
|
#
|
16
16
|
# @return [Smile::SmugMug.new] An Smug object that has been authenticated
|
17
17
|
def auth( email, pass )
|
18
|
-
|
19
|
-
:method => 'smugmug.login.withPassword',
|
20
|
-
:EmailAddress => email,
|
21
|
-
:Password => pass
|
18
|
+
json = web_method_call(
|
19
|
+
{ :method => 'smugmug.login.withPassword', :EmailAddress => email, :Password => pass }
|
22
20
|
)
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
self.session_id = result["Login"]["Session"]["id"]
|
28
|
-
result
|
29
|
-
rescue NoMethodError => e
|
30
|
-
nil
|
22
|
+
self.session.id = json["login"]["session"]["id"]
|
23
|
+
json
|
31
24
|
end
|
32
25
|
|
33
26
|
# Login to SmugMug using an anonymously account
|
@@ -35,25 +28,15 @@ module Smile
|
|
35
28
|
#
|
36
29
|
# @return [Smile::SmugMug.new] An Smug object that has been authenticated
|
37
30
|
def auth_anonymously
|
38
|
-
|
39
|
-
:method => 'smugmug.login.anonymously'
|
40
|
-
)
|
31
|
+
json = web_method_call( { :method => 'smugmug.login.anonymously' } )
|
41
32
|
|
42
|
-
|
43
|
-
|
44
|
-
self.session_id = result["Login"]["Session"]["id"]
|
45
|
-
result
|
46
|
-
rescue NoMethodError => e
|
47
|
-
nil
|
33
|
+
self.session.id = json["login"]["session"]["id"]
|
34
|
+
json
|
48
35
|
end
|
49
36
|
|
50
37
|
# Close the session
|
51
38
|
def logout
|
52
|
-
|
53
|
-
:method => 'smugmug.logout'
|
54
|
-
)
|
55
|
-
|
56
|
-
RestClient.post( BASE, params ).body
|
39
|
+
web_method_call( { :method => 'smugmug.logout' } )
|
57
40
|
end
|
58
41
|
|
59
42
|
|
@@ -72,18 +55,12 @@ module Smile
|
|
72
55
|
#
|
73
56
|
# @see Smug::Album#new For more information about heavy ( true and false ) responces
|
74
57
|
def albums( options=nil )
|
75
|
-
|
76
|
-
:method => 'smugmug.albums.get',
|
77
|
-
|
58
|
+
json = web_method_call(
|
59
|
+
{ :method => 'smugmug.albums.get', :heavy => 1 },
|
60
|
+
options
|
78
61
|
)
|
79
62
|
|
80
|
-
|
81
|
-
params = params.merge( options ) if( options )
|
82
|
-
json = RestClient.post( BASE, params ).body
|
83
|
-
|
84
|
-
Smile::Album.from_json( json, session_id )
|
85
|
-
rescue
|
86
|
-
nil
|
63
|
+
Smile::Album.from_json( json )
|
87
64
|
end
|
88
65
|
end
|
89
66
|
end
|
data/lib/smile.rb
CHANGED
@@ -1,11 +1,15 @@
|
|
1
1
|
require 'active_support'
|
2
2
|
require 'restclient'
|
3
3
|
require 'ostruct'
|
4
|
-
require '
|
5
|
-
require '
|
6
|
-
require '
|
7
|
-
require '
|
8
|
-
require '
|
4
|
+
require File.dirname(__FILE__) + '/smile/session'
|
5
|
+
require File.dirname(__FILE__) + '/smile/common'
|
6
|
+
require File.dirname(__FILE__) + '/smile/base'
|
7
|
+
require File.dirname(__FILE__) + '/smile/smug'
|
8
|
+
require File.dirname(__FILE__) + '/smile/album'
|
9
|
+
require File.dirname(__FILE__) + '/smile/photo'
|
10
|
+
require File.dirname(__FILE__) + '/smile/param_converter'
|
11
|
+
require File.dirname(__FILE__) + '/smile/exception'
|
12
|
+
require File.dirname(__FILE__) + '/smile/json'
|
9
13
|
require 'cgi'
|
10
14
|
require 'rss'
|
11
15
|
require 'json'
|
data/smile.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{smile}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["cajun"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-05-13}
|
13
13
|
s.default_executable = %q{smile}
|
14
14
|
s.email = %q{zac@kleinpeter.org}
|
15
15
|
s.executables = ["smile"]
|
@@ -23,12 +23,15 @@ Gem::Specification.new do |s|
|
|
23
23
|
"README.rdoc",
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION.yml",
|
26
|
-
"config/metric_fu_config.rb",
|
27
26
|
"lib/smile.rb",
|
28
27
|
"lib/smile/album.rb",
|
29
28
|
"lib/smile/base.rb",
|
29
|
+
"lib/smile/common.rb",
|
30
|
+
"lib/smile/exception.rb",
|
31
|
+
"lib/smile/json.rb",
|
30
32
|
"lib/smile/param_converter.rb",
|
31
33
|
"lib/smile/photo.rb",
|
34
|
+
"lib/smile/session.rb",
|
32
35
|
"lib/smile/smug.rb",
|
33
36
|
"smile.gemspec",
|
34
37
|
"test/smile_test.rb",
|
data/test/smile_test.rb
CHANGED
@@ -1,63 +1,82 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/test_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
Shindo.tests 'checking all the cool things smile can do' do
|
4
|
+
extend RR::Adapters::RRMethods
|
5
|
+
|
6
|
+
before do
|
7
|
+
# this resets the config to the base state before every test
|
8
|
+
Smile::Base.clear_config!
|
9
|
+
Smile::Base.configure do |config|
|
10
|
+
# config.logger_on = true
|
11
|
+
end
|
12
|
+
|
5
13
|
@smug = Smile::Smug.new
|
6
14
|
@smug.auth_anonymously
|
7
15
|
end
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
+
|
17
|
+
tests 'security checks', ['security'] do
|
18
|
+
test( 'testing basic auth anonymously' ) { @smug.auth_anonymously }
|
19
|
+
|
20
|
+
test 'InvalidLogin will get raised on foo bar login' do
|
21
|
+
all_good = false
|
22
|
+
begin
|
23
|
+
Smile.auth( 'foo', 'and mo bar' )
|
24
|
+
rescue Smile::Exception => ex
|
25
|
+
all_good = true
|
26
|
+
end
|
27
|
+
|
28
|
+
all_good
|
16
29
|
end
|
17
30
|
end
|
18
|
-
|
19
|
-
|
20
|
-
|
31
|
+
|
32
|
+
tests 'album and photo checks' do
|
33
|
+
test( 'checking to see if we have some albums', ['album']) do
|
34
|
+
@smug.albums( :nick_name => 'kleinpeter' )
|
35
|
+
end
|
36
|
+
|
37
|
+
test( 'we can reload albums from the site', ['album'])
|
38
|
+
|
39
|
+
test 'checking to see if we have photos in the albums', ['album'] do
|
21
40
|
album = @smug.albums( :nick_name => 'kleinpeter' ).first
|
22
|
-
|
41
|
+
!album.photos.empty?
|
23
42
|
end
|
24
|
-
|
25
|
-
|
26
|
-
def test_photo_has_album
|
27
|
-
assert_nothing_raised(Exception) do
|
43
|
+
|
44
|
+
test 'a photo is connected to its album', ['photo'] do
|
28
45
|
album = @smug.albums( :nick_name => 'kleinpeter' ).first
|
29
46
|
photo = album.photos.first
|
30
|
-
|
31
|
-
|
47
|
+
album.album_id == photo.album.album_id &&
|
48
|
+
album.key == photo.album.key
|
32
49
|
end
|
33
50
|
end
|
34
51
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
52
|
+
tests 'confirm configuration settings', ['config'] do
|
53
|
+
test 'there is a default api key' do
|
54
|
+
Smile::Base.session.api_key
|
55
|
+
end
|
56
|
+
|
57
|
+
test 'we can set the api key in the config' do
|
58
|
+
Smile::Base.configure do |config|
|
59
|
+
config.api_key = 'foo'
|
60
|
+
end
|
61
|
+
|
62
|
+
Smile::Base.session.api_key
|
42
63
|
end
|
43
64
|
end
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
assert_not_nil( photo.details )
|
59
|
-
assert_not_nil( photo.info )
|
60
|
-
assert_not_nil( photo.urls )
|
65
|
+
|
66
|
+
tests 'there is a logger and it does stuff' do
|
67
|
+
test 'the logger is off by default', ['log'] do
|
68
|
+
Smile::Base.clear_config!
|
69
|
+
!Smile::Base.logger_on?
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
tests 'looking now at the exception classes', ['exceptions'] do
|
74
|
+
test 'exceptions should log errors' do
|
75
|
+
@@error_got_called = false
|
76
|
+
mock(Smile::Base.logger).error( 'foo' ) { @@error_got_called = true }
|
77
|
+
Smile::Exception.new( 'foo' )
|
78
|
+
@@error_got_called
|
61
79
|
end
|
62
80
|
end
|
63
81
|
end
|
82
|
+
|
data/test/test_helper.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
require '
|
3
|
-
require '
|
2
|
+
require 'shindo'
|
3
|
+
require 'rr'
|
4
|
+
|
4
5
|
|
5
6
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
7
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
7
8
|
require 'smile'
|
8
|
-
|
9
|
-
class Test::Unit::TestCase
|
10
|
-
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 4
|
8
|
+
- 0
|
9
|
+
version: 0.4.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- cajun
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-05-13 00:00:00 -05:00
|
18
18
|
default_executable: smile
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -56,12 +56,15 @@ files:
|
|
56
56
|
- README.rdoc
|
57
57
|
- Rakefile
|
58
58
|
- VERSION.yml
|
59
|
-
- config/metric_fu_config.rb
|
60
59
|
- lib/smile.rb
|
61
60
|
- lib/smile/album.rb
|
62
61
|
- lib/smile/base.rb
|
62
|
+
- lib/smile/common.rb
|
63
|
+
- lib/smile/exception.rb
|
64
|
+
- lib/smile/json.rb
|
63
65
|
- lib/smile/param_converter.rb
|
64
66
|
- lib/smile/photo.rb
|
67
|
+
- lib/smile/session.rb
|
65
68
|
- lib/smile/smug.rb
|
66
69
|
- smile.gemspec
|
67
70
|
- test/smile_test.rb
|
data/config/metric_fu_config.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
MetricFu::Configuration.run do |config|
|
2
|
-
#define which metrics you want to use
|
3
|
-
config.metrics = [:churn, :saikuro, :flog, :flay, :reek, :roodi, :rcov]
|
4
|
-
config.graphs = [:flog, :flay, :reek, :roodi, :rcov]
|
5
|
-
config.flay = { :dirs_to_flay => ['lib'],
|
6
|
-
:minimum_score => 100 }
|
7
|
-
config.flog = { :dirs_to_flog => ['lib'] }
|
8
|
-
config.reek = { :dirs_to_reek => ['lib'] }
|
9
|
-
config.roodi = { :dirs_to_roodi => ['lib'] }
|
10
|
-
config.saikuro = { :output_directory => 'scratch_directory/saikuro',
|
11
|
-
:input_directory => ['lib'],
|
12
|
-
:cyclo => "",
|
13
|
-
:filter_cyclo => "0",
|
14
|
-
:warn_cyclo => "5",
|
15
|
-
:error_cyclo => "7",
|
16
|
-
:formater => "text"} #this needs to be set to "text"
|
17
|
-
config.churn = { :start_date => "1 year ago", :minimum_churn_count => 10}
|
18
|
-
config.rcov = { :environment => 'test',
|
19
|
-
:test_files => ['test/*_test.rb'],
|
20
|
-
:rcov_opts => ["--sort coverage",
|
21
|
-
"--no-html",
|
22
|
-
"--text-coverage",
|
23
|
-
"--profile",
|
24
|
-
"--exclude /gems/,/Library/,spec"]}
|
25
|
-
config.graph_engine = :bluff
|
26
|
-
end
|
27
|
-
|
28
|
-
namespace :metrics do
|
29
|
-
TEST_PATHS_FOR_RCOV = ['test/*_test.rb']
|
30
|
-
end
|
31
|
-
|