apartments 0.2.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/apartments +5 -0
- data/lib/apartments/apartment.rb +58 -0
- data/lib/apartments/cli.rb +70 -0
- data/lib/apartments/scraper.rb +16 -0
- data/lib/apartments/version.rb +3 -0
- data/lib/apartments.rb +4 -0
- metadata +121 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dd142d090f7404cfd9e8f7c358accf831e6f2109
|
4
|
+
data.tar.gz: 7aa0d879332663a8d3355cf17bd2ee1ff7b15388
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 42dea910bf69a541139c6a3a86bc24d6f96a572f76e3190b208c75b463296bc962c803945178cfefe04d6eec71040f094100b5eadf8628d01e20e98fae264759
|
7
|
+
data.tar.gz: 8d60222d0d65cda02a8ce51c55d811540cf39558f632a31349546fe80eec2db26ec6f71156a79e008e5e5827992c6a04f1bbac2f22f74ca782dae91ff7caf3de
|
data/bin/apartments
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
class Apartments::Apartment
|
2
|
+
|
3
|
+
attr_accessor :area, :price, :neighborhood, :date, :img, :description, :apt, :url
|
4
|
+
|
5
|
+
@@all = []
|
6
|
+
|
7
|
+
|
8
|
+
def self.new_from_index_page(apt)
|
9
|
+
url = apt.css('a').attribute('href').value unless apt.css('a').attribute('href').nil?
|
10
|
+
area = apt.css('span.housing').text.gsub("\n","").gsub("-","").squeeze.strip unless apt.css('span.housing').nil?
|
11
|
+
price = apt.css('span.result-price')[0].text unless apt.css('span.result-price')[0].nil?
|
12
|
+
neighborhood = apt.css('p.result-info').css('span.result-hood').text.gsub(/[()]/, "").strip unless apt.css('p.result-info').css('span.result-hood').nil?
|
13
|
+
self.new(area, price, neighborhood, url)
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
def initialize(area=nil, price=nil, neighborhood=nil, url=nil)
|
19
|
+
@area = area
|
20
|
+
@price = price
|
21
|
+
@neighborhood = neighborhood
|
22
|
+
@url = url
|
23
|
+
@@all << self
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.all
|
27
|
+
@@all
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.count
|
31
|
+
@@all.length
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.find(id)
|
35
|
+
@@all[id - 1]
|
36
|
+
end
|
37
|
+
|
38
|
+
def title
|
39
|
+
@title ||= doc.css('h2.postingtitle span#titletextonly').text.gsub(/[^[:print:]]/i, '')
|
40
|
+
end
|
41
|
+
|
42
|
+
def description
|
43
|
+
# binding.pry
|
44
|
+
@description ||= doc.css('#postingbody').text.gsub(/\P{ASCII}/,'').gsub("\n", " ").gsub(" QR Code Link to This Post ","").strip
|
45
|
+
end
|
46
|
+
|
47
|
+
def date
|
48
|
+
@date ||= doc.css('p').css('time').text.split("\n")[1].strip
|
49
|
+
end
|
50
|
+
|
51
|
+
def doc
|
52
|
+
@doc ||= Nokogiri::HTML(open(self.url))
|
53
|
+
end
|
54
|
+
|
55
|
+
def apt_url
|
56
|
+
@apt_url ||= self.url
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
class Apartments::CLI
|
2
|
+
|
3
|
+
def call
|
4
|
+
Apartments::Scraper.new.make_apartments
|
5
|
+
puts "Welcome to the latest listing of NY area Apartments. Hit 'Enter' to continue"
|
6
|
+
gets
|
7
|
+
start
|
8
|
+
end
|
9
|
+
|
10
|
+
def start
|
11
|
+
print_apartments
|
12
|
+
select_apartment
|
13
|
+
see_another?
|
14
|
+
end
|
15
|
+
|
16
|
+
def select_apartment
|
17
|
+
puts ""
|
18
|
+
input = nil
|
19
|
+
while input.nil? || !input.between?(1,Apartments::Apartment.count)
|
20
|
+
puts "which apartment would you like to have more information about?"
|
21
|
+
input = gets.strip.to_i
|
22
|
+
end
|
23
|
+
apartment = Apartments::Apartment.find(input.to_i)
|
24
|
+
print_apartment(apartment)
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def see_another?
|
29
|
+
puts ""
|
30
|
+
puts "Would you like to see another apartment? (Y/N)"
|
31
|
+
input = gets.strip.upcase
|
32
|
+
if input == "Y"
|
33
|
+
start
|
34
|
+
elsif input == "N"
|
35
|
+
puts ""
|
36
|
+
puts "Good luck in your apartment search. Have a nice day!"
|
37
|
+
exit
|
38
|
+
else
|
39
|
+
puts ""
|
40
|
+
puts "Not sure what you have in mind.."
|
41
|
+
see_another?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
def print_apartment(apartment)
|
47
|
+
puts ""
|
48
|
+
puts "----- #{apartment.title} -----"
|
49
|
+
puts ""
|
50
|
+
puts "bedrooms / area: #{apartment.area}"
|
51
|
+
puts "rental price: #{apartment.price}"
|
52
|
+
puts "neighborhood: #{apartment.neighborhood}"
|
53
|
+
puts "date advertised: #{apartment.date}"
|
54
|
+
puts "apartment url: #{apartment.url}"
|
55
|
+
puts ""
|
56
|
+
puts "----------------------------- Description -----------------------------"
|
57
|
+
puts "#{apartment.description}"
|
58
|
+
puts ""
|
59
|
+
end
|
60
|
+
|
61
|
+
def print_apartments
|
62
|
+
puts ""
|
63
|
+
puts "----------------------------- Apartments -----------------------------"
|
64
|
+
puts ""
|
65
|
+
Apartments::Apartment.all.each.with_index(1) do |apartment, idx|
|
66
|
+
spacer = apartment.price.nil? ? [' '].cycle(20).to_a.join("") : [' '].cycle(20 - apartment.price.length).to_a.join("")
|
67
|
+
puts "#{idx}.\t #{apartment.price} #{spacer}\t #{apartment.neighborhood}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Apartments::Scraper
|
2
|
+
|
3
|
+
def get_page
|
4
|
+
Nokogiri::HTML(open("https://newyork.craigslist.org/d/housing/search/hhh"))
|
5
|
+
end
|
6
|
+
|
7
|
+
def scrape_apartments
|
8
|
+
self.get_page.css('li.result-row')
|
9
|
+
end
|
10
|
+
|
11
|
+
def make_apartments
|
12
|
+
scrape_apartments.each do |apt|
|
13
|
+
Apartments::Apartment.new_from_index_page(apt)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/apartments.rb
ADDED
metadata
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: apartments
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sara Ginsburg
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-05-15 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.16'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.16'
|
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.7'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.7'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
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: nokogiri
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Provides details on a user selected apartment in NYC
|
84
|
+
email:
|
85
|
+
- Sara.ginsburg.ny@gmail.com
|
86
|
+
executables:
|
87
|
+
- apartments
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- bin/apartments
|
92
|
+
- lib/apartments.rb
|
93
|
+
- lib/apartments/apartment.rb
|
94
|
+
- lib/apartments/cli.rb
|
95
|
+
- lib/apartments/scraper.rb
|
96
|
+
- lib/apartments/version.rb
|
97
|
+
homepage: https://github.com/SaraGinsburg/apartments
|
98
|
+
licenses:
|
99
|
+
- MIT
|
100
|
+
metadata: {}
|
101
|
+
post_install_message:
|
102
|
+
rdoc_options: []
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
requirements: []
|
116
|
+
rubyforge_project:
|
117
|
+
rubygems_version: 2.5.1
|
118
|
+
signing_key:
|
119
|
+
specification_version: 4
|
120
|
+
summary: Find apartments in NY
|
121
|
+
test_files: []
|