class ScrapCbf::RankingsBuilder
Public Class Methods
new(document, championship)
click to toggle source
# File lib/scrap_cbf/builders/rankings_builder.rb, line 12 def initialize(document, championship) @championship = championship @rankings = [] @header = [] @rows = [] tables = document.css('table') table = find_table_by_header(tables, Ranking::TABLE_HEADER) return unless table scrap_rankings(table) end
Public Instance Methods
to_h()
click to toggle source
# File lib/scrap_cbf/builders/rankings_builder.rb, line 26 def to_h @rankings.map(&:to_h) end
Private Instance Methods
create_rankings_from_table()
click to toggle source
# File lib/scrap_cbf/builders/rankings_builder.rb, line 102 def create_rankings_from_table @rows.each do |row| ranking = Ranking.new ranking.championship = @championship.year ranking.serie = @championship.serie attrs_rank = Ranking::ATTRS_RANK row.cells.each_with_index do |cell, idx| ranking.send "#{attrs_rank[idx]}=", cell.value end @rankings << ranking end end
scrap_body(table)
click to toggle source
# File lib/scrap_cbf/builders/rankings_builder.rb, line 49 def scrap_body(table) table.css('tbody > tr').each do |tr_element| next if tr_element.element? && element_hidden?(tr_element) row = Row.new tr_element.children.each do |td_element| text = td_element.element? && remove_whitespace(td_element) next unless text text = scrap_position_if_exist(text) team = scrap_team_name_if_exist(td_element) # First cell (e.g posicao: 7º and team: Fluminense) if text && !text.empty? && team && !team.empty? row.cells << Cell.new(text) row.cells << Cell.new(team) elsif team && !team.empty? row.cells << Cell.new(team) else row.cells << Cell.new(text) end end # Add 1 to header length because on first cell we scrap 2 values row_length = row.cells.length header_length = @header.length + 1 unless row_length == header_length raise RowSizeError.new(row_length, header_length) end @rows << row end end
scrap_header(table)
click to toggle source
# File lib/scrap_cbf/builders/rankings_builder.rb, line 38 def scrap_header(table) table.css('thead > tr > th').each do |th| text = th.element? && remove_whitespace(th) next unless text title = title_or_nil_helper(th) @header << HeaderColumn.new(text, title) end end
scrap_position_if_exist(text)
click to toggle source
# File lib/scrap_cbf/builders/rankings_builder.rb, line 85 def scrap_position_if_exist(text) if text&.match?(/^\d{1,2}º/i) position = text[/^\d{1,2}º/i].strip return position.delete 'º' end text end
scrap_rankings(table)
click to toggle source
# File lib/scrap_cbf/builders/rankings_builder.rb, line 32 def scrap_rankings(table) scrap_header(table) scrap_body(table) create_rankings_from_table end
scrap_team_name_if_exist(element)
click to toggle source
# File lib/scrap_cbf/builders/rankings_builder.rb, line 94 def scrap_team_name_if_exist(element) title = title_or_nil_helper(element) return unless title&.match?(/^[a-záàâãéèêíïóôõöúç\s\-]+ - [a-z]{2}$/i) title[/^[a-záàâãéèêíïóôõöúç\s]{3,50}/i].strip end