whos_dated_who 0.3.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6926df4ea88a005695b59c0aeaf9ea31945c1cde
4
- data.tar.gz: 9fc1d12d3d151d8d5499b9cae8df2ea01e0886dc
3
+ metadata.gz: a5246ad18e26101327c9f7648c893fae3b1fdc1b
4
+ data.tar.gz: 33b92cf602bb0c9678dcc4432913bc41378df622
5
5
  SHA512:
6
- metadata.gz: d21d1383ba7f9a095f3909a9b18d5633b92ada3afa1eb867885b19e6069ca2eb97dfb6f86ab2a78dbabe968024824801d16ee8e4f1ff899850ca13504dc55b6f
7
- data.tar.gz: 26d201634852dc932e49afd46866257fab9525c2493b02f4b91bc1ce4b32b90ff3cf0825476c8c96b0198d5491eace5c426907ed8b8d23d50bb103f61970f24b
6
+ metadata.gz: 9581d74ca3ee89f125966ea3244cfb441279b90b3870d3fa8ebcf8d8f2459a40b0dd4c1a895e021e28a75fa6b017d34f8f4d47735190647926bd7b024401b2c5
7
+ data.tar.gz: 888aa209ec8573b714293ac4989df7d1014897f83957589d0343ce9071fcf25cdcc30d381400672baf73819436e7ee797e5f75218e8f5a17b4a2f91327cc81c6
data/.rubocop.yml ADDED
@@ -0,0 +1,4 @@
1
+ # Offense count: 9
2
+ Style/Documentation:
3
+ Enabled: false
4
+
data/.travis.yml CHANGED
@@ -1,3 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.2
3
+ - 2.2.2
4
+ - 2.1.2
5
+ env:
6
+ global:
7
+ secure: LajEHfUoZ43iJI3DWRWNyWRumb73A4fCMJyTxP3chHoA7Rbh6Baie1vuQVDCbt4TiOMlZVhP7d21JonsvsFyfagKdTTNyUM1m9pNXWX1z/mIV51/TtOgpx2o8eNExI2SB4LqOrLDZ/UFvdl9xIrgmUQgRjcjqfq5MmNHLO1N/co=
@@ -1,16 +1,19 @@
1
1
  require 'yaml'
2
2
  module WhosDatedWho
3
3
  class BingClient
4
- API_KEY = ENV['BING_API_KEY'] ||
5
- YAML.load_file(File.expand_path('~/.whos_dated_who.yml'))[:bing_api_key]
6
-
7
- def initialize(type = 'Web', num_results = 10, api_key = API_KEY)
8
- @api_key = api_key
4
+ def initialize(type = 'Web', num_results = 10, api_key = nil)
5
+ @api_key = api_key || ENV['BING_API_KEY'] || config[:bing_api_key]
9
6
  @client = Bing.new(@api_key, num_results, type)
10
7
  end
11
8
 
12
9
  def search(query)
13
10
  @client.search(query)
14
11
  end
12
+
13
+ private
14
+
15
+ def config
16
+ @config ||= YAML.load_file(File.expand_path('~/.whos_dated_who.yml'))
17
+ end
15
18
  end
16
19
  end
@@ -4,6 +4,7 @@ class Biography < Hashie::Trash
4
4
  include Hashie::Extensions::IgnoreUndeclared
5
5
 
6
6
  @split_on_comma = ->(i) { i.is_a?(Array) ? i : i.split(', ') }
7
+ @parse_date = ->(i) { Date.parse(i) }
7
8
 
8
9
  property :first_name
9
10
  property :middle_name
@@ -12,7 +13,7 @@ class Biography < Hashie::Trash
12
13
  property :full_name_at_birth
13
14
  property :other_names # array
14
15
  property :age, transform_with: ->(i) { i.to_i }
15
- property :born_on, from: :date_of_birth, transform_with: ->(i) { Date.parse(i) }
16
+ property :born_on, from: :date_of_birth, transform_with: @parse_date
16
17
  property :born_at, from: :birthplace
17
18
  property :height
18
19
  property :weight
@@ -11,23 +11,24 @@ module WhosDatedWho
11
11
  desc 'query', 'Return the relationship status of a celebrity'
12
12
  def query(name)
13
13
  result = Client.new.fetch(name)
14
- puts "#{result[:relationship_status]}: #{result[:current_relationship][:human]}"
14
+ status = [
15
+ result[:relationship_status], result[:current_relationship][:human]
16
+ ].join(': ')
17
+
18
+ puts status
15
19
  puts result[:current_relationship][:dates].join(', ')
16
20
  end
17
21
 
18
- desc 'explore', 'Return the relationship status of everyone included in celebs.yml'
22
+ desc 'explore', 'Return the relationship status of everyone in celebs.yml'
19
23
  def explore
20
- results = []
21
- celebs = my_celebs
22
- celebs.each do |celeb|
24
+ my_celebs.map do |celeb|
23
25
  puts "Processing #{celeb}..."
24
26
  begin
25
- results << Client.new.fetch(celeb)
27
+ Client.new.fetch(celeb)
26
28
  rescue
27
29
  puts "Error processing #{celeb}"
28
30
  end
29
- end
30
- results
31
+ end.compact
31
32
  end
32
33
 
33
34
  desc 'import_mine', 'Import my favorites into RethinkDB'
@@ -37,7 +38,8 @@ module WhosDatedWho
37
38
 
38
39
  desc 'import_maxim', 'Import maxim hot 100'
39
40
  def import_maxim
40
- resp = Faraday.get('http://www.maxim.com/hot100/2014')
41
+ # TODO
42
+ # resp = Faraday.get('http://www.maxim.com/hot100/2014')
41
43
  end
42
44
 
43
45
  private
@@ -4,15 +4,8 @@ module WhosDatedWho
4
4
  bing_results = BingClient.new.search("#{name} site:dating.famousfix.com")
5
5
  url = bing_results.first[:Web].first[:Url]
6
6
  resp = Faraday.get(url)
7
- if resp.success?
8
- Parser.new.parse(resp.body)
9
- end
10
- end
11
-
12
- private
13
7
 
14
- def normalize(name)
15
- name.gsub(/\s/, '-').downcase
8
+ resp.success? && Parser.new.parse(resp.body)
16
9
  end
17
10
  end
18
11
  end
@@ -4,28 +4,38 @@ module WhosDatedWho
4
4
  attr_reader :conn, :logger, :table_name
5
5
 
6
6
  def initialize(db, table_name)
7
- @conn = r.connect(host: 'localhost', db: db || 'celebs')
8
- @logger = Logger.new(STDOUT)
7
+ @conn = r.connect(host: 'localhost', db: db || 'celebs')
8
+ @logger = Logger.new(STDOUT)
9
9
  @table_name = table_name
10
10
  end
11
11
 
12
12
  def fetch_and_import(celebs)
13
13
  celebs.each do |celeb|
14
- begin
15
- logger.info "Fetching #{celeb}"
16
- result = Client.new.fetch(celeb)
17
- logger.info "Importing #{celeb} to #{table_name}"
18
- import(result)
19
- rescue
20
- first_name, last_name = celeb.split
21
- r.table("missing_#{table_name}").insert(first_name: first_name, last_name: last_name).run(conn)
22
- logger.error("Error importing #{celeb}, added to missing")
23
- end
14
+ logger.info "Fetching #{celeb}"
15
+ import_celeb(celeb)
24
16
  end
25
17
  end
26
18
 
27
- def import(results)
19
+ private
20
+
21
+ def import_celeb(celeb)
22
+ result = Client.new.fetch(celeb)
23
+ logger.info "Importing #{celeb} to #{table_name}"
24
+ create(result)
25
+ rescue
26
+ logger.error("Error importing #{celeb}, added to missing")
27
+ add_to_missing_celebs(celeb)
28
+ end
29
+
30
+ def create(results)
28
31
  r.table(table_name).insert(JSON.parse(results.to_json)).run(conn)
29
32
  end
33
+
34
+ def add_to_missing_celebs(celeb)
35
+ first_name, last_name = celeb.split
36
+ r.table("missing_#{table_name}").insert(
37
+ first_name: first_name, last_name: last_name
38
+ ).run(conn)
39
+ end
30
40
  end
31
41
  end
@@ -17,48 +17,66 @@ module WhosDatedWho
17
17
  private
18
18
 
19
19
  def extract_bio
20
- result = {}
20
+ result = parse_bio(@doc.css('#rcol .cbox-nopad:nth-child(3)'))
21
21
  result[:description] = @doc.css('#wikitext').text
22
22
 
23
- bio = @doc.css('#rcol .cbox-nopad:nth-child(3)')
24
- bio.css('.posl, .posr').each do |el|
25
- if el.matches?('.posl')
26
- @key = el.content
27
- else
28
- key = normalize_bio_key(@key)
29
- if el.css('div').size > 0
30
- result[key] = [] unless result[key]
31
- result[key] = el.children.map(&:content).reject do |c|
32
- c.empty? || c =~ /^\s\(/
33
- end
34
- else
35
- value = el.content.rstrip
36
- if respond_to?("parse_#{key}".to_sym, true)
37
- result[key] = send("parse_#{key}", value)
38
- else
39
- result[key] = value
40
- end
41
- end
42
- end
43
- end
44
-
45
23
  @biography = Biography.new(result.symbolize_keys)
46
24
  end
47
25
 
48
26
  def extract_current_relationship
49
27
  current = @doc.css('.pbox.datebox')
50
28
  relationship = {}
29
+
51
30
  relationship[:human] = current.css('div.padb10:first').text
52
31
  relationship[:dates] = current.css('ul li').map(&:content)
53
32
  result[:current_relationship] = relationship
54
- result[:status] = :married if relationship[:human] =~ /married/
55
- result[:status] = :engaged if relationship[:human] =~ /engaged/
56
- result[:status] = :rumored if relationship[:human] =~ /rumored/
57
- result[:status] = :dating if relationship[:human] =~ /dating/
58
- result[:status] = :single if relationship[:human] =~ /single/
33
+
34
+ result[:status] = parse_relationship_status(relationship)
59
35
  relationship
60
36
  end
61
37
 
38
+ def list?(el)
39
+ el.css('div').size > 0
40
+ end
41
+
42
+ def parse_bio(bio)
43
+ bio.css('.posl, .posr').each_with_object({}) do |el, result|
44
+ if el.matches?('.posl')
45
+ @key = el.content
46
+ else
47
+ key = normalize_bio_key(@key)
48
+ result[key] = list?(el) ? parse_list(el) : parse_content(el, key)
49
+ end
50
+ end
51
+ end
52
+
53
+ def parse_list(el)
54
+ el.children.map(&:content).reject do |c|
55
+ c.empty? || c =~ /^\s\(/
56
+ end
57
+ end
58
+
59
+ def parse_content(el, key)
60
+ value = el.content.rstrip
61
+ if respond_to?("parse_#{key}".to_sym, true)
62
+ send("parse_#{key}", value)
63
+ else
64
+ value
65
+ end
66
+ end
67
+
68
+ def parse_relationship_status(relationship)
69
+ case relationship[:human]
70
+ when /married/ then :married
71
+ when /engaged/ then :engaged
72
+ when /rumored/ then :rumored
73
+ when /dating/ then :dating
74
+ when /single/ then :single
75
+ else
76
+ :unknown
77
+ end
78
+ end
79
+
62
80
  def extract_past_relationships
63
81
  end
64
82
 
@@ -1,3 +1,3 @@
1
1
  module WhosDatedWho
2
- VERSION = '0.3.1'
2
+ VERSION = '1.0.0'
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -1,16 +1,26 @@
1
+ require 'simplecov'
1
2
  require 'coveralls'
2
- Coveralls.wear!
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
+ ]
8
+ SimpleCov.start do
9
+ add_filter 'spec'
10
+ end
3
11
 
4
12
  require 'pry'
5
13
  require 'whos_dated_who'
6
14
 
15
+ Dir[File.expand_path('..', __FILE__) + '/support/**/*.rb'].each do |f|
16
+ require(f)
17
+ end
18
+
7
19
  RSpec.configure do |config|
8
20
  config.filter_run :focus
9
21
  config.run_all_when_everything_filtered = true
10
22
 
11
- if config.files_to_run.one?
12
- config.default_formatter = 'doc'
13
- end
23
+ config.default_formatter = 'doc' if config.files_to_run.one?
14
24
 
15
25
  config.profile_examples = 10
16
26
 
@@ -0,0 +1,13 @@
1
+ module FixtureHelpers
2
+ def fixture_response(name)
3
+ File.read(fixture_file("#{name}.resp"))
4
+ end
5
+
6
+ def fixture_file(filename)
7
+ File.expand_path("../../fixtures/#{filename}", __FILE__)
8
+ end
9
+ end
10
+
11
+ RSpec.configure do |config|
12
+ config.include(FixtureHelpers)
13
+ end
@@ -3,9 +3,9 @@ require 'spec_helper'
3
3
  module WhosDatedWho
4
4
  describe Parser do
5
5
  let(:parser) { Parser.new }
6
+
6
7
  before do
7
- body = File.read(File.expand_path('../../fixtures/scarlett-johansson.resp', __FILE__))
8
- parser.parse(body)
8
+ parser.parse(fixture_response(:scarlett_johansson))
9
9
  @result = parser.result.biography
10
10
  end
11
11
 
@@ -42,7 +42,7 @@ module WhosDatedWho
42
42
  [
43
43
  :other_names, :brand_endorsements, :websites, :brothers, :sisters,
44
44
  :friends, :pets, :favorite_movies, :favorite_places, :favorite_foods,
45
- :favorite_colors, :favorite_accessories
45
+ :favorite_colors, :favorite_accessories, :distinctive_features
46
46
  ].each do |key|
47
47
  expect(@result[key]).to be_kind_of(Array)
48
48
  end
@@ -56,10 +56,14 @@ module WhosDatedWho
56
56
  expect(@result.pets.size).to eq(2)
57
57
  expect(@result.favorite_movies).to include(/Heat/)
58
58
  expect(@result.favorite_places).to include('London')
59
+ expect(@result.distinctive_features).to include(/Lips/)
60
+ expect(@result.distinctive_features).to include(/Husky Voice/)
59
61
  end
60
62
 
61
63
  it 'gets a description' do
62
- expect(@result.description).to match(/American actress, model, and singer/)
64
+ expect(@result.description).to match(
65
+ /American actress, model, and singer/
66
+ )
63
67
  end
64
68
  end
65
69
  end
@@ -32,4 +32,6 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency 'pry-rescue'
33
33
  spec.add_development_dependency 'coveralls'
34
34
  spec.add_development_dependency 'rethinkdb'
35
+ spec.add_development_dependency 'awesome_print'
36
+ spec.add_development_dependency 'rubocop'
35
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whos_dated_who
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adrian Perez
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-25 00:00:00.000000000 Z
11
+ date: 2015-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -192,6 +192,34 @@ dependencies:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: awesome_print
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - ">="
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - ">="
207
+ - !ruby/object:Gem::Version
208
+ version: '0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: rubocop
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
195
223
  description: Unofficial API for whosdatedwho.com
196
224
  email:
197
225
  - adrianperez.deb@gmail.com
@@ -202,6 +230,7 @@ extra_rdoc_files: []
202
230
  files:
203
231
  - ".gitignore"
204
232
  - ".rspec"
233
+ - ".rubocop.yml"
205
234
  - ".travis.yml"
206
235
  - Gemfile
207
236
  - LICENSE.txt
@@ -218,8 +247,9 @@ files:
218
247
  - lib/whos_dated_who/parser.rb
219
248
  - lib/whos_dated_who/version.rb
220
249
  - spec/acceptance/whos_dated_who_spec.rb
221
- - spec/fixtures/scarlett-johansson.resp
250
+ - spec/fixtures/scarlett_johansson.resp
222
251
  - spec/spec_helper.rb
252
+ - spec/support/fixture_helpers.rb
223
253
  - spec/whos_dated_who/client_spec.rb
224
254
  - spec/whos_dated_who/parser_spec.rb
225
255
  - whos_dated_who.gemspec
@@ -249,8 +279,9 @@ specification_version: 4
249
279
  summary: Unofficial API for whosdatedwho.com
250
280
  test_files:
251
281
  - spec/acceptance/whos_dated_who_spec.rb
252
- - spec/fixtures/scarlett-johansson.resp
282
+ - spec/fixtures/scarlett_johansson.resp
253
283
  - spec/spec_helper.rb
284
+ - spec/support/fixture_helpers.rb
254
285
  - spec/whos_dated_who/client_spec.rb
255
286
  - spec/whos_dated_who/parser_spec.rb
256
287
  has_rdoc: