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
@@ -0,0 +1,26 @@
|
|
1
|
+
# @private
|
2
|
+
class Symbol
|
3
|
+
def to_proc
|
4
|
+
Proc.new { |*args| args.shift.__send__(self, *args) }
|
5
|
+
end unless method_defined?(:to_proc)
|
6
|
+
end
|
7
|
+
|
8
|
+
# @private
|
9
|
+
class Hash
|
10
|
+
# Taken from Rails, with appreciation to DHH
|
11
|
+
def stringify_keys
|
12
|
+
inject({}) do |options, (key, value)|
|
13
|
+
options[key.to_s] = value
|
14
|
+
options
|
15
|
+
end
|
16
|
+
end unless method_defined?(:stringify_keys)
|
17
|
+
end
|
18
|
+
|
19
|
+
# @private
|
20
|
+
class Array
|
21
|
+
def to_hsh
|
22
|
+
h = Hash.new
|
23
|
+
each { |k, v| h[k] = v }
|
24
|
+
h
|
25
|
+
end
|
26
|
+
end
|
@@ -6,7 +6,9 @@ require 'rubygems'
|
|
6
6
|
require 'mime/types' # Requires gem install mime-types
|
7
7
|
require 'cgi'
|
8
8
|
|
9
|
-
|
9
|
+
# @private
|
10
|
+
module Net
|
11
|
+
# @private
|
10
12
|
class HTTP::Post
|
11
13
|
def multipart_params=(param_hash={})
|
12
14
|
boundary_token = [Array.new(8) {rand(256)}].join
|
data/rscribd.gemspec
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{rscribd}
|
8
|
+
s.version = "1.2.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Tim Morgan", "Jared Friedman", "Mike Watts"]
|
12
|
+
s.date = %q{2010-05-13}
|
13
|
+
s.description = %q{The official Ruby gem for the Scribd API. Scribd is a document-sharing website allowing people to upload and view documents online.}
|
14
|
+
s.email = %q{api@scribd.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
".gitignore",
|
20
|
+
"History.txt",
|
21
|
+
"README",
|
22
|
+
"Rakefile",
|
23
|
+
"VERSION",
|
24
|
+
"lib/rscribd.rb",
|
25
|
+
"lib/scribd/api.rb",
|
26
|
+
"lib/scribd/category.rb",
|
27
|
+
"lib/scribd/collection.rb",
|
28
|
+
"lib/scribd/document.rb",
|
29
|
+
"lib/scribd/errors.rb",
|
30
|
+
"lib/scribd/resource.rb",
|
31
|
+
"lib/scribd/security.rb",
|
32
|
+
"lib/scribd/user.rb",
|
33
|
+
"lib/support/extensions.rb",
|
34
|
+
"lib/support/multipart_hack.rb",
|
35
|
+
"rscribd.gemspec",
|
36
|
+
"sample/01_upload.rb",
|
37
|
+
"sample/02_user.rb",
|
38
|
+
"sample/test.txt",
|
39
|
+
"spec/api_spec.rb",
|
40
|
+
"spec/category_spec.rb",
|
41
|
+
"spec/collection_spec.rb",
|
42
|
+
"spec/document_spec.rb",
|
43
|
+
"spec/error_spec.rb",
|
44
|
+
"spec/resource_spec.rb",
|
45
|
+
"spec/rscribd_spec.rb",
|
46
|
+
"spec/security_spec.rb",
|
47
|
+
"spec/user_spec.rb"
|
48
|
+
]
|
49
|
+
s.homepage = %q{http://www.scribd.com/developers}
|
50
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
51
|
+
s.require_paths = ["lib"]
|
52
|
+
s.rubyforge_project = %q{rscribd}
|
53
|
+
s.rubygems_version = %q{1.3.6}
|
54
|
+
s.summary = %q{Ruby client library for the Scribd API}
|
55
|
+
s.test_files = [
|
56
|
+
"spec/api_spec.rb",
|
57
|
+
"spec/category_spec.rb",
|
58
|
+
"spec/collection_spec.rb",
|
59
|
+
"spec/document_spec.rb",
|
60
|
+
"spec/error_spec.rb",
|
61
|
+
"spec/resource_spec.rb",
|
62
|
+
"spec/rscribd_spec.rb",
|
63
|
+
"spec/security_spec.rb",
|
64
|
+
"spec/user_spec.rb"
|
65
|
+
]
|
66
|
+
|
67
|
+
if s.respond_to? :specification_version then
|
68
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
69
|
+
s.specification_version = 3
|
70
|
+
|
71
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
72
|
+
s.add_runtime_dependency(%q<mime-types>, [">= 0"])
|
73
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
74
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
75
|
+
else
|
76
|
+
s.add_dependency(%q<mime-types>, [">= 0"])
|
77
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
78
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
79
|
+
end
|
80
|
+
else
|
81
|
+
s.add_dependency(%q<mime-types>, [">= 0"])
|
82
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
83
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
@@ -0,0 +1,177 @@
|
|
1
|
+
CATEGORY = Proc.new { |id, name, children|
|
2
|
+
id ||= rand(1000)
|
3
|
+
name ||= "Test Category #{id}"
|
4
|
+
children ||= nil
|
5
|
+
|
6
|
+
str = <<-EOF
|
7
|
+
<id>#{id}</id>
|
8
|
+
<name><![CDATA[#{name}]]></name>
|
9
|
+
EOF
|
10
|
+
str + (children ? "<subcategories>#{children}</subcategories>" : "")
|
11
|
+
}
|
12
|
+
|
13
|
+
CATEGORY_TAG = Proc.new { |root, category|
|
14
|
+
root ||= 'result'
|
15
|
+
category ||= CATEGORY.call
|
16
|
+
|
17
|
+
<<-EOF
|
18
|
+
<#{root}>
|
19
|
+
#{category}
|
20
|
+
</#{root}>
|
21
|
+
EOF
|
22
|
+
}
|
23
|
+
|
24
|
+
RESULT = Proc.new { |categories|
|
25
|
+
categories ||= (0..10).map { CATEGORY_TAG.call(nil, nil, ((0..10).map { CATEGORY_TAG.call('subcategory') }.join("\n"))) }.join("\n")
|
26
|
+
<<-EOF
|
27
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
28
|
+
<rsp stat="ok">
|
29
|
+
<result_set>
|
30
|
+
#{categories}
|
31
|
+
</result_set>
|
32
|
+
</rsp>
|
33
|
+
EOF
|
34
|
+
}
|
35
|
+
|
36
|
+
describe Scribd::Category do
|
37
|
+
subject { Scribd::Category.new(:xml => REXML::Document.new(CATEGORY_TAG.call(nil, CATEGORY.call('12', 'test'))).root) }
|
38
|
+
|
39
|
+
describe "#initialize" do
|
40
|
+
it "should raise an error if initialized without XML" do
|
41
|
+
lambda { Scribd::Category.new :name => 'foo' }.should raise_error
|
42
|
+
end
|
43
|
+
|
44
|
+
context "attributes" do
|
45
|
+
its(:id) { should eql('12') }
|
46
|
+
its(:name) { should eql('test') }
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should populate children that link back to their parents" do
|
50
|
+
response = CATEGORY_TAG.call(nil, CATEGORY.call(nil, nil, CATEGORY_TAG.call('subcategory', CATEGORY.call('100'))))
|
51
|
+
|
52
|
+
category = Scribd::Category.new(:xml => REXML::Document.new(response).root)
|
53
|
+
Scribd::API.instance.should_not_receive(:send_request) # not really being tested here, but we should make sure we don't actually make remote requests
|
54
|
+
category.children.should be_kind_of(Array)
|
55
|
+
category.children.first.should be_kind_of(Scribd::Category)
|
56
|
+
category.children.first.id.should eql('100')
|
57
|
+
category.children.first.name.should eql('Test Category 100')
|
58
|
+
category.children.first.children_preloaded?.should be_false
|
59
|
+
category.children.first.parent.should eql(category)
|
60
|
+
end
|
61
|
+
|
62
|
+
it { should be_saved }
|
63
|
+
it { should be_created }
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#children_preloaded?" do
|
67
|
+
it "should be true for categories initialized with children" do
|
68
|
+
response = CATEGORY_TAG.call(nil, CATEGORY.call(nil, nil, CATEGORY_TAG.call('subcategory')))
|
69
|
+
Scribd::Category.new(:xml => REXML::Document.new(response).root).children_preloaded?.should be_true
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should be false for categories initialized without children" do
|
73
|
+
Scribd::Category.new(:xml => REXML::Document.new(CATEGORY_TAG.call).root).children_preloaded?.should be_false
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe :all do
|
78
|
+
before :each do
|
79
|
+
@response = REXML::Document.new(RESULT.call).root
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should send an API request to docs.getCategories" do
|
83
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.getCategories').and_return(@response)
|
84
|
+
Scribd::Category.all
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should set with_subcategories if include_children is true" do
|
88
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.getCategories', :with_subcategories => true).and_return(@response)
|
89
|
+
Scribd::Category.all(true)
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should return an array of categories" do
|
93
|
+
Scribd::API.instance.stub!(:send_request).and_return(@response)
|
94
|
+
categories = Scribd::Category.all
|
95
|
+
categories.should be_kind_of(Array)
|
96
|
+
categories.first.should be_kind_of(Scribd::Category)
|
97
|
+
categories.last.should be_kind_of(Scribd::Category)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe "#children" do
|
102
|
+
before :each do
|
103
|
+
xml = REXML::Document.new(CATEGORY_TAG.call(nil, CATEGORY.call(nil, nil, CATEGORY_TAG.call('subcategory')))).root
|
104
|
+
@preloaded = Scribd::Category.new(:xml => xml)
|
105
|
+
|
106
|
+
xml = REXML::Document.new(CATEGORY_TAG.call(nil, CATEGORY.call('3'))).root
|
107
|
+
@not_preloaded = Scribd::Category.new(:xml => xml)
|
108
|
+
|
109
|
+
@response = REXML::Document.new(RESULT.call(CATEGORY_TAG.call)).root
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should not make a network call if the category has preloaded children" do
|
113
|
+
Scribd::API.instance.should_not_receive(:send_request)
|
114
|
+
@preloaded.children
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should otherwise make an API call to docs.getCategories" do
|
118
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.getCategories', :category_id => '3').and_return(@response)
|
119
|
+
@not_preloaded.children
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should return an array of child categories" do
|
123
|
+
Scribd::API.instance.stub!(:send_request).and_return(@response)
|
124
|
+
cats = @not_preloaded.children
|
125
|
+
cats.should be_kind_of(Array)
|
126
|
+
cats.first.should be_kind_of(Scribd::Category)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "#browse" do
|
131
|
+
before :each do
|
132
|
+
@response = REXML::Document.new(<<-EOF
|
133
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
134
|
+
<rsp stat="ok">
|
135
|
+
<result_set totalResultsAvailable="922" totalResultsReturned="2" firstResultPosition="1" list="true">
|
136
|
+
<result>
|
137
|
+
<title><![CDATA[Ruby on Java]]></title>
|
138
|
+
<description><![CDATA[Ruby On Java, Barcamp, Washington DC]]></description>
|
139
|
+
<access_key>key-t3q5qujoj525yun8gf7</access_key>
|
140
|
+
<doc_id>244565</doc_id>
|
141
|
+
<page_count>10</page_count>
|
142
|
+
<download_formats></download_formats>
|
143
|
+
</result>
|
144
|
+
<result>
|
145
|
+
<title><![CDATA[Ruby on Java Part II]]></title>
|
146
|
+
<description><![CDATA[Ruby On Java Part II, Barcamp, Washington DC]]></description>
|
147
|
+
<access_key>key-2b3udhalycthsm91d1ps</access_key>
|
148
|
+
<doc_id>244567</doc_id>
|
149
|
+
<page_count>12</page_count>
|
150
|
+
<download_formats>pdf,txt</download_formats>
|
151
|
+
</result>
|
152
|
+
</result_set>
|
153
|
+
</rsp>
|
154
|
+
EOF
|
155
|
+
).root
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should make an API call to docs.browse" do
|
159
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.browse', :category_id => '12').and_return(@response)
|
160
|
+
subject.browse
|
161
|
+
end
|
162
|
+
|
163
|
+
it "should pass options to the API call" do
|
164
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.browse', :category_id => '12', :foo => 'bar').and_return(@response)
|
165
|
+
subject.browse(:foo => 'bar')
|
166
|
+
end
|
167
|
+
|
168
|
+
it "should return an array of Documents" do
|
169
|
+
Scribd::API.instance.stub!(:send_request).and_return(@response)
|
170
|
+
docs = subject.browse
|
171
|
+
docs.should be_kind_of(Array)
|
172
|
+
docs.each do |doc|
|
173
|
+
doc.should be_kind_of(Scribd::Document)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
describe Scribd::Collection do
|
2
|
+
before :each do
|
3
|
+
Scribd::API.instance.key = 'test key'
|
4
|
+
Scribd::API.instance.secret = 'test sec'
|
5
|
+
end
|
6
|
+
|
7
|
+
subject do
|
8
|
+
user = Scribd::User.new(:xml => REXML::Document.new("<rsp stat='ok'><user_id type='integer'>225</user_id><username>sancho</username><name>Sancho Sample</name><session_key>some key</session_key></rsp>").root)
|
9
|
+
Scribd::Collection.new(:xml => REXML::Document.new("<result><collection_id>61</collection_id><collection_name>My Collection</collection_name></result>").root, :owner => user)
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#initialize" do
|
13
|
+
context "from XML" do
|
14
|
+
its(:collection_id) { should eql("61") }
|
15
|
+
its(:collection_name) { should eql("My Collection") }
|
16
|
+
it { should be_saved }
|
17
|
+
it { should be_created }
|
18
|
+
|
19
|
+
it "should set the owner" do
|
20
|
+
user = Scribd::User.new
|
21
|
+
coll = Scribd::Collection.new(:xml => REXML::Document.new("<result><collection_id>61</collection_id><collection_name>My Collection</collection_name></result>").root, :owner => user)
|
22
|
+
coll.owner.should eql(user)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "from attributes" do
|
27
|
+
it "should raise an exception" do
|
28
|
+
lambda { Scribd::Collection.new(:collection_id => 61, :collection_name => "My Collection") }.should raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "aliased attributes" do
|
34
|
+
its(:id) { should eql('61') }
|
35
|
+
its(:name) { should eql('My Collection') }
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#add" do
|
39
|
+
before :each do
|
40
|
+
@good_response = <<-EOF
|
41
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
42
|
+
<rsp stat="ok">
|
43
|
+
</rsp>
|
44
|
+
EOF
|
45
|
+
@document = Scribd::Document.new(:doc_id => '123')
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should raise ArgumentError if an invalid document is given" do
|
49
|
+
lambda { subject.add(123) }.should raise_error(ArgumentError)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should make an API call to docs.addToCollection" do
|
53
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.addToCollection', hash_including(:doc_id => '123', :collection_id => '61', :session_key => 'some key')).and_return(REXML::Document.new(@good_response).root)
|
54
|
+
subject.add(@document)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should capture ResponseErrors of code 653 if ignore_if_exists is true" do
|
58
|
+
Scribd::API.instance.stub!(:send_request).and_raise(Scribd::ResponseError.new('653'))
|
59
|
+
lambda { subject.add(@document) }.should_not raise_error
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should not capture ResponseErrors of code 653 if ignore_if_exists is false" do
|
63
|
+
Scribd::API.instance.stub!(:send_request).and_raise(Scribd::ResponseError.new('653'))
|
64
|
+
lambda { subject.add(@document, false) }.should raise_error(Scribd::ResponseError)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should not capture ResponseErrors of other codes" do
|
68
|
+
Scribd::API.instance.stub!(:send_request).and_raise(Scribd::ResponseError.new('652'))
|
69
|
+
lambda { subject.add(@document, false) }.should raise_error(Scribd::ResponseError)
|
70
|
+
lambda { subject.add(@document) }.should raise_error(Scribd::ResponseError)
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should return the document" do
|
74
|
+
Scribd::API.instance.stub!(:send_request).and_return(REXML::Document.new(@good_response).root)
|
75
|
+
subject.add(@document).should eql(@document)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#<<" do
|
80
|
+
it "should call #add" do
|
81
|
+
doc_mock = mock('Scribd::Document')
|
82
|
+
subject.should_receive(:add).once.with(doc_mock).and_return(doc_mock)
|
83
|
+
(subject << doc_mock).should eql(doc_mock)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "#remove" do
|
88
|
+
before :each do
|
89
|
+
@good_response = <<-EOF
|
90
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
91
|
+
<rsp stat="ok">
|
92
|
+
</rsp>
|
93
|
+
EOF
|
94
|
+
@document = Scribd::Document.new(:doc_id => '123')
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should raise ArgumentError if an invalid document is given" do
|
98
|
+
lambda { subject.remove(123) }.should raise_error(ArgumentError)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should make an API call to docs.removeFromCollection" do
|
102
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.removeFromCollection', hash_including(:doc_id => '123', :collection_id => '61', :session_key => 'some key')).and_return(REXML::Document.new(@good_response).root)
|
103
|
+
subject.remove(@document)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should capture ResponseErrors of code 652 if ignore_if_missing is true" do
|
107
|
+
Scribd::API.instance.stub!(:send_request).and_raise(Scribd::ResponseError.new('652'))
|
108
|
+
lambda { subject.remove(@document) }.should_not raise_error
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should not capture ResponseErrors of code 653 if ignore_if_missing is false" do
|
112
|
+
Scribd::API.instance.stub!(:send_request).and_raise(Scribd::ResponseError.new('652'))
|
113
|
+
lambda { subject.remove(@document, false) }.should raise_error(Scribd::ResponseError)
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should not capture ResponseErrors of other codes" do
|
117
|
+
Scribd::API.instance.stub!(:send_request).and_raise(Scribd::ResponseError.new('653'))
|
118
|
+
lambda { subject.remove(@document, false) }.should raise_error(Scribd::ResponseError)
|
119
|
+
lambda { subject.remove(@document) }.should raise_error(Scribd::ResponseError)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should return the document" do
|
123
|
+
Scribd::API.instance.stub!(:send_request).and_return(REXML::Document.new(@good_response).root)
|
124
|
+
subject.remove(@document).should eql(@document)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/spec/document_spec.rb
CHANGED
@@ -263,6 +263,13 @@ describe Scribd::Document do
|
|
263
263
|
@document.save
|
264
264
|
end
|
265
265
|
|
266
|
+
it "should not pass the thumbnail option to the docs.upload call" do
|
267
|
+
@document.thumbnail = 'sample/test.txt'
|
268
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.upload', hash_not_including(:thumbnail))
|
269
|
+
Scribd::API.instance.should_receive(:send_request).any_number_of_times
|
270
|
+
@document.save
|
271
|
+
end
|
272
|
+
|
266
273
|
describe "successfully" do
|
267
274
|
before :each do
|
268
275
|
@document.stub!(:id).and_return(3)
|
@@ -293,6 +300,49 @@ describe Scribd::Document do
|
|
293
300
|
it "should return true" do
|
294
301
|
@document.save.should be_true
|
295
302
|
end
|
303
|
+
|
304
|
+
describe "with a path thumbnail" do
|
305
|
+
before :each do
|
306
|
+
@document.thumbnail = "sample/image.jpg"
|
307
|
+
end
|
308
|
+
|
309
|
+
it "should call docs.uploadThumb with a File object from the path" do
|
310
|
+
file_mock = mock('File (thumb)', :close => nil)
|
311
|
+
File.should_receive(:open).with(@document.thumbnail, 'rb').and_return(file_mock)
|
312
|
+
File.should_receive(:open).any_number_of_times.and_return(mock('File (content)', :close => nil))
|
313
|
+
|
314
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.uploadThumb', :file => file_mock, :doc_id => 3)
|
315
|
+
Scribd::API.instance.should_receive(:send_request).any_number_of_times
|
316
|
+
|
317
|
+
@document.save
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
describe "with a File thumbnail" do
|
322
|
+
before :each do
|
323
|
+
@document.thumbnail = File.open("sample/test.txt")
|
324
|
+
end
|
325
|
+
|
326
|
+
it "should call docs.uploadThumb with the File object" do
|
327
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.uploadThumb', :file => @document.thumbnail, :doc_id => 3)
|
328
|
+
Scribd::API.instance.should_receive(:send_request).any_number_of_times
|
329
|
+
@document.save
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
describe "with a URL thumbnail" do
|
334
|
+
before :each do
|
335
|
+
@document.thumbnail = "http://www.scribd.com/favicon.ico"
|
336
|
+
end
|
337
|
+
|
338
|
+
it "should open a stream for the URL and pass it to docs.uploadThumb" do
|
339
|
+
stream_mock = mock('open-uri stream', :close => nil)
|
340
|
+
@document.should_receive(:open).once.with(an_instance_of(URI::HTTP)).and_return(stream_mock)
|
341
|
+
Scribd::API.instance.should_receive(:send_request).once.with('docs.uploadThumb', :file => stream_mock, :doc_id => 3)
|
342
|
+
Scribd::API.instance.should_receive(:send_request).any_number_of_times
|
343
|
+
@document.save
|
344
|
+
end
|
345
|
+
end
|
296
346
|
end
|
297
347
|
|
298
348
|
it "should not send the file, type, or access parameters to the changeSettings call" do
|
@@ -310,6 +360,13 @@ describe Scribd::Document do
|
|
310
360
|
@document.save
|
311
361
|
end
|
312
362
|
|
363
|
+
it "should not pass thumbnail to the changeSettings call" do
|
364
|
+
@document.thumbnail = 'sample/test.txt'
|
365
|
+
Scribd::API.instance.should_receive(:send_request).with('docs.changeSettings', hash_not_including(:thumbnail))
|
366
|
+
Scribd::API.instance.should_receive(:send_request).any_number_of_times
|
367
|
+
@document.save
|
368
|
+
end
|
369
|
+
|
313
370
|
it "should pass the owner's session key to changeSettings" do
|
314
371
|
owner = mock('Scribd::User owner')
|
315
372
|
owner.stub!(:session_key).and_return('his key')
|
@@ -379,8 +436,8 @@ describe Scribd::Document do
|
|
379
436
|
lambda { Scribd::Document.find('oh hai') }.should raise_error(ArgumentError)
|
380
437
|
end
|
381
438
|
|
382
|
-
it "should raise an ArgumentError if a query is not provided for
|
383
|
-
lambda { Scribd::Document.find(:
|
439
|
+
it "should raise an ArgumentError if a query is not provided for non-ID lookups" do
|
440
|
+
lambda { Scribd::Document.find(:title => 'hi') }.should raise_error(ArgumentError)
|
384
441
|
end
|
385
442
|
|
386
443
|
describe "by ID" do
|
@@ -393,11 +450,6 @@ describe Scribd::Document do
|
|
393
450
|
Scribd::Document.find 123
|
394
451
|
end
|
395
452
|
|
396
|
-
it "should pass other options to the getSettings call" do
|
397
|
-
Scribd::API.instance.should_receive(:send_request).once.with('docs.getSettings', hash_including(:arg => 'val')).and_return(@xml)
|
398
|
-
Scribd::Document.find 123, :arg => 'val'
|
399
|
-
end
|
400
|
-
|
401
453
|
it "should return a Document created from the resulting XML" do
|
402
454
|
Scribd::API.instance.stub!(:send_request).and_return(@xml)
|
403
455
|
doc = Scribd::Document.find(123)
|
@@ -411,34 +463,22 @@ describe Scribd::Document do
|
|
411
463
|
@xml = REXML::Document.new("<rsp stat='ok'><result_set><result><access_key>abc123</access_key></result><result><access_key>abc321</access_key></result></result_set></rsp>")
|
412
464
|
end
|
413
465
|
|
414
|
-
it "should set the scope field according to the parameter" do
|
415
|
-
Scribd::API.instance.should_receive(:send_request).with('docs.search', hash_including(:scope => 'all')).and_return(@xml)
|
416
|
-
Scribd::Document.find(:all, :query => 'test')
|
417
|
-
end
|
418
|
-
|
419
466
|
it "should return an ordered array of Document results" do
|
420
467
|
Scribd::API.instance.stub!(:send_request).and_return(@xml)
|
421
|
-
docs = Scribd::Document.find(:
|
468
|
+
docs = Scribd::Document.find(:query => 'test')
|
422
469
|
docs.should have(2).items
|
423
470
|
docs.first.access_key.should eql('abc123')
|
424
471
|
docs.last.access_key.should eql('abc321')
|
425
472
|
end
|
426
473
|
|
427
|
-
it "should set the scope to 'all' and return the first result if :first is provided" do
|
428
|
-
Scribd::API.instance.should_receive(:send_request).with('docs.search', hash_including(:scope => 'all')).and_return(@xml)
|
429
|
-
docs = Scribd::Document.find(:first, :query => 'test')
|
430
|
-
docs.should be_kind_of(Scribd::Document)
|
431
|
-
docs.access_key.should eql('abc123')
|
432
|
-
end
|
433
|
-
|
434
474
|
it "should set the num_results field to the limit option" do
|
435
475
|
Scribd::API.instance.should_receive(:send_request).with('docs.search', hash_including(:num_results => 10)).and_return(@xml)
|
436
|
-
docs = Scribd::Document.find(:
|
476
|
+
docs = Scribd::Document.find(:query => 'test', :limit => 10)
|
437
477
|
end
|
438
478
|
|
439
479
|
it "should set the num_start field to the offset option" do
|
440
480
|
Scribd::API.instance.should_receive(:send_request).with('docs.search', hash_including(:num_start => 10)).and_return(@xml)
|
441
|
-
docs = Scribd::Document.find(:
|
481
|
+
docs = Scribd::Document.find(:query => 'test', :offset => 10)
|
442
482
|
end
|
443
483
|
end
|
444
484
|
end
|
@@ -448,16 +488,17 @@ describe Scribd::Document do
|
|
448
488
|
@xml = REXML::Document.new("<rsp stat='ok'><result_set><result><access_key>abc123</access_key></result><result><access_key>abc321</access_key></result></result_set></rsp>")
|
449
489
|
end
|
450
490
|
|
451
|
-
it "should
|
452
|
-
Scribd::API.instance.should_receive(:send_request).with('docs.featured', hash_including(:scope => 'hot')).and_return(@xml)
|
453
|
-
Scribd::Document.featured(:all, :scope => 'hot', :limit => 10)
|
454
|
-
end
|
455
|
-
|
456
|
-
it "should return first result if :first is provided" do
|
491
|
+
it "should call the docs.featured API method" do
|
457
492
|
Scribd::API.instance.should_receive(:send_request).with('docs.featured', {}).and_return(@xml)
|
458
|
-
docs = Scribd::Document.featured
|
459
|
-
docs.should be_kind_of(
|
460
|
-
docs.
|
493
|
+
docs = Scribd::Document.featured
|
494
|
+
docs.should be_kind_of(Array)
|
495
|
+
docs.first.should be_kind_of(Scribd::Document)
|
496
|
+
docs.first.access_key.should eql('abc123')
|
497
|
+
end
|
498
|
+
|
499
|
+
it "should pass options to the API" do
|
500
|
+
Scribd::API.instance.should_receive(:send_request).with('docs.featured', :foo => 'bar').and_return(@xml)
|
501
|
+
docs = Scribd::Document.featured(:foo => 'bar')
|
461
502
|
end
|
462
503
|
end
|
463
504
|
|
@@ -466,21 +507,20 @@ describe Scribd::Document do
|
|
466
507
|
@xml = REXML::Document.new("<rsp stat='ok'><result_set><result><access_key>abc123</access_key></result><result><access_key>abc321</access_key></result></result_set></rsp>")
|
467
508
|
end
|
468
509
|
|
469
|
-
it "should
|
470
|
-
Scribd::API.instance.should_receive(:send_request).with('docs.browse', hash_including(:sort => 'views', :category_id => 1, :limit => 10)).and_return(@xml)
|
471
|
-
Scribd::Document.browse(:all, :sort => 'views', :category_id => 1, :limit => 10)
|
472
|
-
end
|
473
|
-
|
474
|
-
it "should return first result if :first is provided" do
|
510
|
+
it "should call the docs.browse method" do
|
475
511
|
Scribd::API.instance.should_receive(:send_request).with('docs.browse', {}).and_return(@xml)
|
476
|
-
docs = Scribd::Document.browse
|
477
|
-
docs.should be_kind_of(
|
478
|
-
docs.
|
512
|
+
docs = Scribd::Document.browse
|
513
|
+
docs.should be_kind_of(Array)
|
514
|
+
docs.first.should be_kind_of(Scribd::Document)
|
515
|
+
docs.first.access_key.should eql('abc123')
|
516
|
+
end
|
517
|
+
|
518
|
+
it "should pass options to the API" do
|
519
|
+
Scribd::API.instance.should_receive(:send_request).with('docs.browse', :foo => 'bar').and_return(@xml)
|
520
|
+
docs = Scribd::Document.browse(:foo => 'bar')
|
479
521
|
end
|
480
522
|
end
|
481
523
|
|
482
|
-
it "should have an upload synonym for the create method"
|
483
|
-
|
484
524
|
describe ".conversion_status" do
|
485
525
|
before :each do
|
486
526
|
@document = Scribd::Document.new(:xml => REXML::Document.new("<doc_id type='integer'>123</doc_id>"))
|
@@ -588,6 +628,30 @@ describe Scribd::Document do
|
|
588
628
|
@document.download_url.should eql("http://www.example.com/doc.pdf")
|
589
629
|
end
|
590
630
|
end
|
631
|
+
|
632
|
+
describe "#grant_access" do
|
633
|
+
it "should call Scribd::Security.grant_access" do
|
634
|
+
doc = Scribd::Document.new
|
635
|
+
Scribd::Security.should_receive(:grant_access).once.with('foo', doc)
|
636
|
+
doc.grant_access('foo')
|
637
|
+
end
|
638
|
+
end
|
639
|
+
|
640
|
+
describe "#revoke_access" do
|
641
|
+
it "should call Scribd::Security.revoke_access" do
|
642
|
+
doc = Scribd::Document.new
|
643
|
+
Scribd::Security.should_receive(:revoke_access).once.with('foo', doc)
|
644
|
+
doc.revoke_access('foo')
|
645
|
+
end
|
646
|
+
end
|
647
|
+
|
648
|
+
describe "#access_list" do
|
649
|
+
it "should call Scribd::Security.document_access_list" do
|
650
|
+
doc = Scribd::Document.new
|
651
|
+
Scribd::Security.should_receive(:document_access_list).once.with(doc)
|
652
|
+
doc.access_list
|
653
|
+
end
|
654
|
+
end
|
591
655
|
end
|
592
656
|
|
593
657
|
Dir.chdir old_dir
|