Class: PublicStorage::Facility

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id:, url:, name:, address:, geocode:, phone: DEFAULT_PHONE, email: DEFAULT_EMAIL, prices: []) ⇒ Facility

Returns a new instance of Facility.

Parameters:

  • id (String)
  • url (String)
  • name (String)
  • address (Address)
  • geocode (Geocode)
  • prices (Array<Price>) (defaults to: [])


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

#addressAddress

Returns:



38
39
40
# File 'lib/publicstorage/facility.rb', line 38

def address
  @address
end

#emailString

Returns:

  • (String)


34
35
36
# File 'lib/publicstorage/facility.rb', line 34

def email
  @email
end

#geocodeGeocode

Returns:



42
43
44
# File 'lib/publicstorage/facility.rb', line 42

def geocode
  @geocode
end

#idInteger

Returns:

  • (Integer)


18
19
20
# File 'lib/publicstorage/facility.rb', line 18

def id
  @id
end

#nameString

Returns:

  • (String)


26
27
28
# File 'lib/publicstorage/facility.rb', line 26

def name
  @name
end

#phoneString

Returns:

  • (String)


30
31
32
# File 'lib/publicstorage/facility.rb', line 30

def phone
  @phone
end

#pricesArray<Price>

Returns:



46
47
48
# File 'lib/publicstorage/facility.rb', line 46

def prices
  @prices
end

#urlString

Returns:

  • (String)


22
23
24
# File 'lib/publicstorage/facility.rb', line 22

def url
  @url
end

Class Method Details

.crawlObject



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

Parameters:

  • url (String)

Returns:



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

Parameters:

  • document (NokoGiri::XML::Document)

Returns:



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

Parameters:

  • document (NokoGiri::XML::Document)

Returns:

  • (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

.sitemapSitemap

Returns:



49
50
51
# File 'lib/publicstorage/facility.rb', line 49

def self.sitemap
  Sitemap.fetch(url: SITEMAP_URL)
end

Instance Method Details

#inspectString

Returns:

  • (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

#textString

Returns:

  • (String)


130
131
132
# File 'lib/publicstorage/facility.rb', line 130

def text
  "#{@id} | #{@name} | #{@address.text} | #{@geocode.text}"
end