best-nomad-cities 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/best-nomad-cities +5 -0
- data/config/environment.rb +7 -0
- data/lib/best_nomad_cities.rb +4 -0
- data/lib/best_nomad_cities/city.rb +34 -0
- data/lib/best_nomad_cities/cli.rb +96 -0
- data/lib/best_nomad_cities/scraper.rb +16 -0
- metadata +120 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 92f33468eac7eb1d083fbc45ebfdf096b2b708b5
|
4
|
+
data.tar.gz: 786012d5adac6edb26621490ae510d1ea6cfbf9d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 952cf0dbd1df953edaa10144ac427254fe17ea445e680ce5a768f61eee61c83fa18d00c3885e1d5bf11bb2861576b99fd3b12db8f3d6394baa519327f1b8dfa1
|
7
|
+
data.tar.gz: d45c68e71ada9a0819f2f688220be8e88b8155249209dae2566c381e03c0c88391532a341ecb326a607d5c20e7318bcfd703cbad144643bbe0b7e8c0a8c8a7a0
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class BestNomadCities::City
|
2
|
+
attr_accessor :name, :rank, :country, :cost, :internet_speed, :weather, :link, :tg_link
|
3
|
+
|
4
|
+
@@all = []
|
5
|
+
|
6
|
+
def self.new_from_home_page(city)
|
7
|
+
self.new(
|
8
|
+
city.css("h2").text,
|
9
|
+
city.css("h3").text,
|
10
|
+
city.css(".rank").text,
|
11
|
+
city.css(".bottom-right").text,
|
12
|
+
city.css(".top-right").text,
|
13
|
+
"#{city.css(".metric").text} / #{city.css(".imperial").text}",
|
14
|
+
city.css('a').attribute('href').value,
|
15
|
+
"#{city.css('a').attribute('href').value}/travel-guide"
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(name = nil, country = nil, rank = nil, cost = nil, internet_speed = nil, weather = nil, link = nil, tg_link = nil )
|
20
|
+
@name = name
|
21
|
+
@country = country
|
22
|
+
@rank = rank
|
23
|
+
@cost = cost
|
24
|
+
@internet_speed = internet_speed
|
25
|
+
@weather = weather
|
26
|
+
@link = link
|
27
|
+
@tg_link = tg_link
|
28
|
+
@@all << self
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.all
|
32
|
+
@@all
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
class BestNomadCities::CLI
|
2
|
+
def call
|
3
|
+
BestNomadCities::Scraper.new.make_cities
|
4
|
+
puts 'Welcome to Best Nomad Cities'
|
5
|
+
start
|
6
|
+
end
|
7
|
+
|
8
|
+
def start
|
9
|
+
puts ''
|
10
|
+
puts 'What would you like to do?'
|
11
|
+
puts ''
|
12
|
+
puts '1. See a ranked list of nomad cities?'
|
13
|
+
puts '2. Search for a city by name?'
|
14
|
+
puts '3. Exit'
|
15
|
+
puts ''
|
16
|
+
choice = gets.strip.to_i
|
17
|
+
|
18
|
+
if choice == 1
|
19
|
+
puts ''
|
20
|
+
puts 'How many cities would you like in your list?'
|
21
|
+
puts ''
|
22
|
+
amount = gets.strip.to_i
|
23
|
+
print_cities(amount)
|
24
|
+
puts ''
|
25
|
+
puts 'Please enter city name or number for more information.'
|
26
|
+
search = gets.strip
|
27
|
+
search_city_by_name_or_number(search)
|
28
|
+
puts ''
|
29
|
+
puts 'Would you like to see other cities? (Y or N)'
|
30
|
+
puts ''
|
31
|
+
y_or_n = gets.strip
|
32
|
+
if y_or_n == 'Y'
|
33
|
+
start
|
34
|
+
else
|
35
|
+
puts ''
|
36
|
+
puts "'Don't listen to what they say. GO SEE!'"
|
37
|
+
exit
|
38
|
+
end
|
39
|
+
elsif choice == 2
|
40
|
+
puts ''
|
41
|
+
puts 'Please enter city name.'
|
42
|
+
puts ''
|
43
|
+
search = gets.strip
|
44
|
+
search_city_by_name_or_number(search)
|
45
|
+
puts ''
|
46
|
+
puts 'Would you like to see other cities? (Y or N)'
|
47
|
+
puts ''
|
48
|
+
y_or_n = gets.strip
|
49
|
+
if y_or_n == 'Y'
|
50
|
+
start
|
51
|
+
else
|
52
|
+
puts ''
|
53
|
+
puts "'Don't listen to what they say. GO SEE!'"
|
54
|
+
exit
|
55
|
+
end
|
56
|
+
elsif choice == 3
|
57
|
+
puts ''
|
58
|
+
puts "'A good traveller has no fixed plans and is not intent on arriving.' - Lao Tzu"
|
59
|
+
exit
|
60
|
+
else
|
61
|
+
puts ''
|
62
|
+
puts "If at first you don't succeed, try again."
|
63
|
+
start
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def print_cities(amount)
|
68
|
+
puts ''
|
69
|
+
puts "---------- Top #{amount} Nomad Cities ----------"
|
70
|
+
puts ''
|
71
|
+
BestNomadCities::City.all[0, amount].each.with_index(1) do |city, index|
|
72
|
+
puts "#{index}. #{city.name}, #{city.country}"
|
73
|
+
end
|
74
|
+
puts ''
|
75
|
+
end
|
76
|
+
|
77
|
+
def search_city_by_name_or_number(search)
|
78
|
+
if search.length > 3
|
79
|
+
found_city = BestNomadCities::City.all.detect { |city| city.name.start_with?(search) }
|
80
|
+
else
|
81
|
+
found_city = BestNomadCities::City.all[search.to_i - 1]
|
82
|
+
end
|
83
|
+
puts ''
|
84
|
+
puts "---------- City: #{found_city.name} ----------"
|
85
|
+
puts ''
|
86
|
+
puts "Global nomad rank: #{found_city.rank}"
|
87
|
+
puts "Country: #{found_city.country}"
|
88
|
+
puts "Nomad cost: #{found_city.cost}"
|
89
|
+
puts "Internet speed: #{found_city.internet_speed}"
|
90
|
+
puts "Weather (now): #{found_city.weather}"
|
91
|
+
puts "Link to city page: #{found_city.link}"
|
92
|
+
puts "Link to travel guide: #{found_city.tg_link}"
|
93
|
+
puts ''
|
94
|
+
puts "Hold 'cmd' on Mac to click the links."
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class BestNomadCities::Scraper
|
2
|
+
|
3
|
+
def get_home_page
|
4
|
+
Nokogiri::HTML(open('fixtures/html/nomadlist.html'))
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_cities
|
8
|
+
self.get_home_page.css("div[data-i]")
|
9
|
+
end
|
10
|
+
|
11
|
+
def make_cities
|
12
|
+
self.get_cities.each do |city|
|
13
|
+
BestNomadCities::City.new_from_home_page(city)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: best-nomad-cities
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Henno Fourie
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-03-16 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.10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
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: '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: 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
|
+
description: Provides a list of the top Nomad Cities from around the world.
|
84
|
+
email: bortch@gmail.com
|
85
|
+
executables:
|
86
|
+
- best-nomad-cities
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- bin/best-nomad-cities
|
91
|
+
- config/environment.rb
|
92
|
+
- lib/best_nomad_cities.rb
|
93
|
+
- lib/best_nomad_cities/city.rb
|
94
|
+
- lib/best_nomad_cities/cli.rb
|
95
|
+
- lib/best_nomad_cities/scraper.rb
|
96
|
+
homepage: http://rubygems.org/gems/best-nomad-cities
|
97
|
+
licenses:
|
98
|
+
- MIT
|
99
|
+
metadata: {}
|
100
|
+
post_install_message:
|
101
|
+
rdoc_options: []
|
102
|
+
require_paths:
|
103
|
+
- lib
|
104
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ">="
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: '0'
|
109
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: '0'
|
114
|
+
requirements: []
|
115
|
+
rubyforge_project:
|
116
|
+
rubygems_version: 2.6.10
|
117
|
+
signing_key:
|
118
|
+
specification_version: 4
|
119
|
+
summary: Best Nomad Cities
|
120
|
+
test_files: []
|