rscribd 1.1.0 → 1.2.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.
- data/.gitignore +1 -0
- data/History.txt +10 -0
- data/{README.txt → README} +21 -20
- data/Rakefile +19 -0
- data/VERSION +1 -1
- data/lib/rscribd.rb +12 -33
- data/lib/{scribdapi.rb → scribd/api.rb} +48 -35
- data/lib/scribd/category.rb +112 -0
- data/lib/scribd/collection.rb +96 -0
- data/lib/{scribddoc.rb → scribd/document.rb} +179 -101
- data/lib/{scribderrors.rb → scribd/errors.rb} +4 -5
- data/lib/{scribdresource.rb → scribd/resource.rb} +65 -42
- data/lib/scribd/security.rb +102 -0
- data/lib/scribd/user.rb +193 -0
- data/lib/support/extensions.rb +26 -0
- data/lib/{scribdmultiparthack.rb → support/multipart_hack.rb} +3 -1
- data/rscribd.gemspec +86 -0
- data/spec/category_spec.rb +177 -0
- data/spec/collection_spec.rb +127 -0
- data/spec/document_spec.rb +106 -42
- data/spec/security_spec.rb +118 -0
- data/spec/user_spec.rb +88 -0
- metadata +35 -12
- data/lib/scribduser.rb +0 -145
@@ -11,9 +11,9 @@ module Scribd
|
|
11
11
|
# Raised when trying to perform an action that isn't allowed for the current
|
12
12
|
# active user. Note that this exception is thrown only if the error originates
|
13
13
|
# locally. If the request must go out to the Scribd server before the
|
14
|
-
# privilege error occurs, a Scribd::ResponseError will be thrown. Unless a
|
14
|
+
# privilege error occurs, a {Scribd::ResponseError} will be thrown. Unless a
|
15
15
|
# method's documentation indicates otherwise, assume that the error will
|
16
|
-
# originate remotely and a Scribd::ResponseError will be thrown.
|
16
|
+
# originate remotely and a {Scribd::ResponseError} will be thrown.
|
17
17
|
|
18
18
|
class PrivilegeError < StandardError; end
|
19
19
|
|
@@ -22,11 +22,10 @@ module Scribd
|
|
22
22
|
# their descriptions for each API method.
|
23
23
|
|
24
24
|
class ResponseError < RuntimeError
|
25
|
-
# The error code.
|
25
|
+
# @return [Fixnum, String] The error code.
|
26
26
|
attr_reader :code
|
27
27
|
|
28
|
-
#
|
29
|
-
|
28
|
+
# @private
|
30
29
|
def initialize(code)
|
31
30
|
@code = code
|
32
31
|
end
|
@@ -1,36 +1,44 @@
|
|
1
1
|
module Scribd
|
2
2
|
|
3
3
|
# Describes a remote object that the Scribd API lets you interact with. All
|
4
|
-
# such objects are modeled after the
|
4
|
+
# such objects are modeled after the Active Record ORM approach.
|
5
5
|
#
|
6
|
-
# The Resource superclass is never directly used; you will interact with
|
7
|
-
# actual Scribd entities like Document and User, which inherit
|
8
|
-
# from this superclass.
|
6
|
+
# The @Resource@ superclass is never directly used; you will interact with
|
7
|
+
# actual Scribd entities like {Document} and {User}, which inherit
|
8
|
+
# functionality from this superclass.
|
9
9
|
#
|
10
10
|
# Objects have one or more attributes (also called fields) that can be
|
11
11
|
# accessed directly through synonymous methods. For instance, if your resource
|
12
|
-
# has an attribute
|
12
|
+
# has an attribute @title@, you can get and set the title like so:
|
13
13
|
#
|
14
|
-
#
|
15
|
-
#
|
14
|
+
# <pre><code>
|
15
|
+
# obj.title #=> "Title"
|
16
|
+
# obj.title = "New Title"
|
17
|
+
# </code></pre>
|
16
18
|
#
|
17
|
-
# The specific attributes that a Document or a User or any other resource
|
18
|
-
# are not
|
19
|
-
# loaded from the remote server. Thus, you can modify any attribute you
|
20
|
-
# though it may or may not have any effect:
|
19
|
+
# The specific attributes that a {Document} or a {User} or any other resource
|
20
|
+
# has are not saved locally. They are downloaded remotely whenever a resource
|
21
|
+
# is loaded from the remote server. Thus, you can modify any attribute you
|
22
|
+
# want, though it may or may not have any effect:
|
21
23
|
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
24
|
+
# <pre><code>
|
25
|
+
# doc = Scribd::Document.find(:text => 'foo').first
|
26
|
+
# doc.self_destruct_in = 5.seconds #=> Does not produce error
|
27
|
+
# doc.save #=> Has no effect, since that attribute doesn't exist. Your document does not explode.
|
28
|
+
# </code></pre>
|
25
29
|
#
|
26
30
|
# As shown above, when you make changes to an attribute, these changes are not
|
27
31
|
# immediately reflected remotely. They are only stored locally until such time
|
28
32
|
# as save is called. When you call save, the remote object is updated to
|
29
33
|
# reflect the changes you made in its API instance.
|
34
|
+
#
|
35
|
+
# @abstract
|
30
36
|
|
31
37
|
class Resource
|
32
38
|
|
33
39
|
# Initializes instance variables.
|
40
|
+
#
|
41
|
+
# @param [Hash] options Initial attributes for the new object.
|
34
42
|
|
35
43
|
def initialize(options={})
|
36
44
|
@saved = false
|
@@ -39,8 +47,11 @@ module Scribd
|
|
39
47
|
end
|
40
48
|
|
41
49
|
# Creates a new instance with the given attributes, saves it immediately,
|
42
|
-
# and returns it. You should call its created? method if you need to
|
43
|
-
# that the object was saved successfully.
|
50
|
+
# and returns it. You should call its {#created?} method if you need to
|
51
|
+
# verify that the object was saved successfully.
|
52
|
+
#
|
53
|
+
# @param [Hash] options Initial attributes for the new object.
|
54
|
+
# @return [Scribd::Resource] The new object.
|
44
55
|
|
45
56
|
def self.create(options={})
|
46
57
|
obj = new(options)
|
@@ -48,49 +59,56 @@ module Scribd
|
|
48
59
|
obj
|
49
60
|
end
|
50
61
|
|
51
|
-
#
|
52
|
-
|
62
|
+
# @abstract This method is implemented by subclasses.
|
63
|
+
|
53
64
|
def save
|
54
65
|
raise NotImplementedError, "Cannot save #{self.class.to_s} objects"
|
55
66
|
end
|
56
67
|
|
57
|
-
#
|
58
|
-
|
68
|
+
# @abstract This method is implemented by subclasses.
|
69
|
+
|
59
70
|
def self.find(options)
|
60
71
|
raise NotImplementedError, "Cannot find #{self.class.to_s} objects"
|
61
72
|
end
|
62
73
|
|
63
|
-
#
|
74
|
+
# @abstract This method is implemented by subclasses.
|
64
75
|
|
65
76
|
def destroy
|
66
77
|
raise NotImplementedError, "Cannot destroy #{self.class.to_s} objects"
|
67
78
|
end
|
68
79
|
|
69
|
-
#
|
70
|
-
# thus their local values reflect the remote values.
|
80
|
+
# @return [true, false] Whether this resource's attributes have been updated
|
81
|
+
# remotely, and thus their local values reflect the remote values.
|
71
82
|
|
72
83
|
def saved?
|
73
84
|
@saved
|
74
85
|
end
|
75
86
|
|
76
|
-
#
|
77
|
-
# to
|
87
|
+
# @return [true, false] Whether this resource has been created remotely, and
|
88
|
+
# corresponds to something on the Scribd website.
|
78
89
|
|
79
90
|
def created?
|
80
91
|
@created
|
81
92
|
end
|
82
93
|
|
83
|
-
# Returns the value of an attribute
|
84
|
-
#
|
94
|
+
# Returns the value of an attribute.
|
95
|
+
#
|
96
|
+
# @param [#to_sym] attribute The attribute to read.
|
97
|
+
# @return [String] The value of the attribute.
|
98
|
+
# @return [nil] If the attribute could not be read.
|
99
|
+
# @raise [ArgumentError] If an invalid value for @attribute@ is given.
|
85
100
|
|
86
101
|
def read_attribute(attribute)
|
87
102
|
raise ArgumentError, "Attribute must respond to to_sym" unless attribute.respond_to? :to_sym
|
88
103
|
@attributes[attribute.to_sym]
|
89
104
|
end
|
90
105
|
|
91
|
-
# Returns a map of attributes to their values, given an array of attributes
|
92
|
-
#
|
93
|
-
#
|
106
|
+
# Returns a map of attributes to their values, given an array of attributes.
|
107
|
+
# Attributes that cannot be read are ignored.
|
108
|
+
#
|
109
|
+
# @param [Enumerable<String, Symbol>] attributes The attributes to read.
|
110
|
+
# @return [Hash<Symbol -> String] The attribute values.
|
111
|
+
# @raise [ArgumentError] If an invalid value for @attributes@ is provided.
|
94
112
|
|
95
113
|
def read_attributes(attributes)
|
96
114
|
raise ArgumentError, "Attributes must be listed in an Enumeration" unless attributes.kind_of?(Enumerable)
|
@@ -101,8 +119,12 @@ module Scribd
|
|
101
119
|
end
|
102
120
|
|
103
121
|
# Assigns values to attributes. Takes a hash that specifies the
|
104
|
-
# attribute-value pairs to update. Does not perform a save. Non-
|
122
|
+
# attribute-value pairs to update. Does not perform a save. Non-writable
|
105
123
|
# attributes are ignored.
|
124
|
+
#
|
125
|
+
# @param [Hash<#to_sym -> #to_s>] values The values to update and their new
|
126
|
+
# values.
|
127
|
+
# @raise [ArgumentError] If an invalid value for @values@ is provided.
|
106
128
|
|
107
129
|
def write_attributes(values)
|
108
130
|
raise ArgumentError, "Values must be specified through a hash of attributes" unless values.kind_of? Hash
|
@@ -114,15 +136,17 @@ module Scribd
|
|
114
136
|
# retrieved for changed through a method call, even if it doesn't exist.
|
115
137
|
# Such attributes will be ignored and purged when the document is saved:
|
116
138
|
#
|
117
|
-
#
|
118
|
-
#
|
119
|
-
#
|
120
|
-
#
|
121
|
-
#
|
122
|
-
#
|
139
|
+
# <pre><code>
|
140
|
+
# doc = Scribd::Document.new
|
141
|
+
# doc.foobar #=> Returns nil
|
142
|
+
# doc.foobar = 12
|
143
|
+
# doc.foobar #=> Returns 12
|
144
|
+
# doc.save
|
145
|
+
# doc.foobar #=> Returns nil
|
146
|
+
# </code></pre>
|
123
147
|
#
|
124
|
-
# Because of this, no Scribd resource will ever raise NoMethodError
|
125
|
-
|
148
|
+
# Because of this, no Scribd resource will ever raise @NoMethodError@.
|
149
|
+
|
126
150
|
def method_missing(meth, *args)
|
127
151
|
if meth.to_s =~ /(\w+)=/ then
|
128
152
|
raise ArgumentError, "Only one parameter can be passed to attribute=" unless args.size == 1
|
@@ -132,9 +156,8 @@ module Scribd
|
|
132
156
|
end
|
133
157
|
end
|
134
158
|
|
135
|
-
#
|
136
|
-
|
137
|
-
def inspect #:nodoc:
|
159
|
+
# @private
|
160
|
+
def inspect
|
138
161
|
"#<#{self.class.to_s} #{@attributes.select { |k, v| not v.nil? }.collect { |k,v| k.to_s + '=' + v.to_s }.join(', ')}>"
|
139
162
|
end
|
140
163
|
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Scribd
|
2
|
+
|
3
|
+
# Contains methods for working with iPaper Secure. For more information about
|
4
|
+
# iPaper Secure, see the online API documentation.
|
5
|
+
|
6
|
+
module Security
|
7
|
+
|
8
|
+
# Grants a user access to a {Document}. The user is referenced by his
|
9
|
+
# identifier (as used in the iPaper Secure embed code). If no document is
|
10
|
+
# provided, globally grants this user access to all documents.
|
11
|
+
#
|
12
|
+
# @param [String] user_identifier The user identifier as used in your embed
|
13
|
+
# code. (See the online iPaper Secure documentation.)
|
14
|
+
# @param [Scribd::Document, #to_i, nil] document If @nil@, globally grants
|
15
|
+
# this user access to all documents. Otherwise, grants this user access
|
16
|
+
# to one document specified by ID or {Document} instance.
|
17
|
+
# @raise [ArgumentError] If an invalid value for @document@ is provided.
|
18
|
+
# @see Scribd::Document#grant_access
|
19
|
+
|
20
|
+
def self.grant_access(user_identifier, document=nil)
|
21
|
+
set_access user_identifier, true, document
|
22
|
+
end
|
23
|
+
|
24
|
+
# Revokes from a user access to a {Document}. The user is referenced by his
|
25
|
+
# identifier (as used in the iPaper Secure embed code). If no document is
|
26
|
+
# provided, globally revokes access to all documents from this user.
|
27
|
+
#
|
28
|
+
# @param [String] user_identifier The user identifier as used in your embed
|
29
|
+
# code. (See the online iPaper Secure documentation.)
|
30
|
+
# @param [Scribd::Document, #to_i, nil] document If @nil@, globally revokes
|
31
|
+
# access to all documents from this user. Otherwise, revokes access to one
|
32
|
+
# document specified by ID or {Document} instance.
|
33
|
+
# @raise [ArgumentError] If an invalid value for @document@ is provided.
|
34
|
+
# @see Scribd::Document#revoke_access
|
35
|
+
|
36
|
+
def self.revoke_access(user_identifier, document=nil)
|
37
|
+
set_access user_identifier, false, document
|
38
|
+
end
|
39
|
+
|
40
|
+
# Sets whether a user has access to a {Document}. The user is referenced by
|
41
|
+
# his identifier (as used in the iPaper Secure embed code). If no document
|
42
|
+
# is provided, globally sets access to all documents for this user.
|
43
|
+
#
|
44
|
+
# @param [String] user_identifier The user identifier as used in your embed
|
45
|
+
# code. (See the online iPaper Secure documentation.)
|
46
|
+
# @param [true, false] access_allowed If @true@, grants access; if @false@,
|
47
|
+
# revokes access.
|
48
|
+
# @param [Scribd::Document, #to_i, nil] document If @nil@, globally sets
|
49
|
+
# access to all documents for this user. Otherwise, sets access to one
|
50
|
+
# document specified by ID or {Document} instance.
|
51
|
+
# @raise [ArgumentError] If an invalid value for @document@ is provided.
|
52
|
+
|
53
|
+
def self.set_access(user_identifier, access_allowed, document=nil)
|
54
|
+
allow_value = (access_allowed ? 1 : 0)
|
55
|
+
|
56
|
+
if document.nil? then
|
57
|
+
API.instance.send_request('security.setAccess', :user_identifier => user_identifier, :allowed => allow_value)
|
58
|
+
return
|
59
|
+
end
|
60
|
+
|
61
|
+
API.instance.send_request('security.setAccess', :user_identifier => user_identifier, :allowed => allow_value, :doc_id => (
|
62
|
+
if document.kind_of?(Scribd::Document) then
|
63
|
+
document.id
|
64
|
+
elsif document.respond_to?(:to_i) then
|
65
|
+
document.to_i
|
66
|
+
else
|
67
|
+
raise ArgumentError, "document must be a Scribd::Document, a document ID, or nil"
|
68
|
+
end
|
69
|
+
))
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns a list of user identifiers that are allowed to access a given
|
73
|
+
# document. See the iPaper Secure online documentation for more information.
|
74
|
+
#
|
75
|
+
# @param [Scribd::Document, Fixnum] document Either a document instance or
|
76
|
+
# document ID.
|
77
|
+
# @return [Array<String>] An array of user identifiers.
|
78
|
+
# @see Scribd::Document#access_list
|
79
|
+
|
80
|
+
def self.document_access_list(document)
|
81
|
+
response = API.instance.send_request('security.getDocumentAccessList', :doc_id => (document.kind_of?(Scribd::Document) ? document.id : document))
|
82
|
+
acl = Array.new
|
83
|
+
response.get_elements('/rsp/resultset/result/user_identifier').each { |tag| acl << tag.text }
|
84
|
+
return acl
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns a list of documents that a user can view. The user is identified
|
88
|
+
# by his user identifier. See the iPaper Secure online documentation for
|
89
|
+
# more information.
|
90
|
+
#
|
91
|
+
# @param [String] user_identifier The user identifier.
|
92
|
+
# @return [Array<Scribd::Document>] An array of documents the user can
|
93
|
+
# access.
|
94
|
+
|
95
|
+
def self.user_access_list(user_identifier)
|
96
|
+
response = API.instance.send_request('security.getUserAccessList', :user_identifier => user_identifier)
|
97
|
+
acl = Array.new
|
98
|
+
response.get_elements('/rsp/resultset/result').each { |tag| acl << Scribd::Document.new(:xml => tag) }
|
99
|
+
return acl
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/lib/scribd/user.rb
ADDED
@@ -0,0 +1,193 @@
|
|
1
|
+
module Scribd
|
2
|
+
|
3
|
+
# A user of the Scribd website. API programs can use this class to log in as a
|
4
|
+
# Scribd user, create new user accounts, and get information about the current
|
5
|
+
# user.
|
6
|
+
#
|
7
|
+
# An API program begins by logging into Scribd:
|
8
|
+
#
|
9
|
+
# <pre><code>user = Scribd::User.login 'login', 'pass'</code></pre>
|
10
|
+
#
|
11
|
+
# You can now access information about this user through direct method calls:
|
12
|
+
#
|
13
|
+
# <pre><code>user.name #=> 'Real Name'</code></pre>
|
14
|
+
#
|
15
|
+
# If, at any time, you would like to retrieve the {User} instance for the
|
16
|
+
# currently logged-in user, simply call:
|
17
|
+
#
|
18
|
+
# <pre><code>user = Scribd::API.instance.user</code></pre>
|
19
|
+
#
|
20
|
+
# For information on a user's attributes, please consult the online API
|
21
|
+
# documentation.
|
22
|
+
#
|
23
|
+
# You can create a new account with the {.signup} (a.k.a. {.create}) method:
|
24
|
+
#
|
25
|
+
# <pre><code>user = Scribd::User.signup :username => 'testuser', :password => 'testpassword', :email => your@email.com</code></pre>
|
26
|
+
|
27
|
+
class User < Resource
|
28
|
+
|
29
|
+
# Creates a new, unsaved user with the given attributes. You can eventually
|
30
|
+
# use this record to create a new Scribd account.
|
31
|
+
#
|
32
|
+
# @param [Hash] options The initial attributes for the user.
|
33
|
+
|
34
|
+
def initialize(options={})
|
35
|
+
super
|
36
|
+
if options[:xml] then
|
37
|
+
load_attributes(options[:xml])
|
38
|
+
@saved = true
|
39
|
+
@created = true
|
40
|
+
else
|
41
|
+
@attributes = options
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# For new, unsaved records, creates a new Scribd user with the provided
|
46
|
+
# attributes, then logs in as that user. Currently modification of existing
|
47
|
+
# Scribd users is not supported.
|
48
|
+
#
|
49
|
+
# @raise [Scribd::ResponseError] If a remote error occurs.
|
50
|
+
|
51
|
+
def save
|
52
|
+
if not created? then
|
53
|
+
response = API.instance.send_request('user.signup', @attributes)
|
54
|
+
xml = response.get_elements('/rsp')[0]
|
55
|
+
load_attributes(xml)
|
56
|
+
API.instance.user = self
|
57
|
+
else
|
58
|
+
raise NotImplementedError, "Cannot update a user once that user's been saved"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns a list of documents owned by this user. By default, the size of
|
63
|
+
# the returned list is capped at 1,000. Use the @:limit@ and @:offset@
|
64
|
+
# parameters to page through this user's documents; however, @:limit@ cannot
|
65
|
+
# be greater than 1,000. This list is _not_ backed by the server, so if you
|
66
|
+
# add or remove items from it, it will not make those changes server-side.
|
67
|
+
# This also has some tricky consequences when modifying a list of documents
|
68
|
+
# while iterating over it:
|
69
|
+
#
|
70
|
+
# <pre><code>
|
71
|
+
# docs = user.documents
|
72
|
+
# docs.each(&:destroy)
|
73
|
+
# docs #=> Still populated, because it hasn't been updated
|
74
|
+
# docs = user.documents #=> Now it's empty
|
75
|
+
# </code></pre>
|
76
|
+
#
|
77
|
+
# {Scribd::Document} instances returned through this method have more
|
78
|
+
# attributes than those returned by the {Scribd::Document.find} method. The
|
79
|
+
# additional attributes are documented online.
|
80
|
+
#
|
81
|
+
# @param [Hash] options Options to provide to the API find method.
|
82
|
+
# @return [Array<Scribd::Document>] The found documents.
|
83
|
+
# @see #find_documents
|
84
|
+
|
85
|
+
def documents(options = {})
|
86
|
+
response = API.instance.send_request('docs.getList', options.merge(:session_key => @attributes[:session_key]))
|
87
|
+
documents = Array.new
|
88
|
+
response.elements['/rsp/resultset'].elements.each do |doc|
|
89
|
+
documents << Document.new(:xml => doc, :owner => self)
|
90
|
+
end
|
91
|
+
return documents
|
92
|
+
end
|
93
|
+
|
94
|
+
# Finds documents owned by this user matching a given query. The parameters
|
95
|
+
# provided to this method are identical to those provided to {.find}.
|
96
|
+
#
|
97
|
+
# @param [Hash] options Options to pass to the API find method.
|
98
|
+
# @see #documents
|
99
|
+
|
100
|
+
def find_documents(options={})
|
101
|
+
return nil unless @attributes[:session_key]
|
102
|
+
Document.find options.merge(:scope => 'user', :session_key => @attributes[:session_key])
|
103
|
+
end
|
104
|
+
|
105
|
+
# Loads a {Document} by ID. You can only load such documents if they belong
|
106
|
+
# to this user.
|
107
|
+
#
|
108
|
+
# @param [Fixnum] document_id The Scribd document ID.
|
109
|
+
# @return [Scribd::Document] The found document.
|
110
|
+
# @return [nil] If nothing was found.
|
111
|
+
|
112
|
+
def find_document(document_id)
|
113
|
+
return nil unless @attributes[:session_key]
|
114
|
+
response = API.instance.send_request('docs.getSettings', { :doc_id => document_id, :session_key => @attributes[:session_key] })
|
115
|
+
Document.new :xml => response.elements['/rsp'], :owner => self
|
116
|
+
end
|
117
|
+
|
118
|
+
# Uploads a document to a user's document list. See the
|
119
|
+
# {Scribd::Document#save} method for more information on the options hash.
|
120
|
+
#
|
121
|
+
# @param [Hash] options Options to pass to the API upload method.
|
122
|
+
# @raise [Scribd::NotReadyError] If the user is unsaved.
|
123
|
+
|
124
|
+
def upload(options)
|
125
|
+
raise NotReadyError, "User hasn't been created yet" unless created?
|
126
|
+
Document.create options.merge(:owner => self)
|
127
|
+
end
|
128
|
+
|
129
|
+
# Returns the collections this user has created. For information about
|
130
|
+
# search options, see the online API documentation. The list of collections
|
131
|
+
# is not memoized or cached locally.
|
132
|
+
#
|
133
|
+
# @param [Hash] options Options to pass to the API collections search
|
134
|
+
# method.
|
135
|
+
# @return [Array<Scribd::Collection>] The collections created by this user.
|
136
|
+
# @raise [Scribd::NotReadyError] If the user is unsaved
|
137
|
+
|
138
|
+
def collections(options={})
|
139
|
+
raise NotReadyError, "User hasn't been created yet" unless created?
|
140
|
+
response = API.instance.send_request('docs.getCollections', options.merge(:session_key => @attributes[:session_key]))
|
141
|
+
collections = Array.new
|
142
|
+
response.elements['/rsp/resultset'].elements.each do |coll|
|
143
|
+
collections << Collection.new(:xml => coll, :owner => self)
|
144
|
+
end
|
145
|
+
return collections
|
146
|
+
end
|
147
|
+
|
148
|
+
# Returns a URL that, when visited, will automatically sign in this user and
|
149
|
+
# then redirect to the provided URL.
|
150
|
+
#
|
151
|
+
# @param [String] next_url The URL to redirect to after signing in. By
|
152
|
+
# default the user is redirected to the home page.
|
153
|
+
# @return [String] An auto-sign-in URL.
|
154
|
+
# @raise [Scribd::NotReadyError] If the receiver is not an existing user.
|
155
|
+
|
156
|
+
def auto_sign_in_url(next_url="")
|
157
|
+
raise NotReadyError, "User hasn't been created yet" unless created?
|
158
|
+
response = API.instance.send_request('user.getAutoSignInUrl', :session_key => @attributes[:session_key], :next_url => next_url)
|
159
|
+
return response.get_elements('/rsp/url').first.cdatas.first.to_s
|
160
|
+
end
|
161
|
+
|
162
|
+
class << self
|
163
|
+
alias_method :signup, :create
|
164
|
+
end
|
165
|
+
|
166
|
+
# Logs into Scribd using the given username and password. This user will be
|
167
|
+
# used for all subsequent Scribd API calls. You must log in before you can
|
168
|
+
# use protected API functions.
|
169
|
+
#
|
170
|
+
# @param [String] username The Scribd user's login.
|
171
|
+
# @param [String] password The Scribd user's password.
|
172
|
+
# @return [Scribd::User] The logged-in user.
|
173
|
+
|
174
|
+
def self.login(username, password)
|
175
|
+
response = API.instance.send_request('user.login', { :username => username, :password => password })
|
176
|
+
xml = response.get_elements('/rsp').first
|
177
|
+
user = User.new(:xml => xml)
|
178
|
+
API.instance.user = user
|
179
|
+
return user
|
180
|
+
end
|
181
|
+
|
182
|
+
# @return [String] The @user_id@ attribute.
|
183
|
+
|
184
|
+
def id
|
185
|
+
self.user_id
|
186
|
+
end
|
187
|
+
|
188
|
+
# @private
|
189
|
+
def to_s
|
190
|
+
@attributes[:username]
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|