apartments 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/apartments"
4
+
5
+ Apartments::CLI.new.call
@@ -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
@@ -0,0 +1,3 @@
1
+ module Apartments
2
+ VERSION = "0.2.0"
3
+ end
data/lib/apartments.rb ADDED
@@ -0,0 +1,4 @@
1
+ module Apartments
2
+ end
3
+
4
+ require_relative '../config/environment'
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: []