Package: pyAnVIL
PyAnVILUse Case: Auth terra + gen3A python client integration of gen3 and terra.For python developers, who have requirements to access both terra and gen3 platforms, pyAnVIL is an integration module that provides SSO (single sign on) using terra as an IDP (identity provider) and manages distribution of dependencies unlike juggling multiple credentials and installs, pyAnVIL provides developer friendly experience.SetupPre-requisites:For terra users, skip this step, terra installs these dependencies in each vmgcloud cli tools installed and configuredgcloud.Google Id provisioned in both Terra and Gen3:One time Account Linking:Pre-requisite: google account provisioned in both Gen3 and Terra.Log intohttps://gen3.theanvil.io/Log intohttps://anvil.terra.bioIn Terra, navigate to your profileUnder "IDENTITY & EXTERNAL SERVERS", log intoNHGRI AnVIL Data Commons Framework Services, the system should present you with a Gen3 Oauth flow.Note the google project used for billing“unlink” my NHGRI AnVIL Data Commons Framework Services  fromhttps://anvil.terra.bio/#profileopen a new window to gen3.theanvil.io and login using my google idreturn to the terra profile screen and “renew” the identityPer instance, terra API setup:Use the google account and billing project to setup credentials for theterra api.gcloud auth login <google-account>
  gcloud auth application-default set-quota-project <billing-project-id>Validationgcloud auth print-access-token
>>> ya29.a0AfH6SMBSPFSt252qQNl.......

fissfc config
>>> ....
root_url	https://broad-bond-prod.appspot.com/Setuppip install pyAnVILSSOfrom anvil.gen3_auth import Gen3TerraAuth
   from gen3.submission import Gen3Submission

   auth = Gen3TerraAuth()
   gen3_endpoint = "https://gen3.theanvil.io"
   submission_client = Gen3Submission(gen3_endpoint, auth)sso sequence diagramAPI WrappersGen3query = '{project(first:0) {code,  subjects {submitter_id}, programs {name}  }}'
   results = submission_client.query(query)
   [p['code'] for p in results['data']['project']]
   >>> ['GTEx', '1000Genomes']Terrafrom anvil.terra import FAPI
   FAPI.whoami()
   >>> 'anvil.user@gmail.com'Data Normalization / FHIRAt this time, AnVIL's terra workspaces contain data from five consortiums spread across 446 workspaces.
These workspaces express study entities in a wide variety of ways:Distinct schemas of major entities:Patient: (participant) 9, (subject) 32Specimen: (sample) 27FamilyRelationship: (family) 3DocumentReference: (blob) 8Task: (sequencing) 24Note this break down does not account for diversity in vocabularies, entity linking, etc.Extractcommands# create a working directory for our data
mkdir  -p ./DATA

# manually maintained data tracking 
anvil_etl extract spreadsheet

# gen3 DRS identifiers
anvil_etl extract gen3

# terra workspaces, (takes several minutes) 
anvil_etl extract terra extract 2> /tmp/extract_terra.log
# review /tmp/extract_terra.log
# should end in `INFO     Indexing`
tail /tmp/extract_terra.log

# google blob 
anvil_etl  extract google  --user_project $WORKSPACE_NAMESPACE  2> /tmp/extract_google.log
# review /tmp/extract_google.log
# should end in `INFO     Indexing`
tail /tmp/extract_google.logexpected results2022-04-12 01:49:30,144 data_ingestion_tracker.py INFO     Read 485 projects from https://raw.githubusercontent.com/anvilproject/anvil-portal/main/plugins/utils/dashboard-source-anvil.tsv. Wrote to ./DATA/data_ingestion_tracker.json

2022-04-12 01:50:03,672 gen3.py INFO     Created ./DATA/drs_file.sqlite
2022-04-12 01:50:03,822 gen3.py INFO     
Extracted File Counts
gen3_project_id                                     anvil_project_id      file_count
--------------------------------------------------  ------------------  ------------
CCDG-phs001259-DS-CARD-MDS-GSO                                                  4318
CCDG-phs001398-GRU                                                               992
CCDG-phs001487-DS-MULTIPLE_DISEASES-IRB-COL-NPU-RD                              1663
CCDG-phs001569-GRU                                                              2272
CCDG-phs001642-DS-GID                                                            166
CCDG-phs001642-DS-IBD                                                           1462
CCDG-phs001642-GRU                                                              2757
CCDG-phs001642-HMB                                                              1810
CF-GTEx                                                                       122990
CMG-Broad-DS-KRD-RD                                 Hildebrandt                 2444
CMG-Broad-DS-NIC-EMP-LENF                           KNC                          116
CMG-Broad-GRU                                       Bonnemann                    234
CMG-Broad-GRU                                       Manton                       990
CMG-Broad-GRU                                       Pierce                      1274
CMG-Broad-HMB-MDS                                   Gleeson                     2362
CMG-Broad-HMB-MDS                                   Laing                         62
CMG-Broad-HMB-MDS                                   VCGS-White                  1026
CMG-Broad-pre-release-DS-BFD-MDS                    Sankaran                     554
CMG-Broad-pre-release-DS-CSD-MDS                    Seidman                      258
CMG-Broad-pre-release-DS-CVD-MDS                    Ware                          20
CMG-Broad-pre-release-DS-NEURO-GSO-MDS              Beggs                        218
CMG-Broad-pre-release-DS-NEURO-MDS                  Walsh                       1534
CMG-Broad-pre-release-GRU                           Estonia-Ounap                292
CMG-Broad-pre-release-GRU                           OGrady                       146
CMG-Broad-pre-release-HMB-MDS                       Myoseq                      2580
CMG-Broad-pre-release-HMB-MDS                       Ravenscroft                   70
open_access-1000Genomes                                                        13008
tutorial-synthetic_data_set_1                                                  10060

2022-04-12 02:03:48,500 terra.py INFO     ('NIMH', 'AnVIL_NIMH_Broad_WGSPD1_McCarroll_Pato_GRU_WGS')
2022-04-12 02:03:56,872 terra.py INFO     ('NIMH', 'AnVIL_NIMH_Broad_WGSPD1_McCarroll_Escamilla_DS_WGS')
2022-04-12 02:03:57,274 terra.py INFO     ('NIMH', 'AnVIL_NIMH_Broad_WGSPD1_McCarroll_Pato_GRU_10XLRGenomes')
2022-04-12 02:03:58,069 terra.py INFO     ('NIMH', 'AnVIL_NIMH_Broad_ConvergentNeuro_McCarroll_Eggan_CIRM_GRU_WGS')
2022-04-12 02:03:58,784 terra.py INFO     ('NIMH', 'AnVIL_NIMH_Broad_WGSPD1_McCarroll_Braff_DS_WGS')
2022-04-12 02:03:59,978 terra.py INFO     ('NIMH', 'AnVIL_NIMH_Broad_ConvergentNeuro_McCarroll_Eggan_Finkel_SMA_DS_WGS')
2022-04-12 02:04:00,221 terra.py INFO     ('NIMH', 'AnVIL_NIMH_Broad_WGSPD1_McCarroll_Braff_DS_10XLRGenomes')
2022-04-12 02:04:00,779 terra.py INFO     ('NIMH', 'AnVIL_NIMH_Broad_ConvergentNeuro_McCarroll_Eggan_CIRM_GRU_VillageData')
2022-04-12 02:04:01,959 terra.py INFO     ('Public', '1000G-high-coverage-2019')
2022-04-12 02:04:06,578 entities.py INFO     Indexing

2022-04-12 14:50:34,050 google.py INFO     ('CCDG', 'anvil_ccdg_broad_ai_ibd_daly_xavier_share_wes', 'fc-secure-abc7f058-0260-4e82-a911-abfec3dcb676')
2022-04-12 14:50:34,425 google.py INFO     ('CCDG', 'anvil_ccdg_broad_ai_ibd_niddk_daly_brant_wes', 'fc-secure-29cd113f-7eca-4526-aa52-dde1b8cb41d0')
2022-04-12 14:50:34,978 google.py INFO     ('CCDG', 'anvil_ccdg_broad_ai_ibd_niddk_daly_duerr_wes', 'fc-secure-877e6c8c-72ef-46d0-b3f3-37dd175771fe')
2022-04-12 14:50:35,865 google.py INFO     ('CCDG', 'anvil_ccdg_broad_ai_ibd_niddk_daly_silverberg_wes', 'fc-secure-0eba3dae-89be-4642-8982-9a80a7428cd2')
2022-04-12 14:50:37,030 google.py INFO     ('CCDG', 'anvil_ccdg_broad_daly_igsr_1kg_twist_gsa', 'fc-secure-752e48e6-1e66-4f85-9194-456562e87b90')
2022-04-12 14:50:37,594 google.py INFO     ('CCDG', 'anvil_ccdg_broad_daly_igsr_1kg_twist_wes', 'fc-secure-b41964ad-0c8a-47da-8504-f8636ff3d318')
2022-04-12 14:50:37,980 google.py INFO     ('NHGRI', 'anvil_nhgri_broad_ibd_daly_kugathasan_wes', 'fc-secure-0ca0c5e6-26ca-47ea-b509-ec4eaa058fc6')
2022-04-12 14:50:38,277 google.py INFO     ('NHGRI', 'anvil_nhgri_broad_ibd_daly_turner_wes', 'fc-secure-bee7792c-ef35-478d-a9bb-c8f2054c335c')
2022-04-12 14:50:38,398 google.py INFO     ('NHGRI', 'anvil_nhgri_broad_ibd_daly_winter_wes', 'fc-secure-72a949c5-0b7d-45c9-96c3-ff4d25815ed5')
2022-04-12 14:50:38,675 entities.py INFO     IndexingExtractcommands# setup environmental values
source /dev/stdin <<< `anvil_etl utility env`  

# normalize the data
anvil_etl transform normalize 2> /tmp/normalize.log
# log should list workspaces, with any warnings or errors logged without exception stack traces.
tail /tmp/normalize.log

# gather statistics
anvil_etl transform analyze 2> /tmp/analyze.log
tail /tmp/analyze.log

# render the qa-report
anvil_etl utility qa > ./DATA/qa-report.md# render the qa-report in a notebookfromIPython.displayimportMarkdown,display,HTMLdisplay(Markdown("./DATA/qa-report.md"))expected resultsexport GOOGLE_PROJECT_NAME=xxx
export GOOGLE_LOCATION=xxx
export GOOGLE_PROJECT=xxx
export GOOGLE_DATASET=xxx
export TOKEN=xxx
export GOOGLE_DATASTORES=xxx
export GOOGLE_DATASTORE=xxx
export GOOGLE_BUCKET=xxx
export OUTPUT_PATH=xxx
export IMPLEMENTATION_GUIDE_PATH=xxx


2022-04-12 15:05:34,105 normalizer.py INFO     ('CCDG', 'anvil_ccdg_broad_ai_ibd_niddk_daly_silverberg_wes')
2022-04-12 15:05:36,168 normalizer.py INFO     ('CCDG', 'anvil_ccdg_broad_daly_igsr_1kg_twist_gsa')
2022-04-12 15:05:36,899 normalizer.py INFO     ('CCDG', 'anvil_ccdg_broad_daly_igsr_1kg_twist_wes')
2022-04-12 15:05:37,483 normalizer.py INFO     ('NHGRI', 'anvil_nhgri_broad_ibd_daly_kugathasan_wes')
2022-04-12 15:05:37,939 normalizer.py INFO     ('NHGRI', 'anvil_nhgri_broad_ibd_daly_turner_wes')
2022-04-12 15:05:38,096 normalizer.py INFO     ('NHGRI', 'anvil_nhgri_broad_ibd_daly_winter_wes')


2022-04-19 00:31:47,216 transform.py INFO     working on anvil_nhgri_broad_ibd_daly_kugathasan_wes
2022-04-19 00:31:47,237 transform.py INFO     working on anvil_nhgri_broad_ibd_daly_turner_wes
2022-04-19 00:31:47,290 transform.py INFO     working on anvil_nhgri_broad_ibd_daly_winter_wesconsortiumworkspacepatientsspecimenstasksdocumentsvcftbicramqa_gradedrs_grademd5craiidatgtcNAbambaibedpeloupecsvtxtnan0Public1000G-high-coverage-2019320232023202960932053202320299.999499.00061CMGANVIL_CMG_BROAD_BRAIN_ENGLE_WES946946946141947310004734732CMGANVIL_CMG_BROAD_BRAIN_SHERR_WGS666931000333CMGANVIL_CMG_BROAD_ORPHAN_SCOTT_WGS3030304515100015154CMGANVIL_CMG_Broad_Muscle_Laing_WES313131623199.935599315CMGANVIL_CMG_Broad_Orphan_Jueppner_WES2020203010100010106CMGANVIL_CMG_UWASH_DS-BAV-IRB-PUB-RD1771770099.97740...445NHGRIanvil_nhgri_broad_ibd_daly_winter_wes82382382312364121000412412LoadcommandsSee the load options onanvil_etl load fhir$ anvil_etl load fhir --help

Usage: anvil_etl load fhir [OPTIONS] COMMAND [ARGS]...

  Commands to setup and load fhir server.

Options:
  --help  Show this message and exit.

Commands:
  IG          Commands to create and delete implementation guide.
  data-set    Commands to create and delete data_set.
  data-store  Commands to create and delete data_store.# create the IG, FHIR's "schema"
anvil_etl load fhir IG create
# create the data set and data store containers
anvil_etl load fhir data-set create
anvil_etl load fhir data-store create
# load the data to respective stores
anvil_etl load fhir data-store load
# load all public resources into the public store
anvil_etl load fhir data-store load-publicexpected resultsYou can view progress athttps://console.cloud.google.com/healthcare/browser/locations/us-west2/datasets/anvil-test/operations?project=fhir-test-16-342800QueryAccess: PermissionsRoles are assigned at thedata setleveland are inherited by childdata-stores:REST APISee FHIR'sSearch APISee Google'sHealthcare API conformance statementThe base url is:https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStoresAppend data-store to this for a complete url e.g.public/fhir/:https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/public/fhir/Complete data-store list:pendingphs000160-Consortia_Access_Onlyphs000298phs000298-DS-ASDphs000298-DS-MHphs000298-GRUphs000298-GRU-NPUphs000298-HMBphs000356-HMB-NPUphs000424-GRUphs000496-Consortia_Access_Onlyphs000693-DS-BAV-IRB-PUB-PDphs000693-DS-BDISphs000693-DS-EPphs000693-DS-HFAphs000693-DS-NBIAphs000693-GRUphs000693-GRU-IRBphs000693-HMBphs000693-HMB-IRBphs000711-HMB-IRB-NPUphs000711-HMB-NPUphs000744-DS-MCphs000744-DS-RAREDphs000744-GRUphs000744-HMBphs000744-HMB-GSOphs000920-DS-LD-RDphs000997phs000997-Consortia_Access_Onlyphs001062phs001062-Consortia_Access_Onlyphs001155-GRUphs001211-HMB-IRBphs001222-DS-DRC-IRB-NPUphs001227-DS-ATHSCL-IRB-MDSphs001227-GRU-IRBphs001259-DS-CARD-MDS-GSOphs001272phs001272-Consortia_Access_Onlyphs001272-DS-BFD-MDSphs001272-DS-CSD-MDSphs001272-DS-NEURO-GSO-MDSphs001272-GRUphs001272-HMB-MDSphs001395-HMB-NPUphs001398-GRUphs001487-DS-CVD-IRB-COL-MDSphs001489phs001489-DS-CARDI_NEUROphs001489-DS-EAED-MDSphs001489-DS-EARET-MDSphs001489-DS-EPphs001489-DS-EP-ETIOLOGY-MDSphs001489-DS-EP-MDSphs001489-DS-EP-NPUphs001489-DS-EPI-ASZ-MED-MDSphs001489-DS-EPI-MUL-CON-MDSphs001489-DS-EPI-NPU-MDSphs001489-DS-EPIL-BC-ID-MDSphs001489-DS-NEURO-AD-NPUphs001489-DS-NEURO-MDSphs001489-DS-NPD-IRB-NPUphs001489-DS-SEIZDphs001489-EPIL_BRAINAB_CONVUL_INTELCT_DIS_MDSphs001489-EPIL_BRAIN_AB_INTEL_DIS_MDSphs001489-EPIL_BRAIN_AB_MDSphs001489-EPIL_CO_MORBIDI_MDSphs001489-GRUphs001489-GRU-IRBphs001489-GRU-NPUphs001489-HMBphs001489-HMB-IRB-MDSphs001489-HMB-MDSphs001489-HMB-NPUphs001489-HMB-NPU-MDSphs001498phs001502phs001502-Consortia_Access_Onlyphs001502-HMB-IRB-PUBphs001506-DS-CVD-IRBphs001543-Consortia_Access_Onlyphs001544-Consortia_Access_Onlyphs001545-Consortia_Access_Onlyphs001546phs001547-Consortia_Access_Onlyphs001569-Consortia_Access_Onlyphs001569-GRUphs001579-GRU-IRB-NPUphs001592-DS-CVDphs001598-Consortia_Access_Onlyphs001600phs001600-Consortia_Access_Onlyphs001624phs001624-Consortia_Access_Onlyphs001624-HMB-GSOphs001642phs001642-DS-GIDphs001642-DS-IBDphs001642-GRUphs001642-HMBphs001644phs001676-DS-AONDD-IRBphs001725phs001740-DS-ASD-IRBphs001741-DS-ASD-IRBphs001766-DS-ASDphs001766-DS-ASD-IRBphs001871-DS-CAD-IRB-COL-NPUphs001873-HMB-GSOphs001880-GRU-NPUphs001894-DS-EAC-PUB-GSOphs001913-GRU-IRBphs001933phs001933-Consortia_Access_Onlyphs002004-DS-ASDphs002018-Consortia_Access_Onlyphs002018-HMBphs002032-GRUphs002041-DS-MLHLTH-MDSphs002041-DS-SZRD-MDSphs002041-GRUphs002042-DS-ASD-MDS-PUBphs002042-GRU-MDS-PUBphs002043-DS-ASDphs002043-GRUphs002044-DS-ASD-IRBphs002163-GRUphs002236phs002242phs002243-HMBphs002282-DS-CVDRFphs002325-DS-CVDphs002726phs002774publicResearch Study discoveryThefhir_curlcommand will dispatch to all stores and discoverResearchStudyentities:export TOKEN=$(gcloud auth application-default print-access-token)
export GOOGLE_DATASTORES=$(gcloud beta healthcare fhir-stores list --dataset=$GOOGLE_DATASET --location=$GOOGLE_LOCATION | awk '(NR>1){print $1}' | sed  's/$/,/g' | tr -d "\n")
fhir_curl '/ResearchStudy?_elements=id&_count=1000'  | jq -rc '.entry[] | .fullUrl' | sort 

https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-ac-boston-asd-exome
https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-AGRE-FEMF-asd-exome
https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-domenici-asd-exome
https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-herman-asd-exome
https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-lattig-asd-exome
https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-mcpartland-asd-exome
https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-minshew-asd-exome
https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-palotie-asd-exome
https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-puura-asd-exome
https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/pending/fhir/ResearchStudy/AnVIL-ccdg-asc-ndd-daly-talkowski-TASC-asd-exome
...ContributingSetup EnvironmentSet environmental variables by callingfhir_envProvide a project name and region.  Note: please ensure the healthcare API is available in that region.https://cloud.google.com/healthcare-api/docs/concepts/regionsThe script will set reasonable values for other environmental variables.  You may override them on the command line.usage: fhir_env GOOGLE_PROJECT_NAME GOOGLE_LOCATION [GOOGLE_DATASET] [GOOGLE_DATASTORE] [BILLING_ACCOUNT] [GOOGLE_APPLICATION_CREDENTIALS] [SPREADSHEET_UUID] [OUTPUT_PATH]$ source fhir_env fhir-test-16 us-west2
***** env variables *****
GOOGLE_PROJECT_NAME fhir-test-16 The root for the API, billing, buckets, etc.
GOOGLE_BILLING_ACCOUNT XXXXXX-XXXX-XXXX Google Cloud Billing Accounts allow you to configure payment and track spending in GCP.
GOOGLE_LOCATION us-west2 The physical location of the data
GOOGLE_DATASET anvil-test Datasets are top-level containers that are used to organize and control access to your stores.
GOOGLE_DATASTORE test A FHIR store is a data store in the Cloud Healthcare API that holds FHIR resources.
OUTPUT_PATH ./DATA A directory on your local system, used to store work files.
GOOGLE_PROJECT fhir-test-16-342800 The project identifier
GOOGLE_BUCKET fhir-test-16-342800 The bucket used to store extracted FHIR filesWe incorporatedfhirclient, a flexible Python client for FHIR servers supporting the SMART on FHIR protocol.Note: You will need to install the fhir client separately.  seehttps://github.com/smart-on-fhir/client-py/issues/70pip install  fhirclientr4Examplefrom anvil.fhir.client import FHIRClient
from anvil.fhir.smart_auth import GoogleFHIRAuth
settings = {
    'app_id': 'my_web_app',
    'api_base': 'https://healthcare.googleapis.com/v1beta1/projects/fhir-test-16-342800/locations/us-west2/datasets/anvil-test/fhirStores/public/fhir'
}
smart = FHIRClient(settings=settings)
# optionally pass token
# smart.server.auth = GoogleFHIRAuth(access_token='ya29.abcd...')
smart.server.auth = GoogleFHIRAuth()
smart.prepare()
assert smart.ready, "server should be ready"
# search for all ResearchStudy
import fhirclient.models.researchstudy as rs
[s.title for s in rs.ResearchStudy.where(struct={}).perform_resources(smart.server)]
>>> 
['1000g-high-coverage-2019', 'my NCPI research study example']For more information on usage seesmart-on-fhir/client-pyLocal testingTest json files using FHIR reference validatorjava -jar validator_cli.jar  /tmp/invalid_body_no_subject.json -ig ~/client-apis/pyAnVIL/DATA/fhir/IG/Contributingset up virtual envpython3 -m venv venv
source venv/bin/activate
python3 -m pip install -r requirements.txt
python3 -m pip install -r requirements-dev.txttest gen3 authorizationpython3 -m pytest --user_email <GMAIL ACCOUNT>  --log-level DEBUG  --gen3_endpoint <GEN3_ENDPOINT>  tests/integration/test_gen3_auth.pyDistributionPyPi# update pypi

export TWINE_USERNAME=  #  the username to use for authentication to the repository.
export TWINE_PASSWORD=  # the password to use for authentication to the repository.

rm -r dist/
python3  setup.py sdist bdist_wheel
twine upload dist/*Read The Docshttps://readthedocs.org/projects/pyanvil/