speakerdeck_api 0.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3892efbff2761e7e134553b668c35f548cabf3d9
4
+ data.tar.gz: 9acae837f0c8370cd9c5d2819889d452b0dda84a
5
+ SHA512:
6
+ metadata.gz: 9268702f1ac2caccaf604ab945d3a0492e8bbf338167dbb5a6807e21a82814af55c3643d91db46152c57b102840db226a3010310b60cd6d957b65d7064dcfc5d
7
+ data.tar.gz: 22f442d296feace4492a03bf841d661655c4c6719936728137dfc20cf0d6b90d7b8113376949cecd974113b4e0171955bdd13b72ed3709c7e54efe7d0baee3cd
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+ cache: bundler
3
+
4
+ rvm:
5
+ - 2.1.3
6
+
7
+ script: 'bundle exec rake'
8
+
9
+ notifications:
10
+ email:
11
+ recipients:
12
+ - me@ferperales.net
13
+ on_failure: change
14
+ on_success: never
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in speakerdeck_api.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Fer Perales
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,33 @@
1
+ # SpeakerdeckApi
2
+
3
+ [![Build Status](https://travis-ci.org/FerPerales/speakerdeck_api.png?branch=master)](https://travis-ci.org/FerPerales/speakerdeck_api)
4
+
5
+ A gem for getting data from speakerdeck.com
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'speakerdeck_api'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install speakerdeck_api
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Contributing
28
+
29
+ 1. Fork it ( https://github.com/[my-github-username]/speakerdeck_api/fork )
30
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
31
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
32
+ 4. Push to the branch (`git push origin my-new-feature`)
33
+ 5. Create a new Pull Request
@@ -0,0 +1,11 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'bundler/gem_tasks'
3
+
4
+ # Default directory to look in is `/specs`
5
+ # Run with `rake spec`
6
+ RSpec::Core::RakeTask.new(:spec) do |task|
7
+ task.rspec_opts = ['--color']
8
+ end
9
+
10
+ task :default => :spec
11
+
@@ -0,0 +1,9 @@
1
+ require "speakerdeck_api/version"
2
+ require 'speakerdeck_api/connection'
3
+ require 'speakerdeck_api/parser'
4
+ require 'speakerdeck_api/speaker'
5
+ require 'speakerdeck_api/exceptions/speaker_not_found_exception'
6
+
7
+ module SpeakerdeckApi
8
+ # Your code goes here...
9
+ end
@@ -0,0 +1,28 @@
1
+ require 'nokogiri'
2
+ require 'open-uri'
3
+
4
+ module SpeakerdeckApi
5
+ class Connection
6
+
7
+ BASE_URL = 'https://speakerdeck.com/'
8
+
9
+ def get_speaker_data(speaker_name)
10
+ url = url_for_speaker speaker_name
11
+ get_data(url)
12
+ end
13
+
14
+ def url_for_speaker(speaker_name)
15
+ BASE_URL + speaker_name
16
+ end
17
+
18
+
19
+
20
+ private
21
+
22
+ def get_data(url)
23
+ Nokogiri::HTML(open(url))
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,7 @@
1
+ module SpeakerdeckApi
2
+ module Exceptions
3
+ class SpeakerNotFoundException < Exception
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ module SpeakerdeckApi
2
+ class Parser
3
+
4
+ def get_speaker_details(speaker_html)
5
+ info = {}
6
+ info[:number_of_talks] = speaker_html.css('.talk.public').size
7
+ info
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,22 @@
1
+ module SpeakerdeckApi
2
+
3
+ class Speaker
4
+
5
+ attr_reader :number_of_talks
6
+
7
+ def initialize(params = {})
8
+ @number_of_talks = params[:number_of_talks] || 0
9
+ end
10
+
11
+ def self.get(speaker_name)
12
+ begin
13
+ speaker_data = SpeakerdeckApi::Connection.new.get_speaker_data speaker_name
14
+ speaker_details = SpeakerdeckApi::Parser.new.get_speaker_details speaker_data
15
+ SpeakerdeckApi::Speaker.new speaker_details
16
+ rescue
17
+ raise SpeakerdeckApi::Exceptions::SpeakerNotFoundException
18
+ end
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,3 @@
1
+ module SpeakerdeckApi
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'speakerdeck_api/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "speakerdeck_api"
8
+ spec.version = SpeakerdeckApi::VERSION
9
+ spec.authors = ["Fer Perales"]
10
+ spec.email = ["me@ferperales.net"]
11
+ spec.summary = %q{A gem for getting data from speakerdeck.com}
12
+ spec.homepage = ""
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_development_dependency "bundler", "~> 1.7"
21
+ spec.add_development_dependency "rake", "~> 10.0"
22
+ spec.add_development_dependency "rspec"
23
+ spec.add_development_dependency "nokogiri"
24
+ spec.add_development_dependency "pry"
25
+ spec.add_development_dependency "pry-byebug"
26
+
27
+ end
@@ -0,0 +1,388 @@
1
+
2
+ <!DOCTYPE html>
3
+ <html>
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <title>Presentations by Fernando Perales // Speaker Deck</title>
7
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge">
8
+
9
+ <link href='//fonts.googleapis.com/css?family=Open+Sans:400,300,600&subset=latin,latin-ext,cyrillic,cyrillic-ext' rel='stylesheet' type='text/css'>
10
+ <link href="https://d2dfho4r6t7asi.cloudfront.net/assets/application-31e7b11e971c1191f531d134325dda3f.css" media="screen" rel="stylesheet" type="text/css" />
11
+
12
+ <meta name="octolytics-app-id" content="speakerdeck" /><meta name="octolytics-host" content="collector.githubapp.com" /><meta name="octolytics-script-host" content="collector-cdn.github.com" />
13
+ <meta name="octolytics-actor-id" content="13424" /><meta name="octolytics-actor-hash" content="050077a3de932b4489000e56dc249fa6b41708404be9ae26ae576c04103177ec" />
14
+
15
+ <script src="https://d2dfho4r6t7asi.cloudfront.net/assets/application-de3b0dfb5fa666c00edfef0bbc79a0d7.js" type="text/javascript"></script>
16
+ <!--[if lt IE 9]>
17
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
18
+ <![endif]-->
19
+ <!--[if (gte IE 6)&(lte IE 8)]>
20
+ <script src="https://d2dfho4r6t7asi.cloudfront.net/assets/selectivizr-7b14bd1d1264beb6f8c385039c9cf80a.js" type="text/javascript"></script>
21
+ <![endif]-->
22
+ <meta content="authenticity_token" name="csrf-param" />
23
+ <meta content="c6i9OWNVcbBt6H3is4hMjDeJBReVJp6ZaGWwtoZOzH5UQO27+O2NKUh1+ruqLPrYq0iaVtWdu5P10yUrC2zUuw==" name="csrf-token" />
24
+
25
+ <link href="https://speakerdeck.com/ferperales.atom" rel="alternate" title="Fernando Perales&#x27;s Presentations Feed" type="application/atom+xml" />
26
+ <meta name="octolytics-dimension-user_id" content="13424" /><meta name="octolytics-dimension-user_username" content="ferperales" />
27
+
28
+ </head>
29
+ <body class="signed-in">
30
+ <header>
31
+ <div class="container">
32
+ <h1><a href="/">Speaker Deck</a></h1>
33
+
34
+ <form accept-charset="UTF-8" action="/search" id="search_form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div>
35
+ <input type="text" id="q" name="q" placeholder="Search…" value="" autocomplete="off" />
36
+ <button>Search</button>
37
+ </form>
38
+ <div class="navigation">
39
+ <ul>
40
+ <li class="browse"><a href="/p/featured">Browse</a></li>
41
+ <li class="upload"><a href="/new">Upload</a></li>
42
+ </ul>
43
+
44
+ <div id="amazing-shadow"></div>
45
+ <div id="account-settings">
46
+ <a class="user" href="/ferperales"><img alt="597e300a2878d54443eeb8cbde63edad?s=47" src="//secure.gravatar.com/avatar/597e300a2878d54443eeb8cbde63edad?s=47" />Fernando Perales</a>
47
+ <ul>
48
+ <li><a href="/ferperales">My Decks</a></li>
49
+ <li><a href="/account">My Account</a></a>
50
+ <li><a href="/ferperales/stars">My Stars</a></li>
51
+ <li><a href="#feedback_box" rel="facebox">Feedback</a></li>
52
+ <li><a href="/signout">Sign Out</a></li>
53
+ </ul>
54
+ </div>
55
+
56
+ </div>
57
+
58
+ <div id="feedback_box" style="display: none">
59
+ <div class="letter">
60
+ <h2>Dear Speaker Deck,</h2>
61
+ <form accept-charset="UTF-8" action="/feedback" data-remote="true" id="feedback" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="EtNj8IV8MmZP24S+AEVefoNyJloJwNl5U9sn7AC7Mn81OzNyHsTO/2pGA+cZ4egqH7O5G0l7/HPObbJxjZkqug==" /></div>
62
+
63
+ <div class="subject">
64
+ <label for="subject">I’d like to talk with you about</label>
65
+ <input id="subject" name="subject" placeholder="Subject" type="text" />
66
+ </div>
67
+ <textarea id="comments" name="comments" placeholder="Your message">
68
+ </textarea>
69
+
70
+ <span style="display: block; margin-bottom: 10px;">
71
+ Signed,
72
+ </span>
73
+ <h2>Fernando Perales</h2><br/>
74
+ <hr>
75
+ <button type=submit class="primary">Send Mail</button>
76
+ </form> </div>
77
+ </div>
78
+
79
+ </div>
80
+ </header>
81
+
82
+
83
+ <div id="content">
84
+
85
+
86
+
87
+ <section class="light">
88
+ <div class="container">
89
+ <div class="main">
90
+
91
+
92
+
93
+ <h1>Talks by Fernando Perales</h1>
94
+ <p></p>
95
+
96
+
97
+
98
+ <div class="talks">
99
+ <div class="talk public" data-id="60e74b1029b90132958f166834114127" data-slide-count="42">
100
+ <a class="slide_preview scrub" href="/ferperales/i-dot-a-y-open-source">
101
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/60e74b1029b90132958f166834114127/thumb_slide_0.jpg" />
102
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
103
+ </a>
104
+ <div class="talk-listing-meta">
105
+ <h3 class="title">
106
+ <a href="/ferperales/i-dot-a-y-open-source">I.A. y Open Source</a>
107
+ </h3>
108
+ <p class="date">
109
+ Sep 20, 2014 by
110
+ <a href="/ferperales">Fernando Perales</a></p>
111
+ </div>
112
+ </div>
113
+
114
+ <div class="talk public" data-id="13f78d50f4ea0131751b2ef16f2868ea" data-slide-count="51">
115
+ <a class="slide_preview scrub" href="/ferperales/the-x-factor">
116
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/13f78d50f4ea0131751b2ef16f2868ea/thumb_slide_0.jpg" />
117
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
118
+ </a>
119
+ <div class="talk-listing-meta">
120
+ <h3 class="title">
121
+ <a href="/ferperales/the-x-factor">The X factor</a>
122
+ </h3>
123
+ <p class="date">
124
+ Jul 23, 2014 by
125
+ <a href="/ferperales">Fernando Perales</a></p>
126
+ </div>
127
+ </div>
128
+
129
+ <div class="talk public" data-id="119bae30ca68013176a162bf191fee83" data-slide-count="7">
130
+ <a class="slide_preview scrub" href="/ferperales/using-remotes-in-a-presentation">
131
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/119bae30ca68013176a162bf191fee83/thumb_slide_0.jpg" />
132
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
133
+ </a>
134
+ <div class="talk-listing-meta">
135
+ <h3 class="title">
136
+ <a href="/ferperales/using-remotes-in-a-presentation">Using remotes in a presentation</a>
137
+ </h3>
138
+ <p class="date">
139
+ May 30, 2014 by
140
+ <a href="/ferperales">Fernando Perales</a></p>
141
+ </div>
142
+ </div>
143
+
144
+ <div class="talk public" data-id="dfc5df0089320131712b6e502952b505" data-slide-count="44">
145
+ <a class="slide_preview scrub" href="/ferperales/introduccion-a-git-y-github">
146
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/dfc5df0089320131712b6e502952b505/thumb_slide_0.jpg" />
147
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
148
+ </a>
149
+ <div class="talk-listing-meta">
150
+ <h3 class="title">
151
+ <a href="/ferperales/introduccion-a-git-y-github">Introducción a git y GitHub</a>
152
+ </h3>
153
+ <p class="date">
154
+ Mar 8, 2014 by
155
+ <a href="/ferperales">Fernando Perales</a></p>
156
+ </div>
157
+ </div>
158
+
159
+ <div class="talk public" data-id="fc037890ca6c0130db67327b70541545" data-slide-count="20">
160
+ <a class="slide_preview scrub" href="/ferperales/marilyn-monroe-top-20-19-moments">
161
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/fc037890ca6c0130db67327b70541545/thumb_slide_0.jpg" />
162
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
163
+ </a>
164
+ <div class="talk-listing-meta">
165
+ <h3 class="title">
166
+ <a href="/ferperales/marilyn-monroe-top-20-19-moments">Marilyn Monroe Top -20- 19 moments</a>
167
+ </h3>
168
+ <p class="date">
169
+ Jul 9, 2013 by
170
+ <a href="/ferperales">Fernando Perales</a></p>
171
+ </div>
172
+ </div>
173
+
174
+ <div class="talk public" data-id="bf5480d0b1150130d014221a8388c3ea" data-slide-count="31">
175
+ <a class="slide_preview scrub" href="/ferperales/from-just-hired-to-just-graduated">
176
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/bf5480d0b1150130d014221a8388c3ea/thumb_slide_0.jpg" />
177
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
178
+ </a>
179
+ <div class="talk-listing-meta">
180
+ <h3 class="title">
181
+ <a href="/ferperales/from-just-hired-to-just-graduated">From just hired to just graduated</a>
182
+ </h3>
183
+ <p class="date">
184
+ Jun 6, 2013 by
185
+ <a href="/ferperales">Fernando Perales</a></p>
186
+ </div>
187
+ </div>
188
+
189
+ <div class="talk public" data-id="a93b60209e7501301b2f469a61e096c5" data-slide-count="96">
190
+ <a class="slide_preview scrub" href="/ferperales/termine-la-universidad-ahora-que-hago">
191
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/a93b60209e7501301b2f469a61e096c5/thumb_slide_0.jpg" />
192
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
193
+ </a>
194
+ <div class="talk-listing-meta">
195
+ <h3 class="title">
196
+ <a href="/ferperales/termine-la-universidad-ahora-que-hago">Terminé la universidad: ¿ahora qué hago?</a>
197
+ </h3>
198
+ <p class="date">
199
+ May 14, 2013 by
200
+ <a href="/ferperales">Fernando Perales</a></p>
201
+ </div>
202
+ </div>
203
+
204
+ <div class="talk public" data-id="6dcd02400e8901305c251231382037e3" data-slide-count="13">
205
+ <a class="slide_preview scrub" href="/ferperales/songfly-dot-me">
206
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/6dcd02400e8901305c251231382037e3/thumb_slide_0.jpg" />
207
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
208
+ </a>
209
+ <div class="talk-listing-meta">
210
+ <h3 class="title">
211
+ <a href="/ferperales/songfly-dot-me">Songfly.me</a>
212
+ </h3>
213
+ <p class="date">
214
+ Mar 21, 2013 by
215
+ <a href="/ferperales">Fernando Perales</a></p>
216
+ </div>
217
+ </div>
218
+
219
+ <div class="talk public" data-id="41d02bf05ce00130605912313d141deb" data-slide-count="22">
220
+ <a class="slide_preview scrub" href="/ferperales/hackergarage">
221
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/41d02bf05ce00130605912313d141deb/thumb_slide_0.jpg" />
222
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
223
+ </a>
224
+ <div class="talk-listing-meta">
225
+ <h3 class="title">
226
+ <a href="/ferperales/hackergarage">HackerGarage</a>
227
+ </h3>
228
+ <p class="date">
229
+ Feb 19, 2013 by
230
+ <a href="/ferperales">Fernando Perales</a></p>
231
+ </div>
232
+ </div>
233
+
234
+ <div class="talk public" data-id="41cbae301bd30130ead722000a1c80bb" data-slide-count="16">
235
+ <a class="slide_preview scrub" href="/ferperales/eventos-hg">
236
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/41cbae301bd30130ead722000a1c80bb/thumb_slide_0.jpg" />
237
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
238
+ </a>
239
+ <div class="talk-listing-meta">
240
+ <h3 class="title">
241
+ <a href="/ferperales/eventos-hg">Eventos HG</a>
242
+ </h3>
243
+ <p class="date">
244
+ Nov 28, 2012 by
245
+ <a href="/ferperales">Fernando Perales</a></p>
246
+ </div>
247
+ </div>
248
+
249
+ <div class="talk public" data-id="50799967cd5250000207dfe2" data-slide-count="17">
250
+ <a class="slide_preview scrub" href="/ferperales/strings-and-ranges-in-ruby">
251
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/50799967cd5250000207dfe2/thumb_slide_0.jpg" />
252
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
253
+ </a>
254
+ <div class="talk-listing-meta">
255
+ <h3 class="title">
256
+ <a href="/ferperales/strings-and-ranges-in-ruby">Strings and ranges in Ruby</a>
257
+ </h3>
258
+ <p class="date">
259
+ Oct 13, 2012 by
260
+ <a href="/ferperales">Fernando Perales</a></p>
261
+ </div>
262
+ </div>
263
+
264
+ <div class="talk public" data-id="5063daf9d6efd30002040027" data-slide-count="33">
265
+ <a class="slide_preview scrub" href="/ferperales/ninjavascript">
266
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/5063daf9d6efd30002040027/thumb_slide_0.jpg" />
267
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
268
+ </a>
269
+ <div class="talk-listing-meta">
270
+ <h3 class="title">
271
+ <a href="/ferperales/ninjavascript">ninJavascript</a>
272
+ </h3>
273
+ <p class="date">
274
+ Sep 27, 2012 by
275
+ <a href="/ferperales">Fernando Perales</a></p>
276
+ </div>
277
+ </div>
278
+
279
+ <div class="talk public" data-id="5063dc09ca52410002040a1c" data-slide-count="21">
280
+ <a class="slide_preview scrub" href="/ferperales/ajax">
281
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/5063dc09ca52410002040a1c/thumb_slide_0.jpg" />
282
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
283
+ </a>
284
+ <div class="talk-listing-meta">
285
+ <h3 class="title">
286
+ <a href="/ferperales/ajax">AJAX</a>
287
+ </h3>
288
+ <p class="date">
289
+ Sep 27, 2012 by
290
+ <a href="/ferperales">Fernando Perales</a></p>
291
+ </div>
292
+ </div>
293
+
294
+ <div class="talk public" data-id="5063dbc8d6efd3000204029c" data-slide-count="11">
295
+ <a class="slide_preview scrub" href="/ferperales/json">
296
+ <img alt="Thumb_slide_0" src="https://speakerd.s3.amazonaws.com/presentations/5063dbc8d6efd3000204029c/thumb_slide_0.jpg" />
297
+ <div class="scrubber"><div class="scrubbed" style="width:0;"></div></div>
298
+ </a>
299
+ <div class="talk-listing-meta">
300
+ <h3 class="title">
301
+ <a href="/ferperales/json">JSON</a>
302
+ </h3>
303
+ <p class="date">
304
+ Sep 27, 2012 by
305
+ <a href="/ferperales">Fernando Perales</a></p>
306
+ </div>
307
+ </div>
308
+
309
+ <div class="talk empty"><div class="slide_preview"></div></div>
310
+
311
+ </div>
312
+
313
+
314
+
315
+ </div>
316
+
317
+ <div class="sidebar">
318
+ <div class="sidebar">
319
+ <h1>Speaker Details</h1>
320
+ <a href="/ferperales" class="bio_mugshot"><img alt="597e300a2878d54443eeb8cbde63edad?s=47" src="//secure.gravatar.com/avatar/597e300a2878d54443eeb8cbde63edad?s=47" /></a>
321
+ <h2>Fernando Perales</h2>
322
+ <div class="bio"><p><a href="http://ferperales.net/" rel="nofollow">http://ferperales.net/</a></p></div>
323
+
324
+ <ul class="delimited">
325
+ <li><a href="/ferperales/stars">7 Stars</a></li>
326
+ </ul>
327
+
328
+ <a href="/account" class="button">Edit My Account</a>
329
+
330
+
331
+ </div>
332
+
333
+ </div>
334
+ </div>
335
+ </section>
336
+
337
+
338
+
339
+ </div>
340
+
341
+ <footer>
342
+ <div class="container">
343
+ <span class="copyright">
344
+ <img alt="Invertocat" src="https://d2dfho4r6t7asi.cloudfront.net/assets/invertocat-f10d7398407ff679b054b8c4c86aa639.svg" />
345
+ <div class="copyright-text">Copyright &copy; 2014 <a href="http://github.com">GitHub</a> Inc.
346
+ <div class="crumb">All slide content and descriptions are owned by their creators.</div>
347
+ </div>
348
+ </span>
349
+
350
+ <ul class="links">
351
+ <li><a href="/faq">F.A.Q.</a></li>
352
+ <li><a href="/tos">Terms of Service</a></li>
353
+ <li><a href="/privacy">Privacy Policy</a></li>
354
+ </ul>
355
+ </div>
356
+ </footer>
357
+
358
+ <script type="text/javascript">
359
+ var _gaq = _gaq || [];
360
+ _gaq.push(['_setAccount', 'UA-19290517-1']);
361
+ _gaq.push(['_setDomainName', '.speakerdeck.com']);
362
+ _gaq.push(['_trackPageview']);
363
+
364
+ (function() {
365
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
366
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
367
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
368
+ })();
369
+ </script>
370
+
371
+
372
+ <script type="text/javascript">
373
+ (function() {
374
+ var t = document.createElement('script');
375
+ t.type = 'text/javascript';
376
+ t.async = true;
377
+ t.id = 'gauges-tracker';
378
+ t.setAttribute('data-site-id',
379
+ '4dd2a2b5613f5d2021000005');
380
+ t.src = '//secure.gaug.es/track.js';
381
+ var s = document.getElementsByTagName('script')[0];
382
+ s.parentNode.insertBefore(t, s);
383
+ })();
384
+ </script>
385
+
386
+ </body>
387
+ </html>
388
+
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ module SpeakerdeckApi
4
+ describe Connection do
5
+
6
+ let(:valid_speaker) { 'ferperales' }
7
+ let(:invalid_speaker) { 'jondoe' }
8
+ let(:subject) { SpeakerdeckApi::Connection }
9
+
10
+ it 'has a base URL' do
11
+ expect(subject::BASE_URL).to be_eql('https://speakerdeck.com/')
12
+ end
13
+
14
+ describe '.get_speaker_data' do
15
+ context 'with valid url' do
16
+ it 'returns a parseable object' do
17
+ expect(subject.new.get_speaker_data(valid_speaker)).to be_a Nokogiri::HTML::Document
18
+ end
19
+
20
+ end
21
+
22
+ context 'with invalid url' do
23
+ it 'raises a OpenURI::HTTPError' do
24
+ expect { subject.new.get_speaker_data(invalid_speaker)}.to raise_error OpenURI::HTTPError
25
+ end
26
+ end
27
+ end
28
+
29
+
30
+ describe '.url_for_speaker' do
31
+ it 'returns the correct URL' do
32
+ expect(subject.new.url_for_speaker('ferperales')).to be_eql('https://speakerdeck.com/ferperales')
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,27 @@
1
+ module SpeakerdeckApi
2
+ describe Parser do
3
+
4
+ let(:speaker_profile_page) do
5
+ path = File.join(File.dirname(File.expand_path(__FILE__)), "../fixtures/speaker_profile.html")
6
+ f = File.open(path)
7
+ doc = Nokogiri::XML(f)
8
+ f.close
9
+ doc
10
+ end
11
+
12
+ context 'speakers' do
13
+ describe '.get_speaker_details' do
14
+ context 'valid speaker' do
15
+
16
+ it 'contains the "number of talks" key' do
17
+ expect(subject.get_speaker_details(speaker_profile_page)).to have_key(:number_of_talks)
18
+ end
19
+
20
+ it 'contains the right value' do
21
+ expect(subject.get_speaker_details(speaker_profile_page).values_at(:number_of_talks)).to eql([14])
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ module SpeakerdeckApi
4
+ describe Speaker do
5
+
6
+ let!(:subject) { SpeakerdeckApi::Speaker }
7
+
8
+ describe '.get' do
9
+
10
+ context 'with invalid username' do
11
+
12
+ it 'throws a SpeakerNotFoundException' do
13
+ expect { subject.get('fake123') }.to raise_error(SpeakerdeckApi::Exceptions::SpeakerNotFoundException)
14
+ end
15
+
16
+ end
17
+
18
+ context 'with a valid username' do
19
+ it 'returns a SpeakerdeckApi::Speaker object' do
20
+ expect(subject.get('ferperales')).to be_a SpeakerdeckApi::Speaker
21
+ end
22
+
23
+ it 'contains the number of talks' do
24
+ expect(subject.get('ferperales')).to respond_to :number_of_talks
25
+ end
26
+
27
+ it 'contains the number of talks' do
28
+ expect(subject.get('ferperales').number_of_talks).to eql 14
29
+ end
30
+
31
+
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+
3
+ describe SpeakerdeckApi do
4
+
5
+ end
@@ -0,0 +1,5 @@
1
+ require 'speakerdeck_api'
2
+ require 'speakerdeck_api/speaker'
3
+ require 'speakerdeck_api/exceptions/speaker_not_found_exception'
4
+ require 'speakerdeck_api/connection'
5
+ require 'speakerdeck_api/parser'
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: speakerdeck_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Fer Perales
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-byebug
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description:
98
+ email:
99
+ - me@ferperales.net
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".travis.yml"
106
+ - Gemfile
107
+ - LICENSE.txt
108
+ - README.md
109
+ - Rakefile
110
+ - lib/speakerdeck_api.rb
111
+ - lib/speakerdeck_api/connection.rb
112
+ - lib/speakerdeck_api/exceptions/speaker_not_found_exception.rb
113
+ - lib/speakerdeck_api/parser.rb
114
+ - lib/speakerdeck_api/speaker.rb
115
+ - lib/speakerdeck_api/version.rb
116
+ - speakerdeck_api.gemspec
117
+ - spec/fixtures/speaker_profile.html
118
+ - spec/speakerdeck_api/connection_spec.rb
119
+ - spec/speakerdeck_api/parser_spec.rb
120
+ - spec/speakerdeck_api/speaker_spec.rb
121
+ - spec/speakerdeck_api_spec.rb
122
+ - spec/spec_helper.rb
123
+ homepage: ''
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubyforge_project:
143
+ rubygems_version: 2.2.2
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: A gem for getting data from speakerdeck.com
147
+ test_files:
148
+ - spec/fixtures/speaker_profile.html
149
+ - spec/speakerdeck_api/connection_spec.rb
150
+ - spec/speakerdeck_api/parser_spec.rb
151
+ - spec/speakerdeck_api/speaker_spec.rb
152
+ - spec/speakerdeck_api_spec.rb
153
+ - spec/spec_helper.rb