speakerdeck_api 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
-