Skip to content

Support Ruby 3 #949

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 27 additions & 48 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,61 +4,40 @@
#
version: 2.1
orbs:
ruby: circleci/ruby@0.2.2

shared_steps: &shared_steps
steps:
- run: ruby -v
- checkout
- ruby/load-cache
- run: gem install bundler:2.1.4
- ruby/install-deps
- ruby/save-cache
- ruby/run-tests
ruby: circleci/ruby@1.1.2

jobs:
lint:
environment:
BUNDLE_PATH: vendor/bundle
executor: ruby/default
steps:
- run: ruby -v
- checkout
- ruby/load-cache
- ruby/install-deps
- run: bundle exec rubocop

test:
rspec:
parameters:
tag:
image:
description: "Name of the Docker image."
type: string
default: "cimg/ruby"
docker:
- image: << parameters.image >>
environment:
BUNDLE_PATH: vendor/bundle
executor:
name: ruby/default
tag: << parameters.tag >>
parallelism: 1
<<: *shared_steps

test_jruby:
environment:
BUNDLE_PATH: vendor/bundle
JRUBY_OPTS: "--debug"
docker:
- image: circleci/jruby:9.2
<<: *shared_steps
steps:
- checkout
- run: bundle install
- run: bundle exec rubocop
- run: bundle exec rspec

workflows:
version: 2
build:
jobs:
- lint
- test_jruby:
requires:
- lint
- test:
matrix:
parameters:
tag: ["2.5", "2.6", "2.7"]
requires:
- lint
- rspec:
name: Ruby 2.5
image: cimg/ruby:2.5
- rspec:
name: Ruby 2.6
image: cimg/ruby:2.6
- rspec:
name: Ruby 2.7
image: cimg/ruby:2.7
- rspec:
name: Ruby 3.0
image: cimg/ruby:3.0
- rspec:
name: JRuby 9.2
image: circleci/jruby:9.2
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ def include_issues_by_labels(issues)
filter_wo_labels(filtered_issues)
end

# @param [Array] issues Issues & PRs to filter when without labels
# @param [Array] items Issues & PRs to filter when without labels
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's debatable whether this commit belongs in this PR.
I would probably prefer a Rubocop cop or something that auto-corrects this.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yard-junk is a tool for this. Finding errors and presenting them in a small report.

# @return [Array] Issues & PRs without labels or empty array if
# add_issues_wo_labels or add_pr_wo_labels are false
def filter_wo_labels(items)
Expand All @@ -170,6 +170,7 @@ def filter_wo_labels(items)
end

# @todo Document this
# @param [Object] issues
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This enumerable is probably an Array

def filter_by_include_labels(issues)
if options[:include_labels].nil?
issues
Expand Down
20 changes: 17 additions & 3 deletions lib/github_changelog_generator/octo_fetcher.rb
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ def get_all_tags
# Returns the number of pages for a API call
#
# @return [Integer] number of pages for this API call in total
# @param [Object] request_options
# @param [Object] method
# @param [Object] client
def calculate_pages(client, method, request_options)
# Makes the first API call so that we can call last_response
check_github_response do
Expand Down Expand Up @@ -161,7 +164,7 @@ def fetch_closed_issues_and_pr
page_i = 0
count_pages = calculate_pages(client, "issues", closed_pr_options)

iterate_pages(client, "issues", closed_pr_options) do |new_issues|
iterate_pages(client, "issues", **closed_pr_options) do |new_issues|
page_i += PER_PAGE_NUMBER
print_in_same_line("Fetching issues... #{page_i}/#{count_pages * PER_PAGE_NUMBER}")
issues.concat(new_issues)
Expand All @@ -185,7 +188,7 @@ def fetch_closed_pull_requests
page_i = 0
count_pages = calculate_pages(client, "pull_requests", options)

iterate_pages(client, "pull_requests", options) do |new_pr|
iterate_pages(client, "pull_requests", **options) do |new_pr|
page_i += PER_PAGE_NUMBER
log_string = "Fetching merged dates... #{page_i}/#{count_pages * PER_PAGE_NUMBER}"
print_in_same_line(log_string)
Expand Down Expand Up @@ -215,7 +218,7 @@ def fetch_events_async(issues)
issues.each do |issue|
semaphore.async do
issue["events"] = []
iterate_pages(client, "issue_events", issue["number"], preview) do |new_event|
iterate_pages(client, "issue_events", issue["number"], **preview) do |new_event|
issue["events"].concat(new_event)
end
issue["events"] = issue["events"].map { |event| stringify_keys_deep(event.to_hash) }
Expand Down Expand Up @@ -335,6 +338,7 @@ def default_branch
@default_branch ||= client.repository(user_project)[:default_branch]
end

# @param [Object] name
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Name is String.

def commits_in_branch(name)
@branches ||= client.branches(user_project).map { |branch| [branch[:name], branch] }.to_h

Expand All @@ -357,6 +361,8 @@ def fetch_tag_shas(tags)

private

# @param [Set] shas
# @param [Object] sha
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The sha is String, I think.

def commits_in_tag(sha, shas = Set.new)
# Reduce multiple runs for the same tag
return @commits_in_tag_cache[sha] if @commits_in_tag_cache.key?(sha)
Expand All @@ -382,6 +388,7 @@ def commits_in_tag(sha, shas = Set.new)
shas
end

# @param [Object] indata
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are super cool additions, and type descriptions in Yard can use a comma to separate each matching type like [Array, Hash] etc.

def stringify_keys_deep(indata)
case indata
when Array
Expand All @@ -405,10 +412,13 @@ def stringify_keys_deep(indata)
#
# @param [Octokit::Client] client
# @param [String] method (eg. 'tags')
# @param [Array] arguments
# @param [Async::Semaphore] parent
#
# @yield [Sawyer::Resource] An OctoKit-provided response (which can be empty)
#
# @return [void]
# @param [Hash] options
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: this param should be placed before th return Yard directive.

def iterate_pages(client, method, *arguments, parent: nil, **options)
options = DEFAULT_REQUEST_OPTIONS.merge(options)

Expand Down Expand Up @@ -442,6 +452,7 @@ def iterate_pages(client, method, *arguments, parent: nil, **options)
# This is wrapper with rescue block
#
# @return [Object] returns exactly the same, what you put in the block, but wrap it with begin-rescue block
# @param [Proc] block
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yard probably has some notation for you here, specific to blocks. We don't want the docs to show that this method takes a positional argument. Does the rendered Yard docs HTML show that?

def check_github_response(&block)
Retriable.retriable(retry_options, &block)
rescue MovedPermanentlyError => e
Expand All @@ -453,6 +464,8 @@ def check_github_response(&block)
end

# Presents the exception, and the aborts with the message.
# @param [Object] message
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Message is a String.

# @param [Object] error
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error is Exception I guess.

def fail_with_message(error, message)
Helper.log.error("#{error.class}: #{error.message}")
sys_abort(message)
Expand Down Expand Up @@ -483,6 +496,7 @@ def retry_callback
end
end

# @param [Object] msg
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This type is String.

def sys_abort(msg)
abort(msg)
end
Expand Down