gh-trending 1.0.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 808ee3a7194a4284ee546f7ab167c69ac24439e7
4
- data.tar.gz: 0422c8cea905cce431bffcf2ee90df020667725f
3
+ metadata.gz: 461ee5d745b9d3b316bd3cb709efbcdeeb7507ea
4
+ data.tar.gz: 2d2a4630245ab5e3bae4f35f64091fa8896fe942
5
5
  SHA512:
6
- metadata.gz: d9b0d3524ea69290beeef5ec6125ae3b63887e1b4f6089af804f8013f023adf0829a9f2ab22b41f6c07a11e67dcc14cd2880e3a9a2c5bef36c542d54f91d65ca
7
- data.tar.gz: 8f7e52cc4977c77222b65fed750cefb0344716c9c3105dedd66481a4ba210bcb3a7bd504e46630f543472ed8721d4392f3e6cc944bea53f0542b2c472c523d08
6
+ metadata.gz: 3b09330b0ae4a00ab8941a18e21e330a719ac0477dc7741e8c7e2b0b8ed78b867c6b331fd73ab92048b9aaef9843b2fa96efb995de6d43cba9ed95ac539b5aef
7
+ data.tar.gz: 66225f25a11535bca3c1004927cf28f87733fd5d51336a10841e830dd76ddca1349adbc8b1e4b8647b846b041468a7c3c68dcf18c25d4d23c7d5c7bce3e0aa36
@@ -5,7 +5,11 @@ module Gh
5
5
  class Developer
6
6
  attr_reader :full_name, :user_profile_url, :hot_repository_url
7
7
 
8
- def initialize(full_name: nil, user_profile_url: nil, hot_repository_url: nil)
8
+ def initialize(
9
+ full_name: nil,
10
+ user_profile_url: nil,
11
+ hot_repository_url: nil
12
+ )
9
13
  @full_name = full_name || ''
10
14
  @user_profile_url = user_profile_url || ''
11
15
  @hot_repository_url = hot_repository_url || ''
@@ -5,6 +5,8 @@ require 'gh_trending/developer'
5
5
 
6
6
  module Gh
7
7
  module Trending
8
+ # Returns an array of representation of the trending developers in github.
9
+ # Usage example: Gh::Trending::Developers.new.get(language: 'ruby')
8
10
  class Developers
9
11
  attr_reader :developers_list
10
12
 
@@ -4,17 +4,21 @@ module Gh
4
4
  # Parses the trending developers page
5
5
  class DevelopersParser < Parser
6
6
  LIST_WITH_DEVS_NODES_HTML_CLASS = 'ol.leaderboard-list'.freeze
7
- H2_WITH_DEVELOPER_NAME = 'h2.user-leaderboard-list-name'.freeze
8
- ANCHOR_WITH_HOT_REPOSITORY = 'a.repo-snipit'.freeze
7
+ H2_WITH_DEVELOPER_NAME = 'h2.user-leaderboard-list-name'.freeze
8
+ ANCHOR_WITH_HOT_REPOSITORY = 'a.repo-snipit'.freeze
9
9
  SPAN_WITH_FULL_NAME = 'span.full-name'.freeze
10
- REGEXP_FOR_FULLNAME = /\((.+)\)/.freeze
10
+ REGEXP_FOR_FULLNAME = /\((.+)\)/
11
11
 
12
12
  def parse(parser_args)
13
13
  url = build_request_url_with(parser_args)
14
14
  page = agent.get(url)
15
15
  parsed_page = page.at(LIST_WITH_DEVS_NODES_HTML_CLASS)
16
16
 
17
- raise Gh::Trending::Parsers::HtmlChangedError.new(:front_page_with_devs) if parsed_page.nil?
17
+ if parsed_page.nil?
18
+ changed_page = :front_page_with_devs
19
+ raise Gh::Trending::Parsers::HtmlChangedError.new(changed_page)
20
+ end
21
+
18
22
  devs = parsed_page.search('li')
19
23
  build_developers_from_node devs
20
24
  end
@@ -25,11 +29,13 @@ module Gh
25
29
 
26
30
  private
27
31
 
28
- def build_developers_from_node developers_node
29
- developers_node.map { |dev_node| Developer.new extract_developer_info dev_node }
32
+ def build_developers_from_node(developers_node)
33
+ developers_node.map do |dev_node|
34
+ Developer.new extract_developer_info dev_node
35
+ end
30
36
  end
31
37
 
32
- def extract_developer_info developer_node
38
+ def extract_developer_info(developer_node)
33
39
  {
34
40
  full_name: get_full_name(developer_node),
35
41
  hot_repository_url: get_hot_repository_url(developer_node),
@@ -37,21 +43,22 @@ module Gh
37
43
  }
38
44
  end
39
45
 
40
- def get_profile_url dev_node
46
+ def get_profile_url(dev_node)
41
47
  parsed_url = dev_node.search(H2_WITH_DEVELOPER_NAME)
42
- .children
43
- .search('a')[0]
44
- .attributes['href']
45
- .value
48
+ .children
49
+ .search('a')[0]
50
+ .attributes['href']
51
+ .value
46
52
  build_github_url(parsed_url)
47
53
  end
48
54
 
49
- def get_hot_repository_url dev_node
50
- parsed_url = dev_node.search(ANCHOR_WITH_HOT_REPOSITORY)[0].attributes['href'].value
55
+ def get_hot_repository_url(dev_node)
56
+ parsed_url = dev_node.search(ANCHOR_WITH_HOT_REPOSITORY)[0]
57
+ .attributes['href'].value
51
58
  build_github_url(parsed_url)
52
59
  end
53
60
 
54
- def get_full_name dev_node
61
+ def get_full_name(dev_node)
55
62
  span_with_full_name = dev_node.search(SPAN_WITH_FULL_NAME)
56
63
  return nil if span_with_full_name.empty?
57
64
 
@@ -12,7 +12,9 @@ module Gh
12
12
  @page_that_changed = page_that_changed
13
13
  page_changed_human_format = build_human_format_page_changed
14
14
 
15
- msg ||= "The page can't be crawled anymore because #{page_changed_human_format} changed its HTML format. Submit a PR to fix it!"
15
+ msg ||= 'The page can\'t be crawled anymore because' \
16
+ "#{page_changed_human_format} changed its HTML format." \
17
+ 'Submit a PR to fix it!'
16
18
  super(msg)
17
19
  end
18
20
 
@@ -21,11 +23,12 @@ module Gh
21
23
  def build_human_format_page_changed
22
24
  case page_that_changed
23
25
  when :front_page_with_repos
24
- "the front page that lists all trending repositories"
26
+ 'the front page that lists all trending repositories'
25
27
  when :front_page_with_devs
26
- "the front page that lists all trending developers"
28
+ 'the front page that lists all trending developers'
27
29
  else
28
- raise ArgumentError, "Unknown page_that_changed symbol: #{page_that_changed}"
30
+ error = "Unknown page_that_changed symbol: #{page_that_changed}"
31
+ raise ArgumentError, error
29
32
  end
30
33
  end
31
34
  end
@@ -3,6 +3,7 @@ require 'mechanize'
3
3
  module Gh
4
4
  module Trending
5
5
  module Parsers
6
+ # Abstract parser of the trending page.
6
7
  class Parser
7
8
  attr_reader :agent
8
9
 
@@ -18,7 +18,7 @@ module Gh
18
18
  TIME_PERIOD_ARG = :time_period
19
19
  LANGUAGE_ARG = :language
20
20
 
21
- KNOWN_TIME_PERIODS = %i(daily weekly monthly)
21
+ KNOWN_TIME_PERIODS = %i[daily weekly monthly].freeze
22
22
  DEFAULT_TIME_PERIOD = KNOWN_TIME_PERIODS.first
23
23
 
24
24
  def initialize(**args)
@@ -42,7 +42,12 @@ module Gh
42
42
 
43
43
  def sanitize_time_period(time_period)
44
44
  return nil if time_period.nil?
45
- raise UnknownTimePeriod.new("The time period '#{time_period}' is invalid. Supported: #{KNOWN_TIME_PERIODS}") unless KNOWN_TIME_PERIODS.include? time_period
45
+
46
+ unless KNOWN_TIME_PERIODS.include? time_period
47
+ error_msg = "The time period '#{time_period}' is invalid. " \
48
+ "Supported: #{KNOWN_TIME_PERIODS}"
49
+ raise UnknownTimePeriod.new(error_msg)
50
+ end
46
51
 
47
52
  time_period
48
53
  end
@@ -13,7 +13,12 @@ module Gh
13
13
  page = agent.get(url)
14
14
  parsed_page = page.at(LIST_WITH_REPO_NODES_HTML_CLASS)
15
15
 
16
- raise Gh::Trending::Parsers::HtmlChangedError.new(:front_page_with_repos) if parsed_page.nil?
16
+ if parsed_page.nil?
17
+ changed_page = :front_page_with_repos
18
+ error = Gh::Trending::Parsers::HtmlChangedError.new(changed_page)
19
+ raise error
20
+ end
21
+
17
22
  repositories = parsed_page.search('li')
18
23
  build_repositories_from_node(repositories)
19
24
  end
@@ -24,11 +29,13 @@ module Gh
24
29
 
25
30
  private
26
31
 
27
- def build_repositories_from_node repositories_node
28
- repositories_node.map { |repo_node| Repository.new extract_repo_data repo_node }
32
+ def build_repositories_from_node(repositories_node)
33
+ repositories_node.map do |repo_node|
34
+ Repository.new extract_repo_data repo_node
35
+ end
29
36
  end
30
37
 
31
- def extract_repo_data repo_node
38
+ def extract_repo_data(repo_node)
32
39
  {
33
40
  name: get_name(repo_node),
34
41
  description: get_description(repo_node),
@@ -38,19 +45,19 @@ module Gh
38
45
  }
39
46
  end
40
47
 
41
- def get_name repo_node
48
+ def get_name(repo_node)
42
49
  repo_node.search('h3')[0].children[1].attributes['href'].value
43
50
  end
44
51
 
45
- def get_description repo_node
52
+ def get_description(repo_node)
46
53
  repo_node.search(DIV_WITH_DESCRIPTION).text.strip
47
54
  end
48
55
 
49
- def get_language repo_node
56
+ def get_language(repo_node)
50
57
  repo_node.search(SPAN_WITH_LANGUAGE).text.strip
51
58
  end
52
59
 
53
- def get_stars repo_node
60
+ def get_stars(repo_node)
54
61
  string_with_stars = repo_node.search(SPAN_WITH_STARS).text.strip
55
62
  # Github shows the string "1,263 stars this week"
56
63
  # Lets strip only the number.
@@ -65,7 +72,11 @@ module Gh
65
72
  end
66
73
 
67
74
  def get_repo_url(repo_node)
68
- parsed_url = repo_node.search('h3').children.search('a')[0].attributes['href'].value
75
+ parsed_url = repo_node.search('h3')
76
+ .children
77
+ .search('a')[0]
78
+ .attributes['href']
79
+ .value
69
80
  build_github_url(parsed_url)
70
81
  end
71
82
  end
@@ -6,6 +6,8 @@ require 'gh_trending/parsers/html_changed_error'
6
6
 
7
7
  module Gh
8
8
  module Trending
9
+ # Returns an array of representation of the trending repositories in github.
10
+ # Usage example: Gh::Trending::Repositories.new.get(language: 'ruby')
9
11
  class Repositories
10
12
  attr_reader :repos_list
11
13
 
@@ -4,9 +4,15 @@ module Gh
4
4
  # repositories page.
5
5
  class Repository
6
6
  attr_reader :name, :description, :language, :period_stars, :url
7
- # Period stars correspond to the stars that the repository has in the current
8
- # period being considered, for example: 283 stars THIS WEEK.
9
- def initialize(name: nil, description: nil, language: nil, period_stars: nil, url: nil)
7
+ # Period stars correspond to the stars that the repository has in the
8
+ # current period being considered, for example: 283 stars THIS WEEK.
9
+ def initialize(
10
+ name: nil,
11
+ description: nil,
12
+ language: nil,
13
+ period_stars: nil,
14
+ url: nil
15
+ )
10
16
  @name = name || ''
11
17
  @description = description || ''
12
18
  @language = language || ''
@@ -1,5 +1,5 @@
1
1
  module Gh
2
2
  module Trending
3
- VERSION = "1.0.0"
3
+ VERSION = '1.0.1'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gh-trending
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - luispcosta