summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-06-20 04:33:49 +0000
committerCoprDistGit <infra@openeuler.org>2023-06-20 04:33:49 +0000
commita1fec7e3d0535bb1d11fef2f85bcce2af03b05ba (patch)
tree5633a417af5913cfd16d91254f997067f49fee3e
parent54d0c48de0ea7b4a911786a53f9f06fdf4238ded (diff)
automatic import of python-grpc4bmiopeneuler20.03
-rw-r--r--.gitignore1
-rw-r--r--python-grpc4bmi.spec578
-rw-r--r--sources1
3 files changed, 580 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..67e1a21 100644
--- a/.gitignore
+++ b/.gitignore
@@ -0,0 +1 @@
+/grpc4bmi-0.4.0.tar.gz
diff --git a/python-grpc4bmi.spec b/python-grpc4bmi.spec
new file mode 100644
index 0000000..107c22c
--- /dev/null
+++ b/python-grpc4bmi.spec
@@ -0,0 +1,578 @@
+%global _empty_manifest_terminate_build 0
+Name: python-grpc4bmi
+Version: 0.4.0
+Release: 1
+Summary: Run your BMI implementation in a separate process and expose it as BMI-python with GRPC
+License: Apache License 2.0
+URL: https://github.com/eWaterCycle/grpc4bmi
+Source0: https://mirrors.aliyun.com/pypi/web/packages/0c/af/208f4f84a7910136e2fe6776f8b7d4370235f47edc11e1cffd1bb6cc8bf9/grpc4bmi-0.4.0.tar.gz
+BuildArch: noarch
+
+Requires: python3-grpcio
+Requires: python3-grpcio-reflection
+Requires: python3-grpcio-status
+Requires: python3-googleapis-common-protos
+Requires: python3-protobuf
+Requires: python3-numpy
+Requires: python3-docker
+Requires: python3-bmipy
+Requires: python3-packaging
+Requires: python3-typeguard
+Requires: python3-rpy2
+Requires: python3-build
+Requires: python3-pytest
+Requires: python3-pytest-cov
+Requires: python3-coverage[toml]
+Requires: python3-grpcio-tools
+Requires: python3-nbconvert
+Requires: python3-ipykernel
+Requires: python3-nbformat
+Requires: python3-sphinx
+Requires: python3-sphinxcontrib-apidoc
+Requires: python3-sphinxcontrib-napoleon
+Requires: python3-sphinx-argparse
+Requires: python3-sphinx-rtd-theme
+Requires: python3-numpydoc
+Requires: python3-sphinx-copybutton
+
+%description
+# grpc4bmi
+
+[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1462641.svg)](https://doi.org/10.5281/zenodo.1462641)
+[![CI](https://github.com/eWaterCycle/grpc4bmi/workflows/CI/badge.svg)](https://github.com/eWaterCycle/grpc4bmi/actions?query=workflow%3ACI)
+[![Documentation Status](https://readthedocs.org/projects/grpc4bmi/badge/?version=latest)](https://grpc4bmi.readthedocs.io/en/latest/?badge=latest)
+[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=grpc4bmi&metric=alert_status)](https://sonarcloud.io/dashboard?id=grpc4bmi)
+[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=grpc4bmi&metric=coverage)](https://sonarcloud.io/dashboard?id=grpc4bmi)
+
+## Purpose
+
+This software allows you to wrap your [Basic Model Interface (BMI)](https://github.com/csdms/bmi) implementation in a server process and communicate with it via the included Python client. The communication is serialized to protocol buffers by [GRPC](https://grpc.io/) and occurs over network ports. Can run models in isolated containers using Docker or Apptainer.
+
+## Installation
+
+Optionally, create your virtual environment and activate it, Then, run
+
+```bash
+pip install grpc4bmi
+```
+
+on the client (Python) side. If your server model is implemented in Python, do the same in the server environment (e.g. docker container). If the model is implemented in R, run instead
+
+```bash
+pip install grpc4bmi[R]
+```
+
+in the server environment. For bleeding edge version from GitHub use
+
+```bash
+pip install git+https://github.com/eWaterCycle/grpc4bmi.git#egg=grpc4bmi
+```
+
+Finally if the model is implemented in C or C++, clone this git repo and run
+
+```bash
+make
+make install
+```
+
+in the cpp folder.
+
+## Usage
+
+### Model written in Python
+
+A model should be a subclass of the `Bmi` class from the [bmipy](https://pypi.org/project/bmipy/2.0/) package.
+
+For inspiration look at the [example](test/fake_models.py) in the test directory.
+
+To start a server process that allows calls to your BMI implementation, type
+
+```bash
+run-bmi-server --name <PACKAGE>.<MODULE>.<CLASS> --port <PORT> --path <PATH>
+```
+
+where ```<PACKAGE>, <MODULE>``` are the python package and module containing your implementation, ```<CLASS>``` is your
+bmi model class name, ```<PORT>``` is any available port on the host system, and optionally ```<PATH>``` denotes an
+additional path that should be added to the system path to make your implementation work. The name option above is
+optional, and if not provided the script will look at the environment variables ```BMI_PACKAGE```, ```BMI_MODULE``` and
+```BMI_CLASS```. Similarly, the port can be defined by the environment variable ```BMI_PORT```.
+This software assumes that your implementation constructor has no parameters.
+
+### Model written in C/C++ (beta)
+
+Create an executable along the lines of cpp/run-bmi-server.cc. You can copy the file and replace the function
+
+```C++
+Bmi* create_model_instance()
+{
+ /* Return your new BMI instance pointer here... */
+}
+```
+
+with the instantiation of your model BMI. The model needs to implement the csdms BMI for C, but you may also implement our more object-oriented C++ interface [BmiCppExtension](https://github.com/eWaterCycle/grpc4bmi/blob/master/cpp/bmi_cpp_extension.h).
+
+### Model written in R
+
+The grpc4bmi Python package can also run BMI models written in R if the model is a subclass of [AbstractBmi](https://github.com/eWaterCycle/bmi-r/blob/master/R/abstract-bmi.R#L9)
+See [https://github.com/eWaterCycle/bmi-r](https://github.com/eWaterCycle/bmi-r) for instruction on R and Docker.
+
+Run the R model a server with
+
+```bash
+run-bmi-server --lang R [--path <R file with BMI model>] --name [<PACKAGE>::]<CLASS> --port <PORT>
+```
+
+For example with [WALRUS](https://github.com/eWaterCycle/grpc4bmi-examples/tree/master/walrus) use
+
+```bash
+run-bmi-server --lang R --path ~/git/eWaterCycle/grpc4bmi-examples/walrus/walrus-bmi.r --name WalrusBmi --port 55555
+```
+
+### The client side
+
+The client side has only a Python implementation. The default BMI client assumes a running server process on a given port.
+
+```python
+from grpc4bmi.bmi_grpc_client import BmiClient
+import grpc
+mymodel = BmiClient(grpc.insecure_channel("localhost:<PORT>"))
+print mymodel.get_component_name()
+mymodel.initialize(<FILEPATH>)
+...further BMI calls...
+```
+
+The package contains also client implementation that own the server process, either as a Python subprocess or a Docker
+container or a Singularity container or a Apptainer container running the ```run-bmi-server``` script. For instance
+```python
+from grpc4bmi.bmi_client_subproc import BmiClientSubProcess
+mymodel = BmiClientSubProcess(<PACKAGE>.<MODULE>.<CLASS>)
+```
+
+will automatically launch the server in a sub-process and
+
+```python
+from grpc4bmi.bmi_client_docker import BmiClientDocker
+mymodel = BmiClientDocker(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
+```
+will launch a Docker container based on supplied Docker image
+and will mount supplied directories to share files between the container and host.
+
+```python
+from grpc4bmi.bmi_client_singularity import BmiClientSingularity
+mymodel = BmiClientSingularity(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
+```
+will launch a singularity container on based supplied Singularity image
+and will mount supplied directories to share files between the container and host.
+
+```python
+from grpc4bmi.bmi_client_apptainer import BmiClientApptainer
+mymodel = BmiClientApptainer(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
+```
+will launch a Apptainer container on based supplied Apptainer image
+and will mount supplied directories to share files between the container and host.
+
+For more documentation see [https://grpc4bmi.readthedocs.io/](https://grpc4bmi.readthedocs.io/).
+
+## Development: generating the gRPC code
+
+When developers change the proto-file, it is necessary to install gRPC tools Python packages in your Python environment:
+
+```bash
+# Create virtual env
+python3 -m venv .venv
+. venv/bin/activate
+# Make sure latest pip and wheel are install
+pip install -U pip wheel
+pip install -r dev-requirements.txt
+# For R integration also install the R extras with
+pip install -e .[R]
+# For building docs (cd docs && make html) also install the docs extras with
+pip install -e .[docs]
+```
+
+and install the C++ runtime and `protoc` command as described in <https://github.com/google/protobuf/blob/master/src/README.md>.
+After this, simply executing the `proto_gen.sh` script should do the job.
+
+## Future work
+
+More language bindings are underway.
+
+
+%package -n python3-grpc4bmi
+Summary: Run your BMI implementation in a separate process and expose it as BMI-python with GRPC
+Provides: python-grpc4bmi
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-grpc4bmi
+# grpc4bmi
+
+[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1462641.svg)](https://doi.org/10.5281/zenodo.1462641)
+[![CI](https://github.com/eWaterCycle/grpc4bmi/workflows/CI/badge.svg)](https://github.com/eWaterCycle/grpc4bmi/actions?query=workflow%3ACI)
+[![Documentation Status](https://readthedocs.org/projects/grpc4bmi/badge/?version=latest)](https://grpc4bmi.readthedocs.io/en/latest/?badge=latest)
+[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=grpc4bmi&metric=alert_status)](https://sonarcloud.io/dashboard?id=grpc4bmi)
+[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=grpc4bmi&metric=coverage)](https://sonarcloud.io/dashboard?id=grpc4bmi)
+
+## Purpose
+
+This software allows you to wrap your [Basic Model Interface (BMI)](https://github.com/csdms/bmi) implementation in a server process and communicate with it via the included Python client. The communication is serialized to protocol buffers by [GRPC](https://grpc.io/) and occurs over network ports. Can run models in isolated containers using Docker or Apptainer.
+
+## Installation
+
+Optionally, create your virtual environment and activate it, Then, run
+
+```bash
+pip install grpc4bmi
+```
+
+on the client (Python) side. If your server model is implemented in Python, do the same in the server environment (e.g. docker container). If the model is implemented in R, run instead
+
+```bash
+pip install grpc4bmi[R]
+```
+
+in the server environment. For bleeding edge version from GitHub use
+
+```bash
+pip install git+https://github.com/eWaterCycle/grpc4bmi.git#egg=grpc4bmi
+```
+
+Finally if the model is implemented in C or C++, clone this git repo and run
+
+```bash
+make
+make install
+```
+
+in the cpp folder.
+
+## Usage
+
+### Model written in Python
+
+A model should be a subclass of the `Bmi` class from the [bmipy](https://pypi.org/project/bmipy/2.0/) package.
+
+For inspiration look at the [example](test/fake_models.py) in the test directory.
+
+To start a server process that allows calls to your BMI implementation, type
+
+```bash
+run-bmi-server --name <PACKAGE>.<MODULE>.<CLASS> --port <PORT> --path <PATH>
+```
+
+where ```<PACKAGE>, <MODULE>``` are the python package and module containing your implementation, ```<CLASS>``` is your
+bmi model class name, ```<PORT>``` is any available port on the host system, and optionally ```<PATH>``` denotes an
+additional path that should be added to the system path to make your implementation work. The name option above is
+optional, and if not provided the script will look at the environment variables ```BMI_PACKAGE```, ```BMI_MODULE``` and
+```BMI_CLASS```. Similarly, the port can be defined by the environment variable ```BMI_PORT```.
+This software assumes that your implementation constructor has no parameters.
+
+### Model written in C/C++ (beta)
+
+Create an executable along the lines of cpp/run-bmi-server.cc. You can copy the file and replace the function
+
+```C++
+Bmi* create_model_instance()
+{
+ /* Return your new BMI instance pointer here... */
+}
+```
+
+with the instantiation of your model BMI. The model needs to implement the csdms BMI for C, but you may also implement our more object-oriented C++ interface [BmiCppExtension](https://github.com/eWaterCycle/grpc4bmi/blob/master/cpp/bmi_cpp_extension.h).
+
+### Model written in R
+
+The grpc4bmi Python package can also run BMI models written in R if the model is a subclass of [AbstractBmi](https://github.com/eWaterCycle/bmi-r/blob/master/R/abstract-bmi.R#L9)
+See [https://github.com/eWaterCycle/bmi-r](https://github.com/eWaterCycle/bmi-r) for instruction on R and Docker.
+
+Run the R model a server with
+
+```bash
+run-bmi-server --lang R [--path <R file with BMI model>] --name [<PACKAGE>::]<CLASS> --port <PORT>
+```
+
+For example with [WALRUS](https://github.com/eWaterCycle/grpc4bmi-examples/tree/master/walrus) use
+
+```bash
+run-bmi-server --lang R --path ~/git/eWaterCycle/grpc4bmi-examples/walrus/walrus-bmi.r --name WalrusBmi --port 55555
+```
+
+### The client side
+
+The client side has only a Python implementation. The default BMI client assumes a running server process on a given port.
+
+```python
+from grpc4bmi.bmi_grpc_client import BmiClient
+import grpc
+mymodel = BmiClient(grpc.insecure_channel("localhost:<PORT>"))
+print mymodel.get_component_name()
+mymodel.initialize(<FILEPATH>)
+...further BMI calls...
+```
+
+The package contains also client implementation that own the server process, either as a Python subprocess or a Docker
+container or a Singularity container or a Apptainer container running the ```run-bmi-server``` script. For instance
+```python
+from grpc4bmi.bmi_client_subproc import BmiClientSubProcess
+mymodel = BmiClientSubProcess(<PACKAGE>.<MODULE>.<CLASS>)
+```
+
+will automatically launch the server in a sub-process and
+
+```python
+from grpc4bmi.bmi_client_docker import BmiClientDocker
+mymodel = BmiClientDocker(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
+```
+will launch a Docker container based on supplied Docker image
+and will mount supplied directories to share files between the container and host.
+
+```python
+from grpc4bmi.bmi_client_singularity import BmiClientSingularity
+mymodel = BmiClientSingularity(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
+```
+will launch a singularity container on based supplied Singularity image
+and will mount supplied directories to share files between the container and host.
+
+```python
+from grpc4bmi.bmi_client_apptainer import BmiClientApptainer
+mymodel = BmiClientApptainer(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
+```
+will launch a Apptainer container on based supplied Apptainer image
+and will mount supplied directories to share files between the container and host.
+
+For more documentation see [https://grpc4bmi.readthedocs.io/](https://grpc4bmi.readthedocs.io/).
+
+## Development: generating the gRPC code
+
+When developers change the proto-file, it is necessary to install gRPC tools Python packages in your Python environment:
+
+```bash
+# Create virtual env
+python3 -m venv .venv
+. venv/bin/activate
+# Make sure latest pip and wheel are install
+pip install -U pip wheel
+pip install -r dev-requirements.txt
+# For R integration also install the R extras with
+pip install -e .[R]
+# For building docs (cd docs && make html) also install the docs extras with
+pip install -e .[docs]
+```
+
+and install the C++ runtime and `protoc` command as described in <https://github.com/google/protobuf/blob/master/src/README.md>.
+After this, simply executing the `proto_gen.sh` script should do the job.
+
+## Future work
+
+More language bindings are underway.
+
+
+%package help
+Summary: Development documents and examples for grpc4bmi
+Provides: python3-grpc4bmi-doc
+%description help
+# grpc4bmi
+
+[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1462641.svg)](https://doi.org/10.5281/zenodo.1462641)
+[![CI](https://github.com/eWaterCycle/grpc4bmi/workflows/CI/badge.svg)](https://github.com/eWaterCycle/grpc4bmi/actions?query=workflow%3ACI)
+[![Documentation Status](https://readthedocs.org/projects/grpc4bmi/badge/?version=latest)](https://grpc4bmi.readthedocs.io/en/latest/?badge=latest)
+[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=grpc4bmi&metric=alert_status)](https://sonarcloud.io/dashboard?id=grpc4bmi)
+[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=grpc4bmi&metric=coverage)](https://sonarcloud.io/dashboard?id=grpc4bmi)
+
+## Purpose
+
+This software allows you to wrap your [Basic Model Interface (BMI)](https://github.com/csdms/bmi) implementation in a server process and communicate with it via the included Python client. The communication is serialized to protocol buffers by [GRPC](https://grpc.io/) and occurs over network ports. Can run models in isolated containers using Docker or Apptainer.
+
+## Installation
+
+Optionally, create your virtual environment and activate it, Then, run
+
+```bash
+pip install grpc4bmi
+```
+
+on the client (Python) side. If your server model is implemented in Python, do the same in the server environment (e.g. docker container). If the model is implemented in R, run instead
+
+```bash
+pip install grpc4bmi[R]
+```
+
+in the server environment. For bleeding edge version from GitHub use
+
+```bash
+pip install git+https://github.com/eWaterCycle/grpc4bmi.git#egg=grpc4bmi
+```
+
+Finally if the model is implemented in C or C++, clone this git repo and run
+
+```bash
+make
+make install
+```
+
+in the cpp folder.
+
+## Usage
+
+### Model written in Python
+
+A model should be a subclass of the `Bmi` class from the [bmipy](https://pypi.org/project/bmipy/2.0/) package.
+
+For inspiration look at the [example](test/fake_models.py) in the test directory.
+
+To start a server process that allows calls to your BMI implementation, type
+
+```bash
+run-bmi-server --name <PACKAGE>.<MODULE>.<CLASS> --port <PORT> --path <PATH>
+```
+
+where ```<PACKAGE>, <MODULE>``` are the python package and module containing your implementation, ```<CLASS>``` is your
+bmi model class name, ```<PORT>``` is any available port on the host system, and optionally ```<PATH>``` denotes an
+additional path that should be added to the system path to make your implementation work. The name option above is
+optional, and if not provided the script will look at the environment variables ```BMI_PACKAGE```, ```BMI_MODULE``` and
+```BMI_CLASS```. Similarly, the port can be defined by the environment variable ```BMI_PORT```.
+This software assumes that your implementation constructor has no parameters.
+
+### Model written in C/C++ (beta)
+
+Create an executable along the lines of cpp/run-bmi-server.cc. You can copy the file and replace the function
+
+```C++
+Bmi* create_model_instance()
+{
+ /* Return your new BMI instance pointer here... */
+}
+```
+
+with the instantiation of your model BMI. The model needs to implement the csdms BMI for C, but you may also implement our more object-oriented C++ interface [BmiCppExtension](https://github.com/eWaterCycle/grpc4bmi/blob/master/cpp/bmi_cpp_extension.h).
+
+### Model written in R
+
+The grpc4bmi Python package can also run BMI models written in R if the model is a subclass of [AbstractBmi](https://github.com/eWaterCycle/bmi-r/blob/master/R/abstract-bmi.R#L9)
+See [https://github.com/eWaterCycle/bmi-r](https://github.com/eWaterCycle/bmi-r) for instruction on R and Docker.
+
+Run the R model a server with
+
+```bash
+run-bmi-server --lang R [--path <R file with BMI model>] --name [<PACKAGE>::]<CLASS> --port <PORT>
+```
+
+For example with [WALRUS](https://github.com/eWaterCycle/grpc4bmi-examples/tree/master/walrus) use
+
+```bash
+run-bmi-server --lang R --path ~/git/eWaterCycle/grpc4bmi-examples/walrus/walrus-bmi.r --name WalrusBmi --port 55555
+```
+
+### The client side
+
+The client side has only a Python implementation. The default BMI client assumes a running server process on a given port.
+
+```python
+from grpc4bmi.bmi_grpc_client import BmiClient
+import grpc
+mymodel = BmiClient(grpc.insecure_channel("localhost:<PORT>"))
+print mymodel.get_component_name()
+mymodel.initialize(<FILEPATH>)
+...further BMI calls...
+```
+
+The package contains also client implementation that own the server process, either as a Python subprocess or a Docker
+container or a Singularity container or a Apptainer container running the ```run-bmi-server``` script. For instance
+```python
+from grpc4bmi.bmi_client_subproc import BmiClientSubProcess
+mymodel = BmiClientSubProcess(<PACKAGE>.<MODULE>.<CLASS>)
+```
+
+will automatically launch the server in a sub-process and
+
+```python
+from grpc4bmi.bmi_client_docker import BmiClientDocker
+mymodel = BmiClientDocker(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
+```
+will launch a Docker container based on supplied Docker image
+and will mount supplied directories to share files between the container and host.
+
+```python
+from grpc4bmi.bmi_client_singularity import BmiClientSingularity
+mymodel = BmiClientSingularity(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
+```
+will launch a singularity container on based supplied Singularity image
+and will mount supplied directories to share files between the container and host.
+
+```python
+from grpc4bmi.bmi_client_apptainer import BmiClientApptainer
+mymodel = BmiClientApptainer(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
+```
+will launch a Apptainer container on based supplied Apptainer image
+and will mount supplied directories to share files between the container and host.
+
+For more documentation see [https://grpc4bmi.readthedocs.io/](https://grpc4bmi.readthedocs.io/).
+
+## Development: generating the gRPC code
+
+When developers change the proto-file, it is necessary to install gRPC tools Python packages in your Python environment:
+
+```bash
+# Create virtual env
+python3 -m venv .venv
+. venv/bin/activate
+# Make sure latest pip and wheel are install
+pip install -U pip wheel
+pip install -r dev-requirements.txt
+# For R integration also install the R extras with
+pip install -e .[R]
+# For building docs (cd docs && make html) also install the docs extras with
+pip install -e .[docs]
+```
+
+and install the C++ runtime and `protoc` command as described in <https://github.com/google/protobuf/blob/master/src/README.md>.
+After this, simply executing the `proto_gen.sh` script should do the job.
+
+## Future work
+
+More language bindings are underway.
+
+
+%prep
+%autosetup -n grpc4bmi-0.4.0
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-grpc4bmi -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Tue Jun 20 2023 Python_Bot <Python_Bot@openeuler.org> - 0.4.0-1
+- Package Spec generated
diff --git a/sources b/sources
new file mode 100644
index 0000000..6d01d0e
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+f78db6140c1eda3a5fabb70d2898c121 grpc4bmi-0.4.0.tar.gz