class Gh::Trending::Parsers::DevelopersParser

Parses the trending developers page

Constants

ANCHOR_WITH_HOT_REPOSITORY
LIST_WITH_DEVS_NODES_HTML_CLASS
REGEXP_FOR_FULLNAME
SPAN_WITH_FULL_NAME

Public Instance Methods

parse(parser_args) click to toggle source
# File lib/gh_trending/parsers/developers_parser.rb, line 11
def parse(parser_args)
  url = build_request_url_with(parser_args)
  page = agent.get(url)
  parsed_page = page.at(LIST_WITH_DEVS_NODES_HTML_CLASS)

  if parsed_page.nil?
    changed_page = :front_page_with_devs
    raise Gh::Trending::Parsers::HtmlChangedError.new(changed_page)
  end

  devs = parsed_page.search('li')
  build_developers_from_node devs
end
resource_url() click to toggle source
# File lib/gh_trending/parsers/developers_parser.rb, line 25
def resource_url
  'https://github.com/trending/developers'.freeze
end

Private Instance Methods

build_developers_from_node(developers_node) click to toggle source
# File lib/gh_trending/parsers/developers_parser.rb, line 31
def build_developers_from_node(developers_node)
  developers_node.map do |dev_node|
    Developer.new extract_developer_info dev_node
  end
end
extract_developer_info(developer_node) click to toggle source
# File lib/gh_trending/parsers/developers_parser.rb, line 37
def extract_developer_info(developer_node)
  {
    full_name: get_full_name(developer_node),
    hot_repository_url: get_hot_repository_url(developer_node),
    user_profile_url: get_profile_url(developer_node)
  }
end
get_full_name(dev_node) click to toggle source
# File lib/gh_trending/parsers/developers_parser.rb, line 63
def get_full_name(dev_node)
  span_with_full_name = dev_node.search('div.d-flex')[0]
                                .search('div.mx-2')[1]
                                .search('h2')[0]
                                .search('a')[0]
                                .search(SPAN_WITH_FULL_NAME)

  return nil if span_with_full_name.empty?

  match = span_with_full_name
          .text
          .strip
          .match REGEXP_FOR_FULLNAME

  full_name_without_enclosing_parens = match[1]
  full_name_without_enclosing_parens
end
get_hot_repository_url(dev_node) click to toggle source
# File lib/gh_trending/parsers/developers_parser.rb, line 56
def get_hot_repository_url(dev_node)
  parsed_url = dev_node.search('div.d-flex')[0]
                       .search(ANCHOR_WITH_HOT_REPOSITORY)[0]
                       .attributes['href'].value
  build_github_url(parsed_url)
end
get_profile_url(dev_node) click to toggle source
# File lib/gh_trending/parsers/developers_parser.rb, line 45
def get_profile_url(dev_node)
  parsed_url = dev_node.search('div.d-flex')[0]
                       .search('div.mx-2')[1]
                       .search('h2')[0]
                       .search('a')[0]
                       .attributes['href']
                       .value

  build_github_url(parsed_url)
end