smile 0.2.0 → 0.2.1

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.
data/.yardoc CHANGED
Binary file
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
+ :patch: 1
2
3
  :major: 0
3
4
  :minor: 2
4
- :patch: 0
data/lib/smile/album.rb CHANGED
@@ -1,6 +1,79 @@
1
- #
2
- # album.rb
3
- # smile
1
+ # Result
2
+ # STANDARD RESPONSE
3
+ #
4
+ # array Albums
5
+ # Album
6
+ # integer id
7
+ # string Key
8
+ # string Title
9
+ # struct Category
10
+ # string id
11
+ # string Name
12
+ # struct SubCategory
13
+ # string id
14
+ # string Name
15
+ #
16
+ # HEAVY RESPONSE
17
+ #
18
+ # array Albums
19
+ # Album
20
+ # integer id
21
+ # string Key
22
+ # string Title
23
+ # struct Category
24
+ # string id
25
+ # string Name
26
+ # struct SubCategory
27
+ # string id
28
+ # string Name
29
+ # string Description
30
+ # string Keywords
31
+ # boolean Geography (owner)
32
+ # integer Position
33
+ # struct Hightlight (owner)
34
+ # string id
35
+ # integer ImageCount
36
+ # string LastUpdated
37
+ # boolean Header (owner, power & pro only)
38
+ # boolean Clean (owner)
39
+ # boolean EXIF (owner)
40
+ # boolean Filenames (owner)
41
+ # struct Template (owner)
42
+ # string id
43
+ # string SortMethod (owner)
44
+ # boolean SortDirection (owner)
45
+ # string Password (owner)
46
+ # string PasswordHint (owner)
47
+ # boolean Public (owner)
48
+ # boolean WorldSearchable (owner)
49
+ # boolean SmugSearchable (owner)
50
+ # boolean External (owner)
51
+ # boolean Protected (owner, power & pro only)
52
+ # boolean Watermarking (owner, pro only)
53
+ # struct Watermark (owner, pro only)
54
+ # string id
55
+ # boolean HideOwner (owner)
56
+ # boolean Larges (owner, pro only)
57
+ # boolean XLarges (owner, pro only)
58
+ # boolean X2Larges (owner)
59
+ # boolean X3Larges (owner)
60
+ # boolean Originals (owner)
61
+ # boolean CanRank (owner)
62
+ # boolean FriendEdit (owner)
63
+ # boolean FamilyEdit (owner)
64
+ # boolean Comments (owner)
65
+ # boolean Share (owner)
66
+ # boolean Printable (owner)
67
+ # int ColorCorrection (owner)
68
+ # boolean DefaultColor (owner, pro only) deprecated
69
+ # integer ProofDays (owner, pro only)
70
+ # string Backprinting (owner, pro only)
71
+ # float UnsharpAmount (owner, power & pro only)
72
+ # float UnsharpRadius (owner, power & pro only)
73
+ # float UnsharpThreshold (owner, power & pro only)
74
+ # float UnsharpSigma (owner, power & pro only)
75
+ # struct Community (owner)
76
+ # string id
4
77
  #
5
78
  # Created by Zac Kleinpeter on 2009-04-28.
6
79
  # Copyright 2009 Cajun Country. All rights reserved.
@@ -8,9 +81,11 @@
8
81
  class Smile::Album < Smile::Base
9
82
 
10
83
  class << self
11
- def from_xml( xml, session_id )
12
- hash = Hash.from_xml( xml )["rsp"]
13
- hash["albums"]["album"].map do |album|
84
+ def from_json( json, session_id )
85
+ result = JSON.parse( json )
86
+ result["Albums"].map do |album_upcase|
87
+ album = upper_hash_to_lower_hash( album_upcase )
88
+
14
89
  album.merge!( :album_id => album["id"] )
15
90
 
16
91
  a = Smile::Album.new( album )
@@ -34,9 +109,10 @@ class Smile::Album < Smile::Base
34
109
 
35
110
  params.merge!( options ) if( options )
36
111
 
37
- xml = RestClient.post Smile::Base::BASE, params
112
+ json = RestClient.post Smile::Base::BASE, params
38
113
 
39
- album = Hash.from_xml( xml )["rsp"]["album"]
114
+ album_upper = JSON.parse(json)
115
+ album = upper_hash_to_lower_hash( album_upper['Album'] )
40
116
  album.merge!( :album_id => album["id"] )
41
117
 
42
118
  a = Smile::Album.new( album )
@@ -62,8 +138,8 @@ class Smile::Album < Smile::Base
62
138
 
63
139
  params.merge!( options ) if( options )
64
140
 
65
- xml = RestClient.post BASE, params
66
- Smile::Photo.from_xml( xml, session_id )
141
+ json = RestClient.post BASE, params
142
+ Smile::Photo.from_json( json, session_id )
67
143
  end
68
144
 
69
145
  # * integer AlbumID
@@ -80,10 +156,35 @@ class Smile::Album < Smile::Base
80
156
 
81
157
  params.merge!( options ) if( options )
82
158
 
83
- xml = RestClient.post BASE, params
84
- rsp = Hash.from_xml( xml )["rsp"]
85
- raise "invalid user" if rsp["stat"] == 'fail'
86
- hash = Hash.from_xml( xml )["rsp"]
159
+ json = RestClient.post Smile::Base::BASE, params
160
+
161
+ json = JSON.parse( json )
162
+ raise json["message"] if json["stat"] == 'fail'
163
+
164
+ image = upper_hash_to_lower_hash( json['Album'] )
87
165
  OpenStruct.new( hash )
88
166
  end
167
+
168
+ def add( payload, options={} )
169
+ if( File.exists?( payload ) )
170
+ RestClient.put BASE, payload,
171
+ :content_length => File.size( payload ),
172
+ :content_md5 => '?',
173
+ :x_smug_sessionid => session_id,
174
+ :x_smug_version => VERSION,
175
+ :x_smug_albumid => album_id,
176
+ :x_smug_filename => File.basename( payload ),
177
+ :x_smug_caption => options[:caption],
178
+ :x_smug_keywords => options[:keywords],
179
+ :x_smug_latitude => options[:latitude],
180
+ :x_smug_longitude => options[:longitude],
181
+ :x_smug_altitude => options[:altitude]
182
+ else
183
+ Exception.new( "Cannot find file #{payload}." )
184
+ end
185
+ end
186
+
187
+ def category
188
+ ['category']
189
+ end
89
190
  end
data/lib/smile/base.rb CHANGED
@@ -7,10 +7,12 @@
7
7
  #
8
8
  module Smile
9
9
  class Base < OpenStruct
10
- BASE = 'http://api.smugmug.com/hack/rest/1.2.0/'
11
- BASE_SECURE = 'https://api.smugmug.com/hack/rest/1.2.0/'
10
+ BASE = 'http://api.smugmug.com/hack/json/1.2.0/'
11
+ BASE_SECURE = 'https://api.smugmug.com/hack/json/1.2.0/'
12
12
  API = 'HSoqGCJ8ilF42BeThMGDZqqqOgj1eXqN'
13
13
 
14
+ VERSION = '1.2.0'
15
+
14
16
  class << self
15
17
  attr_accessor :session_id
16
18
  # This will be included in every request once you have logged in
@@ -29,6 +31,19 @@ module Smile
29
31
  self.session_id = smug.session_id
30
32
  end
31
33
  end
34
+
35
+ def upper_hash_to_lower_hash( upper )
36
+ if( Hash === upper )
37
+ lower ={}
38
+ upper.each_pair do |key, value|
39
+ lower[key.downcase] = upper_hash_to_lower_hash( value )
40
+ end
41
+ lower
42
+ else
43
+ upper
44
+ end
45
+ end
46
+
32
47
  end
33
48
 
34
49
  attr_accessor :session_id
@@ -36,5 +51,9 @@ module Smile
36
51
  self.class.session_id = self.session_id
37
52
  self.class.default_params
38
53
  end
54
+
55
+ def upper_hash_to_lower_hash( hash )
56
+ self.class.upper_hash_to_lower_hash( hash )
57
+ end
39
58
  end
40
59
  end
@@ -43,6 +43,8 @@ module Smile::ParamConverter
43
43
  key = :ImageKey
44
44
  when :image_count
45
45
  key = :ImageCount
46
+ when :nickname, :nick_name
47
+ key = :NickName
46
48
  else
47
49
  key = param
48
50
  end
data/lib/smile/photo.rb CHANGED
@@ -9,10 +9,11 @@ class Smile::Photo < Smile::Base
9
9
 
10
10
  class << self
11
11
  # Convert the given xml into photo objects to play with
12
- def from_xml( xml, session_id )
13
- hash = Hash.from_xml( xml )["rsp"]
12
+ def from_json( json, session_id )
13
+ result = JSON.parse( json )
14
14
 
15
- hash["images"]["image"].map do |image|
15
+ result["Images"].map do |image_upper|
16
+ image = upper_hash_to_lower_hash( image_upper )
16
17
  image.merge!( :image_id => image["id"] )
17
18
  image.merge!( :album_key => image["album"]["key"] )
18
19
  image.merge!( :album_id => image["album"]["id"] )
@@ -40,8 +41,9 @@ class Smile::Photo < Smile::Base
40
41
  )
41
42
 
42
43
  params.merge!( options ) if( options )
43
- xml = RestClient.post Smile::Base::BASE, params
44
- image = Hash.from_xml( xml )["rsp"]["image"]
44
+ json = RestClient.post Smile::Base::BASE, params
45
+ image_upper = JSON.parse( json )
46
+ image = upper_hash_to_lower_hash( image_upper['Image'] )
45
47
 
46
48
  image.merge!( :image_id => image["id"] )
47
49
  image.merge!( :album_key => image["album"]["key"] )
@@ -104,12 +106,12 @@ class Smile::Photo < Smile::Base
104
106
  )
105
107
 
106
108
  params.merge!( options ) if( options )
107
- xml = RestClient.post Smile::Base::BASE, params
109
+ json = RestClient.post Smile::Base::BASE, params
108
110
 
109
- rsp = Hash.from_xml( xml )["rsp"]
110
- raise rsp["message"] if rsp["stat"] == 'fail'
111
+ json = JSON.parse( json )
112
+ raise json["message"] if json["stat"] == 'fail'
111
113
 
112
- image = Hash.from_xml( xml )["rsp"]["image"]
114
+ image = upper_hash_to_lower_hash( json['Image'] )
113
115
  image.merge!( :image_id => image["id"] )
114
116
 
115
117
  OpenStruct.new( image )
@@ -163,12 +165,12 @@ class Smile::Photo < Smile::Base
163
165
  )
164
166
 
165
167
  params.merge!( options ) if( options )
166
- xml = RestClient.post Smile::Base::BASE, params
168
+ json = RestClient.post Smile::Base::BASE, params
167
169
 
168
- rsp = Hash.from_xml( xml )["rsp"]
169
- raise rsp["message"] if rsp["stat"] == 'fail'
170
+ json = JSON.parse( json )
171
+ raise json["message"] if json["stat"] == 'fail'
170
172
 
171
- image = Hash.from_xml( xml )["rsp"]["image"]
173
+ image = upper_hash_to_lower_hash( json['Image'] )
172
174
  image.merge!( :image_id => image["id"] )
173
175
 
174
176
  OpenStruct.new( image )
@@ -214,12 +216,12 @@ class Smile::Photo < Smile::Base
214
216
  )
215
217
 
216
218
  params.merge!( options ) if( options )
217
- xml = RestClient.post Smile::Base::BASE, params
219
+ json = RestClient.post Smile::Base::BASE, params
218
220
 
219
- rsp = Hash.from_xml( xml )["rsp"]
220
- raise rsp["message"] if rsp["stat"] == 'fail'
221
-
222
- image = Hash.from_xml( xml )["rsp"]["image"]
221
+ json = JSON.parse( json )
222
+ raise json["message"] if json["stat"] == 'fail'
223
+
224
+ image = upper_hash_to_lower_hash( json['Image'] )
223
225
  image.merge!( :image_id => image["id"] )
224
226
 
225
227
  OpenStruct.new( image )
data/lib/smile/smug.rb CHANGED
@@ -8,6 +8,12 @@
8
8
  module Smile
9
9
  class Smug < Smile::Base
10
10
 
11
+ # Login to SmugMug using a specific user account.
12
+ #
13
+ # @param [String] email The username ( Nickname ) for the SmugMug account
14
+ # @param [String] password The password for the SmugMug account
15
+ #
16
+ # @return [Smile::SmugMug.new] An Smug object that has been authenticated
11
17
  def auth( email, pass )
12
18
  params = default_params.merge(
13
19
  :method => 'smugmug.login.withPassword',
@@ -15,28 +21,33 @@ module Smile
15
21
  :Password => pass
16
22
  )
17
23
 
18
- xml = RestClient.post( BASE, params )
19
- result = Hash.from_xml( xml )["rsp"]["login"]
20
- self.session_id = result["session"]["id"]
24
+ json = RestClient.post( BASE, params )
25
+ result = JSON.parse( json )
26
+
27
+ self.session_id = result["Login"]["Session"]["id"]
21
28
  result
22
29
  rescue NoMethodError => e
23
30
  nil
24
31
  end
25
32
 
26
-
33
+ # Login to SmugMug using an anonymously account
34
+ # This will allow you to execute many functions, but no user specific functions
35
+ #
36
+ # @return [Smile::SmugMug.new] An Smug object that has been authenticated
27
37
  def auth_anonymously
28
38
  params = default_params.merge(
29
39
  :method => 'smugmug.login.anonymously'
30
40
  )
31
41
 
32
- xml = RestClient.post( BASE, params )
33
- result = Hash.from_xml( xml )["rsp"]["login"]
34
- self.session_id = result["session"]["id"]
42
+ json = RestClient.post( BASE, params )
43
+ result = JSON.parse( json )
44
+ self.session_id = result["Login"]["Session"]["id"]
35
45
  result
36
46
  rescue NoMethodError => e
37
47
  nil
38
48
  end
39
49
 
50
+ # Close the session
40
51
  def logout
41
52
  params = default_params.merge(
42
53
  :method => 'smugmug.logout'
@@ -50,87 +61,16 @@ module Smile
50
61
  # Retrieves a list of albums for a given user. If you are logged in it will return
51
62
  # your albums.
52
63
  #
53
- # Arguments
54
- # NickName - string (optional).
55
- # Heavy - boolean (optional).
56
- # SitePassword - string (optional).
64
+ # @param [optional,Hash] options The magic options hash all ruby devs love
65
+ # @option options [optional, String] :nick_name If no nick name is supplied then...
66
+ # @option options [optional, true or false ] :heavy ('true') This will control how much
67
+ # information is returned about the album
68
+ # @option options [optional, String] :site_password If you have not logged in then you can provide the
69
+ # password here to access private information.
57
70
  #
58
- # Result
59
- # STANDARD RESPONSE
71
+ # @return [Array<Smile::Album>]
60
72
  #
61
- # array Albums
62
- # Album
63
- # integer id
64
- # string Key
65
- # string Title
66
- # struct Category
67
- # string id
68
- # string Name
69
- # struct SubCategory
70
- # string id
71
- # string Name
72
- #
73
- # HEAVY RESPONSE
74
- #
75
- # array Albums
76
- # Album
77
- # integer id
78
- # string Key
79
- # string Title
80
- # struct Category
81
- # string id
82
- # string Name
83
- # struct SubCategory
84
- # string id
85
- # string Name
86
- # string Description
87
- # string Keywords
88
- # boolean Geography (owner)
89
- # integer Position
90
- # struct Hightlight (owner)
91
- # string id
92
- # integer ImageCount
93
- # string LastUpdated
94
- # boolean Header (owner, power & pro only)
95
- # boolean Clean (owner)
96
- # boolean EXIF (owner)
97
- # boolean Filenames (owner)
98
- # struct Template (owner)
99
- # string id
100
- # string SortMethod (owner)
101
- # boolean SortDirection (owner)
102
- # string Password (owner)
103
- # string PasswordHint (owner)
104
- # boolean Public (owner)
105
- # boolean WorldSearchable (owner)
106
- # boolean SmugSearchable (owner)
107
- # boolean External (owner)
108
- # boolean Protected (owner, power & pro only)
109
- # boolean Watermarking (owner, pro only)
110
- # struct Watermark (owner, pro only)
111
- # string id
112
- # boolean HideOwner (owner)
113
- # boolean Larges (owner, pro only)
114
- # boolean XLarges (owner, pro only)
115
- # boolean X2Larges (owner)
116
- # boolean X3Larges (owner)
117
- # boolean Originals (owner)
118
- # boolean CanRank (owner)
119
- # boolean FriendEdit (owner)
120
- # boolean FamilyEdit (owner)
121
- # boolean Comments (owner)
122
- # boolean Share (owner)
123
- # boolean Printable (owner)
124
- # int ColorCorrection (owner)
125
- # boolean DefaultColor (owner, pro only) deprecated
126
- # integer ProofDays (owner, pro only)
127
- # string Backprinting (owner, pro only)
128
- # float UnsharpAmount (owner, power & pro only)
129
- # float UnsharpRadius (owner, power & pro only)
130
- # float UnsharpThreshold (owner, power & pro only)
131
- # float UnsharpSigma (owner, power & pro only)
132
- # struct Community (owner)
133
- # string id
73
+ # @see Smug::Album#new For more information about heavy ( true and false ) responces
134
74
  def albums( options=nil )
135
75
  params = default_params.merge(
136
76
  :method => 'smugmug.albums.get',
@@ -138,9 +78,9 @@ module Smile
138
78
  )
139
79
 
140
80
  params = params.merge( options ) if( options )
141
- xml = RestClient.post BASE, params
81
+ json = RestClient.post BASE, params
142
82
 
143
- Smile::Album.from_xml( xml, session_id )
83
+ Smile::Album.from_json( json, session_id )
144
84
  rescue
145
85
  nil
146
86
  end
data/lib/smile.rb CHANGED
@@ -8,10 +8,15 @@ require 'lib/smile/photo'
8
8
  require 'lib/smile/param_converter'
9
9
  require 'cgi'
10
10
  require 'rss'
11
+ require 'json'
11
12
 
12
13
  module Smile
13
14
  module_function
14
15
 
16
+ # Login to SmugMug using an anonymously account
17
+ # This will allow you to execute many functions, but no user specific functions
18
+ #
19
+ # @return [Smile::SmugMug.new] An Smug object that has been authenticated
15
20
  def auth_anonymously
16
21
  smug = Smile::Smug.new
17
22
  smug.auth_anonymously
@@ -20,16 +25,17 @@ module Smile
20
25
 
21
26
  # Login to SmugMug using a specific user account.
22
27
  #
23
- # @param [String] username The username ( Nickname ) for the SmugMug account
28
+ # @param [String] email The username ( e-mail address ) for the SmugMug account
24
29
  # @param [String] password The password for the SmugMug account
25
30
  #
26
31
  # @return [Smile::SmugMug.new] An Smug object that has been authenticated
27
- def auth( username, password )
32
+ def auth( email, password )
28
33
  smug = Smile::Smug.new
29
- smug.auth( username, password )
34
+ smug.auth( email, password )
30
35
  smug
31
36
  end
32
37
 
38
+
33
39
  def base_feed( options={} )
34
40
  options.merge!( :format => 'rss' )
35
41
  url = "http://api.smugmug.com/hack/feed.mg?"
data/smile.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{smile}
5
- s.version = "0.2.0"
5
+ s.version = "0.2.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["cajun"]
9
- s.date = %q{2009-07-11}
9
+ s.date = %q{2009-08-21}
10
10
  s.email = %q{zac@kleinpeter.org}
11
11
  s.extra_rdoc_files = [
12
12
  "LICENSE",
@@ -32,7 +32,7 @@ Gem::Specification.new do |s|
32
32
  s.rdoc_options = ["--charset=UTF-8"]
33
33
  s.require_paths = ["lib"]
34
34
  s.rubyforge_project = %q{cajun-gems}
35
- s.rubygems_version = %q{1.3.4}
35
+ s.rubygems_version = %q{1.3.5}
36
36
  s.summary = %q{Simple API for talking to SmugMug}
37
37
  s.test_files = [
38
38
  "test/smile_test.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smile
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - cajun
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-11 00:00:00 -05:00
12
+ date: 2009-08-21 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -80,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
80
  requirements: []
81
81
 
82
82
  rubyforge_project: cajun-gems
83
- rubygems_version: 1.3.4
83
+ rubygems_version: 1.3.5
84
84
  signing_key:
85
85
  specification_version: 3
86
86
  summary: Simple API for talking to SmugMug