best_novels 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/best_novels +5 -0
- data/lib/best_novels.rb +17 -0
- data/lib/best_novels/cli.rb +66 -0
- data/lib/best_novels/novel.rb +31 -0
- data/lib/best_novels/scraper.rb +22 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: bcf430a2bdf331e15e35dcdb71815bcb159eb7f2270c3e7c39e648bba79cff6b
|
4
|
+
data.tar.gz: 5dee65b3166a9ade717130b4fb553733e82b377ed67f65777cdb53490f0a09d6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: be858dda9b55f71e17faf37add557584dbd07f79894576327d2887e95f14c01d3bc7151feca60f594ce401b08e3415683b5820b7a6319cc30c2918570badaec2
|
7
|
+
data.tar.gz: 0c2fe571c0cf9cf2b733611aca5f71e03ef591eabde5c14e480cedd4e0e5a4ef510ba017ae69b575f99431ff8f78ac964988fab4d48604d456048094e35d9321
|
data/bin/best_novels
ADDED
data/lib/best_novels.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative "./best_novels/version"
|
2
|
+
require_relative "./best_novels/cli"
|
3
|
+
require_relative "./best_novels/novel"
|
4
|
+
require_relative "./best_novels/scraper"
|
5
|
+
|
6
|
+
require "pry"
|
7
|
+
require "nokogiri"
|
8
|
+
require 'open-uri'
|
9
|
+
require 'colorize'
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
module BestNovels
|
15
|
+
class Error < StandardError; end
|
16
|
+
# Your code goes here...
|
17
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
class BestNovels::CLI
|
2
|
+
def call
|
3
|
+
puts "Welcome to The Guardian's List of 100 Best Novels!".colorize(:blue)
|
4
|
+
@input = ""
|
5
|
+
until @input == "exit"
|
6
|
+
get_novels
|
7
|
+
list_novels
|
8
|
+
get_user_novel
|
9
|
+
what_next
|
10
|
+
end
|
11
|
+
goodbye
|
12
|
+
end
|
13
|
+
|
14
|
+
|
15
|
+
def get_novels
|
16
|
+
@novels = BestNovels::Novel.all
|
17
|
+
end
|
18
|
+
|
19
|
+
def list_novels
|
20
|
+
puts ''
|
21
|
+
puts 'Choose a novel to read a review from The Guardian.'.colorize(:blue)
|
22
|
+
puts ''
|
23
|
+
|
24
|
+
@novels.each.with_index(1) do |novel, index|
|
25
|
+
puts "#{index}. #{novel.title}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_user_novel
|
30
|
+
chosen_novel = gets.strip.to_i
|
31
|
+
show_details_for(chosen_novel) if valid_input(chosen_novel, @novels)
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
def valid_input(input, data)
|
36
|
+
input.to_i <= data.length && input.to_i > 0
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
def show_details_for(chosen_novel)
|
42
|
+
novel = @novels[chosen_novel - 1]
|
43
|
+
novel.get_novel_details
|
44
|
+
puts ""
|
45
|
+
puts "The Guardian's Review of ".colorize(:blue) +
|
46
|
+
"#{novel.title}".colorize(:blue).bold
|
47
|
+
puts ""
|
48
|
+
puts novel.review
|
49
|
+
puts ""
|
50
|
+
puts "Read the full review:".colorize(:blue)
|
51
|
+
puts "#{novel.url}".colorize(:blue).underline
|
52
|
+
end
|
53
|
+
|
54
|
+
def what_next
|
55
|
+
puts ""
|
56
|
+
puts ""
|
57
|
+
puts "Are you done? Type 'exit' to exit or press any key to view the full list of novels.".colorize(:blue)
|
58
|
+
@input = gets.strip
|
59
|
+
end
|
60
|
+
|
61
|
+
def goodbye
|
62
|
+
puts "Thanks! Goodbye".colorize(:red)
|
63
|
+
end
|
64
|
+
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class BestNovels::Novel
|
2
|
+
#Create accessor methods for all variables given
|
3
|
+
attr_accessor :title, :url, :review
|
4
|
+
#class variable
|
5
|
+
@@all = []
|
6
|
+
|
7
|
+
def initialize(title, url)
|
8
|
+
#instance variables
|
9
|
+
@title = title
|
10
|
+
@url = url
|
11
|
+
save
|
12
|
+
end
|
13
|
+
|
14
|
+
#def title
|
15
|
+
#@title
|
16
|
+
#end
|
17
|
+
|
18
|
+
#class method
|
19
|
+
def self.all
|
20
|
+
BestNovels::Scraper.scrape_novels if @@all.empty?
|
21
|
+
@@all
|
22
|
+
end
|
23
|
+
|
24
|
+
def get_novel_details
|
25
|
+
BestNovels::Scraper.scrape_review(self)
|
26
|
+
end
|
27
|
+
|
28
|
+
def save
|
29
|
+
@@all << self
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class BestNovels::Scraper
|
2
|
+
#class method
|
3
|
+
def self.scrape_novels
|
4
|
+
site = "https://www.theguardian.com/books/2015/aug/17/the-100-best-novels-written-in-english-the-full-list"
|
5
|
+
doc = Nokogiri::HTML(open(site))
|
6
|
+
novels = doc.css("div.content__article-body.from-content-api.js-article__body p strong")
|
7
|
+
novels.each do |n|
|
8
|
+
title = n.css("a.u-underline").text.strip
|
9
|
+
url = n.css("a").attr("href").value
|
10
|
+
BestNovels::Novel.new(title, url)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
#class method
|
15
|
+
def self.scrape_review(novel)
|
16
|
+
url = "#{novel.url}"
|
17
|
+
doc = Nokogiri::HTML(open(url))
|
18
|
+
doc.css("div.content__article-body.from-content-api.js-article__body p:first-of-type").each do |paragraph|
|
19
|
+
novel.review = paragraph.text.strip
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: best_novels
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- jblair87
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-03-12 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: nokogiri
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: pry
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: colorize
|
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
|
+
description:
|
70
|
+
email:
|
71
|
+
- jenna.b.mandel@gmail.com
|
72
|
+
executables:
|
73
|
+
- best_novels
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- bin/best_novels
|
78
|
+
- lib/best_novels.rb
|
79
|
+
- lib/best_novels/cli.rb
|
80
|
+
- lib/best_novels/novel.rb
|
81
|
+
- lib/best_novels/scraper.rb
|
82
|
+
homepage: http://rubygems.org/gems/best_novels
|
83
|
+
licenses:
|
84
|
+
- MIT
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubygems_version: 3.1.2
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: '"A Command Line Interface for The Guardian''s "100 Best Novels Ever Written"'
|
105
|
+
test_files: []
|