|
#! /bin/bash |
|
|
|
language=python |
|
artman_yaml=artman_dogs.yaml |
|
|
|
if [ -z "$GOOGLEAPIS" ]; then |
|
echo "export GOOGLEAPIS – must be set to path to local googleapis/googleapis clone" |
|
echo ">> note: this script makes modifications (additions) to the googleapis directory" |
|
exit 1 |
|
else |
|
echo "googleapis directory: $GOOGLEAPIS" |
|
fi |
|
|
|
log() { |
|
echo -e "[\033[0;92m–> –> –> $1\033[0m]" |
|
} |
|
|
|
log "Deleting previous artman-genfiles artifacts" |
|
rm_genfiles_output="`rm -rfv ./artman-genfiles`" |
|
log "Deleted `echo -e "$rm_genfiles_output" | wc -l` files/dirs" |
|
|
|
root="`pwd`" |
|
|
|
# Required dependencies (or it blows up) |
|
# tl;dr make the generator think it has all of the Googley files it needs |
|
mkdir -pv ./google/{api,rpc,type,longrunning,iam/v1} |
|
for filepath in google/api/{http,annotations}.proto; do |
|
cp -v "$GOOGLEAPIS/$filepath" "./$filepath" |
|
done |
|
|
|
log "Generating Python Library" |
|
output=`docker run --rm -e RUNNING_IN_ARTMAN_DOCKER=True -v "$(pwd):/googleapis" \ |
|
-w /googleapis googleapis/artman /bin/bash -c \ |
|
"artman --local --config $artman_yaml generate ${language}_gapic" 2>&1` |
|
docker_exit_code=$? |
|
echo -e "$output" |
|
|
|
if [ $docker_exit_code -ne 0 ]; then |
|
if [[ "$output" =~ "Path gapic not found in" ]]; then |
|
log "Generation may have failed ($docker_exit_code)" |
|
log "'dogs' related directories created:" |
|
find $root/artman-genfiles -type d -name "*dog*" |
|
else |
|
log "Generating $language failed ($docker_exit_code)" |
|
exit $docker_exit_code |
|
fi |
|
fi |
|
|
|
python_library_root="artman-genfiles/python/dogs-v1" |
|
python_samples_path="samples/codelabs/dogs_v1/gapic/list_dogs" |
|
|
|
cd "$root/$python_library_root" |
|
|
|
log "FIX standardize import namespaces" |
|
grep -rl "from codelabs.dogs\.v1" codelabs | xargs -n1 sed -i.bak -e "s/from codelabs.dogs.v1/from codelabs.dogs_v1/" |
|
find codelabs/ -name "*.py.bak" -exec rm {} \; |
|
|
|
log "Copy pb2 proto files into package" |
|
mv ../grpc-codelabs-dogs-v1/codelabs/dogs_v1/proto codelabs/dogs_v1/ |
|
touch codelabs/dogs_v1/proto/__init__.py |
|
|
|
log "FIX pb2 proto imports" |
|
grep -rl "from codelabs.dogs_v1 import dogs_pb2" . | xargs -n1 sed -i.bak -e "s/dogs_v1 import dogs_pb2/dogs_v1.proto import dogs_pb2/" |
|
find codelabs/ -name "*.py.bak" -exec rm {} \; |
|
|
|
log "FIX samples to use localhost server (without auth)" |
|
for sample in `find samples/codelabs/dogs_v1/gapic -name "*.py"`; do |
|
sed -i.bak -e $'s/import sys/import sys\\\nfrom grpc import insecure_channel/' "$sample" |
|
find samples/ -name "*.py.bak" -exec rm {} \; |
|
sed -i.bak -e 's/\.DogsServiceClient()/.DogsServiceClient(channel=insecure_channel("localhost:2222"))/' "$sample" |
|
find samples/ -name "*.py.bak" -exec rm {} \; |
|
done |
|
|
|
log "FIX setup.py" |
|
for replacement in "s/^.*namespace.*$//" \ |
|
"s/if 'google.cloud'.*$//" \ |
|
"s/startswith('google')/startswith('codelabs')/" |
|
do |
|
sed -i.bak -e "$replacement" setup.py |
|
done |
|
|
|
echo |
|
log "Install Generated Library" |
|
virtualenv --python python3 env |
|
source env/bin/activate |
|
pip install . |
|
|
|
log "Running Python Samples" |
|
log "Sample: List Dogs" |
|
output="$( python samples/codelabs/dogs_v1/gapic/list_dogs/list_dogs_request_list_dogs.py 2>&1 )" |
|
if [[ "$output" =~ "ServiceUnavailable" ]]; then |
|
echo "Client library cannot hit your local gRPC API (ServiceUnavailable)" |
|
echo "Did you run \`node dogs_server.js\`?" |
|
echo "Run \`npm install\` first to install dependencies" |
|
exit 1 |
|
fi |
|
log "Sample: Add Dog" |
|
python samples/codelabs/dogs_v1/gapic/add_dog/add_dog_request_add_dog.py --name "Rex" |
|
log "Sample: List Dogs" |
|
python samples/codelabs/dogs_v1/gapic/list_dogs/list_dogs_request_list_dogs.py |
|
log "Sample: Remove Dogs" |
|
python samples/codelabs/dogs_v1/gapic/remove_dog/remove_dog_request_remove_dog.py --name "Rex" |
|
log "Sample: List Dogs" |
|
python samples/codelabs/dogs_v1/gapic/list_dogs/list_dogs_request_list_dogs.py |
|
|
|
echo -e " |
|
[\033[0;37mCheck the console where you ran dogs_server.js to verify this client library hit it\033[0m] |
|
|
|
>> \033[0;92mTry it out for yourself!\033[0m << |
|
|
|
The \033[0;34mcodelabs.dogs_v1\033[0m pip package is now installed locally |
|
|
|
Client Library: |
|
- artman-genfiles/python/dogs-v1/ |
|
|
|
Samples: |
|
- artman-genfiles/python/dogs-v1/samples/codelabs/dogs_v1/gapic/remove_dog/\033[0;34mremove_dog_request_remove_dog.py\033[0m] |
|
- artman-genfiles/python/dogs-v1/samples/codelabs/dogs_v1/gapic/list_dogs/\033[0;34mlist_dogs_request_list_dogs.py\033[0m] |
|
- artman-genfiles/python/dogs-v1/samples/codelabs/dogs_v1/gapic/add_dog/\033[0;34madd_dog_request_add_dog.py\033[0m] |
|
|
|
Example sample: |
|
\033[0;34m |
|
import sys |
|
|
|
from codelabs import dogs_v1 |
|
|
|
def list_dogs(): |
|
|
|
client = dogs_v1.DogsServiceClient(channel=insecure_channel(localhost:2222)) |
|
|
|
response = client.list_dogs() |
|
|
|
for dog in response.dogs: |
|
print('Dog name: {}'.format(dog.name)) |
|
|
|
def main(): |
|
list_dogs() |
|
|
|
if __name__ == '__main__': |
|
main() |
|
\033[0m" |