nyt-bestsellers 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.
- checksums.yaml +7 -0
- data/bin/nyt-bestsellers +5 -0
- data/config/environment.rb +10 -0
- data/lib/nyt_bestsellers.rb +4 -0
- data/lib/nytimes/book.rb +30 -0
- data/lib/nytimes/cli.rb +109 -0
- data/lib/nytimes/genre.rb +30 -0
- data/lib/nytimes/scraper.rb +49 -0
- metadata +151 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dde1d8da6a957133ddcfcaf3958afaa6c2c684cf
|
4
|
+
data.tar.gz: fbac5bfe18ed7f0118969a35f0bf42f4afda17ab
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2e9985ef36a159d93856faba0cb499eb2487fab82d516afe1bf47e28b5b1b7614222a4e0b5109bf291c5be4645aa9d0dd09091f0272bb95125c257f140599235
|
7
|
+
data.tar.gz: d1d9605341e715ece07266d62c01050e7dbcec79f33b21e7d43c501552c89ba2d66af2a9657b795877cdfebd1298bdc85fdab0b9b4b000434a43c64f546b95dd
|
data/bin/nyt-bestsellers
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'pry'
|
2
|
+
require 'nokogiri'
|
3
|
+
require 'open-uri'
|
4
|
+
require 'colorize'
|
5
|
+
require 'mechanize'
|
6
|
+
|
7
|
+
require_relative '../lib/nytimes/scraper'
|
8
|
+
require_relative '../lib/nytimes/book'
|
9
|
+
require_relative '../lib/nytimes/cli'
|
10
|
+
require_relative '../lib/nytimes/genre'
|
data/lib/nytimes/book.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
class NYTBestsellers::Book
|
2
|
+
|
3
|
+
attr_accessor :genre, :title, :author, :publisher, :wol, :summary
|
4
|
+
|
5
|
+
@@all = []
|
6
|
+
|
7
|
+
def initialize(genre=nil, title=nil, author=nil, publisher=nil, wol=nil, summary=nil)
|
8
|
+
@genre = NYTBestsellers::Genre.find_by_name(genre)
|
9
|
+
@genre.books << self if !wol.empty? || !summary.empty?
|
10
|
+
@title = title
|
11
|
+
@author = author
|
12
|
+
@publisher = publisher
|
13
|
+
@wol = wol
|
14
|
+
@summary = summary
|
15
|
+
@@all << self if !wol.empty? || !summary.empty?
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.all
|
19
|
+
@@all
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.find_by_title(name)
|
23
|
+
self.all.find do |book|
|
24
|
+
if name == book.title
|
25
|
+
book
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/lib/nytimes/cli.rb
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
class NYTBestsellers::CLI
|
2
|
+
|
3
|
+
def call
|
4
|
+
NYTBestsellers::Scraper.make_genres
|
5
|
+
NYTBestsellers::Scraper.make_books
|
6
|
+
puts ""
|
7
|
+
puts "Welcome to the New York Times Bestsellers List".blue.bold
|
8
|
+
run
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
puts "-------------------"
|
13
|
+
puts ""
|
14
|
+
puts "NYT Bestsellers - Week of #{NYTBestsellers::Scraper.get_date}".bold.blue
|
15
|
+
puts "(Lists are published early online.)".bold.blue
|
16
|
+
puts ""
|
17
|
+
puts "Here are the categories:"
|
18
|
+
puts ""
|
19
|
+
display_genres
|
20
|
+
puts ""
|
21
|
+
|
22
|
+
response = ""
|
23
|
+
while response != "exit"
|
24
|
+
puts "Select a category by number: " + "[exit]".light_red
|
25
|
+
response = gets.strip
|
26
|
+
if (1..5).to_a.include?(response.to_i)
|
27
|
+
genre_books(response.to_i)
|
28
|
+
elsif response == "exit"
|
29
|
+
puts "Goodbye!~".bold.red
|
30
|
+
puts ""
|
31
|
+
exit
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def display_genres
|
37
|
+
NYTBestsellers::Genre.all.each_with_index do |genre, index|
|
38
|
+
puts "#{index+1} - #{genre.name}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def genre_books(response)
|
43
|
+
genre = NYTBestsellers::Genre.find_by_num(response)
|
44
|
+
puts ""
|
45
|
+
puts "****----#{genre.name.upcase}----****".blue.bold
|
46
|
+
puts ""
|
47
|
+
puts " Rank^ Title"
|
48
|
+
puts " ----- -----"
|
49
|
+
genre.books.each_with_index do |book, index|
|
50
|
+
rank = " #{index+1} "
|
51
|
+
rank << " " if (0..8).include?(index)
|
52
|
+
|
53
|
+
title = " #{book.title}"
|
54
|
+
puts rank + title
|
55
|
+
end
|
56
|
+
|
57
|
+
puts ""
|
58
|
+
puts "(^refers to the current position on the bestseller's list)"
|
59
|
+
puts ""
|
60
|
+
puts "Select a book by rank number to get more info: " + "[back][exit]".light_red
|
61
|
+
puts ""
|
62
|
+
|
63
|
+
book_input = gets.strip
|
64
|
+
puts ""
|
65
|
+
display_book_info(response, book_input)
|
66
|
+
if book_input == "back"
|
67
|
+
run
|
68
|
+
elsif book_input == "exit"
|
69
|
+
puts "Goodbye!~".bold.red
|
70
|
+
puts ""
|
71
|
+
exit
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def display_book_info(response, book_input)
|
76
|
+
genre = NYTBestsellers::Genre.find_by_num(response)
|
77
|
+
|
78
|
+
genre.books.each_with_index do |book, index|
|
79
|
+
if book_input.to_i == index+1
|
80
|
+
puts "****----#{book.title}----****".blue.bold
|
81
|
+
puts ""
|
82
|
+
puts "Weeks On Bestseller:".bold + " #{book.wol}"
|
83
|
+
puts "Author:".bold + " #{book.author}"
|
84
|
+
puts "Publisher:".bold + " #{book.publisher}"
|
85
|
+
puts "Genre:".bold + " #{book.genre.name}"
|
86
|
+
puts ""
|
87
|
+
puts "---------Summary---------".bold
|
88
|
+
puts "#{book.summary}"
|
89
|
+
puts ""
|
90
|
+
puts "[back][menu][exit]".light_red
|
91
|
+
puts ""
|
92
|
+
|
93
|
+
input = gets.strip
|
94
|
+
puts ""
|
95
|
+
if input == "back"
|
96
|
+
genre_books(response)
|
97
|
+
elsif input == "exit"
|
98
|
+
puts "Goodbye!~".bold.red
|
99
|
+
puts ""
|
100
|
+
exit
|
101
|
+
elsif input == "menu"
|
102
|
+
run
|
103
|
+
puts ""
|
104
|
+
end #second if
|
105
|
+
end #first if
|
106
|
+
end #each
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class NYTBestsellers::Genre
|
2
|
+
|
3
|
+
attr_accessor :name, :url
|
4
|
+
|
5
|
+
@@all = []
|
6
|
+
|
7
|
+
def initialize(name=nil, url=nil)
|
8
|
+
@name = name
|
9
|
+
@url = url
|
10
|
+
@@all << self
|
11
|
+
@books = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.all
|
15
|
+
@@all
|
16
|
+
end
|
17
|
+
|
18
|
+
def books
|
19
|
+
@books
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.find_by_name(genre_name)
|
23
|
+
self.all.find {|x| x.name == genre_name}
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.find_by_num(num_input)
|
27
|
+
self.all[num_input.to_i-1]
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class NYTBestsellers::Scraper
|
2
|
+
|
3
|
+
def self.get_page
|
4
|
+
agent = Mechanize.new
|
5
|
+
page = agent.get("http://www.nytimes.com/books/best-sellers/")
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.scrape_genres
|
9
|
+
get_page.css("section.subcategory")
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.make_genres
|
13
|
+
scrape_genres.each do |category|
|
14
|
+
NYTBestsellers::Genre.new(
|
15
|
+
category.css("a.subcategory-heading-link").text.strip,
|
16
|
+
"http://www.nytimes.com#{category.css("a").attr("href").text}"
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.get_genre_pages
|
22
|
+
agent = Mechanize.new
|
23
|
+
NYTBestsellers::Genre.all.collect do |genre|
|
24
|
+
page = agent.get("#{genre.url}")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.make_books
|
29
|
+
get_genre_pages.each do |page|
|
30
|
+
books = page.css("div.book-body")
|
31
|
+
|
32
|
+
books.each do |book|
|
33
|
+
NYTBestsellers::Book.new(
|
34
|
+
page.css("h1").text.split(/\s-\s/)[0].strip, #genre
|
35
|
+
book.css("h2.title").text.split.collect(&:capitalize).join(" "),
|
36
|
+
book.css("p.author").text.split.delete_if{|x| x == "by"}.join(" "),
|
37
|
+
book.css("p.publisher").text,
|
38
|
+
book.css("p.freshness").text,
|
39
|
+
book.css("p.description").text
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.get_date
|
46
|
+
get_page.css("div.date-range").text.strip
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
metadata
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nyt-bestsellers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Amy Back
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-09-19 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.11'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.11'
|
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: '3.0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.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: colorize
|
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
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: mechanize
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: A CLI based on the New York Times Bestsellers List. Provides list of
|
112
|
+
top-selling books by genre.
|
113
|
+
email: aback1227@gmail.com
|
114
|
+
executables:
|
115
|
+
- nyt-bestsellers
|
116
|
+
extensions: []
|
117
|
+
extra_rdoc_files: []
|
118
|
+
files:
|
119
|
+
- bin/nyt-bestsellers
|
120
|
+
- config/environment.rb
|
121
|
+
- lib/nyt_bestsellers.rb
|
122
|
+
- lib/nytimes/book.rb
|
123
|
+
- lib/nytimes/cli.rb
|
124
|
+
- lib/nytimes/genre.rb
|
125
|
+
- lib/nytimes/scraper.rb
|
126
|
+
homepage: https://github.com/aback1227/nyt-bestsellers
|
127
|
+
licenses:
|
128
|
+
- MIT
|
129
|
+
metadata: {}
|
130
|
+
post_install_message:
|
131
|
+
rdoc_options: []
|
132
|
+
require_paths:
|
133
|
+
- lib
|
134
|
+
- lib/nytimes
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
145
|
+
requirements: []
|
146
|
+
rubyforge_project:
|
147
|
+
rubygems_version: 2.6.3
|
148
|
+
signing_key:
|
149
|
+
specification_version: 4
|
150
|
+
summary: Lists books by genre from the NYT Bestsellers List
|
151
|
+
test_files: []
|