Module: Eaternet::Agencies::MultcoLib::Misc

Defined in:
lib/eaternet/agencies/multco_lib/misc.rb

Class Method Summary collapse

Class Method Details

.better_strip(a_string) ⇒ Object



96
97
98
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 96

def self.better_strip(a_string)
  a_string.sub(/\p{Blank}+\z/, '').sub(/^\p{Blank}+/, '').strip
end

.blacklisted?(name:) ⇒ Boolean

Returns:

  • (Boolean)


7
8
9
10
11
12
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 7

def self.blacklisted?(name:)
  return true if name =~ /Chartwells/      # Apparently bad data
  return true if name =~ /Doubletree/      # Apparently bad data
  return true if name =~ /Providence Park/ # Yelp's model mismatch
  false
end

.clean_inner_text(elem) ⇒ Object



88
89
90
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 88

def self.clean_inner_text(elem)
  elem.nil? ? '' : better_strip(elem.inner_text)
end

.courtesy_delayObject



100
101
102
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 100

def self.courtesy_delay
  # sleep 0.25
end

.inspection_pages(business_id) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 23

def self.inspection_pages(business_id)
  results = []
  page = latest_inspection_page(business_id)
  loop do
    results << page
    form = page.forms.first
    button = form.button_with(id: 'NextInspection')
    break if button.nil?
    courtesy_delay
    page = form.submit(button)
  end
  results
end

.latest_inspection_page(id) ⇒ Object



37
38
39
40
41
42
43
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 37

def self.latest_inspection_page(id)
  agent  = Mechanize.new
  courtesy_delay
  url = "http://www3.multco.us/MCHealthInspect/ListSearch.aspx?id=#{id}"
  agent.get(url)
  agent.page
end

.parse_inspection(page:) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 45

def self.parse_inspection(page:)
  result = {}
  cells = page.search('td.DetailsTD')
  return nil if cells.size == 0
  result['inspection_number'] = cells[0].inner_text.gsub(/[^0-9]/, '')
  date_text = cells[2].inner_text.strip.gsub(/[^0-9\/]/, '')
  date_text =~ %r{(\d\d)/(\d\d)/(\d\d\d\d)}
  result['date'] = Date.parse "#{Regexp.last_match(3)}-#{Regexp.last_match(1)}-#{Regexp.last_match(2)}"
  result['score'] = cells[3].inner_text.gsub(/[^0-9]/, '').to_i
  return nil if result['score'] == 0
  result
end

.parse_violation_row(tr) ⇒ Object



72
73
74
75
76
77
78
79
80
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 72

def self.parse_violation_row(tr)
  cells = tr.search('td.DetailsTD')
  result = {
    code_number: clean_inner_text(cells[0]),
    facts: clean_inner_text(cells[2]),
    code_description: clean_inner_text(cells[1])
  }
  valid_result?(parsed_data: result) ? result : nil
end

.parse_violations(page:) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 58

def self.parse_violations(page:)
  next_is_a_violation = false
  page.search('tr').map do |tr|
    if tr.inner_text =~ /Law\/Rule/
      next_is_a_violation = true
      next
    end
    next unless next_is_a_violation
    next_is_a_violation = false

    parse_violation_row(tr)
  end.compact
end

.parse_violations_from_html(a_string) ⇒ Object



14
15
16
17
18
19
20
21
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 14

def self.parse_violations_from_html(a_string)
  page = Mechanize::Page.new(nil,
                             { 'content-type' => 'text/html' },
                             a_string,
                             nil,
                             Mechanize.new)
  parse_violations(page: page)
end

.valid_code_number?(n) ⇒ Boolean

Returns:

  • (Boolean)


92
93
94
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 92

def self.valid_code_number?(n)
  !(n =~ /^(99.*|98[A-Z])$/)
end

.valid_result?(parsed_data:) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
85
86
# File 'lib/eaternet/agencies/multco_lib/misc.rb', line 82

def self.valid_result?(parsed_data:)
  valid_code_number?(parsed_data[:code_number]) &&
    !parsed_data[:facts].start_with?('INFORMATIONAL') &&
    !parsed_data.values.reduce(:+).blank?
end