whos_dated_who 0.3.1 → 1.0.0

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.
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: