Skip to content

Instantly share code, notes, and snippets.

@bestwebua
Last active April 6, 2018 13:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bestwebua/6c4cf4a92bb605119a4f47be325d2f62 to your computer and use it in GitHub Desktop.
Save bestwebua/6c4cf4a92bb605119a4f47be325d2f62 to your computer and use it in GitHub Desktop.
Scraping kata
require 'nokogiri'
require 'open-uri'
class User
attr_reader :name, :clan, :honor
def initialize(name, clan, honor)
@name, @clan, @honor = name, clan, honor
end
end
class Leaderboard
@@leaderboard = []
def self.position
url = 'https://www.codewars.com/users/leaderboard'
page = Nokogiri::HTML(open(url), nil, Encoding::UTF_8.to_s)
rows = page.css("[class='leaderboard pan'] > table > tr")
rows.each do |row|
name, clan, honor = row.css('a').text, row.css('td[3]').text, row.css('td[4]').text.to_i
@@leaderboard << User.new(name, clan, honor)
end
@@leaderboard
end
end
def solution
Leaderboard.position
end
@bestwebua
Copy link
Author

@10XL my new code with struct instead class. It has passed all tests.

require 'nokogiri'
require 'open-uri'

class LeaderboardArray < Array
  def size
    length-1
  end
end

class Leaderboard
  def self.build
    Struct.new('Warrior', :name, :clan, :honor)
    @@leaderboard = LeaderboardArray.new

      url = 'https://www.codewars.com/users/leaderboard'
      page = Nokogiri::HTML(open(url))
      rows = page.css("[class='leaderboard pan'] > table > tr")

        rows.each do |row|
          name, clan, honor = row.css('a').text, row.css('td[3]').text, row.css('td[4]').text.to_i
          @@leaderboard << Struct::Warrior.new(name, clan, honor)
        end

    @@leaderboard
  end

  def self.position
    @@leaderboard ||= self.build
  end
end

def solution
  Leaderboard
end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment