rmm5t-slideshare 0.2.1.20091230
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +5 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +13 -0
- data/Rakefile +63 -0
- data/VERSION +1 -0
- data/init.rb +1 -0
- data/lib/slide_share/base.rb +79 -0
- data/lib/slide_share/errors.rb +18 -0
- data/lib/slide_share/slideshows.rb +128 -0
- data/lib/slideshare.rb +16 -0
- data/spec/fixtures/config.yml +4 -0
- data/spec/fixtures/config_missing_api_key.yml +2 -0
- data/spec/fixtures/config_missing_shared_secret.yml +2 -0
- data/spec/fixtures/delete_slideshow.xml +4 -0
- data/spec/fixtures/edit_slideshow.xml +4 -0
- data/spec/fixtures/error_failed_auth.xml +4 -0
- data/spec/fixtures/error_not_found.xml +4 -0
- data/spec/fixtures/error_permissions.xml +4 -0
- data/spec/fixtures/get_slideshow.xml +16 -0
- data/spec/fixtures/get_slideshow_detailed.xml +39 -0
- data/spec/fixtures/sample.txt +4 -0
- data/spec/fixtures/upload_slideshow.xml +4 -0
- data/spec/slide_share/base_spec.rb +58 -0
- data/spec/slide_share/slideshows_spec.rb +150 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +54 -0
- metadata +105 -0
data/.document
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 Saiku Desarrollos S.L.
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
= slideshare
|
2
|
+
|
3
|
+
A Ruby wrapper library for the SlideShare API
|
4
|
+
|
5
|
+
== Requirements
|
6
|
+
|
7
|
+
You will need to install HTTParty[http://github.com/jnunemaker/httparty/tree/master] and Curb[http://curb.rubyforge.org/] gems.
|
8
|
+
|
9
|
+
== Caveats
|
10
|
+
|
11
|
+
This gem is still in its infancy.
|
12
|
+
|
13
|
+
copyright (c) 2009 Saiku Desarrollos S.L., released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'spec/rake/spectask'
|
4
|
+
|
5
|
+
Spec::Rake::SpecTask.new(:spec)
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'jeweler'
|
9
|
+
Jeweler::Tasks.new do |gem|
|
10
|
+
gem.name = "rmm5t-slideshare"
|
11
|
+
gem.summary = %Q{Ruby interface for SlideShare API}
|
12
|
+
gem.email = "andy@shenie.info"
|
13
|
+
gem.homepage = "http://github.com/rmm5t/slideshare"
|
14
|
+
gem.authors = ["Saiku.es", "Russell Norris", "Andy Shen", "Ryan McGeary"]
|
15
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
|
+
gem.add_dependency('httparty', '>= 0.4.3')
|
17
|
+
gem.add_dependency('curb', '>= 0.1.4')
|
18
|
+
end
|
19
|
+
|
20
|
+
Jeweler::GemcutterTasks.new
|
21
|
+
|
22
|
+
rescue LoadError
|
23
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'rake/testtask'
|
27
|
+
Rake::TestTask.new(:test) do |test|
|
28
|
+
test.libs << 'lib' << 'test'
|
29
|
+
test.pattern = 'test/**/*_test.rb'
|
30
|
+
test.verbose = true
|
31
|
+
end
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'rcov/rcovtask'
|
35
|
+
Rcov::RcovTask.new do |test|
|
36
|
+
test.libs << 'test'
|
37
|
+
test.pattern = 'test/**/*_test.rb'
|
38
|
+
test.verbose = true
|
39
|
+
end
|
40
|
+
rescue LoadError
|
41
|
+
task :rcov do
|
42
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
task :default => :test
|
48
|
+
|
49
|
+
require 'rake/rdoctask'
|
50
|
+
Rake::RDocTask.new do |rdoc|
|
51
|
+
if File.exist?('VERSION.yml')
|
52
|
+
config = YAML.load(File.read('VERSION.yml'))
|
53
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
54
|
+
else
|
55
|
+
version = ""
|
56
|
+
end
|
57
|
+
|
58
|
+
rdoc.rdoc_dir = 'rdoc'
|
59
|
+
rdoc.title = "slideshare #{version}"
|
60
|
+
rdoc.rdoc_files.include('README*')
|
61
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
62
|
+
end
|
63
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.1.20091230
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "slide_share"
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require "digest/sha1"
|
2
|
+
|
3
|
+
module SlideShare
|
4
|
+
class Base
|
5
|
+
include HTTParty
|
6
|
+
base_uri "http://www.slideshare.net/api/2"
|
7
|
+
format :xml
|
8
|
+
|
9
|
+
attr_accessor :api_key, :shared_secret
|
10
|
+
|
11
|
+
# Returns an instance of <tt>SlideShare::Base</tt>. Takes the following options:
|
12
|
+
#
|
13
|
+
# * <tt>:api_key</tt> - SlideShare API key
|
14
|
+
# * <tt>:shared_pass</tt> - SlideShared shared secret
|
15
|
+
#
|
16
|
+
# Alternatively, this method may take the path to a YAML file containing
|
17
|
+
# this data. Examples (of both):
|
18
|
+
#
|
19
|
+
# # Using the options hash
|
20
|
+
# @slideshare = SlideShare::Base.new(:api_key => "4815162342", :shared_secret => "dharma")
|
21
|
+
# # Using the YAML file
|
22
|
+
# @slideshare = SlideShare::Base.new("path/to/file.yml")
|
23
|
+
def initialize(hash_or_yaml)
|
24
|
+
config = hash_or_yaml.is_a?(Hash) ? hash_or_yaml :
|
25
|
+
YAML.load_file(hash_or_yaml)
|
26
|
+
self.api_key = config[:api_key]
|
27
|
+
self.shared_secret = config[:shared_secret]
|
28
|
+
unless api_key && shared_secret
|
29
|
+
raise ArgumentError, "Configuration must have values for :api_key and :shared_secret"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# OO abstraction for <tt>SlideShare::Slideshow</tt> namespace. Example usage:
|
34
|
+
#
|
35
|
+
# @slideshare = SlideShare::Base.new("path/to/file.yml")
|
36
|
+
# @slideshow = @slideshare.slideshows.find(815)
|
37
|
+
#
|
38
|
+
# This is recommended over initializing and accessing a <tt>SlideShare::Slideshow</tt>
|
39
|
+
# object directly.
|
40
|
+
def slideshows
|
41
|
+
@slideshow ||= Slideshows.new(self)
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
def get(*args)
|
46
|
+
catch_errors self.class.get(args.first,
|
47
|
+
{:query => add_required_params(args.extract_options!)})
|
48
|
+
end
|
49
|
+
|
50
|
+
def post(*args)
|
51
|
+
options = add_required_params(args.extract_options!)
|
52
|
+
catch_errors self.class.post(args.first,
|
53
|
+
{:query => options})
|
54
|
+
end
|
55
|
+
|
56
|
+
def add_required_params(options)
|
57
|
+
now = Time.now.to_i.to_s
|
58
|
+
hashed = Digest::SHA1.hexdigest("#{shared_secret}#{now}")
|
59
|
+
options.merge(:api_key => api_key, :ts => now, :hash => hashed)
|
60
|
+
end
|
61
|
+
|
62
|
+
def catch_errors(response)
|
63
|
+
if error = response.delete("SlideShareServiceError")
|
64
|
+
case error["Message"]
|
65
|
+
when /failed user authentication/i
|
66
|
+
raise FailedUserAuthentication
|
67
|
+
when /insufficient permission/i
|
68
|
+
raise InsufficientPermission
|
69
|
+
when /slideshow not found/i
|
70
|
+
raise SlideshowNotFound
|
71
|
+
else
|
72
|
+
raise ServiceError, error["Message"]
|
73
|
+
end
|
74
|
+
else
|
75
|
+
response
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module SlideShare
|
2
|
+
# Root error
|
3
|
+
# Raised when none of the other errors match
|
4
|
+
class ServiceError < StandardError; end
|
5
|
+
|
6
|
+
# Raised when API method requires username and password but none
|
7
|
+
# was provided
|
8
|
+
class InsufficientPermission < ServiceError; end
|
9
|
+
|
10
|
+
# Raised when API method was given incorrect username and/or password
|
11
|
+
class FailedUserAuthentication < ServiceError; end
|
12
|
+
|
13
|
+
# Raised when no slideshow matches the supplied slideshow_id
|
14
|
+
class SlideshowNotFound < ServiceError; end
|
15
|
+
|
16
|
+
# Raised when the application has made more than 1000 calls a day
|
17
|
+
class AccountExceededDailyLimit < ServiceError; end
|
18
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module SlideShare
|
2
|
+
class Slideshows
|
3
|
+
attr_accessor :base
|
4
|
+
|
5
|
+
# This method should only be called internally from an instance of
|
6
|
+
# <tt>SlideShare::Base</tt>.
|
7
|
+
def initialize(base) # :nodoc:
|
8
|
+
self.base = base
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns id of newly created slideshow if successful or raises an appropriate
|
12
|
+
# exception if not. Takes the following options:
|
13
|
+
#
|
14
|
+
# * <tt>:slideshow_description</tt> - Description for the slideshow
|
15
|
+
# * <tt>:slideshow_tags</tt> - Tags for the slideshow. Multiple tags should be separated
|
16
|
+
# by spaces, using quotes to create individual multiple word tags.
|
17
|
+
# * <tt>:make_src_public</tt> - Set to <tt>true/false</tt> to allow users to download
|
18
|
+
# the slideshow
|
19
|
+
# * <tt>:make_slideshow_private</tt> - Set to <tt>true/false</tt> to change the privacy
|
20
|
+
# setting appropriately
|
21
|
+
#
|
22
|
+
# The following options will only be used if <tt>:make_slideshow_private</tt> is set
|
23
|
+
# <tt>true</tt>:
|
24
|
+
#
|
25
|
+
# * <tt>:generate_secret_url</tt> - Set to <tt>true/false</tt> to generate a secret URL
|
26
|
+
# * <tt>:allow_embeds</tt> - Set to <tt>true/false</tt> to allow websites to embed
|
27
|
+
# the private slideshow
|
28
|
+
# * <tt>:share_with_contacts</tt> - Set to <tt>true/false</tt> to allow your contacts to
|
29
|
+
# view the private slideshow
|
30
|
+
def create(title, filename, username, password, options = {})
|
31
|
+
force_boolean_params_to_letters! options
|
32
|
+
options.merge!(:username => username, :password => password,
|
33
|
+
:slideshow_title => title)
|
34
|
+
params = base.send(:add_required_params, options).map do |key, value|
|
35
|
+
Curl::PostField.content(key.to_s, value)
|
36
|
+
end
|
37
|
+
params << Curl::PostField.file("slideshow_srcfile", File.expand_path(filename))
|
38
|
+
|
39
|
+
curl = Curl::Easy.new("#{SlideShare::Base.base_uri}/upload_slideshow") do |c|
|
40
|
+
c.multipart_form_post = true
|
41
|
+
end
|
42
|
+
curl.http_post(*params)
|
43
|
+
|
44
|
+
body = Crack::XML.parse(curl.body_str)
|
45
|
+
|
46
|
+
response = base.send(:catch_errors, body)
|
47
|
+
# I'd presume the id returned was an integer
|
48
|
+
response["SlideShowUploaded"]["SlideShowID"].to_i
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns hash of attributes for slideshow if successful or raises an appropriate
|
52
|
+
# exception if not. Takes the following options:
|
53
|
+
#
|
54
|
+
# * <tt>:username</tt> - SlideShare username of the user _making_ the request
|
55
|
+
# * <tt>:password</tt> - SlideShare password of the user _making_ the request
|
56
|
+
# * <tt>:detailed</tt> - Set to <tt>true</tt> to return additional, detailed information
|
57
|
+
# about the slideshow (see the official API documentation here[http://www.slideshare.net/developers/documentation]
|
58
|
+
# for more information). Default is <tt>false</tt>.
|
59
|
+
def find(id, options = {})
|
60
|
+
detailed = convert_to_number(options.delete(:detailed))
|
61
|
+
options[:detailed] = detailed unless detailed.nil?
|
62
|
+
base.send :get, "/get_slideshow", options.merge(:slideshow_id => id)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns true if successful or raises an appropriate exception if not.
|
66
|
+
# Takes the following options:
|
67
|
+
#
|
68
|
+
# * <tt>:slideshow_title</tt> - Title for the slideshow
|
69
|
+
# * <tt>:slideshow_description</tt> - Description for the slideshow
|
70
|
+
# * <tt>:slideshow_tags</tt> - Tags for the slideshow. Multiple tags should be separated
|
71
|
+
# by spaces, using quotes to create individual multiple word tags.
|
72
|
+
# * <tt>:make_slideshow_private</tt> - Set to <tt>true/false</tt> to change the privacy
|
73
|
+
# setting appropriately
|
74
|
+
#
|
75
|
+
# The following options will only be used if <tt>:make_slideshow_private</tt> is set
|
76
|
+
# <tt>true</tt>:
|
77
|
+
#
|
78
|
+
# * <tt>:generate_secret_url</tt> - Set to <tt>true/false</tt> to generate a secret URL
|
79
|
+
# * <tt>:allow_embeds</tt> - Set to <tt>true/false</tt> to allow websites to embed
|
80
|
+
# the private slideshow
|
81
|
+
# * <tt>:share_with_contacts</tt> - Set to <tt>true/false</tt> to allow your contacts to
|
82
|
+
# view the private slideshow
|
83
|
+
def update(id, username, password, options = {})
|
84
|
+
force_boolean_params_to_letters! options
|
85
|
+
base.send(:post, "/edit_slideshow", options.merge(:slideshow_id => id,
|
86
|
+
:username => username, :password => password))
|
87
|
+
true # This might be too naïve but should have already raised exception if unsuccessful
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns true if successful or raises an appropriate exception if not.
|
91
|
+
def delete(id, username, password)
|
92
|
+
base.send :post, "/delete_slideshow", :slideshow_id => id,
|
93
|
+
:username => username, :password => password
|
94
|
+
true # This might be too naïve but should have already raised exception if unsuccessful
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
def force_boolean_params_to_letters!(hash)
|
99
|
+
[
|
100
|
+
:make_src_public, :make_slideshow_private, :generate_secret_url,
|
101
|
+
:allow_embeds, :share_with_contacts
|
102
|
+
].each do |key|
|
103
|
+
value = hash.delete(key)
|
104
|
+
unless value.nil?
|
105
|
+
hash[key] = convert_to_letter(value, true)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def convert_to_letter(value, force = false)
|
111
|
+
case value
|
112
|
+
when false, "N", nil
|
113
|
+
force ? "N" : nil
|
114
|
+
when true, "Y"
|
115
|
+
"Y"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def convert_to_number(value, force = false)
|
120
|
+
case value
|
121
|
+
when false, 0, nil
|
122
|
+
force ? 0 : nil
|
123
|
+
when true, 1
|
124
|
+
1
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
data/lib/slideshare.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "httparty"
|
3
|
+
require "curb"
|
4
|
+
|
5
|
+
require "slide_share/errors"
|
6
|
+
require "slide_share/base"
|
7
|
+
require "slide_share/slideshows"
|
8
|
+
|
9
|
+
unless Array.new.respond_to?(:extract_options!)
|
10
|
+
# Via ActiveSupport
|
11
|
+
class Array
|
12
|
+
def extract_options!
|
13
|
+
last.is_a?(Hash) ? pop : {}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<Slideshow>
|
3
|
+
<ID>815</ID>
|
4
|
+
<Title>The Oceanic Six: A Conspiracy of Lies</Title>
|
5
|
+
<Description>The Oceanic Six: A Conspiracy of Lies is a short mocumentary which was an extra feature for the season 4 DVD and Blu-ray. It is intentionally edited in the style of amateur and independent conspiracy documentaries such as Loose Change.</Description>
|
6
|
+
<Status>2</Status>
|
7
|
+
<Username>anon</Username>
|
8
|
+
<URL>http://slideshare.net/path/to/slideshare</URL>
|
9
|
+
<ThumbnailURL>http://slideshare.net/path/to/thumbnail</ThumbnailURL>
|
10
|
+
<ThumbnailSmallURL>http://slideshare.net/path/to/small_thumbnail</ThumbnailSmallURL>
|
11
|
+
<Embed>HTML EMBED code</Embed>
|
12
|
+
<Created>Mon Sep 22 07:40:33 -0600 2008</Created>
|
13
|
+
<Language>en</Language>
|
14
|
+
<Format>ppt</Format>
|
15
|
+
<Download>1</Download>
|
16
|
+
</Slideshow>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<Slideshow>
|
3
|
+
<ID>815</ID>
|
4
|
+
<Title>The Oceanic Six: A Conspiracy of Lies</Title>
|
5
|
+
<Description>The Oceanic Six: A Conspiracy of Lies is a short mocumentary which was an extra feature for the season 4 DVD and Blu-ray. It is intentionally edited in the style of amateur and independent conspiracy documentaries such as Loose Change.</Description>
|
6
|
+
<Status>2</Status>
|
7
|
+
<Username>anon</Username>
|
8
|
+
<URL>http://slideshare.net/path/to/slideshare</URL>
|
9
|
+
<ThumbnailURL>http://slideshare.net/path/to/thumbnail</ThumbnailURL>
|
10
|
+
<ThumbnailSmallURL>http://slideshare.net/path/to/small_thumbnail</ThumbnailSmallURL>
|
11
|
+
<Embed>HTML EMBED code</Embed>
|
12
|
+
<Created>Mon Sep 22 07:40:33 -0600 2008</Created>
|
13
|
+
<Language>en</Language>
|
14
|
+
<Format>ppt</Format>
|
15
|
+
<Download>1</Download>
|
16
|
+
<Tags>
|
17
|
+
</Tags>
|
18
|
+
<NumDownloads>0</NumDownloads>
|
19
|
+
<NumViews>0</NumViews>
|
20
|
+
<NumComments>0</NumComments>
|
21
|
+
<NumFavorites>0</NumFavorites>
|
22
|
+
<NumSlides>1</NumSlides>
|
23
|
+
<RelatedSlideshows>
|
24
|
+
<RelatedSlideshowID rank="10">10</RelatedSlideshowID>
|
25
|
+
<RelatedSlideshowID rank="9">9</RelatedSlideshowID>
|
26
|
+
<RelatedSlideshowID rank="8">8</RelatedSlideshowID>
|
27
|
+
<RelatedSlideshowID rank="7">7</RelatedSlideshowID>
|
28
|
+
<RelatedSlideshowID rank="6">6</RelatedSlideshowID>
|
29
|
+
<RelatedSlideshowID rank="5">5</RelatedSlideshowID>
|
30
|
+
<RelatedSlideshowID rank="4">4</RelatedSlideshowID>
|
31
|
+
<RelatedSlideshowID rank="3">3</RelatedSlideshowID>
|
32
|
+
<RelatedSlideshowID rank="2">2</RelatedSlideshowID>
|
33
|
+
<RelatedSlideshowID rank="1">1</RelatedSlideshowID>
|
34
|
+
</RelatedSlideshows>
|
35
|
+
<PrivacyLevel>0</PrivacyLevel>
|
36
|
+
<SecretURL>0</SecretURL>
|
37
|
+
<AllowEmbed>0</AllowEmbed>
|
38
|
+
<ShareWithContacts>0</ShareWithContacts>
|
39
|
+
</Slideshow>
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe SlideShare::Base do
|
4
|
+
describe "when initializing with an options hash" do
|
5
|
+
it "should require an api key" do
|
6
|
+
lambda {
|
7
|
+
SlideShare::Base.new(:api_key => "this is not a real api key")
|
8
|
+
}.should raise_error(ArgumentError)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should require an shared secret" do
|
12
|
+
lambda {
|
13
|
+
SlideShare::Base.new(:shared_secret => "this is not a real shared secret")
|
14
|
+
}.should raise_error(ArgumentError)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should raise no errors if provided api key and shared secret" do
|
18
|
+
lambda {
|
19
|
+
SlideShare::Base.new(
|
20
|
+
:api_key => "this is not a real api key",
|
21
|
+
:shared_secret => "this is not a real shared secret"
|
22
|
+
)
|
23
|
+
}.should_not raise_error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "when initializing with a YAML file" do
|
28
|
+
it "should require an api key" do
|
29
|
+
lambda {
|
30
|
+
SlideShare::Base.new(spec_fixture("config_missing_api_key.yml"))
|
31
|
+
}.should raise_error(ArgumentError)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should require an shared secret" do
|
35
|
+
lambda {
|
36
|
+
SlideShare::Base.new(spec_fixture("config_missing_shared_secret.yml"))
|
37
|
+
}.should raise_error(ArgumentError)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should raise no errors if provided api key and shared secret" do
|
41
|
+
lambda {
|
42
|
+
SlideShare::Base.new(spec_fixture("config.yml"))
|
43
|
+
}.should_not raise_error
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "when accessing slideshow functionality" do
|
48
|
+
before(:each) do
|
49
|
+
@slideshare = SlideShare::Base.new(spec_fixture("config.yml"))
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should abstract access to the SlideShare::Slideshows class through SlideShare#slideshows" do
|
53
|
+
@slideshow = mock("SlideShare::Slideshows")
|
54
|
+
SlideShare::Slideshows.stub!(:new).and_return(@slideshow)
|
55
|
+
@slideshare.slideshows.should == @slideshow
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
2
|
+
|
3
|
+
describe SlideShare::Slideshows do
|
4
|
+
before(:all) do
|
5
|
+
@slideshare = SlideShare::Base.new(spec_fixture("config.yml"))
|
6
|
+
@now = Time.now
|
7
|
+
Time.stub!(:now).and_return(@now)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "when creating a slideshow" do
|
11
|
+
before(:each) do
|
12
|
+
@upload = spec_fixture("sample.txt")
|
13
|
+
@curl = mock("Curl::Easy instance")
|
14
|
+
Curl::Easy.stub!(:new).and_return(@curl)
|
15
|
+
@curl.stub!(:http_post)
|
16
|
+
@curl.stub!(:body_str).and_return(File.read(spec_fixture("upload_slideshow.xml")))
|
17
|
+
end
|
18
|
+
|
19
|
+
# it "should generate the proper API call" do
|
20
|
+
# @slideshare.slideshows.create "A Title", @upload, "user", "pass"
|
21
|
+
# end
|
22
|
+
|
23
|
+
it "should return the uploaded slideshow's id when successful" do
|
24
|
+
@slideshare.slideshows.create("A Title", @upload, "user", "pass").should == 815
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should raise SlideShare::FailedUserAuthentication if given bad credentials" do
|
28
|
+
@curl.stub!(:body_str).and_return(File.read(spec_fixture("error_failed_auth.xml")))
|
29
|
+
lambda {
|
30
|
+
@slideshare.slideshows.create "A Title", @upload, "wronguser", "wrongpass"
|
31
|
+
}.should raise_error(SlideShare::FailedUserAuthentication)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "when retrieving a slideshow" do
|
36
|
+
before(:each) do
|
37
|
+
@response = stub_http_response_with("get_slideshow.xml")
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should generate the proper API call" do
|
41
|
+
SlideShare::Base.should_receive(:get).with("/get_slideshow",
|
42
|
+
:query => add_required_params(@slideshare, :slideshow_id => 815)).and_return(@response)
|
43
|
+
@slideshare.slideshows.find(815)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should convert boolean argument for detailed slideshow into numeric values" do
|
47
|
+
SlideShare::Base.should_receive(:get).with("/get_slideshow",
|
48
|
+
:query => add_required_params(@slideshare, :slideshow_id => 815, :detailed => 1)).and_return(@response)
|
49
|
+
@slideshare.slideshows.find(815, :detailed => true)
|
50
|
+
end
|
51
|
+
|
52
|
+
# I kinda think this sucks but I don't want to make it too brittle.
|
53
|
+
# Also, if this fails it's because of an outdated HTTParty gem.
|
54
|
+
it "should convert the response into a Hash when successful" do
|
55
|
+
@slideshare.slideshows.find(815).is_a?(Hash).should be_true
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should raise SlideShare::SlideshowNotFound if no slideshow matches id" do
|
59
|
+
stub_http_response_with("error_not_found.xml")
|
60
|
+
lambda {
|
61
|
+
@slideshare.slideshows.find 4815162342
|
62
|
+
}.should raise_error(SlideShare::SlideshowNotFound)
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should raise SlideShare::FailedUserAuthentication if given bad credentials" do
|
66
|
+
stub_http_response_with("error_failed_auth.xml")
|
67
|
+
lambda {
|
68
|
+
@slideshare.slideshows.find 815, :username => "wrong_user", :password => "wrong_pass"
|
69
|
+
}.should raise_error(SlideShare::FailedUserAuthentication)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should raise SlideShare::InsufficientPermission if username and password are needed but not supplied" do
|
73
|
+
stub_http_response_with("error_permissions.xml")
|
74
|
+
lambda {
|
75
|
+
@slideshare.slideshows.find 815
|
76
|
+
}.should raise_error(SlideShare::InsufficientPermission)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
describe "when updating a slideshow" do
|
81
|
+
before(:each) do
|
82
|
+
@response = stub_http_response_with("edit_slideshow.xml")
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should generate the proper API call" do
|
86
|
+
SlideShare::Base.should_receive(:post).with("/edit_slideshow",
|
87
|
+
:query => add_required_params(@slideshare, :slideshow_id => 815,
|
88
|
+
:username => "user", :password => "pass")).and_return(@response)
|
89
|
+
@slideshare.slideshows.update(815, "user", "pass")
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should convert optional argument for :make_slideshow_private" do
|
93
|
+
SlideShare::Base.should_receive(:post).with("/edit_slideshow",
|
94
|
+
:query => add_required_params(@slideshare, :slideshow_id => 815,
|
95
|
+
:username => "user", :password => "pass",
|
96
|
+
:make_slideshow_private => "Y")).and_return(@response)
|
97
|
+
@slideshare.slideshows.update(815, "user", "pass", :make_slideshow_private => true)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should return true if successful" do
|
101
|
+
@slideshare.slideshows.update(815, "user", "pass",
|
102
|
+
:slideshow_title => "Something New").should be_true
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should raise SlideShare::SlideshowNotFound if no slideshow matches id" do
|
106
|
+
stub_http_response_with("error_not_found.xml")
|
107
|
+
lambda {
|
108
|
+
@slideshare.slideshows.update 4815162342, "user", "pass"
|
109
|
+
}.should raise_error(SlideShare::SlideshowNotFound)
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should raise SlideShare::FailedUserAuthentication if given bad credentials" do
|
113
|
+
stub_http_response_with("error_failed_auth.xml")
|
114
|
+
lambda {
|
115
|
+
@slideshare.slideshows.update 815, "wrong_user", "wrong_pass"
|
116
|
+
}.should raise_error(SlideShare::FailedUserAuthentication)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "when deleting a slideshow" do
|
121
|
+
before(:each) do
|
122
|
+
@response = stub_http_response_with("delete_slideshow.xml")
|
123
|
+
end
|
124
|
+
|
125
|
+
it "should generate the proper API call" do
|
126
|
+
SlideShare::Base.should_receive(:post).with("/delete_slideshow",
|
127
|
+
:query => add_required_params(@slideshare, :slideshow_id => 815,
|
128
|
+
:username => "user", :password => "pass")).and_return(@response)
|
129
|
+
@slideshare.slideshows.delete(815, "user", "pass")
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should return true if successful" do
|
133
|
+
@slideshare.slideshows.delete(815, "user", "pass").should be_true
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should raise SlideShare::SlideshowNotFound if no slideshow matches id" do
|
137
|
+
stub_http_response_with("error_not_found.xml")
|
138
|
+
lambda {
|
139
|
+
@slideshare.slideshows.delete 4815162342, "user", "pass"
|
140
|
+
}.should raise_error(SlideShare::SlideshowNotFound)
|
141
|
+
end
|
142
|
+
|
143
|
+
it "should raise SlideShare::FailedUserAuthentication if given bad credentials" do
|
144
|
+
stub_http_response_with("error_failed_auth.xml")
|
145
|
+
lambda {
|
146
|
+
@slideshare.slideshows.delete 815, "wrong_user", "wrong_pass"
|
147
|
+
}.should raise_error(SlideShare::FailedUserAuthentication)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
data/spec/spec.opts
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
gem "rspec"
|
3
|
+
require "spec"
|
4
|
+
|
5
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
6
|
+
require "slideshare"
|
7
|
+
|
8
|
+
def spec_fixture(filename)
|
9
|
+
File.expand_path(File.join(File.dirname(__FILE__), "fixtures", filename))
|
10
|
+
end
|
11
|
+
|
12
|
+
def valid_configuration(options = {})
|
13
|
+
{
|
14
|
+
:api_key => "this is not a real api key",
|
15
|
+
:shared_secret => "this is not a real shared secret"
|
16
|
+
}.merge(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def stub_time_now
|
20
|
+
# Returning ;)
|
21
|
+
now = Time.now
|
22
|
+
Time.stub!(:now).and_return(now)
|
23
|
+
now
|
24
|
+
end
|
25
|
+
|
26
|
+
def add_required_params(base, hash)
|
27
|
+
base.send :add_required_params, hash
|
28
|
+
end
|
29
|
+
|
30
|
+
# Adapted from HTTParty specs
|
31
|
+
def stub_http_response_with(filename)
|
32
|
+
format = filename.split('.').last.intern
|
33
|
+
data = File.read(spec_fixture(filename))
|
34
|
+
http = Net::HTTP.new('localhost', 80)
|
35
|
+
|
36
|
+
response = Net::HTTPOK.new("1.1", 200, "Content for you")
|
37
|
+
response.stub!(:body).and_return(data)
|
38
|
+
http.stub!(:request).and_return(response)
|
39
|
+
|
40
|
+
http_request = HTTParty::Request.new(Net::HTTP::Get, 'http://slideshare.net')
|
41
|
+
http_request.stub!(:get_response).and_return(response)
|
42
|
+
http_request.stub!(:format).and_return(format)
|
43
|
+
|
44
|
+
HTTParty::Request.stub!(:new).and_return(http_request)
|
45
|
+
|
46
|
+
case format
|
47
|
+
when :xml
|
48
|
+
Crack::XML.parse(data)
|
49
|
+
when :json
|
50
|
+
Crack::JSON.parse(data)
|
51
|
+
else
|
52
|
+
data
|
53
|
+
end
|
54
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rmm5t-slideshare
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.1.20091230
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Saiku.es
|
8
|
+
- Russell Norris
|
9
|
+
- Andy Shen
|
10
|
+
- Ryan McGeary
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
|
15
|
+
date: 2009-12-30 00:00:00 -05:00
|
16
|
+
default_executable:
|
17
|
+
dependencies:
|
18
|
+
- !ruby/object:Gem::Dependency
|
19
|
+
name: httparty
|
20
|
+
type: :runtime
|
21
|
+
version_requirement:
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.4.3
|
27
|
+
version:
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: curb
|
30
|
+
type: :runtime
|
31
|
+
version_requirement:
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 0.1.4
|
37
|
+
version:
|
38
|
+
description:
|
39
|
+
email: andy@shenie.info
|
40
|
+
executables: []
|
41
|
+
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
extra_rdoc_files:
|
45
|
+
- README.rdoc
|
46
|
+
files:
|
47
|
+
- .document
|
48
|
+
- .gitignore
|
49
|
+
- MIT-LICENSE
|
50
|
+
- README.rdoc
|
51
|
+
- Rakefile
|
52
|
+
- VERSION
|
53
|
+
- init.rb
|
54
|
+
- lib/slide_share/base.rb
|
55
|
+
- lib/slide_share/errors.rb
|
56
|
+
- lib/slide_share/slideshows.rb
|
57
|
+
- lib/slideshare.rb
|
58
|
+
- spec/fixtures/config.yml
|
59
|
+
- spec/fixtures/config_missing_api_key.yml
|
60
|
+
- spec/fixtures/config_missing_shared_secret.yml
|
61
|
+
- spec/fixtures/delete_slideshow.xml
|
62
|
+
- spec/fixtures/edit_slideshow.xml
|
63
|
+
- spec/fixtures/error_failed_auth.xml
|
64
|
+
- spec/fixtures/error_not_found.xml
|
65
|
+
- spec/fixtures/error_permissions.xml
|
66
|
+
- spec/fixtures/get_slideshow.xml
|
67
|
+
- spec/fixtures/get_slideshow_detailed.xml
|
68
|
+
- spec/fixtures/sample.txt
|
69
|
+
- spec/fixtures/upload_slideshow.xml
|
70
|
+
- spec/slide_share/base_spec.rb
|
71
|
+
- spec/slide_share/slideshows_spec.rb
|
72
|
+
- spec/spec.opts
|
73
|
+
- spec/spec_helper.rb
|
74
|
+
has_rdoc: true
|
75
|
+
homepage: http://github.com/rmm5t/slideshare
|
76
|
+
licenses: []
|
77
|
+
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options:
|
80
|
+
- --charset=UTF-8
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: "0"
|
88
|
+
version:
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ">="
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: "0"
|
94
|
+
version:
|
95
|
+
requirements: []
|
96
|
+
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 1.3.5
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: Ruby interface for SlideShare API
|
102
|
+
test_files:
|
103
|
+
- spec/slide_share/base_spec.rb
|
104
|
+
- spec/slide_share/slideshows_spec.rb
|
105
|
+
- spec/spec_helper.rb
|