Skip to content
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

[Feature Request]: TODO format checker should be run in static_checks.sh & be runnable locally #5312

Closed
BenHenning opened this issue Jan 18, 2024 · 0 comments · Fixed by #5315
Assignees
Labels
enhancement End user-perceivable enhancements. Impact: Low Low perceived user impact (e.g. edge cases). Work: Low Solution is clear and broken into good-first-issue-sized chunks.

Comments

@BenHenning
Copy link
Sponsor Member

Is your feature request related to a problem? Please describe.

The TODO script currently requires using the gh tool locally to download the list of open issues before comparing them in the codebase:

* Example:
* bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb
* open_issues.json
.

Describe the solution you'd like

The script is possible to be made runnable locally without needing to interact with gh ahead of time. This is ideal as it's both easier to do, and makes it simpler to integrate in static_checks.sh (so that developers can check it ahead of time without needing to rely on CI).

Describe alternatives you've considered

No response

Additional context

No response

@BenHenning BenHenning added enhancement End user-perceivable enhancements. triage needed labels Jan 18, 2024
@BenHenning BenHenning self-assigned this Jan 18, 2024
@adhiamboperes adhiamboperes added Impact: Low Low perceived user impact (e.g. edge cases). Work: Low Solution is clear and broken into good-first-issue-sized chunks. labels Jan 26, 2024
BenHenning added a commit that referenced this issue Mar 15, 2024
…port (#5313)

## Explanation
Fixes part of #5312
Fixes part of #59

This PR helps prepare for changes coming in #5315 and #4929 (the latter
of which is the start of the main upcoming Bazel migration PR chain) by
introducing one main scripts-based change:
``ScriptBackgroundCoroutineDispatcher``: a Kotlin coroutine dispatcher
for executing asynchronous tasks in scripts that also supports proper
Java executor service shutdown (so that scripts don't hang). This
dispatcher is multi-threaded to help simplify executing large numbers of
parallel background tasks.

All scripts have been migrated over to running their primary operations
within the context of this new dispatcher. Relevant script utilities
have been updated to use it, including ``CommandExecutor`` (though this
is mainly a placeholder change for the main executor changes which are
coming in #4929).

Miscellaneous details to note:
1. A bunch of 'e.g.' typos were fixed in
``GenerateMavenDependenciesList.kt`` and
``wiki/Updating-Maven-Dependencies.md``. These aren't functionally
needed, they were just something I noticed while developing.
2. ``kotlinx-coroutines-core`` was updated from 1.4.1 to 1.4.3 in order
to work around Kotlin/kotlinx.coroutines#2371
which was causing flakiness in one of the new dispatcher tests.
3. ``testClose_pendingTaskLongerThanCloseTimeout_taskIsNotRun``
intentionally takes ~2 seconds to run in order to provide some assurance
that, without cancellation, the task _would_ run and the test _would_
fail (this has been manually verified in a few different situations of
the dispatcher and/or test changing; some changes won't result in a
failure due to how cancellation works internally for executor service &
the converted coroutine dispatcher).

Note that historically these changes were originally part of #4929, but
they were split out so that they could be used by #5315 (which ended up
being convenient to include prior to #4929).

## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

## For UI-specific PRs only
This PR doesn't include any user-facing changes since it only impacts
scripts.

---------

Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com>
BenHenning added a commit that referenced this issue Mar 20, 2024
)

## Explanation
Fixes #5312

This updates the TODO open check script to be locally runnable rather
than requiring the developer to manually download the list of issues
from GitHub to analyze. This simplifies things and allows the script to
be easily run within the ``static_checks.sh`` script. This is being done
via interacting directly with GitHub using its RESTful API (see
https://docs.github.com/en/rest/issues/issues?apiVersion=2022-11-28#list-repository-issues)
in conjunction with the user's local auth token used to set up their
``gh`` tool (which needs to be set up, hence the changes to the wiki
documentation and clear error messages from the new ``GitHubClient``
utility).

To further simplify things, a ``regenerate`` mode was added to
regenerate the TODO exemptions textproto file (which is helpful for
#4929 hence why this comes before that PR).

The new command syntax to perform the TODO check is:

```sh
bazel run //scripts:todo_open_check -- <path_to_dir_root> <path_to_proto_binary> [regenerate]
```

With a specific example to just perform the check:

```sh
bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb
```

And an example to also perform regeneration:

```sh
bazel run //scripts:todo_open_check -- $(pwd) scripts/assets/todo_open_exemptions.pb regenerate
```

Some other things specifically to note:
- TODO exemptions needed to be updated in this PR due to TODO utility &
test changes. The new file was created using the new regenerate
functionality.
- The TODO check has been added to the end of ``static_checks.sh``.
- The GitHub CI workflow was updated to use the new script syntax
appropriately.
- This is the first time scripts have been updated to integrate with
Retrofit, and this setup is going to be reused in the future for other
services.
- The data model for issues has been updated to better represent the
remote data structure.
- Moshi is being used along with Retrofit for an easier interaction with
GitHub as a remote endpoint. All of this has been wrapped in a new
``GitHubClient``.
- ``GitHubClient`` is designed to download all issues regardless of
length (whereas before the manual download step was limited to the first
2000 issues of the repository) using pagination.
- New tests were added to verify the regenerate flow (and properly set
up the mock OkHttp server since the script now relies on an HTTP
endpoint to download the GitHub issues itself).
- ``GitHubIssue`` is exempted from tests since it's just a basic data
structure, so there's no specific logic to test.
- ``GitHubService`` is exempted from tests since it's a template to
generate code via Retrofit's annotation processor, so there's no
specific logic to test.
- All scripts proto libraries were updated to use normal Java (rather
than Java lite) generation to provide text format support.
- The file paths included in ``TodoOpenCheck``'s output has been
simplified to be relative to the repository root rather than using
absolute paths (for parity with many other app scripts).
- Since ``GitHubClient``'s tests required interacting with ``gh``, a new
``FakeCommandExecutor`` was added (along with its own tests) to provide
support for orchestrating local utilities. This may be useful in other
tests in the future, though some of those script tests intentionally
integrate with environment commands like ``git`` and ``bazel``.

## Essential Checklist
- [x] The PR title and explanation each start with "Fix #bugnum: " (If
this PR fixes part of an issue, prefix the title with "Fix part of
#bugnum: ...".)
- [x] Any changes to
[scripts/assets](https://github.com/oppia/oppia-android/tree/develop/scripts/assets)
files have their rationale included in the PR explanation.
- [x] The PR follows the [style
guide](https://github.com/oppia/oppia-android/wiki/Coding-style-guide).
- [x] The PR does not contain any unnecessary code changes from Android
Studio
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#undo-unnecessary-changes)).
- [x] The PR is made from a branch that's **not** called "develop" and
is up-to-date with "develop".
- [x] The PR is **assigned** to the appropriate reviewers
([reference](https://github.com/oppia/oppia-android/wiki/Guidance-on-submitting-a-PR#clarification-regarding-assignees-and-reviewers-section)).

## For UI-specific PRs only
This is an infrastructure-only PR.

---------

Co-authored-by: Adhiambo Peres <59600948+adhiamboperes@users.noreply.github.com>
Co-authored-by: Sean Lip <sean@seanlip.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement End user-perceivable enhancements. Impact: Low Low perceived user impact (e.g. edge cases). Work: Low Solution is clear and broken into good-first-issue-sized chunks.
Development

Successfully merging a pull request may close this issue.

3 participants