bored-wikipedia-explorer 0.1.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 +7 -0
- data/bin/run +4 -0
- data/lib/command_line_interface.rb +61 -0
- data/lib/portal.rb +25 -0
- data/lib/scraper.rb +70 -0
- data/lib/topic.rb +42 -0
- metadata +48 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: cf79c1ca3b3092734ef5b9a8cebad458513ee39687d63055ac631bfb9f25be58
|
|
4
|
+
data.tar.gz: 5fc96f3106247e29568087ab1698bd49d72cccef58764e9b74458a90f74f1e37
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 9d5f2b16b680aae2139dd4715846c00fddf8d4dca5b0ee1b1a9d7acc192d58dab35e27ce7d675876cf3d23596267e11c33fbec02f8cefbfbd45a05b8a8892f55
|
|
7
|
+
data.tar.gz: 416000b632164d4f5589519a441ebcfe1301517d8dde0afbe0e6f3127859275b74321ba25cb0fcff1f53c25ca976e5211c0b3fff2eb8e64fc2068c1fd891f763
|
data/bin/run
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require_relative "../lib/topic.rb"
|
|
2
|
+
require "colorize"
|
|
3
|
+
require "launchy"
|
|
4
|
+
|
|
5
|
+
class CommandLineInterface
|
|
6
|
+
def self.run
|
|
7
|
+
puts "Welcome to Did-You-Know Wikipedia Edition!"
|
|
8
|
+
puts "Please select a topic to be given a random Wikipedia Portal to read:"
|
|
9
|
+
get_inputs #starts cli flow
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.get_inputs
|
|
13
|
+
display_all_topics #Displays all available main topics
|
|
14
|
+
puts "Select a number to explore that topic"
|
|
15
|
+
get_choice #gets users main topic choice
|
|
16
|
+
get_rand_url #gets random sub-topic and creates Portal objects
|
|
17
|
+
visit_portal #asks user if they want to visit the randomnly select sub-topic
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
#beautifies and lists the command line options
|
|
21
|
+
def self.display_all_topics
|
|
22
|
+
colors = [:red, :green, :yellow, :blue, :magenta, :cyan, :red, :green, :yellow, :blue, :magenta]
|
|
23
|
+
@list = []
|
|
24
|
+
Topic.all_topics_list.each_with_index{|item, indx|
|
|
25
|
+
@list << item
|
|
26
|
+
puts "#{indx + 1}. #{item}".colorize(colors[indx])
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.get_choice
|
|
31
|
+
@choice = @list[gets.strip.to_i - 1]
|
|
32
|
+
@topic = Topic.find_or_create_by_name(@choice)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.get_rand_url
|
|
36
|
+
@randurl = Scraper.scrape_portals_page(@choice)
|
|
37
|
+
@portal = Portal.find_or_create_by_url(@randurl)
|
|
38
|
+
@portal.name = Scraper.get_portal_name(@randurl)
|
|
39
|
+
@portal.topic = @topic
|
|
40
|
+
@topic.portals << @portal
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self.visit_portal
|
|
44
|
+
puts "We've selected " + Scraper.get_portal_name(@randurl)
|
|
45
|
+
+ " for you within the " + @choice +" topic you selected."
|
|
46
|
+
puts "Would you like to visit this page? (Y/N)"
|
|
47
|
+
if gets.strip.upcase == "Y"
|
|
48
|
+
puts @randurl
|
|
49
|
+
Launchy.open(@randurl)
|
|
50
|
+
else
|
|
51
|
+
puts "Either type 'reroll' to choose another page within the " + @choice + " topic you selected. Or select a new topic with 'new'."
|
|
52
|
+
choice = gets.strip
|
|
53
|
+
if choice == "reroll"
|
|
54
|
+
get_rand_url
|
|
55
|
+
visit_portal
|
|
56
|
+
elsif choice == "new"
|
|
57
|
+
get_inputs
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
data/lib/portal.rb
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require_relative "../lib/scraper.rb"
|
|
2
|
+
|
|
3
|
+
class Portal
|
|
4
|
+
attr_accessor :url, :topic, :name
|
|
5
|
+
@@all = []
|
|
6
|
+
|
|
7
|
+
def initialize(url)
|
|
8
|
+
@url = url
|
|
9
|
+
@@all << self
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.all
|
|
13
|
+
@@all
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def self.find_or_create_by_url(url)
|
|
17
|
+
if Portal.all.detect{|portal| url == portal.url}
|
|
18
|
+
@portal = Portal.all.detect{|portal| url == portal.url}
|
|
19
|
+
else
|
|
20
|
+
@portal = Portal.new(url)
|
|
21
|
+
# @@all << @portal
|
|
22
|
+
return @portal
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
data/lib/scraper.rb
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require 'open-uri'
|
|
2
|
+
require 'nokogiri'
|
|
3
|
+
require 'pry'
|
|
4
|
+
|
|
5
|
+
class Scraper
|
|
6
|
+
@@all_topics = []
|
|
7
|
+
|
|
8
|
+
def self.scrape_portals_page(name)
|
|
9
|
+
choice_index = @@all_topics.index(name) + 1
|
|
10
|
+
|
|
11
|
+
#choice is the chosen topic index
|
|
12
|
+
#there are 11 main topics derrived from Scraper.all_topics
|
|
13
|
+
html = open("https://en.wikipedia.org/wiki/Portal:Contents/Portals")
|
|
14
|
+
doc = Nokogiri::HTML(html) do |config|
|
|
15
|
+
config.noblanks
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
#set portals-container class for all portal links for each topic
|
|
19
|
+
#Thus there are 12 portal links containers but we're skipping the first one
|
|
20
|
+
doc.search("div").each{|anchor|
|
|
21
|
+
if anchor['style'] == "box-sizing: border-box; border: 0px solid #A3BFB1; border-bottom: 0px solid #A3BFB1;; border-top-width: 1px; vertical-align: top;background: #F5FFFA;opacity: 1; color: black; text-align: left; margin: 0 0 10px; padding: 1em;;padding-top: .3em;-moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;"
|
|
22
|
+
anchor['class'] = "portals-container"
|
|
23
|
+
end
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
#randomnly select a sub-portal from the main topic portal choice
|
|
27
|
+
randval = Random.new
|
|
28
|
+
randnum = randval.rand(doc.search(".portals-container")[choice_index].search("a").count{|i| i.attribute("href").value.include?("/wiki/Portal:")})
|
|
29
|
+
randportal = doc.search(".portals-container")[choice_index].search("a")[randnum].attribute("href").value.prepend("https://en.wikipedia.org")
|
|
30
|
+
return randportal
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
#Scrapes all main topics from all portals main page
|
|
35
|
+
def self.all_topics
|
|
36
|
+
html = open("https://en.wikipedia.org/wiki/Portal:Contents/Portals")
|
|
37
|
+
doc = Nokogiri::HTML(html) do |config|
|
|
38
|
+
config.noblanks
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#sets a container for the main topic headlines
|
|
42
|
+
doc.search("#mw-content-text div table table div").each{|anchor|
|
|
43
|
+
if anchor['style'] == "position: relative;border: 0px solid #A3BFB1;background: #CEF2E0;color: black;padding: .1em;text-align: center;font-weight: bold;font-size: 100%;margin-bottom: 0px;border-top: 1px solid #A3BFB1;border-bottom: 1px solid #A3BFB1;"
|
|
44
|
+
anchor['class'] = "title_container" unless anchor.text.include?("General reference")
|
|
45
|
+
end
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#set .headlines class for all main topics
|
|
49
|
+
doc.search("h2 .mw-headline big").each{|anchor|
|
|
50
|
+
anchor['class'] = "headlines" unless anchor.text == "Wikipedia's contents: Portals" || anchor.text == "Wikipedia's contents: Portals" || anchor.text.include?("General reference")
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
#updating the @@all_topics hash with topic symbols
|
|
54
|
+
doc.search(".headlines").each{|anchor|
|
|
55
|
+
copy = anchor.text.chomp("(see in all page types)").strip
|
|
56
|
+
copy.slice!(-3..-1)
|
|
57
|
+
@@all_topics << copy
|
|
58
|
+
}
|
|
59
|
+
return @@all_topics
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.get_portal_name(url)
|
|
63
|
+
html = open(url)
|
|
64
|
+
doc = Nokogiri::HTML(html) do |config|
|
|
65
|
+
config.noblanks
|
|
66
|
+
end
|
|
67
|
+
return doc.search("title").text
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
data/lib/topic.rb
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require_relative "../lib/scraper.rb"
|
|
2
|
+
require_relative "../lib/portal.rb"
|
|
3
|
+
|
|
4
|
+
class Topic
|
|
5
|
+
#has many Portals
|
|
6
|
+
@@all = []
|
|
7
|
+
attr_accessor :name, :portals
|
|
8
|
+
def initialize(name)
|
|
9
|
+
@name = name
|
|
10
|
+
@portals = []
|
|
11
|
+
# add_portal
|
|
12
|
+
@@all << self
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def find_random_portal_page
|
|
16
|
+
find_rand_portal = Scraper.scrape_portals_page(@name).sample
|
|
17
|
+
# create_portal = Portal.find_rand_portal
|
|
18
|
+
# return create_portal
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.all_topics_list
|
|
22
|
+
return Scraper.all_topics
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def portals
|
|
26
|
+
@portals
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.all
|
|
30
|
+
@@all
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.find_or_create_by_name(name)
|
|
34
|
+
if self.all.detect{|topic| topic.name == name}
|
|
35
|
+
@topic = self.all.detect{|topic| topic.name == name}
|
|
36
|
+
else
|
|
37
|
+
@topic = self.new(name)
|
|
38
|
+
end
|
|
39
|
+
@topic
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: bored-wikipedia-explorer
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Katrina Brinson
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2018-09-01 00:00:00.000000000 Z
|
|
12
|
+
dependencies: []
|
|
13
|
+
description: A simple content discovery gem
|
|
14
|
+
email: kbrinso@gmail.com
|
|
15
|
+
executables: []
|
|
16
|
+
extensions: []
|
|
17
|
+
extra_rdoc_files: []
|
|
18
|
+
files:
|
|
19
|
+
- bin/run
|
|
20
|
+
- lib/command_line_interface.rb
|
|
21
|
+
- lib/portal.rb
|
|
22
|
+
- lib/scraper.rb
|
|
23
|
+
- lib/topic.rb
|
|
24
|
+
homepage: http://rubygems.org/gems/bored-wikipedia-explorer
|
|
25
|
+
licenses:
|
|
26
|
+
- MIT
|
|
27
|
+
metadata: {}
|
|
28
|
+
post_install_message:
|
|
29
|
+
rdoc_options: []
|
|
30
|
+
require_paths:
|
|
31
|
+
- lib
|
|
32
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
33
|
+
requirements:
|
|
34
|
+
- - ">="
|
|
35
|
+
- !ruby/object:Gem::Version
|
|
36
|
+
version: '0'
|
|
37
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
38
|
+
requirements:
|
|
39
|
+
- - ">="
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '0'
|
|
42
|
+
requirements: []
|
|
43
|
+
rubyforge_project:
|
|
44
|
+
rubygems_version: 2.7.3
|
|
45
|
+
signing_key:
|
|
46
|
+
specification_version: 4
|
|
47
|
+
summary: If you're bored this is the CLI app for you to explore new topics on Wikipedia.
|
|
48
|
+
test_files: []
|