-
Notifications
You must be signed in to change notification settings - Fork 6
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
Minimal contributing guide #42
Merged
Merged
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
# Contributing guide | ||
|
||
## Development environment | ||
|
||
This section provides a brief overview of the minimal developer environment. Because `tsumugi` is a complex multi-language project, this part is split into subsections covering the JVM server component, the protobuf and buf component, and the Python client component. | ||
|
||
### Makefile | ||
|
||
A portion of useful commands has been moved to the `Makefile`. To run `make` commands, one needs to download and install the make utility. The make utility can be obtained from the [GNU Make website](https://www.gnu.org/software/make/#download). For some operating systems, `make` is also available through package managers. | ||
|
||
### JVM | ||
|
||
For managing Java, Scala, and Maven, it is strongly recommended to use tools like [SDKMan](https://sdkman.io/). With SDKMan, all the necessary components can be easily installed using just a few shell commands. | ||
|
||
- Java 11; [OpenJDK archieve](https://jdk.java.net/archive/), [installation manual](https://openjdk.org/install/); | ||
- Apache Maven; [Installation manual](https://maven.apache.org/install.html); | ||
- Scala 2.12.X; [Installation manual](https://www.scala-lang.org/download/); | ||
|
||
Installation with `SDKMan`: | ||
|
||
```sh | ||
sdk install java 11.0.25-zulu | ||
sdk install maven 3.9.6 | ||
sdk install scala 2.12.20 | ||
``` | ||
|
||
|
||
### Protobuf | ||
|
||
- [Protoc](https://github.com/protocolbuffers/protobuf); [Installation manual](https://grpc.io/docs/protoc-installation/); | ||
- [Buf](https://github.com/bufbuild/buf); [Installation manual](https://buf.build/docs/installation/); | ||
|
||
Java classes are generated from the protobuf messages during the build via maven plugin and there is no reason to store them inside the repository. Python classes are generated from the protobuf messages manually. To generat or update Python classes run the following: | ||
|
||
```sh | ||
make generate_code | ||
``` | ||
|
||
### Python | ||
|
||
It is strongly recommend to use tools like [pyenv](https://github.com/pyenv/pyenv/tree/master) to manage Python versions. | ||
|
||
- [Python](https://www.python.org/downloads/release/python-3100/); with `pyenv`: `pyenv install 3.10`; | ||
- [Poetry](https://python-poetry.org/); [Installation manual](https://python-poetry.org/docs/#installation); | ||
|
||
Run the following command to create a python venv: | ||
|
||
```sh | ||
poetry env use %path-to-python3.10% # On POSIX systems it should be like ~/.pyenv/versions/3.10.14/bin/python | ||
poetry install --with dev | ||
``` | ||
|
||
## Code style and naming conventions | ||
|
||
### Linters | ||
|
||
Tsumugi uses [`scalafmt`](https://scalameta.org/scalafmt/) for server part and [`ruff`](https://github.com/astral-sh/ruff) for Python client. | ||
|
||
To apply formatting rules to scala part run the following command: | ||
|
||
```sh | ||
mvn spotless:apply | ||
``` | ||
|
||
To apply python formatting rules run the following command: | ||
|
||
```sh | ||
make lint_python | ||
``` | ||
|
||
### Python tips | ||
|
||
All the APIs built on top of ptorobuf classes are done in the following way: | ||
|
||
The protobuf message: | ||
|
||
```proto3 | ||
message KLLParameters { | ||
int32 sketch_size = 1; | ||
double shrinking_factor = 2; | ||
int32 number_of_buckets = 3; | ||
} | ||
``` | ||
|
||
The Python API: | ||
|
||
```python | ||
@dataclass | ||
class KLLParameters: | ||
"""Parameters for KLLSketch.""" | ||
|
||
sketch_size: int | ||
shrinking_factor: float | ||
number_of_buckets: int | ||
|
||
def _to_proto(self) -> proto.KLLSketch.KLLParameters: | ||
return proto.KLLSketch.KLLParameters( | ||
sketch_size=self.sketch_size, | ||
shrinking_factor=self.shrinking_factor, | ||
number_of_buckets=self.number_of_buckets, | ||
) | ||
``` | ||
|
||
To maintain a consistent style across all Python code, the following rules should be followed: | ||
|
||
1. All classes that wrap code generated from protobuf messages should be implemented as dataclasses, unless there is a compelling reason not to do so. | ||
2. Each of these classes should have a private method `_to_proto(self) -> "protobuf class"` that converts the dataclass to the proto-serializable class. | ||
|
||
## Running examples or testing clients | ||
|
||
To simplify testing and development, there is a script that builds a server plugin, downloads and unpacks the Spark distribution, and runs the Spark Connect Server with all the necessary configurations. To run it, use `make run_spark_server`. After that, the server will be available at `sc://localhost:15002`. | ||
|
||
## Examples and notebooks | ||
|
||
Examples and Notebooks are part of the documentation and are placed in `docs/notebooks` folder. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -3,7 +3,7 @@ | |
A modern PySpark Connect/Classic wrapper on top of the Deequ, a beautiful Data Quality library from AWS Labs. | ||
|
||
|
||
![](https://raw.githubusercontent.com/SemyonSinchenko/tsumugi-spark/main/static/tsumugi-spark-logo.png) | ||
![](https://raw.githubusercontent.com/mrpowers-io/tsumugi-spark/main/static/tsumugi-spark-logo.png) | ||
|
||
**_NOTE:_** _Tsumugi Shiraui is a chimera: a hybrid of Human and Gauna. She combines the chaotic power of Gauna with a Human intillegence and empathia. Like an original character of the Manga "Knights of Sidonia", this project aims to make a hybrid of very powerful but hard to learn and use Deequ Scala Library with a usability and simplicity of Spark Connect (PySpark Connect, Spark Connect Go, Spark Connect Rust, etc.)._ | ||
|
||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not related to this PR but On line 12 there is a typo |
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
make run_spark_server
results in a build error -[ERROR] /workspaces/tsumugi-spark/tsumugi-server/src/test/scala/com/ssinchenko/tsumugi/DeequUtilsTest.scala:66: type mismatch; found : scala.util.Try[com.amazon.deequ.VerificationRunBuilder] required: com.amazon.deequ.VerificationRunBuilder [ERROR] one error found
Changing the statement
val deequSuite = DeequSuiteBuilder.protoToVerificationSuite(data, protoSuiteBuilder.build())
toval deequSuite = DeequSuiteBuilder.protoToVerificationSuite(data, protoSuiteBuilder.build()).getOrElse(throw new RuntimeException("Failed to create VerificationSuite"))
in/workspaces/tsumugi-spark/tsumugi-server/src/test/scala/com/ssinchenko/tsumugi/DeequUtilsTest.scala
and adding relevant imports resolved it, however my Scala is no good. Please have a look and use your judgement!There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch. I just realized that I somehow missed this in previous PR and we actually do not have automated testing for scala server. Will create a separate Issue to tackle this. Since it's not really related to this PR I will merge it in
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I will try to fix the problem in this PR but we also need to run some minimal python client tests in CI
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@SemyonSinchenko Sorry Did not get updated on this. I figured we already have #40 which might be a good candidate for this?