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

feat: move synthtool templates to library_generation/owlbot #2443

Merged
merged 33 commits into from
Feb 8, 2024
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
ba38e9c
transfer templates from synthtool to owlbot
diegomarquezp Feb 2, 2024
37af910
use locally hosted templates
diegomarquezp Feb 2, 2024
9e9e743
fix regex parsing
diegomarquezp Feb 2, 2024
d2a8ca4
update protobuf and generator versions in IT
diegomarquezp Feb 2, 2024
2cb0a31
minor fixes
diegomarquezp Feb 6, 2024
e1c262d
install synthtool for unit tests
diegomarquezp Feb 6, 2024
79b41bc
use repo level googleapis commitish for kms
diegomarquezp Feb 6, 2024
7d6dabc
comment fixes
diegomarquezp Feb 6, 2024
7c503c9
Update library_generation/owlbot/bin/entrypoint.sh
diegomarquezp Feb 6, 2024
5587d0f
use config yaml to compute exclusions
diegomarquezp Feb 7, 2024
65d8ef9
remove unused __init__.py files
diegomarquezp Feb 7, 2024
a0b0cfd
Merge remote-tracking branch 'origin/move-synthtool-templates' into m…
diegomarquezp Feb 7, 2024
b980b88
remove owlbot.py check in template rendering postprocessing step
diegomarquezp Feb 7, 2024
f2cd5bf
add comment for setup.py
diegomarquezp Feb 7, 2024
f416b4c
remove unit test
diegomarquezp Feb 7, 2024
8d348a4
simplify module processing script
diegomarquezp Feb 7, 2024
9c778f6
update googleapis commitish
diegomarquezp Feb 7, 2024
dbecc0e
update googleapis commitish ii
diegomarquezp Feb 7, 2024
a17d36a
Merge remote-tracking branch 'origin/main' into move-synthtool-templates
diegomarquezp Feb 8, 2024
07bc35f
Merge remote-tracking branch 'origin/main' into move-synthtool-templates
diegomarquezp Feb 8, 2024
2539e1e
post-merge fixes
diegomarquezp Feb 8, 2024
560644c
fix unit tests
diegomarquezp Feb 8, 2024
e0aade6
delete generated goldens
diegomarquezp Feb 8, 2024
1663a0f
restore necessary golden files
diegomarquezp Feb 8, 2024
0fb4b7e
snippet bot to ignore templates
diegomarquezp Feb 8, 2024
ccfee71
fix snippet bot ii
diegomarquezp Feb 8, 2024
07ea2a6
fix snippet bot iii
diegomarquezp Feb 8, 2024
b38f755
use full path to conflicting pomxml
diegomarquezp Feb 8, 2024
0e8b19e
use full path to actual conflicting pomxml
diegomarquezp Feb 8, 2024
f4e7867
lint
diegomarquezp Feb 8, 2024
f86635d
install lirbary_generation python package via setup.py
diegomarquezp Feb 8, 2024
02bac22
include owlbot python sources in python lint check
diegomarquezp Feb 8, 2024
e540631
lint owlbot
diegomarquezp Feb 8, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 15 additions & 0 deletions .github/workflows/verify_library_generation.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,21 @@ jobs:
pushd library_generation
pip install -r requirements.in
popd
- name: install synthtool
shell: bash
run: |
set -ex
mkdir -p /tmp/synthtool
pushd /tmp/synthtool
if [ ! -d "synthtool" ]; then
git clone https://github.com/googleapis/synthtool.git
fi
pushd "synthtool"

git reset --hard origin/no-java-templates

python3 -m pip install -e .
python3 -m pip install -r requirements.in
- name: Run shell unit tests
run: |
set -x
Expand Down
14 changes: 12 additions & 2 deletions library_generation/owlbot/bin/entrypoint.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,17 @@ versions_file=$2

# Runs template and etc in current working directory
function processModule() {
monorepo=$1

# apply repo templates
echo "Generating templates"
diegomarquezp marked this conversation as resolved.
Show resolved Hide resolved
if [ -f "owlbot.py" ]
then
python3 "${scripts_root}/owlbot/src/apply_repo_templates.py" owlbot.py "${monorepo}"
fi

# templates as well as retrieving files from owl-bot-staging
echo "Generating templates and retrieving files from owl-bot-staging directory..."
echo "Retrieving files from owl-bot-staging directory..."
if [ -f "owlbot.py" ]
then
# defaults to run owlbot.py
Expand Down Expand Up @@ -70,6 +79,7 @@ function processModule() {
# monorepo folders have an .OwlBot.yaml file in the module folder (e.g.
# java-asset/.OwlBot.yaml), whereas HW libraries have the yaml in
# `.github/.OwlBot.yaml`
monorepo="false"
if [[ -f "$(pwd)/.OwlBot.yaml" ]]; then
monorepo="true"
fi
Expand All @@ -80,4 +90,4 @@ if [[ "${monorepo}" == "true" ]]; then
mv temp owl-bot-staging
fi

processModule
processModule monorepo
59 changes: 59 additions & 0 deletions library_generation/owlbot/src/apply_repo_templates.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""
This script parses an owlbot.py file, specifically the call to `java.common_templates` in
order to extract the excluded files so it can be called with a custom template path
pointing to the templates hosted in `sdk-platform-java/library_generation/owlbot/templates`.
Briefly, this wraps the call to synthtool's common templates using a custom template folder.
"""

import os
from collections.abc import Sequence
from absl import app
from synthtool.languages.java import common_templates
from pathlib import Path
import re

script_dir = os.path.dirname(os.path.realpath(__file__))
repo_templates_path = os.path.join(script_dir, '..', 'templates', 'java_library')

def apply_repo_templates(owlbot_py_path: str, monorepo: bool) -> None:
excludes = []
with open(owlbot_py_path) as contents:
excludes += parse_template_excludes(contents.read())
print(f'repo_templates_path: {repo_templates_path}')
print(f'excludes: {excludes}')
common_templates(
excludes=excludes,
template_path=Path(repo_templates_path),
monorepo=monorepo
)


def parse_template_excludes(owlbot_py_contents: str) -> str:
Copy link
Collaborator

Choose a reason for hiding this comment

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

I think parsing generated owlbot.py is not intuitive.
Can we change the implementation of java.common_templates?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

java.common_templates lives in synthtool

If we want to change the implementation of that function we would need to transfer synthtool to sdk-platform-java (which is an actual option).

Also from the PR description, we could modify all owlbot.py files (and its template) to call our_own_owlbot.common_templates instead of java.common_templates

cc: @suztomo

Copy link
Contributor Author

Choose a reason for hiding this comment

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

As discussed with @suztomo, I'll use the configuration yaml to have a list of exclusions

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I modified the implementation to use the configuration yaml

print(f'owlbot_py_contents: {owlbot_py_contents}')
excludes = re.search(
'java\.common_templates\(.*excludes=\[(.*)\].*\)',
owlbot_py_contents,
re.MULTILINE | re.DOTALL
)
if excludes is None:
raise ValueError('Could not parse owlbot.py exclusions')
raw_excludes = excludes.group(1).split(',')
result = []
for raw_exc in raw_excludes:
match = re.search('["\'](.*)["\']', raw_exc)
if match:
result.append(match.group(1))
return result

def main(argv: Sequence[str]) -> None:
if len(argv) != 3:
raise app.UsageError("Usage: python apply-repo-templates.py owlbot_py_path monorepo")

owlbot_py_path = argv[1]
monorepo = argv[2]
apply_repo_templates(owlbot_py_path, monorepo.lower() == 'true')



if __name__ == "__main__":
app.run(main)
3 changes: 2 additions & 1 deletion library_generation/owlbot/src/requirements.in
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ colorlog
protobuf
watchdog
requests
pyyaml
pyyaml
Copy link
Collaborator

Choose a reason for hiding this comment

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

Why do we need these two packages?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

removed

absl-py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<!-- # Generated by synthtool. DO NOT EDIT! !-->
# Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of
experience, education, socio-economic status, nationality, personal appearance,
race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment
include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, or to ban temporarily or permanently any
contributor for other behaviors that they deem inappropriate, threatening,
offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.

This Code of Conduct also applies outside the project spaces when the Project
Steward has a reasonable belief that an individual's behavior may have a
negative impact on the project or its community.

## Conflict Resolution

We do not believe that all conflict is bad; healthy debate and disagreement
often yield positive results. However, it is never okay to be disrespectful or
to engage in behavior that violates the project’s code of conduct.

If you see someone violating the code of conduct, you are encouraged to address
the behavior directly with those involved. Many issues can be resolved quickly
and easily, and this gives people more control over the outcome of their
dispute. If you are unable to resolve the matter for any reason, or if the
behavior is threatening or harassing, report it. We are dedicated to providing
an environment where participants feel welcome and safe.

Reports should be directed to *googleapis-stewards@google.com*, the
Project Steward(s) for *Google Cloud Client Libraries*. It is the Project Steward’s duty to
receive and address reported violations of the code of conduct. They will then
work with a committee consisting of representatives from the Open Source
Programs Office and the Google Open Source Strategy team. If for any reason you
are uncomfortable reaching out to the Project Steward, please email
opensource@google.com.

We will investigate every complaint, but you may not receive a direct response.
We will use our discretion in determining when and how to follow up on reported
incidents, which may range from not taking action to permanent expulsion from
the project and project-sponsored spaces. We will notify the accused of the
report and provide them an opportunity to discuss it before any action is taken.
The identity of the reporter will be omitted from the details of the report
supplied to the accused. In potentially harmful situations, such as ongoing
harassment or threats to anyone's safety, we may take action without notice.

## Attribution

This Code of Conduct is adapted from the Contributor Covenant, version 1.4,
available at
https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# How to Contribute

We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.

## Contributor License Agreement

Contributions to this project must be accompanied by a Contributor License
Agreement. You (or your employer) retain the copyright to your contribution;
this simply gives us permission to use and redistribute your contributions as
part of the project. Head over to <https://cla.developers.google.com/> to see
your current agreements on file or to sign a new one.

You generally only need to submit a CLA once, so if you've already submitted one
(even if it was for a different project), you probably don't need to do it
again.

## Code reviews

All submissions, including submissions by project members, require review. We
use GitHub pull requests for this purpose. Consult
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
information on using pull requests.

## Community Guidelines

This project follows
[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).

## Building the project

To build, package, and run all unit tests run the command

```
mvn clean verify
```

### Running Integration tests

To include integration tests when building the project, you need access to
a GCP Project with a valid service account.

For instructions on how to generate a service account and corresponding
credentials JSON see: [Creating a Service Account][1].

Then run the following to build, package, run all unit tests and run all
integration tests.

```bash
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service/account.json
mvn -Penable-integration-tests clean verify
```

## Code Samples

All code samples must be in compliance with the [java sample formatting guide][3].
Code Samples must be bundled in separate Maven modules.

The samples must be separate from the primary project for a few reasons:
1. Primary projects have a minimum Java version of Java 8 whereas samples can have
Java version of Java 11. Due to this we need the ability to
selectively exclude samples from a build run.
2. Many code samples depend on external GCP services and need
credentials to access the service.
3. Code samples are not released as Maven artifacts and must be excluded from
release builds.

### Building

```bash
mvn clean verify
```

Some samples require access to GCP services and require a service account:

```bash
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service/account.json
mvn clean verify
```

### Code Formatting

Code in this repo is formatted with
[google-java-format](https://github.com/google/google-java-format).
To run formatting on your project, you can run:
```
mvn com.coveo:fmt-maven-plugin:format
```

[1]: https://cloud.google.com/docs/authentication/getting-started#creating_a_service_account
[2]: https://maven.apache.org/settings.html#Active_Profiles
[3]: https://github.com/GoogleCloudPlatform/java-docs-samples/blob/main/SAMPLE_FORMAT.md