speakerdeck_api 0.0.5 → 0.0.6

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.
@@ -4,7 +4,7 @@ module SpeakerdeckApi
4
4
  describe Connection do
5
5
 
6
6
  let(:valid_speaker) { 'ferperales' }
7
- let(:invalid_speaker) { 'jondoe' }
7
+ let(:invalid_speaker) { 'fake123' }
8
8
  let(:subject) { SpeakerdeckApi::Connection }
9
9
 
10
10
  it 'has a base URL' do
@@ -14,14 +14,18 @@ module SpeakerdeckApi
14
14
  describe '.get_speaker_data' do
15
15
  context 'with valid url' do
16
16
  it 'returns a parseable object' do
17
- expect(subject.new.get_speaker_data(valid_speaker)).to be_a Nokogiri::HTML::Document
17
+ VCR.use_cassette('speaker_profile_with_complete_info') do
18
+ expect(subject.new.get_speaker_data(valid_speaker)).to be_a Nokogiri::HTML::Document
19
+ end
18
20
  end
19
21
 
20
22
  end
21
23
 
22
24
  context 'with invalid url' do
23
25
  it 'raises a OpenURI::HTTPError' do
24
- expect { subject.new.get_speaker_data(invalid_speaker)}.to raise_error OpenURI::HTTPError
26
+ VCR.use_cassette('invalid_speaker') do
27
+ expect { subject.new.get_speaker_data(invalid_speaker)}.to raise_error OpenURI::HTTPError
28
+ end
25
29
  end
26
30
  end
27
31
  end
@@ -29,7 +33,9 @@ module SpeakerdeckApi
29
33
 
30
34
  describe '.url_for_speaker' do
31
35
  it 'returns the correct URL' do
32
- expect(subject.new.url_for_speaker('ferperales')).to be_eql('https://speakerdeck.com/ferperales')
36
+ VCR.use_cassette('speaker_profile_with_complete_info') do
37
+ expect(subject.new.url_for_speaker('ferperales')).to be_eql('https://speakerdeck.com/ferperales')
38
+ end
33
39
  end
34
40
  end
35
41
  end
@@ -3,45 +3,26 @@ require 'spec_helper'
3
3
  module SpeakerdeckApi
4
4
  describe Parser do
5
5
 
6
- let(:speaker_profile_page) do
7
- path = File.join(File.dirname(File.expand_path(__FILE__)), "../fixtures/speaker_profile.html")
8
- f = File.open(path)
9
- doc = Nokogiri::XML(f)
10
- f.close
11
- doc
12
- end
13
-
14
- let(:speaker_without_info) do
15
- path = File.join(File.dirname(File.expand_path(__FILE__)), "../fixtures/speaker_without_info.html")
16
- f = File.open(path)
17
- doc = Nokogiri::XML(f)
18
- f.close
19
- doc
20
- end
21
-
22
-
23
-
24
6
  context 'speakers' do
25
7
  describe '.get_speaker_details' do
26
- context 'valid speaker' do
8
+ context 'valid speaker with complete info' do
27
9
 
28
- it 'contains the "number of talks" key' do
29
- expect(subject.get_speaker_details(speaker_profile_page)).to have_key(:number_of_talks)
10
+ let(:speaker_profile_page) do
11
+ VCR.use_cassette('speaker_profile_with_complete_info') do
12
+ Nokogiri::HTML(open('https://speakerdeck.com/ferperales'))
13
+ end
30
14
  end
31
15
 
32
- it 'contains the right value' do
33
- expect(subject.get_speaker_details(speaker_profile_page).values_at(:number_of_talks)).to eql([14])
34
- end
35
16
 
36
- it 'contains the "name" key' do
37
- expect(subject.get_speaker_details(speaker_profile_page)).to have_key(:name)
17
+ it 'contains the number_of_talks key and correct value' do
18
+ expect(subject.get_speaker_details(speaker_profile_page).values_at(:number_of_talks)).to eql([14])
38
19
  end
39
20
 
40
- it 'contains the right value' do
21
+ it 'contains the name key and correct value' do
41
22
  expect(subject.get_speaker_details(speaker_profile_page).values_at(:name)).to eql(["Fernando Perales"])
42
23
  end
43
24
 
44
- it 'contains the "website" key' do
25
+ it 'contains the website key and correct value' do
45
26
  expect(subject.get_speaker_details(speaker_profile_page)).to have_key(:website)
46
27
  end
47
28
 
@@ -50,15 +31,22 @@ module SpeakerdeckApi
50
31
  end
51
32
 
52
33
  end
53
- end
54
34
 
55
- context 'speaker with no info' do
56
- it 'contains the "name" key' do
57
- expect(subject.get_speaker_details(speaker_without_info).values_at(:name)).to eql(["Erik Michaels-Ober"])
58
- end
35
+ context 'valid speaker with no info' do
59
36
 
60
- it 'contains the "website" key as empty string' do
61
- expect(subject.get_speaker_details(speaker_without_info).values_at(:website)).to eql([""])
37
+ let(:speaker_without_info) do
38
+ VCR.use_cassette('speaker_profile_without_info') do
39
+ Nokogiri::HTML(open('https://speakerdeck.com/sferik'))
40
+ end
41
+ end
42
+
43
+ it 'contains the name key and correct value' do
44
+ expect(subject.get_speaker_details(speaker_without_info).values_at(:name)).to eql(["Erik Michaels-Ober"])
45
+ end
46
+
47
+ it 'contains the "website" key as empty string' do
48
+ expect(subject.get_speaker_details(speaker_without_info).values_at(:website)).to eql([""])
49
+ end
62
50
  end
63
51
  end
64
52
  end
@@ -10,39 +10,47 @@ module SpeakerdeckApi
10
10
  context 'with invalid username' do
11
11
 
12
12
  it 'throws a SpeakerNotFoundException' do
13
- expect { subject.get('fake123') }.to raise_error(SpeakerdeckApi::Exceptions::SpeakerNotFoundException)
13
+ VCR.use_cassette('speaker_profile_with_complete_info') do
14
+ expect { subject.get('fake123') }.to raise_error(SpeakerdeckApi::Exceptions::SpeakerNotFoundException)
15
+ end
14
16
  end
15
17
 
16
18
  end
17
19
 
18
20
  context 'with a valid username' do
19
21
 
22
+ let(:subject) do
23
+ VCR.use_cassette('speaker_profile_with_complete_info') do
24
+ SpeakerdeckApi::Speaker.get 'ferperales'
25
+ end
26
+ end
27
+
20
28
  it 'returns a SpeakerdeckApi::Speaker object' do
21
- expect(subject.get('ferperales')).to be_a SpeakerdeckApi::Speaker
29
+ expect(subject).to be_a SpeakerdeckApi::Speaker
22
30
  end
23
31
 
24
32
  it 'contains the number_of_talks attribute' do
25
- expect(subject.get('ferperales')).to respond_to :number_of_talks
33
+ expect(subject).to respond_to :number_of_talks
26
34
  end
27
35
 
28
36
  it 'contains the correct number of talks' do
29
- expect(subject.get('ferperales').number_of_talks).to eql 14
37
+ expect(subject.number_of_talks).to eql 14
30
38
  end
31
39
 
32
40
  it 'contains the name attribute' do
33
- expect(subject.get('ferperales')).to respond_to :name
41
+ expect(subject).to respond_to :name
34
42
  end
35
43
 
36
44
  it 'contains the correct name number' do
37
- expect(subject.get('ferperales').name).to eql 'Fernando Perales'
45
+ expect(subject.name).to eql 'Fernando Perales'
38
46
  end
39
47
 
40
48
  it 'contains the website attribute' do
41
- expect(subject.get('ferperales')).to respond_to :website
49
+ expect(subject).to respond_to :website
42
50
  end
43
51
 
44
52
  it 'contains the correct website number' do
45
- expect(subject.get('ferperales').website).to eql 'http://ferperales.net/'
53
+ expect(subject.website).to eql 'http://ferperales.net/'
46
54
  end
47
55
 
48
56
  end
@@ -1,4 +1,6 @@
1
1
  require 'coveralls'
2
+ require 'vcr'
3
+
2
4
  Coveralls.wear!
3
5
 
4
6
  require 'speakerdeck_api'
@@ -6,3 +8,8 @@ require 'speakerdeck_api/speaker'
6
8
  require 'speakerdeck_api/exceptions/speaker_not_found_exception'
7
9
  require 'speakerdeck_api/connection'
8
10
  require 'speakerdeck_api/parser'
11
+
12
+ VCR.configure do |c|
13
+ c.cassette_library_dir = 'spec/fixtures/'
14
+ c.hook_into :webmock
15
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: speakerdeck_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fer Perales
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-21 00:00:00.000000000 Z
11
+ date: 2014-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: nokogiri
56
+ name: pry
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: pry
70
+ name: coveralls
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: coveralls
84
+ name: pry-byebug
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: pry-byebug
98
+ name: webmock
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -108,6 +108,34 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: nokogiri
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: vcr
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
111
139
  description:
112
140
  email:
113
141
  - me@ferperales.net
@@ -122,6 +150,9 @@ files:
122
150
  - LICENSE.txt
123
151
  - README.md
124
152
  - Rakefile
153
+ - fixtures/vcr_cassettes/foo.yml
154
+ - fixtures/vcr_cassettes/speaker_profile_with_complete_info.yml
155
+ - fixtures/vcr_cassettes/speaker_profile_without_info.yml
125
156
  - lib/speakerdeck_api.rb
126
157
  - lib/speakerdeck_api/connection.rb
127
158
  - lib/speakerdeck_api/exceptions/speaker_not_found_exception.rb
@@ -129,8 +160,9 @@ files:
129
160
  - lib/speakerdeck_api/speaker.rb
130
161
  - lib/speakerdeck_api/version.rb
131
162
  - speakerdeck_api.gemspec
132
- - spec/fixtures/speaker_profile.html
133
- - spec/fixtures/speaker_without_info.html
163
+ - spec/fixtures/invalid_speaker.yml
164
+ - spec/fixtures/speaker_profile_with_complete_info.yml
165
+ - spec/fixtures/speaker_profile_without_info.yml
134
166
  - spec/speakerdeck_api/connection_spec.rb
135
167
  - spec/speakerdeck_api/parser_spec.rb
136
168
  - spec/speakerdeck_api/speaker_spec.rb
@@ -161,8 +193,12 @@ signing_key:
161
193
  specification_version: 4
162
194
  summary: A gem for getting data from speakerdeck.com
163
195
  test_files:
164
- - spec/fixtures/speaker_profile.html
165
- - spec/fixtures/speaker_without_info.html
196
+ - fixtures/vcr_cassettes/foo.yml
197
+ - fixtures/vcr_cassettes/speaker_profile_with_complete_info.yml
198
+ - fixtures/vcr_cassettes/speaker_profile_without_info.yml
199
+ - spec/fixtures/invalid_speaker.yml
200
+ - spec/fixtures/speaker_profile_with_complete_info.yml
201
+ - spec/fixtures/speaker_profile_without_info.yml
166
202
  - spec/speakerdeck_api/connection_spec.rb
167
203
  - spec/speakerdeck_api/parser_spec.rb
168
204
  - spec/speakerdeck_api/speaker_spec.rb
@@ -1,388 +0,0 @@
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
-