Class: PublicStorage::Facility
- Inherits:
-
Object
- Object
- PublicStorage::Facility
- Defined in:
- lib/publicstorage/facility.rb
Overview
Constant Summary collapse
- SITEMAP_URL =
'https://www.publicstorage.com/sitemap_0-product.xml'- DEFAULT_PHONE =
'1-800-742-8048'- DEFAULT_EMAIL =
'[email protected]'- PRICE_SELECTOR =
'.units-results-section .unit-list-group .unit-list-item'- LD_SELECTOR =
'script[type="application/ld+json"]'- ID_REGEX =
/(?<id>\d+)\.html/
Instance Attribute Summary collapse
- #address ⇒ Address
- #email ⇒ String
- #geocode ⇒ Geocode
- #id ⇒ Integer
- #name ⇒ String
- #phone ⇒ String
- #prices ⇒ Array<Price>
- #url ⇒ String
Class Method Summary collapse
- .crawl ⇒ Object
- .fetch(url:) ⇒ Facility
- .parse(url:, document:) ⇒ Facility
- .parse_ld(document:) ⇒ Hash
- .sitemap ⇒ Sitemap
Instance Method Summary collapse
-
#initialize(id:, url:, name:, address:, geocode:, phone: DEFAULT_PHONE, email: DEFAULT_EMAIL, prices: []) ⇒ Facility
constructor
A new instance of Facility.
- #inspect ⇒ String
- #text ⇒ String
Constructor Details
#initialize(id:, url:, name:, address:, geocode:, phone: DEFAULT_PHONE, email: DEFAULT_EMAIL, prices: []) ⇒ Facility
Returns a new instance of Facility.
104 105 106 107 108 109 110 111 112 113 |
# File 'lib/publicstorage/facility.rb', line 104 def initialize(id:, url:, name:, address:, geocode:, phone: DEFAULT_PHONE, email: DEFAULT_EMAIL, prices: []) @id = id @url = url @name = name @address = address @geocode = geocode @phone = phone @email = email @prices = prices end |
Instance Attribute Details
#address ⇒ Address
38 39 40 |
# File 'lib/publicstorage/facility.rb', line 38 def address @address end |
#email ⇒ String
34 35 36 |
# File 'lib/publicstorage/facility.rb', line 34 def email @email end |
#geocode ⇒ Geocode
42 43 44 |
# File 'lib/publicstorage/facility.rb', line 42 def geocode @geocode end |
#id ⇒ Integer
18 19 20 |
# File 'lib/publicstorage/facility.rb', line 18 def id @id end |
#name ⇒ String
26 27 28 |
# File 'lib/publicstorage/facility.rb', line 26 def name @name end |
#phone ⇒ String
30 31 32 |
# File 'lib/publicstorage/facility.rb', line 30 def phone @phone end |
#prices ⇒ Array<Price>
46 47 48 |
# File 'lib/publicstorage/facility.rb', line 46 def prices @prices end |
#url ⇒ String
22 23 24 |
# File 'lib/publicstorage/facility.rb', line 22 def url @url end |
Class Method Details
.crawl ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/publicstorage/facility.rb', line 83 def self.crawl sitemap.links.each do |link| url = link.loc facility = fetch(url:) puts facility.text facility.prices.each do |price| puts price.text end puts end end |
.fetch(url:) ⇒ Facility
56 57 58 59 |
# File 'lib/publicstorage/facility.rb', line 56 def self.fetch(url:) document = Crawler.html(url:) parse(url:, document:) end |
.parse(url:, document:) ⇒ Facility
64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/publicstorage/facility.rb', line 64 def self.parse(url:, document:) data = parse_ld(document:) id = Integer(data['url'].match(ID_REGEX)[:id]) name = data['name'] address = Address.parse(data: data['address']) geocode = Geocode.parse(data: data['geo']) prices = document.css(PRICE_SELECTOR).map { |element| Price.parse(element:) } new(id:, url:, name:, address:, geocode:, prices:) end |
.parse_ld(document:) ⇒ Hash
79 80 81 |
# File 'lib/publicstorage/facility.rb', line 79 def self.parse_ld(document:) JSON.parse(document.at_css(LD_SELECTOR).text).find { |entry| entry['@type'] == 'SelfStorage' } end |
.sitemap ⇒ Sitemap
49 50 51 |
# File 'lib/publicstorage/facility.rb', line 49 def self.sitemap Sitemap.fetch(url: SITEMAP_URL) end |
Instance Method Details
#inspect ⇒ String
116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/publicstorage/facility.rb', line 116 def inspect props = [ "id=#{@id.inspect}", "url=#{@url.inspect}", "address=#{@address.inspect}", "geocode=#{@geocode.inspect}", "phone=#{@phone.inspect}", "email=#{@email.inspect}", "prices=#{@prices.inspect}" ] "#<#{self.class.name} #{props.join(' ')}>" end |
#text ⇒ String
130 131 132 |
# File 'lib/publicstorage/facility.rb', line 130 def text "#{@id} | #{@name} | #{@address.text} | #{@geocode.text}" end |