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 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: []