diff --git a/.bump2version.cfg b/.bump2version.cfg new file mode 100644 index 0000000000000000000000000000000000000000..b65c024dd7bf02415d8462c7342cf1aae002e555 --- /dev/null +++ b/.bump2version.cfg @@ -0,0 +1,16 @@ +[bumpversion] +current_version = 2.8.2rc1 +parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(rc)?(?P<rc>\d+) +serialize = + {major}.{minor}.{patch}rc{rc} + {major}.{minor}.{patch} + +[bumpversion:glob:apps/cli/utilities/*/*/__init__.py] + +[bumpversion:glob:apps/cli/executables/*/*/__init__.py] + +[bumpversion:glob:apps/cli/executables/pexable/*/*/__init__.py] + +[bumpversion:glob:services/*/*/__init__.py] + +[bumpversion:file:testing/testing/_version.py] diff --git a/.env b/.env new file mode 100644 index 0000000000000000000000000000000000000000..12a2adc7de74e32eca9acd3237133982a9711ef0 --- /dev/null +++ b/.env @@ -0,0 +1,14 @@ +# Infrastructure Related +DEPLOY_ENV=local # the default environment to build for (one of: dev, test, local, prod) +ENV=local # the default environment to build for (one of: dev, test, local, prod) +TAG=local # the tag name to pull images from when building +ENV_HOST="localhost" +DL_HOST="https://dl-dsoc.nrao.edu" +WS_VERSION="0.0.0+local" +NG_APP_WS_VERSION=${WS_VERSION} +LOCAL_OR_SERVER_PEX=local-pex # determines if pexes are built from scratch or pulled from the registry (one of: local-pex, server-pex) +API_TOKEN= + +# CAPO Environment Properties +CAPO_PATH=/home/casa/capo +CAPO_PROFILE=docker diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d3621d00530a02834f381e22c60848633c29b0bb..4559a37e3e4c1ccc658982348c355a4eea464342 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,15 +1,12 @@ stages: - - build-base - - push-base - - cache-build + - pull-db + - build-packages - build - - build-pex-base - unit-test - test-coverage - push + - push-packages - deploy-coverage-page - - generate-pex-yaml - - pex-trigger - generate-go-yaml - go-trigger - deploy @@ -44,84 +41,124 @@ include: - '/ci/push.template.yml' - '/ci/cleanup.template.yml' - '/ci/unit-test.template.yml' + - '/ci/package-build.template.yml' + - '/ci/push-package.template.yml' -# Build Base Image -build base image: - interruptible: true - stage: build-base - script: - - docker build --no-cache -t ${REGISTRY_URL}/ops/base:${PROJECT_NAME} -f Dockerfile.base . - - docker tag ${REGISTRY_URL}/ops/base:${PROJECT_NAME} ${REGISTRY_URL}/ops/base:${CI_COMMIT_SHORT_SHA} - rules: - - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - changes: - - Dockerfile.base - - docker.properties -# Push Base Image Stage -push base image: +# Unit testing steps require a specific database image to be available; this step downloads it +pull db image: interruptible: true - stage: push-base + stage: pull-db script: - - echo "$HARBOR_PASSWORD" | docker login -u "$HARBOR_USER" --password-stdin $REGISTRY_URL - - docker push ${REGISTRY_URL}/ops/base:${PROJECT_NAME} - rules: - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' - changes: - - Dockerfile.base - - docker.properties + - echo "$HARBOR_PASSWORD" | docker login --username "$HARBOR_USER" --password-stdin "$REGISTRY_URL" + - docker pull ${REGISTRY_URL}/workspaces/db:workspaces -build-pex-base image: +############################################### +# Build Python Packages +############################################### +build carta envoy: interruptible: true - stage: build-pex-base - script: - - docker build --no-cache -t nrao_pex_base_3_10 -f ./ci/bin/Dockerfile.pex . - rules: - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELPMENT/' - changes: - - apps/cli/executables/pexable/**/* - - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' - variables: - # override DEPLOY_ENV - DEPLOY_ENV: "test" - - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' - variables: - DEPLOY_ENV: "prod" - -# Cache -build cache: - interruptible: true - stage: cache-build - variables: - # For building pycapo pex - # Enable Git submodules https://docs.gitlab.com/ee/ci/git_submodules.html#use-git-submodules-in-cicd-jobs - GIT_SUBMODULE_STRATEGY: recursive - script: - - docker build --no-cache -t cache:${CI_COMMIT_SHORT_SHA} -f Dockerfile.cache . --build-arg WS_VERSION=${VERSION} - rules: - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' - variables: - IMAGE_TAG: $CI_COMMIT_BRANCH - VERSION: 0.0.1+$CI_COMMIT_BRANCH - - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - variables: - IMAGE_TAG: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME - VERSION: 0.0.1+$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME - - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/' - variables: - IMAGE_TAG: $CI_COMMIT_TAG - VERSION: 0.0.2+$CI_COMMIT_TAG - - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' - variables: - IMAGE_TAG: $CI_COMMIT_TAG - VERSION: $CI_COMMIT_TAG - - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' - variables: - IMAGE_TAG: $CI_COMMIT_TAG - VERSION: $CI_COMMIT_TAG + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/carta_envoy" + extends: .build-package + +build casa envoy: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/casa_envoy" + extends: .build-package -# Build Stages +build core sampler: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/utilities/core_sampler" + extends: .build-package + +build conveyor: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/conveyor" + extends: .build-package + +build deliver: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/deliver" + extends: .build-package + +build ingest envoy: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/ingest_envoy" + extends: .build-package + +build mediator: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/mediator" + extends: .build-package + +build null: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/null" + extends: .build-package + +build productfetcher: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/productfetcher" + extends: .build-package + +build update stage: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/update_stage" + extends: .build-package + +build vela: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/vela" + extends: .build-package + +build wf inspector: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/wf_inspector" + extends: .build-package + +build ws annihilator: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/ws_annihilator" + extends: .build-package + +build ws metrics: + interruptible: true + stage: build-packages + variables: + PACKAGE_PATH: "apps/cli/executables/pexable/ws_metrics" + extends: .build-package + + + +############################################### +# Build Service and Web Images +############################################### build workflow: interruptible: true stage: build @@ -154,38 +191,39 @@ build web: PATH_PREFIX: "apps/" extends: .build -## Test Stages ## -# Unit Tests +############################################### +# Test Stages for Services +############################################### unit test workflow: interruptible: true stage: unit-test variables: SERVICE_NAME: "workflow" + PATH_PREFIX: "services/" extends: .unit-test - needs: - - build workflow unit test capability: interruptible: true stage: unit-test variables: SERVICE_NAME: "capability" + PATH_PREFIX: "services/" extends: .unit-test - needs: - - build capability unit test notification: interruptible: true stage: unit-test variables: SERVICE_NAME: "notification" + PATH_PREFIX: "services/" extends: .unit-test - needs: - - build notification -# Generate Coverage reports -unit test coverage: + +############################################### +# Create Coverage Report +############################################### +.unit test coverage: interruptible: true stage: test-coverage image: python:3.10-slim @@ -211,39 +249,143 @@ unit test coverage: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' -# Push Stages + +############################################### +# Push Service and Web Images to Registry +############################################### push workflow: stage: push variables: SERVICE_NAME: "workflow" + PATH_PREFIX: "services/" extends: .push push capability: stage: push variables: SERVICE_NAME: "capability" + PATH_PREFIX: "services/" extends: .push push notification: stage: push variables: SERVICE_NAME: "notification" + PATH_PREFIX: "services/" extends: .push push web: stage: push variables: SERVICE_NAME: "web" + PATH_PREFIX: "apps/" extends: .push # UI tests coming soon! # needs: # - unit test dev ui -# Cleanup +############################################### +# Push Packages +############################################### +push carta-envoy: + stage: push-packages + variables: + PACKAGE_NAME: "carta_envoy" + PIP_NAME: "carta-envoy" + extends: .push-packages + +push casa-envoy: + stage: push-packages + variables: + PACKAGE_NAME: "casa_envoy" + PIP_NAME: "casa-envoy" + extends: .push-packages + +push conveyor: + stage: push-packages + variables: + PACKAGE_NAME: "conveyor" + PIP_NAME: "conveyor" + extends: .push-packages + +push deliver: + stage: push-packages + variables: + PACKAGE_NAME: "deliver" + PIP_NAME: "ssa_deliver" + extends: .push-packages + +push ingest-envoy: + stage: push-packages + variables: + PACKAGE_NAME: "ingest_envoy" + PIP_NAME: "ingest-envoy" + extends: .push-packages + +push mediator: + stage: push-packages + variables: + PACKAGE_NAME: "mediator" + PIP_NAME: "ssa_mediator" + extends: .push-packages + +push null: + stage: push-packages + variables: + PACKAGE_NAME: "null" + PIP_NAME: "ssa_null" + extends: .push-packages + +push productfetcher: + stage: push-packages + variables: + PACKAGE_NAME: "productfetcher" + PIP_NAME: "productfetcher" + extends: .push-packages + +push update-stage: + stage: push-packages + variables: + PACKAGE_NAME: "update_stage" + PIP_NAME: "ssa-update-stage" + extends: .push-packages + +push vela: + stage: push-packages + variables: + PACKAGE_NAME: "vela" + PIP_NAME: "ssa-vela" + extends: .push-packages + +push wf-inspector: + stage: push-packages + variables: + PACKAGE_NAME: "wf_inspector" + PIP_NAME: "wf-inspector" + extends: .push-packages + +push ws-annihilator: + stage: push-packages + variables: + PACKAGE_NAME: "ws_annihilator" + PIP_NAME: "ws-annihilator" + extends: .push-packages + +push ws-metrics: + stage: push-packages + variables: + PACKAGE_NAME: "ws_metrics" + PIP_NAME: "ws-metrics" + extends: .push-packages + +############################################### +# Clean Pipeline of Service and Web Images +############################################### clean build workflow: stage: .post variables: SERVICE_NAME: "workflow" + PATH_PREFIX: "services/" extends: .cleanup allow_failure: true @@ -251,6 +393,7 @@ clean build capability: stage: .post variables: SERVICE_NAME: "capability" + PATH_PREFIX: "services/" extends: .cleanup allow_failure: true @@ -258,6 +401,7 @@ clean build notification: stage: .post variables: SERVICE_NAME: "notification" + PATH_PREFIX: "services/" extends: .cleanup allow_failure: true @@ -265,11 +409,15 @@ clean build web: stage: .post variables: SERVICE_NAME: "web" + PATH_PREFIX: "apps/" extends: .cleanup allow_failure: true -# Deploy Stages -pages: + +############################################### +# Deployment Stages +############################################### +.pages: interruptible: true stage: deploy-coverage-page image: python:3.10-slim @@ -290,50 +438,6 @@ pages: rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' -# Generate PEX builder yaml for child pipeline -pex generate yaml: - stage: generate-pex-yaml - image: python:3.10-slim - before_script: - - apt update && apt install -y git - - pip install pyyaml - script: - - DEPLOY_ENV=${DEPLOY_ENV} ./ci/bin/generate-yaml.py - rules: - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' - changes: - - apps/cli/executables/pexable/**/* - - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' - variables: - # override DEPLOY_ENV - DEPLOY_ENV: "test" - - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' - variables: - DEPLOY_ENV: "prod" - artifacts: - paths: - - generated-pex-build-pipeline.yml - - # Trigger child pipeline based on generated PEX builder yaml -pex child pipeline: - stage: pex-trigger - trigger: - include: - - artifact: generated-pex-build-pipeline.yml - job: pex generate yaml - strategy: depend - rules: - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' - changes: - - apps/cli/executables/pexable/**/* - - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' - variables: - # override DEPLOY_ENV - DEPLOY_ENV: "test" - - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' - variables: - DEPLOY_ENV: "prod" - # Generate go builder yaml for child pipeline go generate yaml: stage: generate-go-yaml @@ -347,11 +451,11 @@ go generate yaml: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' changes: - apps/cli/executables/go/**/* - - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' + - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/' variables: # override DEPLOY_ENV DEPLOY_ENV: "test" - - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' + - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/' variables: DEPLOY_ENV: "prod" artifacts: @@ -370,11 +474,11 @@ go child pipeline: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' changes: - apps/cli/executables/go/**/* - - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' + - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/' variables: # override DEPLOY_ENV DEPLOY_ENV: "test" - - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' + - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/' variables: DEPLOY_ENV: "prod" @@ -386,12 +490,29 @@ deploy: # This sed command finds and replaces "dsoc_ENV_secrets:" with "dsoc_${DEPLOY_ENV}_secrets:" - sed -i "s/dsoc_ENV_secrets:/dsoc_${DEPLOY_ENV}_secrets:/g" docker-compose.yml - sed -i "s/naasc_ENV_secrets:/naasc_${DEPLOY_ENV}_secrets:/g" docker-compose.yml - - ENV=$DEPLOY_ENV TAG=$IMAGE_TAG DL_HOST=$DL_HOST ENV_HOST=$ENV_HOST docker stack deploy --compose-file docker-compose.yml workspaces-${DEPLOY_ENV} + - ENV=$DEPLOY_ENV TAG=$IMAGE_TAG DL_HOST=$DL_HOST ENV_HOST=$ENV_HOST WS_VERSION=$VERSION docker stack deploy --compose-file docker-compose.yml --with-registry-auth workspaces-${DEPLOY_ENV} rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' variables: IMAGE_TAG: ${CI_COMMIT_BRANCH} - - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' + # override DEPLOY_ENV + DEPLOY_ENV: "dev" + # override DL_HOST + DL_HOST: https://dl-nrao.nrao.edu + # override ENV_HOST + ENV_HOST: ws-dev.nrao.edu + VERSION: 0.0.1+$CI_COMMIT_BRANCH + - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/' + variables: + IMAGE_TAG: $CI_COMMIT_TAG + # override DEPLOY_ENV + DEPLOY_ENV: "test" + # override DL_HOST + DL_HOST: https://dl-dsoc-test.nrao.edu + # override ENV_HOST + ENV_HOST: ws-test.nrao.edu + VERSION: 0.0.2+$CI_COMMIT_TAG + - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/' variables: IMAGE_TAG: $CI_COMMIT_TAG # override DEPLOY_ENV @@ -400,7 +521,8 @@ deploy: DL_HOST: https://dl-dsoc-test.nrao.edu # override ENV_HOST ENV_HOST: ws-test.nrao.edu - - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' + VERSION: $CI_COMMIT_TAG + - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/' variables: IMAGE_TAG: $CI_COMMIT_TAG # override DEPLOY_ENV @@ -409,4 +531,5 @@ deploy: DL_HOST: https://dl-dsoc.nrao.edu # override ENV_HOST ENV_HOST: ws.nrao.edu + VERSION: $CI_COMMIT_TAG diff --git a/Dockerfile.base b/Dockerfile.base deleted file mode 100644 index 173cc349f340be5308182603d1383b3ca0c8b0ba..0000000000000000000000000000000000000000 --- a/Dockerfile.base +++ /dev/null @@ -1,37 +0,0 @@ -FROM python:3.10-slim-buster - -# Get postgres/mysql development stuff in the image -RUN apt update \ - && apt install -y --no-install-recommends \ - gcc \ - libmariadb-dev-compat \ - libpq-dev \ - && rm -rf /var/lib/apt/lists - -# Environment variables -# - CAPO_PROFILE will be overridden for Dev, Test, and Prod -ENV PIP_NO_CACHE_DIR false -ENV CAPO_PROFILE docker -ENV CAPO_PATH /home/ssa/capo - -# Create vlapipe group -RUN addgroup --gid 6000 vlapipe && \ -# Create vlapipe user placed in vlapipe group - useradd --create-home --comment "" --gid 6000 --uid 6000 vlapipe - -# Create almapipe group -RUN addgroup --gid 9233 almapipe && \ -# Create almapipe user placed in almapipe group - useradd --create-home --comment "" --gid 9233 --uid 9233 almapipe - -# Switch to appuser -USER vlapipe - -# Change working directory to /home/ssa/capo -WORKDIR /home/ssa/capo - -# set ownership of docker.properties to vlapipe and the vlapipe group -COPY --chown=vlapipe:vlapipe docker.properties docker.properties - -# Switch to root -USER root diff --git a/Dockerfile.cache b/Dockerfile.cache deleted file mode 100644 index 08d13e7bb2c65d28e886d9e7e9a3bad3955b1a32..0000000000000000000000000000000000000000 --- a/Dockerfile.cache +++ /dev/null @@ -1,19 +0,0 @@ -FROM ssa-containers.aoc.nrao.edu/ops/base:workspaces - -ARG WS_VERSION=unknown-version -ENV WS_VERSION=${WS_VERSION} - -WORKDIR /code/ -RUN chown vlapipe . && chgrp vlapipe . - -USER vlapipe - -WORKDIR /packages/ -COPY --chown=vlapipe:vlapipe ./shared ./shared -COPY --chown=vlapipe:vlapipe ./apps/cli ./apps/cli -COPY --chown=vlapipe:vlapipe ./testing ./testing - -ENV PATH "${PATH}:/home/vlapipe/.local/bin" -# package installation -COPY --chown=vlapipe:vlapipe ./requirements.txt ./requirements.txt -RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} pip install --user -r requirements.txt diff --git a/Makefile b/Makefile index e590a5955c63cf256c0d1438477b16afcb8e981e..82a112f2ffffdd2e394677edb0b30d3515c82e63 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ SHELL := /bin/bash -.PHONY: check-build test-dev test dev setup alembic-update docker-base db build coverage clean +.PHONY: check-build test-dev test dev setup alembic-update db build coverage clean all: dev check-build @@ -12,7 +12,7 @@ init: git submodule update --init --recursive # Check if local code will pass CI build -check-build: docker-base docker-dev-images-locally test-dev +check-build: docker-dev-images-locally test-dev # Run tests on Dockerfile images test-dev: @@ -34,7 +34,7 @@ test_nf: # Setup local development environment -dev: cache docker-base +dev: @echo "starting docker compose up in the background" @echo "wait a few seconds and your environment should be done setting up" docker compose -f docker-compose.local.yml up -d @@ -45,25 +45,16 @@ alembic-update: # Build images from Dockerfile docker-dev-images-locally: - docker build -t nrao:workflow -f services/workflow/Dockerfile.local . --build-arg capo_env=docker - docker build -t nrao:capability -f services/capability/Dockerfile.local . --build-arg capo_env=docker - docker build -t nrao:notification -f services/notification/Dockerfile.local . --build-arg capo_env=docker - -# Build base image -docker-base: db - docker build --no-cache -t ssa-containers.aoc.nrao.edu/ops/base:workspaces -f Dockerfile.base . - docker build --no-cache -t ssa-containers.aoc.nrao.edu/ops/base:nodejs-14 -f apps/web/Dockerfile.base . - -# Build cache image -cache: - docker build --no-cache -t cache:tmp -f Dockerfile.cache . --build-arg WS_VERSION=0.0.0+local + docker build -t nrao:workflow -f services/workflow/Dockerfile . --build-arg ENV=local + docker build -t nrao:capability -f services/capability/Dockerfile . --build-arg ENV=local + docker build -t nrao:notification -f services/notification/Dockerfile . --build-arg ENV=local # Build DB image db: docker build --no-cache -t ssa-containers.aoc.nrao.edu/ops/ci/db:workspaces -f ./ci/psql/Dockerfile.db . # Build docker images -build: docker-base db cache +build: db docker compose -f docker-compose.local.yml build --no-cache # Generate HTML coverage report @@ -91,7 +82,7 @@ clean: # Clean things up in a very nasty and destructive way that is sure to derail the rest of your afternoon reallyclean: clean docker system prune --volumes -f - docker volume prune -f + docker volume prune --filter all=1 -f # Make the documentation .PHONY: docs godocs @@ -100,3 +91,9 @@ docs: godocs godocs: ./build_go_docs.sh + + +build base images: + docker build -t workflow:local -f services/workflow/Dockerfile . --build-arg ENV=local --target dev + docker build -t workflow:local -f services/workflow/Dockerfile . --build-arg ENV=local --target dev + docker build -t workflow:local -f services/workflow/Dockerfile . --build-arg ENV=local --target dev diff --git a/apps/cli/executables/go/gmva_ingester/README.md b/apps/cli/executables/go/gmva_ingester/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b14b9b730876b6953ad536cee1f1bb4ed58d8092 --- /dev/null +++ b/apps/cli/executables/go/gmva_ingester/README.md @@ -0,0 +1,13 @@ +# gmva_ingester + +`gmva_ingester` is a utility that copies GMVA observation directories from the +GMVA source directory (defined in CAPO) to the difx directory +(also defined in CAPO). It is not meant to be run by hand, but by a workflow +that facilitates the entire GMVA observation ingestion process. + +# Usage +``` +Usage of ./gmva_ingester: + -dir string + Name of the GMVA directory within the GMVA source directory to be copied to the difx directory +``` diff --git a/apps/cli/executables/go/gmva_ingester/go.mod b/apps/cli/executables/go/gmva_ingester/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..fbbc362062efcffc6a1fc5bdd67d03175760de89 --- /dev/null +++ b/apps/cli/executables/go/gmva_ingester/go.mod @@ -0,0 +1,25 @@ +module ssa/gmva_ingester + +go 1.20 + +require gitlab.nrao.edu/ssa/gocapo v0.0.0-20230307183307-91ffd4356566 + +require ( + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.13.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect + golang.org/x/text v0.3.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/apps/cli/executables/go/gmva_ingester/go.sum b/apps/cli/executables/go/gmva_ingester/go.sum new file mode 100644 index 0000000000000000000000000000000000000000..d4cddf832c3c0b372210d1709085f4424e08ae93 --- /dev/null +++ b/apps/cli/executables/go/gmva_ingester/go.sum @@ -0,0 +1,472 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +gitlab.nrao.edu/ssa/gocapo v0.0.0-20230307183307-91ffd4356566 h1:ThTqAQM1LTn9YYOeTLT3P++gG5dhBT3J6npwzdj57HY= +gitlab.nrao.edu/ssa/gocapo v0.0.0-20230307183307-91ffd4356566/go.mod h1:1YUS/BksXZTvYstBpeSh2UjBVz4MKyPJve9zmPGkCuA= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/apps/cli/executables/go/gmva_ingester/main.go b/apps/cli/executables/go/gmva_ingester/main.go new file mode 100644 index 0000000000000000000000000000000000000000..90cb1cabbd9b7308c5086b7dc7957b2afe1ccfa5 --- /dev/null +++ b/apps/cli/executables/go/gmva_ingester/main.go @@ -0,0 +1,41 @@ +/* +* Copyright (C) 2023 Associated Universities, Inc. Washington DC, USA. +* +* This file is part of NRAO Workspaces. +* +* Workspaces is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* Workspaces is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Workspaces. If not, see <https://www.gnu.org/licenses/>. + */ +package main + +import ( + "flag" + "log" + "os" + "ssa/gmva_ingester/pkg/copy" +) + +func main() { + var gmvaDir string + + flag.StringVar(&gmvaDir, "dir", "", "Name of the GMVA directory within the GMVA source directory to be copied to the difx directory") + flag.Parse() + + if gmvaDir == "" { + log.Println("GMVA directory argument required!") + flag.Usage() + os.Exit(1) + } + + copy.CopyGmva(gmvaDir) +} diff --git a/apps/cli/executables/go/gmva_ingester/pkg/copy/copy_gmva.go b/apps/cli/executables/go/gmva_ingester/pkg/copy/copy_gmva.go new file mode 100644 index 0000000000000000000000000000000000000000..f904f4a6b98d1cb8a7c8a8b8ccada451684241b5 --- /dev/null +++ b/apps/cli/executables/go/gmva_ingester/pkg/copy/copy_gmva.go @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2023 Associated Universities, Inc. Washington DC, USA. + * + * This file is part of NRAO Workspaces. + * + * Workspaces is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Workspaces is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Workspaces. If not, see <https://www.gnu.org/licenses/>. + */ + +package copy + +import ( + "os" + "os/exec" + "path/filepath" + "strings" + "gitlab.nrao.edu/ssa/gocapo/capo/config" + "gitlab.nrao.edu/ssa/gocapo/helpers" +) + +//checkError +/** + * Check if an error happened and panic on it if so + * + * @param err An error object to report + **/ +func checkError(err error) { + if err != nil { + panic(err) + } +} + +/** + * Copy a given GMVA directory from the GMVA source directory to the VLBI + * staging directory + * + * @param dir A string with the name of the GMVA directory + **/ +func CopyGmva(dir string) { + capoProperties, err := config.InitConfig(os.Getenv("CAPO_PROFILE"), helpers.DefaultCapoPath) + checkError(err) + + wsIngestionSettings := capoProperties.SettingsForPrefix("edu.nrao.workspaces.IngestionSettings") + gmvaSourcePath := wsIngestionSettings.GetString("gmvaSourceDirectory") + aatIngestionSettings := capoProperties.SettingsForPrefix("archive-ingestion") + difxPath := aatIngestionSettings.GetString("VLBAPath") + + // GMVA source only copies files starting with GMVA + gmvaSourceFiles := strings.Join([]string{gmvaSourcePath, dir, "GMVA*"}, "/") + var gmvaSourcePaths []string + gmvaSourcePaths, err = filepath.Glob(gmvaSourceFiles) + checkError(err) + + difxDir := strings.Join([]string{difxPath, dir}, "/") + + // First make the directory to copy files to + mkdirCmd := exec.Command("mkdir", difxDir) + err = mkdirCmd.Run() + checkError(err) + + for _, path := range gmvaSourcePaths { + copyCmd := exec.Command("cp", "-LR", path, difxDir) + err = copyCmd.Run() + checkError(err) + } +} diff --git a/apps/cli/executables/pexable/carta_envoy/LICENSE b/apps/cli/executables/pexable/carta_envoy/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/carta_envoy/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/carta_envoy/carta_envoy/__init__.py b/apps/cli/executables/pexable/carta_envoy/carta_envoy/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..e457e70a1bc02907223b6bcf10ca1a43a7232113 100644 --- a/apps/cli/executables/pexable/carta_envoy/carta_envoy/__init__.py +++ b/apps/cli/executables/pexable/carta_envoy/carta_envoy/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Workspaces system for launching CARTA for viewing images +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/carta_envoy/carta_envoy/_version.py b/apps/cli/executables/pexable/carta_envoy/carta_envoy/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/carta_envoy/carta_envoy/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/carta_envoy/carta_envoy/carta.py b/apps/cli/executables/pexable/carta_envoy/carta_envoy/carta.py index 6753ab8ad381891e15c7a1ce6fc58f70d46e367c..7e126d10c6bb6e5221cc4dcd38fcfeae4bd56eb6 100644 --- a/apps/cli/executables/pexable/carta_envoy/carta_envoy/carta.py +++ b/apps/cli/executables/pexable/carta_envoy/carta_envoy/carta.py @@ -28,7 +28,6 @@ from pycapo import CapoConfig # pylint: disable=C0301, E0401, W0622, W1203 - """ Setup and Launch CARTA via Workspaces (modified from carta-valet) diff --git a/apps/cli/executables/pexable/carta_envoy/carta_envoy/launchers.py b/apps/cli/executables/pexable/carta_envoy/carta_envoy/launchers.py index abfba6476e142717cec5d5870353181325e9bb10..fa48e31cb97cf57c0c8ef81a13ec888b64225435 100644 --- a/apps/cli/executables/pexable/carta_envoy/carta_envoy/launchers.py +++ b/apps/cli/executables/pexable/carta_envoy/carta_envoy/launchers.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. """ This is the CARTA launcher. """ +import arrow import logging import math import os @@ -29,7 +30,6 @@ from threading import Thread from types import FrameType from typing import Optional -import pendulum as pendulum from carta_envoy.connect import ( ArchiveConnect, NotificationConnect, @@ -37,7 +37,6 @@ from carta_envoy.connect import ( WorkflowConnect, ) from carta_envoy.templates import CartaWrapper -from pendulum import DateTime # pylint: disable=E0401, R1705, W0105 @@ -268,7 +267,7 @@ class CartaLauncher: self.logger.warning("WARNING: CARTA not running.") @staticmethod - def _calculate_timeout_date(timeout_minutes: int) -> DateTime: + def _calculate_timeout_date(timeout_minutes: int) -> arrow.Arrow: """ Take the timeout of the CARTA session amd use it to calculate the datetime that the session will expire at @@ -281,9 +280,9 @@ class CartaLauncher: timeout_hours = int(timeout_hours) timeout_minutes = int(timeout_remainder * 60) logger.info(f"Timeout longer than 1 hour. Splitting into {timeout_hours}:{timeout_minutes}") - timeout_date = pendulum.now().add(hours=timeout_hours, minutes=timeout_minutes) + timeout_date = arrow.now().shift(hours=+timeout_hours, minutes=+timeout_minutes) else: - timeout_date = pendulum.now().add(minutes=timeout_minutes) + timeout_date = arrow.now().shift(minutes=+timeout_minutes) logger.info(f"Final timeout date of {timeout_date}") return timeout_date diff --git a/apps/cli/executables/pexable/carta_envoy/poetry.lock b/apps/cli/executables/pexable/carta_envoy/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..8dd703515f511c4745ba6e9e022125b1722795b3 --- /dev/null +++ b/apps/cli/executables/pexable/carta_envoy/poetry.lock @@ -0,0 +1,368 @@ +# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. + +[[package]] +name = "arrow" +version = "1.2.3" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[[package]] +name = "async-timeout" +version = "4.0.2" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fakeredis" +version = "2.15.0" +description = "Python implementation of redis API, can be used for testing purposes." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "fakeredis-2.15.0-py3-none-any.whl", hash = "sha256:221edb25c0a38d0fb7c7b91f52c4e2beb6fbd3369899a8ab59328c3e432b062a"}, + {file = "fakeredis-2.15.0.tar.gz", hash = "sha256:519ab3585ac0c652f04836209b9d835f33879560c7451c2abfc59a663cfaffbc"}, +] + +[package.dependencies] +redis = ">=4" +sortedcontainers = ">=2.4,<3.0" + +[package.extras] +json = ["jsonpath-ng (>=1.5,<2.0)"] +lua = ["lupa (>=1.14,<2.0)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pex" +version = "2.1.119" +description = "The PEX packaging toolchain." +optional = false +python-versions = ">=2.7,<3.12,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "pex-2.1.119-py2.py3-none-any.whl", hash = "sha256:b0dbdf2b1c608b159e50b19fa03b74659d1ecab593335bba0f2ec2ac1184ed7b"}, + {file = "pex-2.1.119.tar.gz", hash = "sha256:42e82163c1b467dff7ef5b651b454c52a78a5bf36776ff6631b4750080659930"}, +] + +[package.extras] +subprocess = ["subprocess32 (>=3.2.7)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "redis" +version = "4.6.0" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.7" +files = [ + {file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c"}, + {file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\""} + +[package.extras] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "802f5b05cdae29a973116528c93f713fa76a6b6231d367e9f5b1ecdceca81a3b" diff --git a/apps/cli/executables/pexable/carta_envoy/pyproject.toml b/apps/cli/executables/pexable/carta_envoy/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..eb4baef69527cf131bb636053fdde9dc7d316e52 --- /dev/null +++ b/apps/cli/executables/pexable/carta_envoy/pyproject.toml @@ -0,0 +1,28 @@ +[tool.poetry] +name = "carta_envoy" +version = "2.8.2rc1" +description = "Workspaces system for launching CARTA for viewing images" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +pycapo = "^0.3.1" +redis = "^4.5.4" +requests = "^2.28.2" +arrow = "^1.2.3" + +[tool.poetry.group.dev.dependencies] +pex = "2.1.119" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" +fakeredis = "^2.13.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.scripts] +carta_envoy = "carta_envoy.carta:main" diff --git a/apps/cli/executables/pexable/carta_envoy/setup.py b/apps/cli/executables/pexable/carta_envoy/setup.py deleted file mode 100644 index 557ee238fd1007a66827c20c0f84d35cc8274506..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/carta_envoy/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("carta_envoy/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["pycapo", "redis", "requests", "pendulum", "pex==2.1.119"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces system for launching CARTA for viewing images", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["carta_envoy = carta_envoy.carta:main"]}, -) diff --git a/apps/cli/executables/pexable/carta_envoy/test/__init__.py b/apps/cli/executables/pexable/carta_envoy/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/carta_envoy/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/casa_envoy/LICENSE b/apps/cli/executables/pexable/casa_envoy/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/casa_envoy/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/casa_envoy/casa_envoy/__init__.py b/apps/cli/executables/pexable/casa_envoy/casa_envoy/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..7408bcca31bfcadcdde868c6ec44c9bafb102f23 100644 --- a/apps/cli/executables/pexable/casa_envoy/casa_envoy/__init__.py +++ b/apps/cli/executables/pexable/casa_envoy/casa_envoy/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Workspaces CASA functionality bridge +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/casa_envoy/casa_envoy/_version.py b/apps/cli/executables/pexable/casa_envoy/casa_envoy/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/casa_envoy/casa_envoy/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/casa_envoy/poetry.lock b/apps/cli/executables/pexable/casa_envoy/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..c05b1fe1acfe5d9566d7c525f343b01b34167d6b --- /dev/null +++ b/apps/cli/executables/pexable/casa_envoy/poetry.lock @@ -0,0 +1,285 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "lxml" +version = "4.9.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pex" +version = "2.1.119" +description = "The PEX packaging toolchain." +category = "dev" +optional = false +python-versions = ">=2.7,<3.12,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "pex-2.1.119-py2.py3-none-any.whl", hash = "sha256:b0dbdf2b1c608b159e50b19fa03b74659d1ecab593335bba0f2ec2ac1184ed7b"}, + {file = "pex-2.1.119.tar.gz", hash = "sha256:42e82163c1b467dff7ef5b651b454c52a78a5bf36776ff6631b4750080659930"}, +] + +[package.extras] +subprocess = ["subprocess32 (>=3.2.7)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prettierfier" +version = "1.0.3" +description = "Intelligently pretty-print HTML/XML with inline tags." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "prettierfier-1.0.3-py3-none-any.whl", hash = "sha256:5dd22b1141b333c02df87b81062d18c5194e811675fa1c656627f39494431a3d"}, + {file = "prettierfier-1.0.3.tar.gz", hash = "sha256:15a5b3b46776bb6173c447f2b33bf5002d2d6d219edccd9402ea64fff9c25f68"}, +] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "soupsieve" +version = "2.4.1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "d26e5fee97485b3ec46c1cdfa41de275acec1a376f15138367c04b617765a423" diff --git a/apps/cli/executables/pexable/casa_envoy/pyproject.toml b/apps/cli/executables/pexable/casa_envoy/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..c356b81fa788ca8932df9543f7687e4fd876c86f --- /dev/null +++ b/apps/cli/executables/pexable/casa_envoy/pyproject.toml @@ -0,0 +1,27 @@ +[tool.poetry] +name = "casa_envoy" +version = "2.8.2rc1" +description = "Workspaces CASA functionality bridge" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +pycapo = "^0.3.1" +beautifulsoup4 = "^4.12.2" +lxml = "^4.9.2" +prettierfier = "^1.0.3" + +[tool.poetry.group.dev.dependencies] +pex = "2.1.119" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.scripts] +casa_envoy = "casa_envoy.palaver:main" diff --git a/apps/cli/executables/pexable/casa_envoy/setup.py b/apps/cli/executables/pexable/casa_envoy/setup.py deleted file mode 100644 index f6b4f38286aee43c8ec7187fcd867790f91435f1..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/casa_envoy/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("casa_envoy/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["pycapo", "bs4", "lxml", "prettierfier", "pex==2.1.119"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces CASA functionality bridge", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["casa_envoy = casa_envoy.palaver:main"]}, -) diff --git a/apps/cli/executables/pexable/casa_envoy/test/__init__.py b/apps/cli/executables/pexable/casa_envoy/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/casa_envoy/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/conveyor/LICENSE b/apps/cli/executables/pexable/conveyor/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/conveyor/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/conveyor/conveyor/__init__.py b/apps/cli/executables/pexable/conveyor/conveyor/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..c28e468f59a83b56520b4316a7fdae314fdd933a 100644 --- a/apps/cli/executables/pexable/conveyor/conveyor/__init__.py +++ b/apps/cli/executables/pexable/conveyor/conveyor/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Conveyor +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/conveyor/conveyor/_version.py b/apps/cli/executables/pexable/conveyor/conveyor/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/conveyor/conveyor/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/conveyor/poetry.lock b/apps/cli/executables/pexable/conveyor/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..74c6af3329159430136438bf40f145d1a68cdac1 --- /dev/null +++ b/apps/cli/executables/pexable/conveyor/poetry.lock @@ -0,0 +1,284 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pex" +version = "2.1.119" +description = "The PEX packaging toolchain." +category = "dev" +optional = false +python-versions = ">=2.7,<3.12,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "pex-2.1.119-py2.py3-none-any.whl", hash = "sha256:b0dbdf2b1c608b159e50b19fa03b74659d1ecab593335bba0f2ec2ac1184ed7b"}, + {file = "pex-2.1.119.tar.gz", hash = "sha256:42e82163c1b467dff7ef5b651b454c52a78a5bf36776ff6631b4750080659930"}, +] + +[package.extras] +subprocess = ["subprocess32 (>=3.2.7)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "urllib3" +version = "2.0.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "a31fc731739dda9113a598f3e1d407a1e38a4529c4214f0f36da48e324321bf7" diff --git a/apps/cli/executables/pexable/conveyor/pyproject.toml b/apps/cli/executables/pexable/conveyor/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..e0064bfd30fa74670a95e2b415d92aed17ef11fb --- /dev/null +++ b/apps/cli/executables/pexable/conveyor/pyproject.toml @@ -0,0 +1,25 @@ +[tool.poetry] +name = "conveyor" +version = "2.8.2rc1" +description = "Conveyor" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +pycapo = "^0.3.1" +requests = "^2.28.2" + +[tool.poetry.group.dev.dependencies] +pex = "2.1.119" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.scripts] +conveyor = "conveyor.conveyor:main" diff --git a/apps/cli/executables/pexable/conveyor/setup.py b/apps/cli/executables/pexable/conveyor/setup.py deleted file mode 100644 index 0278037477c28fe0fbc172e05a5ff315f5abf786..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/conveyor/setup.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("conveyor/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["pycapo==0.3.1", "requests", "pex==2.1.119"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="NRAO Workspaces Standard Capability Delivery/Post QA System", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - tests_require=["pytest>=5.4,<6.0", "pytest-resource-path"], - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["conveyor = conveyor.conveyor:main"]}, -) diff --git a/apps/cli/executables/pexable/conveyor/test/__init__.py b/apps/cli/executables/pexable/conveyor/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/conveyor/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/deliver/LICENSE b/apps/cli/executables/pexable/deliver/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/deliver/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/deliver/delivery/__init__.py b/apps/cli/executables/pexable/deliver/delivery/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..8eba411879a417995046139e74586645f69f2a7f 100644 --- a/apps/cli/executables/pexable/deliver/delivery/__init__.py +++ b/apps/cli/executables/pexable/deliver/delivery/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Workspaces data delivery module +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/deliver/delivery/_version.py b/apps/cli/executables/pexable/deliver/delivery/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/deliver/delivery/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/deliver/poetry.lock b/apps/cli/executables/pexable/deliver/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..f2f2902f81e1461de8201c8189363e28aa157d50 --- /dev/null +++ b/apps/cli/executables/pexable/deliver/poetry.lock @@ -0,0 +1,163 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "chevron" +version = "0.14.0" +description = "Mustache templating language renderer" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443"}, + {file = "chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pex" +version = "2.1.119" +description = "The PEX packaging toolchain." +category = "dev" +optional = false +python-versions = ">=2.7,<3.12,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "pex-2.1.119-py2.py3-none-any.whl", hash = "sha256:b0dbdf2b1c608b159e50b19fa03b74659d1ecab593335bba0f2ec2ac1184ed7b"}, + {file = "pex-2.1.119.tar.gz", hash = "sha256:42e82163c1b467dff7ef5b651b454c52a78a5bf36776ff6631b4750080659930"}, +] + +[package.extras] +subprocess = ["subprocess32 (>=3.2.7)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-resource-path" +version = "1.3.0" +description = "Provides path for uniform access to test resources in isolated directory" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pytest-resource-path-1.3.0.tar.gz", hash = "sha256:5f11b705e57f027141ef651bfeb5d14250ceb5fdb16acd0110228cf07f4a3d1b"}, + {file = "pytest_resource_path-1.3.0-py3-none-any.whl", hash = "sha256:0f794f6b24c14cb20cfd773b08f9de63b3826d1dad0ba4f107fa6f8d65a41350"}, +] + +[package.dependencies] +colorama = "*" +pytest = ">=3.5.0" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "6894473d781ee4883253316b0f4383c859d5219d1d39437f34c7a5586d9c2a78" diff --git a/apps/cli/executables/pexable/deliver/pyproject.toml b/apps/cli/executables/pexable/deliver/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..39a3f549e3dabdc2c60f908547c8ffd6a4c41bfe --- /dev/null +++ b/apps/cli/executables/pexable/deliver/pyproject.toml @@ -0,0 +1,27 @@ +[tool.poetry] +name = "ssa_deliver" +version = "2.8.2rc1" +description = "Workspaces data delivery module" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" +packages = [{ include = "delivery" }] + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +pycapo = "^0.3.1" +chevron = "0.14.0" + +[tool.poetry.group.dev.dependencies] +pex = "2.1.119" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" +pytest-resource-path = "^1.3.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.scripts] +deliver = "delivery.delivery:main" diff --git a/apps/cli/executables/pexable/deliver/setup.py b/apps/cli/executables/pexable/deliver/setup.py deleted file mode 100644 index 2120aa51108152f354a8388c8f38a28f1a79b3ea..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/deliver/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("delivery/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -# Setup Delivery -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="NRAO Workspaces Delivery System", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=["pex==2.1.119", "pycapo==0.3.1", "chevron==0.14.0"], - tests_require=["pytest>=5.4,<6.0", "pytest-resource-path"], - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["deliver = delivery.delivery:main"]}, -) diff --git a/apps/cli/executables/pexable/deliver/test/__init__.py b/apps/cli/executables/pexable/deliver/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/deliver/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/deliver/test/test_products.py b/apps/cli/executables/pexable/deliver/test/test_products.py index 1ff18cae682c6dc5117128f8295c90cc63f89abf..d8df98f7c0178e99a0cff786b6b84b85ff302705 100644 --- a/apps/cli/executables/pexable/deliver/test/test_products.py +++ b/apps/cli/executables/pexable/deliver/test/test_products.py @@ -25,7 +25,7 @@ from delivery.destinations.interfaces import ( ) from delivery.products import Calibration -from .test_api import dest_dir +from test_api import dest_dir class FakeDestination(Destination): diff --git a/apps/cli/executables/pexable/ingest/LICENSE.txt b/apps/cli/executables/pexable/ingest/LICENSE.txt deleted file mode 100644 index d159169d1050894d3ea3b98e1c965c4058208fe1..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/LICENSE.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/apps/cli/executables/pexable/ingest/MANIFEST.in b/apps/cli/executables/pexable/ingest/MANIFEST.in deleted file mode 100644 index 3a9ac50f8e1e7ca8a8d87e5fea8b75ce65c01bea..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/MANIFEST.in +++ /dev/null @@ -1,5 +0,0 @@ -include *.txt *.ini *.cfg *.rst *.wsgi *.sh *.spec *.md -include pyat/ingestion/logging-config.ini -include MANIFEST.in -include README.txt -include scripts/* diff --git a/apps/cli/executables/pexable/ingest/README.md b/apps/cli/executables/pexable/ingest/README.md deleted file mode 100644 index e9c1d36aaf4a05ea0d8a7aa1227e4faca8fd630f..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Ingest - -Ingest is the program that ingests data into the archive. diff --git a/apps/cli/executables/pexable/ingest/__init__.py b/apps/cli/executables/pexable/ingest/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/ingest/ingest/DBURLUtil.py b/apps/cli/executables/pexable/ingest/ingest/DBURLUtil.py deleted file mode 100644 index 0d5da464c678854f02470b87943edd550fd28109..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/DBURLUtil.py +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# jdbc:mysql://my.nrao.edu:3306/nrao_200 -# mysql://pst_ro:XXXXXXXX@my.nrao.edu/nrao_200 - - -def getdburlfromjdbc(jdbcurl, username, password): - return jdbcurl.replace("jdbc:", "").replace("://", "://" + username + ":" + password + "@") diff --git a/apps/cli/executables/pexable/ingest/ingest/FITSUtil.py b/apps/cli/executables/pexable/ingest/ingest/FITSUtil.py deleted file mode 100644 index 34acc631dfc92f97f9ecd61f2ea7d84f0f7bb0ea..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/FITSUtil.py +++ /dev/null @@ -1,224 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import logging -import math - -import numpy as np -from astropy import units as un -from astropy.io import fits -from astropy.table import Table - -from . import archiveutils as au - -""" - Utility module for accessing FITS data -""" - -logger = logging.getLogger("ingestion") - -polarizations = {1: "I", 2: "Q", 3: "U", 4: "V"} - - -def get_fits_data(filename): - """ - Get FITS header data - :param filename: name of the FITS file. - :return: target name, ra, dec, image units, min frequency, max frequency - """ - - hdu = fits.open(filename) - header = hdu["PRIMARY"].header - image_data = hdu[0].data - image_table = Table(image_data) - image_array = image_table[0][0] - - source_name = get_source_name(header) - ra = get_ra(header) - dec = get_dec(header) - image_field_of_view = get_image_field_of_view(header) - - ra_element_count = get_ra_element_count(header) - dec_element_count = get_dec_element_count(header) - spatial_resolution = get_spatial_resolution(header) - beam_axis_ratio = get_beam_axis_ratio(header) - - min_frequency = get_min_frequency(header) - max_frequency = get_max_frequency(header) - - rest_frequency = get_rest_frequency(header) - polarization_id = get_polarization_id(header) - - telescope = get_telescope(header) - image_units = get_image_units(header) - min_intensity = get_min_intensity(image_array) - max_intensity = get_max_intensity(image_array) - rms_noise = get_rms_noise(image_array) - - spatial_region = get_spatial_region(header) - - ra_pixel_size = get_ra_pixel_size(header) - dec_pixel_size = get_dec_pixel_size(header) - - return ( - source_name, - telescope, - spatial_resolution, - image_field_of_view, - min_intensity, - max_intensity, - ra, - dec, - min_frequency, - max_frequency, - rest_frequency, - ra_element_count, - dec_element_count, - image_units, - beam_axis_ratio, - polarization_id, - rms_noise, - spatial_region, - ra_pixel_size, - dec_pixel_size, - ) - - -def get_source_name(header): - return header["OBJECT"] - - -def get_ra(header): - if header["CTYPE1"] == "RA---SIN": - return header["CRVAL1"] - else: - return 0 - - -def get_dec(header): - if header["CTYPE2"] == "DEC--SIN": - return header["CRVAL2"] - else: - return 0 - - -def get_image_field_of_view(header): - return math.sqrt((header["NAXIS1"] * header["CDELT1"]) ** 2 + (header["NAXIS2"] * header["CDELT2"]) ** 2) - - -def get_ra_element_count(header): - if header["CTYPE1"] == "RA---SIN": - return header["NAXIS1"] - else: - return 0 - - -def get_dec_element_count(header): - if header["CTYPE2"] == "DEC--SIN": - return header["NAXIS2"] - else: - return 0 - - -def get_spatial_resolution(header): - """ - :param header: - :return: spatial resolution in arcsec - """ - spatial_resolution_degrees = (math.sqrt(header["BMAJ"] * header["BMIN"])) * un.degree - return spatial_resolution_degrees.to(un.arcsec).value - - -def get_min_frequency(header): - if header["CTYPE3"] == "FREQ": - return header["CRVAL3"] - header["CDELT3"] / 2 - else: - return 0 - - -def get_max_frequency(header): - if header["CTYPE3"] == "FREQ": - return header["CRVAL3"] + header["CDELT3"] / 2 - else: - return 0 - - -def get_rest_frequency(header): - return header["RESTFRQ"] - - -def get_beam_axis_ratio(header): - return header["BMAJ"] / header["BMIN"] - - -def get_polarization_id(header): - if header["CTYPE4"] == "STOKES": - fits_stokes = round(header["CRVAL4"]) - polarization_name = polarizations[fits_stokes] - return au.getpolarizationcode(polarization_name) - else: - return 0 - - -def get_telescope(header): - return header["TELESCOP"] - - -def get_image_units(header): - return "{} {}".format(header["BTYPE"], header["BUNIT"]) - - -def get_min_intensity(image_array): - return np.nanmin(image_array).astype(np.float64) - - -def get_max_intensity(image_array): - return np.nanmax(image_array).astype(np.float64) - - -# TODO -def get_rms_noise(image_array): - return 0 - - -def get_spatial_region(header): - # BOX IRCS {} {} {} {}".format(ra, dec, ra_extent, dec_extent) - if header["CTYPE1"] == "RA---SIN": - ra_extent = abs(header["NAXIS1"] * header["CDELT1"]) - else: - ra_extent = 0 - - if header["CTYPE2"] == "DEC--SIN": - dec_extent = abs(header["NAXIS2"] * header["CDELT2"]) - else: - dec_extent = 0 - - return "BOX IRCS {} {} {} {}".format(get_ra(header), get_dec(header), ra_extent, dec_extent) - - -def get_ra_pixel_size(header): - if header["CTYPE1"] == "RA---SIN": - return abs(header["CDELT1"]) - else: - return 0 - - -def get_dec_pixel_size(header): - if header["CTYPE2"] == "DEC--SIN": - return abs(header["CDELT2"]) - else: - return 0 diff --git a/apps/cli/executables/pexable/ingest/ingest/IDIFITSUtil.py b/apps/cli/executables/pexable/ingest/ingest/IDIFITSUtil.py deleted file mode 100644 index 4cf9924008ea3ed60d9763415862f0a1a8a1368b..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/IDIFITSUtil.py +++ /dev/null @@ -1,325 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import logging -import os -import re -import sys - -import numpy as np -from astropy.coordinates import SkyCoord -from astropy.io import fits -from astropy.table import Table -from astropy.time import Time, TimeDelta - -from . import archiveutils as au - -""" -Represents a VLBA IDIFITS file -""" - -LOG = logging.getLogger("ingestion") - - -class IDIFits: - def __init__(self, file): - self.idifitsfile = file - self.hdu = fits.open(file) - self.source_table = Table(self.hdu["SOURCE"].data) - self.uv_data = self.hdu["UV_DATA"].data - self.frequency_data = self.hdu["FREQUENCY"].data - self.frequency_table = Table(self.hdu["FREQUENCY"].data) - self.reference_frequency = self.hdu["FREQUENCY"].header["REF_FREQ"] - self.numbands = self.hdu["FREQUENCY"].header["NO_BAND"] - # self.spectchannels = self.hdu['FREQUENCY'].header['NO_CHAN'] - self.scans = self.build_scans(self.uv_data) - self.hdu.close() - - def getfitsfile(self): - return self.idifitsfile - - def getproject(self): - m = re.match("([A-Z]+\d+)", self.hdu["PRIMARY"].header["OBSERVER"]) - return m.group(0) - - def getexperiment(self): - m = re.match("[A-Z]+\d+([A-Z|\d]+)", self.hdu["PRIMARY"].header["OBSERVER"]) - if m is None: - return "" - return m.group(1) - - def getcorrelatorpass(self): - fflist = os.path.basename(self.getfitsfile()).split("_") - return fflist[2] - - def getsourcetable(self): - return self.source_table - - def getsource(self, source): - """ - Return source name, RA, and DEC of scan source - :param source: the source index of the scan source - :return: source name, ra, dec - """ - sourcekey = self.hdu["SOURCE"].data.columns[0].name - source_row = self.source_table[self.source_table[sourcekey] == source] - # Retrieving a column with 1 element so extract the value - # return source_row[0]['SOURCE'], source_row[0]['RAOBS'], source_row[0]['DECOBS'] - return source_row[0]["SOURCE"], source_row[0]["RAAPP"], source_row[0]["DECAPP"] - - def getfrequency(self, frequency): - frequency_row = self.frequency_table[self.frequency_table["FREQID"] == frequency] - frequencies = frequency_row[0]["BANDFREQ"] - if np.isscalar(frequencies): - # If the frequency is a scalar, put it in a numpy ndarray - freq_array = np.ndarray(shape=(1)) - freq_array[0] = frequency_row[0]["BANDFREQ"] - return freq_array - return frequencies - - def getbandwidth(self, frequency): - frequency_row = self.frequency_table[self.frequency_table["FREQID"] == frequency] - if np.isscalar(frequency_row[0]["TOTAL_BANDWIDTH"]): - return frequency_row[0]["TOTAL_BANDWIDTH"] - else: - return frequency_row[0]["TOTAL_BANDWIDTH"][0] - - def getfrequencytable(self): - return self.frequency_table - - def get_number_bands(self): - return self.numbands - - # def get_num_spectral_channels(self): - # return self.spectchannels - - def build_scans(self, uv_data): - if len(uv_data) <= 0: - LOG.critical(f"UV_DATA table is empty for VLBA file: {self.idifitsfile}") - sys.exit(1) - sourcekey = self.hdu["SOURCE"].data.columns[0].name - scan_list = [] - polarizations = self.getpolarizations(self.hdu["UV_DATA"].header) - - source = uv_data[0]["SOURCE"] - scan = 0 - scan_start_row = 0 - frequency_ids = [uv_data[scan_start_row]["FREQID"]] - for row in range(len(uv_data)): - if source != uv_data[row]["SOURCE"]: - scan_end_row = row - 1 - scan_start_time = Time(uv_data[scan_start_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_start_row]["TIME"], format="jd" - ) - scan_end_time = Time(uv_data[scan_end_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_end_row]["TIME"], format="jd" - ) - scan_time_on_source = scan_end_time - scan_start_time - scan_integration_time = uv_data[scan_start_row]["INTTIM"] - scan_source = self.source_table[self.source_table[sourcekey] == uv_data[scan_start_row]["SOURCE"]][ - "SOURCE" - ][0] - source_ra = self.source_table[self.source_table[sourcekey] == uv_data[scan_start_row]["SOURCE"]][ - "RAAPP" - ][0] - source_dec = self.source_table[self.source_table[sourcekey] == uv_data[scan_start_row]["SOURCE"]][ - "DECAPP" - ][0] - # c = SkyCoord(source_ra, source_dec, frame='icrs', unit='deg') - # source_radec = c.to_string('hmsdms') - source_radec = "" - frequencies = [(self.get_reference_frequency() + self.getfrequency(f)) for f in frequency_ids] - frequency_list = np.concatenate(frequencies, axis=0) / 1000000 - total_bandwidth = self.getbandwidth(1) - current_scan = [ - scan, - scan_source, - scan_start_time.mjd, - scan_end_time.mjd, - scan_time_on_source.sec, - scan_integration_time, - " ".join(map(str, frequency_list)), - total_bandwidth, - source_ra, - source_dec, - source_radec, - polarizations, - ] - scan_list.append(current_scan) - scan = scan + 1 - scan_start_row = row - frequency_ids.clear() - - frequency_id = uv_data[row]["FREQID"] - if frequency_id not in frequency_ids: - frequency_ids.append(frequency_id) - - source = uv_data[row]["SOURCE"] - - # Add in final scan - scan_end_row = row - scan_start_time = Time(uv_data[scan_start_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_start_row]["TIME"], format="jd" - ) - scan_end_time = Time(uv_data[scan_end_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_end_row]["TIME"], format="jd" - ) - scan_time_on_source = scan_end_time - scan_start_time - scan_integration_time = uv_data[scan_start_row]["INTTIM"] - scan_source = self.source_table[self.source_table[sourcekey] == uv_data[scan_start_row]["SOURCE"]]["SOURCE"][0] - source_ra = self.source_table[self.source_table[sourcekey] == uv_data[scan_start_row]["SOURCE"]]["RAAPP"][0] - source_dec = self.source_table[self.source_table[sourcekey] == uv_data[scan_start_row]["SOURCE"]]["DECAPP"][0] - # c = SkyCoord(source_ra, source_dec, frame='icrs', unit='deg') - # source_radec = c.to_string('hmsdms') - source_radec = "" - frequencies = [(self.get_reference_frequency() + self.getfrequency(f)) for f in frequency_ids] - frequency_list = np.concatenate(frequencies, axis=0) / 1000000 - total_bandwidth = self.getbandwidth(1) - current_scan = [ - scan, - scan_source, - scan_start_time.mjd, - scan_end_time.mjd, - scan_time_on_source.sec, - scan_integration_time, - " ".join(map(str, frequency_list)), - total_bandwidth, - source_ra, - source_dec, - source_radec, - polarizations, - ] - scan_list.append(current_scan) - - # Build scan table from list of scans - return Table( - rows=scan_list, - names=( - "SCAN_ID", - "SOURCE", - "START_TIME", - "END_TIME", - "TIME_ON_SOURCE", - "INTEGRATION_TIME", - "FREQUENCY", - "BANDWIDTH", - "RA", - "DEC", - "RA/DEC", - "POLARIZATION", - ), - ) - - def get_reference_frequency(self): - return self.reference_frequency - - def getpolarizations(self, uv_header): - numpolarizations = uv_header["NO_STKD"] - polarization_code = 0 - for i in range(numpolarizations): - pol_key = f"STK_{i+1}" - if pol_key not in uv_header.keys(): - LOG.warning(f"Stokes key: {pol_key} is not present in UV_DATA table") - continue - polarization = self.lookup_polarization(uv_header[pol_key]) - polarization_code = polarization_code + polarization - return au.getpolarization(polarization_code) - - def lookup_polarization(self, polarization_code): - # Map of polarization codes used by FITS to observation polarization codes - polarization_codes = { - 1: "I", - 2: "Q", - 3: "U", - 4: "V", - -1: "RR", - -2: "LL", - -3: "RL", - -4: "LR", - -5: "XX", - -6: "YY", - -7: "XY", - -8: "YX", - } - - if polarization_code not in polarization_codes.keys(): - LOG.error(f"Invalid polarization code: {polarization_code}") - sys.exit(1) - - return au.getpolarizationcode(polarization_codes[polarization_code]) - - def getuvdatacolumns(self): - return self.uv_data.columns - - def gethdulist(self): - return self.hdu.info() - - def getheader(self): - return self.hdu["PRIMARY"].header - - def getobservingband(self): - ref_frequency = self.get_reference_frequency() - return self.lookup_observing_band(ref_frequency) - - def getfrequencyoffset(self, freq_id): - frequency_row = self.frequency_table[self.frequency_table["FREQID"] == freq_id] - return frequency_row["BANDFREQ"][0][1] - - def getbandwidthoffset(self, freq_id): - frequency_row = self.frequency_table[self.frequency_table["FREQID"] == freq_id] - return frequency_row["CH_WIDTH"][0][1] - - def lookup_observing_band(self, reference_frequency): - ref_freq = reference_frequency / 1000000000 - obs_band = "" - - if 0.058 <= ref_freq <= 0.084: - obs_band = "4" - elif 0.236 <= ref_freq <= 0.492: - obs_band = "P" - elif 1.0 <= ref_freq <= 2.0: - obs_band = "L" - elif 2.0 < ref_freq <= 4.0: - obs_band = "S" - elif 4.0 < ref_freq <= 8.0: - obs_band = "C" - elif 8.0 < ref_freq <= 12.0: - obs_band = "X" - elif 12.0 < ref_freq <= 18.0: - obs_band = "Ku" - elif 18.0 < ref_freq <= 26.5: - obs_band = "K" - elif 26.5 < ref_freq <= 40.0: - obs_band = "Ka" - elif 40.0 < ref_freq <= 50.0: - obs_band = "Q" - else: - LOG.warning(f"Reference frequency {ref_freq} could not be located in a band") - - return obs_band - - def dump_scans(self): - self.scans.pprint(max_lines=-1, max_width=-1) - - -def test_1(file): - pass - - -if __name__ == "__main__": - print("Main") - # test_1(os.path.join(vlba_stage, 'VLBA_BS263E_bs263e_BIN0_SRC0_0_180716T144209.idifits')) diff --git a/apps/cli/executables/pexable/ingest/ingest/IngestionManifest.py b/apps/cli/executables/pexable/ingest/ingest/IngestionManifest.py deleted file mode 100644 index 0ad8d8067aff9f2212a7545d943c2cf78cc2e824..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/IngestionManifest.py +++ /dev/null @@ -1,225 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import logging -import sys -from distutils.util import strtobool - -import simplejson as json - -""" - Utility module for accessing Ingestion Manifest -""" - -LOG = logging.getLogger("ingestion") - -INGESTION_MANIFEST_FILE = "ingestion-manifest.json" -CALIBRATION = "calibration" -EXECUTION_BLOCK = "execution_block" -NAASC_CALIBRATION = "naasc_calibration" -IMAGE = "image" -CONTINUUM_IMAGE = "continuum_image" -IMAGE_CUBE = "image_cube" - - -class IngestionManifest: - def __init__(self, file): - self.from_json(file) - - def to_json(self, file): - """ - Save object in JSON file - :param file: file to store object - :return: None - """ - with open(file, "w") as manifest_file: - return json.dump(self, manifest_file, default=lambda o: o.__dict__, sort_keys=True, indent=4) - - def from_json(self, file): - """ - Load object from JSON file - :param file: ingestion manifest file - :return: None - """ - with open(file, "r") as manifest_file: - self.__dict__ = json.load(manifest_file) - - def get_parameters(self): - return self.parameters - - def get_telescope(self): - return self.parameters["telescope"] - - def get_operation(self): - if self.get_output_group() is None: - return None - return self.output_group["science_products"][0]["type"] - - def get_path(self): - return self.parameters["ingestion_path"] - - def get_reingest(self): - return self.parameters["reingest"] - - def get_ngas_ingest(self): - return self.parameters["ngas_ingest"] - - def get_additional_metadata_file(self): - if "additional_metadata" in self.__dict__["parameters"]: - return self.get_parameters()["additional_metadata"] - - def get_collection_metadata_file(self): - if self.has_collection_metadata_file(): - return self.get_parameters()["collection_metadata"] - - def has_collection_metadata_file(self): - return "collection_metadata" in self.__dict__["parameters"] - - # Calibration parameters - - def get_tar_filename(self): - return self.output_group["science_products"][0]["filename"] - - # Deprecated - def get_execution_block_science_product_locator(self): - return self.input_group["science_products"][0]["locator"] - - def get_execution_block_science_product_locators(self): - # Return list of eb science product locators for ebs used in the calibration (same mous) - return [input_science_product["locator"] for input_science_product in self.input_group["science_products"]] - - # - # Core Accessors - # - - # Provenance data for incoming product group - def get_input_group(self): - if "input_group" not in self.__dict__: - return None - return self.input_group - - # Organized set of products for ingestion - def get_output_group(self): - if "output_group" not in self.__dict__: - return None - return self.output_group - - # Linked, but not provenance products. - # Used for RealFast - def get_associate_group(self): - if "associate_group" not in self.__dict__: - return None - return self.associate_group - - # No Use Cases Yet - def get_additional_science_products(self): - return None - - # A list of ancillary products to be added linked to existing science products or an output group - # Used for ELWA FITS files - def get_additional_ancillary_products(self): - if "ancillary_products" not in self.__dict__: - return None - return self.ancillary_products - - # - # Subset accessors: - # - - def get_group_science_products(self, group): - return group["science_products"] - - def get_input_group_science_products(self): - return self.get_input_group()["science_products"] - - def get_output_group_science_products(self): - return self.get_output_group()["science_products"] - - def get_output_group_ancillary_products(self): - return self.get_output_group()["ancillary_products"] - - def get_associate_group_science_products(self): - return self.get_associate_group()["science_products"] - - def get_associate_group_locator(self): - return self.get_associate_group_science_products()[0]["locator"] - - def get_endtime(self): - return self.endtime - - def get_calibration_ingestion_parameters(self): - """ - :return: path to calibration tar file, calibration tar filename, - execution_block_science_prduct_locator, reingest, ngas_ingest - """ - - if self.get_operation() == CALIBRATION: - return ( - self.get_path(), - self.get_tar_filename(), - self.get_execution_block_science_product_locators(), - self.get_reingest(), - self.get_ngas_ingest(), - ) - elif self.get_operation == NAASC_CALIBRATION: - return self.get_execution_block_science_product_locators(), self.get_reingest(), self.get_ngas_ingest() - else: - LOG.critical(f"Method only defined for calibration ingestion") - sys.exit(1) - - def get_ingestion_parameters(self): - # returning telescope, operation, input product groups, output product groups - return ( - self.get_telescope(), - self.get_operation(), - self.get_input_group(), - self.get_output_group(), - self.get_reingest(), - self.get_ngas_ingest(), - self.get_path(), - ) - - def get_ingestion_parameters2(self): - # returning telescope, operation, reingest, ngas_ingest, path - return ( - self.get_telescope(), - self.get_operation(), - self.get_reingest(), - self.get_ngas_ingest(), - self.get_path(), - self.get_additional_metadata_file(), - self.get_collection_metadata_file(), - ) - - -def test1(): - ingestion_manifest = IngestionManifest(INGESTION_MANIFEST_FILE) - print(ingestion_manifest.get_input_group()) - print(ingestion_manifest.get_output_group()) - - for science_product in ingestion_manifest.get_input_group_science_products(): - print(f"Type: {science_product['type']} Locator: {science_product['locator']}") - - for science_product in ingestion_manifest.get_output_group_science_products(): - print(f"Type: {science_product['type']} File: {science_product['filename']}") - - for ancillary_product in ingestion_manifest.get_output_group_ancillary_products(): - print(f"Type: {ancillary_product['type']} File: {ancillary_product['filename']}") - - -if __name__ == "__main__": - test1() diff --git a/apps/cli/executables/pexable/ingest/ingest/JSONMetadataUtil.py b/apps/cli/executables/pexable/ingest/ingest/JSONMetadataUtil.py deleted file mode 100644 index a029f6165eb0903e199ebec0fc4777e697923e1f..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/JSONMetadataUtil.py +++ /dev/null @@ -1,148 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import json -import logging - -""" - Utility module for accessing JSON metadata -""" - -logger = logging.getLogger("ingestion") - - -class JSONMetadata: - def __init__(self, filename): - self._source_file = filename - self.from_json(filename) - - def to_json(self, filename): - """ - Save object in JSON file - :param filename: file to store object - :return: None - """ - with open(filename, "w") as metadata_file: - return json.dump(self, metadata_file, default=lambda o: o.__dict__, sort_keys=True, indent=4) - - def from_json(self, filename): - """ - Load object from JSON file - :param filename: file name of JSON file containing object attributes - :return: None - """ - try: - with open(filename, "r") as metadata_file: - self.__dict__ = json.load(metadata_file) - except IOError: - logger.critical("Error processing file: {}".format(filename)) - exit(-2) - - # Field accessors - - # - # The only guaranteed bit of information in a - # collection metadata file: Everything else - # is going tto be a key/value set based - # upon what this name is - # - def get_collection_name(self): - return self.collection_name - - # - # Realfast Collection Data - # - def get_calibration_level(self): - return self.calibration_level - - def get_starttime(self): - return self.starttime - - def get_endtime(self): - return self.endtime - - def get_exposure_time(self): - return self.exposure_time - - def get_image_tags(self): - return self.image_tags - - def get_product_tags(self): - return self.product_tags - - def get_configurations(self): - return str(self.configurations) - - def get_band_code(self): - return self.band_code - - def get_project_code(self): - return self.project_code - - def get_rms_noise(self): - return self.rms_noise - - # - # End Realfast Data - # - - # - # Note: No collection metadata for ELWA - # we only need to label the indicated - # science product as part of the collection - # - - # - # Simple checks for which collection: - # - def isRealFast(self): - return self.get_collection_name() == "realfast_execution_blocks" - - def isElwa(self): - return self.get_collection_name() == "elwa" - - -def test1(): - filename = "metadata1.json" - o1 = JSONMetadata() - o2 = JSONMetadata() - o1.collection_name = "vlass" - o1.calibration_level = 2 - o1.starttime = None - o1.endtime = None - o1.exposure_time = None - o1.image_tags = "" - o1.product_tags = "" - o1.configurations = str(["VLA_B"]) - - o1.to_json(filename) - o2.from_json(filename) - # print(o2.__dict__) - assert ( - o1.get_collection_name() == o2.get_collection_name() - and o1.get_calibration_level() == o2.get_calibration_level() - and o1.get_starttime() == o2.get_starttime() - and o1.get_endtime() == o2.get_endtime() - and o1.get_exposure_time() == o2.get_exposure_time() - and o1.get_image_tags() == o2.get_image_tags() - and o1.get_product_tags() == o2.get_product_tags() - and o1.get_configurations() == o2.get_configurations() - ) - - -if __name__ == "__main__": - test1() diff --git a/apps/cli/executables/pexable/ingest/ingest/NGASUtil.py b/apps/cli/executables/pexable/ingest/ingest/NGASUtil.py deleted file mode 100644 index 10446a27d728d54290ad08222e73db5c16698c73..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/NGASUtil.py +++ /dev/null @@ -1,174 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# NGAS Utility - -import hashlib -import logging -import os -import random -import shutil -import time -import uuid -from urllib.parse import quote_plus - -import jxmlease -import requests -from pycapo import CapoConfig - -from . import evlasciencedatamodel as sc - -capoprofile = os.environ["CAPO_PROFILE"] -config = CapoConfig(profile=capoprofile) -# Retrieve NGAS host information -NGASHOSTS = [x.strip() for x in config.getstring("archive-ingestion.NGASHosts").split(" ")] -archivecommand = {"status": "STATUS", "archive": "ARCHIVE", "retrieve": "RETRIEVE"} -LOG = logging.getLogger("ingestion") - - -def random_ngas_host(): - return random.choice(NGASHOSTS) - - -def ingestevlasdmsintongas(filesetbasepath, bdfpath): - filesets = [] - for fileset in filesets(): - filesetpath = os.path.join(filesetbasepath, fileset) - print("Processing fileset: ".format(fileset)) - - -def ingestsdmintongas(sdm, sdmpath, bdfpath, ngas_staging): - # Copy SDM table files - filelist = [] - for sdmtable in sdm.sdmtables: - table = sdm.sdmtables[sdmtable] - if isinstance(sdm.sdmtables[sdmtable], sc.SDMXMLTable): - fromextension = ".xml" - toextension = ".sdm" - elif isinstance(sdm.sdmtables[sdmtable], sc.SDMBinaryTable): - fromextension = ".bin" - toextension = ".bin" - else: - LOG.critical("Unrecognizable SDM table type") - exit(-1) - - fromfile = os.path.join(sdmpath, table.tablename + fromextension) - tofilename = table.entityid.replace(":", "_").replace("/", "_") + toextension - tofile = os.path.join(ngas_staging, tofilename) - LOG.info(f"SDM ingestion copying from {fromfile} to {tofile}") - shutil.copy(fromfile, tofile) - filelist.append((tofile, os.stat(tofile).st_size)) - - # Link BDF files - for bdffile in sdm.bdffiles: - extension = ".bdf" - filename = bdffile.entityid.replace(":", "_").replace("/", "_") - # fromfile = os.path.join(sdmpath, filename) + extension - fromfile = os.path.join(bdfpath, filename) - tofile = os.path.join(ngas_staging, filename + extension) - # TODO don't copy bdfs yet - disk space - LOG.info(f"BDF ingestion linking from {fromfile} to {tofile}") - os.link(fromfile, tofile) - filelist.append((tofile, os.stat(tofile).st_size)) - - if len(filelist) > 0: - archivefiles(filelist) - LOG.info(f"NGAS file list: {filelist}") - else: - logger.warning("No SDM tables or BDF files to process.") - - -def generate_science_product_locator(telescope, filetype): - """ - Generate unique science product locator for science products - :param telescope: the telescope - :param filetype: the type of the science product - :return: science product locator - """ - - id = uuid.uuid4() - science_product_locator = f"uid://{telescope.lower()}/{filetype}/{id}" - return science_product_locator - - -def generate_uuids_for_ngas(telescope, filetype, extension): - """ - Generate unique uuids for ngas storage - :param filename: the current name of the file - :return: new file name - """ - - id = uuid.uuid4() - if extension == "list": - extension = "txt" - file = f"uid____{telescope}_{filetype}_{id}.{extension}" - return file - - -def archivefiles(archivefilelist): - filecount = 0 - for archivefile in archivefilelist: - # archivefile 0:filename 1: file size on disk - file_name = archivefile[0] - expected_file_size = archivefile[1] - # And away we go: - starttime = time.time() - NGASHOST = random_ngas_host() - filecount += 1 - LOG.info(f"Ingesting: {file_name}") - ngascmd = NGASHOST + archivecommand["archive"] + "?filename=file://" + quote_plus(file_name) - LOG.info(ngascmd) - response = requests.get(ngascmd) - returncode = response.status_code - archivemsg = "Archive request ({}): {} [{}] in {}s".format( - filecount, ngascmd, returncode, time.time() - starttime - ) # fix units - LOG.info(archivemsg) - doc = jxmlease.parse(response.text) - if returncode == 200: - ngas_file_size = int(doc["NgamsStatus"]["DiskStatus"]["FileStatus"].get_xml_attr("FileSize")) - LOG.debug(f"Ingested file size: {ngas_file_size} Expected file size: {expected_file_size}") - if ngas_file_size < expected_file_size: - LOG.error( - f"NGAS ingested file size {ngas_file_size} indicates incomplete ingestion (expected file size {expected_file_size})" - ) - exit(-1) - elif ngas_file_size > expected_file_size: - LOG.info( - f"NGAS ingested file size {ngas_file_size} greater than expected {expected_file_size}. Weird, but continuing." - ) - # If they're equal, we're quite happy. - else: - error_message = doc["NgamsStatus"]["Status"].get_xml_attr("Message") - LOG.error(f"NGAS ingestion of {archivefile[0]} failed. Return code: {returncode} Message: {error_message}") - exit(-1) - - -def sha256(fname): - hash_sha256 = hashlib.sha256() - with open(fname, "rb") as f: - for chunk in iter(lambda: f.read(4096), b""): - hash_sha256.update(chunk) - return hash_sha256.hexdigest() - - -def test_uuid(telescope, filetype, extension): - print(generate_uuids_for_ngas(telescope, filetype, extension)) - - -if __name__ == "__main__": - generate_science_product_locator("EVLA", "execblock") diff --git a/apps/cli/executables/pexable/ingest/ingest/RealFastMetadata.py b/apps/cli/executables/pexable/ingest/ingest/RealFastMetadata.py deleted file mode 100644 index 0f5f098d1e7d3a88e94f372f54861485c7ad74cf..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/RealFastMetadata.py +++ /dev/null @@ -1,73 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" -Class for holding Realfast Metadata -""" - - -class RealFastMetadata: - def __init__(self, json_metadata): - self._json_metadata = json_metadata - - def get_transient_dm(self): - return self._json_metadata.transient_DM - - def get_portal_candidate_ids(self): - return self._json_metadata.portal_candidate_IDs - - def get_transient_ra(self): - return self._json_metadata.transient_RA - - def get_transient_ra_error(self): - return self._json_metadata.transient_RA_error - - def get_transient_dec(self): - return self._json_metadata.transient_Dec - - def get_transient_dec_error(self): - return self._json_metadata.transient_Dec_error - - def get_transient_snr(self): - return self._json_metadata.transient_SNR - - def get_transient_dm(self): - return self._json_metadata.transient_DM - - def get_transient_dm_error(self): - return self._json_metadata.transient_DM_error - - def get_preaverage_time(self): - return self._json_metadata.preaverage_time - - def get_rfpipe_version(self): - return self._json_metadata.rfpipe_version - - def get_prefs_id(self): - return self._json_metadata.prefs_Id - - def get_rf_qa_label(self): - return self._json_metadata.rf_QA_label - - def get_rf_qa_zero_fraction(self): - return self._json_metadata.rf_QA_zero_fraction - - def get_rf_qa_visibility_noise(self): - return self._json_metadata.rf_QA_visibility_noise - - def get_rf_qa_image_noise(self): - return self._json_metadata.rf_QA_image_noise diff --git a/apps/cli/executables/pexable/ingest/ingest/UVFITSUtil.py b/apps/cli/executables/pexable/ingest/ingest/UVFITSUtil.py deleted file mode 100644 index dd11635e893c9a2f403e5cfb955cb492ef1ed910..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/UVFITSUtil.py +++ /dev/null @@ -1,358 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import logging -import os -import re -from itertools import chain - -import numpy as np -from astropy.coordinates import SkyCoord -from astropy.io import fits -from astropy.table import Table, vstack -from astropy.time import Time, TimeDelta - -from . import archiveutils as au - -""" -Represents a VLBA UVFITS file -""" - -LOG = logging.getLogger("ingestion") - - -class UVFits: - def __init__(self, file): - self.fitsfile = file - - with fits.open(self.fitsfile) as fh: - self.source_table = Table(fh["SOURCE"].data) - self.source_header = fh["SOURCE"].header - self.reference_frequency = fh["FREQUENCY"].header["REF_FREQ"] - self.frequency_table = Table(fh["FREQUENCY"].data) - self.uv_header = fh["UV_DATA"].header - self.scans = Table() - - i = 1 - start_scan = 0 - # Read through trying to find the UV_DATA tables (there may be multiple in older idifits file) - # Scan number should continue to increment across UV_DATA tables - while True: - try: - if fh[i].header["EXTNAME"] == "UV_DATA": - uv_data = fh[i].data - start_scan, table_scans = self.build_scans(uv_data, start_scan) - self.scans = vstack([self.scans, table_scans]) - i = i + 1 - except OSError: - break - - def getsource(self, source_id): - return self.source_table[self.source_table["ID_NO."] == source_id]["SOURCE"] - - def build_scans(self, uv_data, start_scan): - scan_list = [] - polarizations = self.get_polarizations() - - source = uv_data[0]["SOURCE"] - scan = start_scan - scan_start_row = 0 - frequency_ids = [uv_data[scan_start_row]["FREQID"]] - for row in range(len(uv_data)): - if source != uv_data[row]["SOURCE"]: - scan_end_row = row - 1 - scan_start_time = Time(uv_data[scan_start_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_start_row]["TIME"], format="jd" - ) - scan_end_time = Time(uv_data[scan_end_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_end_row]["TIME"], format="jd" - ) - scan_time_on_source = scan_end_time - scan_start_time - scan_integration_time = uv_data[scan_start_row]["INTTIM"] - scan_source = self.source_table[self.source_table["ID_NO."] == uv_data[scan_start_row]["SOURCE"]][ - "SOURCE" - ][0] - source_ra = self.source_table[self.source_table["ID_NO."] == uv_data[scan_start_row]["SOURCE"]][ - "RAAPP" - ][0] - source_dec = self.source_table[self.source_table["ID_NO."] == uv_data[scan_start_row]["SOURCE"]][ - "DECAPP" - ][0] - c = SkyCoord(source_ra, source_dec, frame="icrs", unit="deg") - source_radec = c.to_string("hmsdms") - frequencies = [(self.get_reference_frequency() + self.getfrequency(f)) for f in frequency_ids] - frequency_list = np.concatenate(frequencies, axis=0) / 1000000 - total_bandwidth = self.getbandwidth(1) - current_scan = [ - scan, - scan_source, - scan_start_time.mjd, - scan_end_time.mjd, - scan_time_on_source.sec, - scan_integration_time, - " ".join(map(str, frequency_list)), - total_bandwidth, - source_ra, - source_dec, - source_radec, - polarizations, - ] - scan_list.append(current_scan) - scan = scan + 1 - scan_start_row = row - frequency_ids.clear() - - frequency_id = uv_data[row]["FREQID"] - if frequency_id not in frequency_ids: - frequency_ids.append(frequency_id) - - source = uv_data[row]["SOURCE"] - - # Add in final scan - scan_end_row = row - scan_start_time = Time(uv_data[scan_start_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_start_row]["TIME"], format="jd" - ) - scan_end_time = Time(uv_data[scan_end_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_end_row]["TIME"], format="jd" - ) - scan_time_on_source = scan_end_time - scan_start_time - scan_integration_time = uv_data[scan_start_row]["INTTIM"] - scan_source = self.source_table[self.source_table["ID_NO."] == uv_data[scan_start_row]["SOURCE"]]["SOURCE"][0] - source_ra = self.source_table[self.source_table["ID_NO."] == uv_data[scan_start_row]["SOURCE"]]["RAAPP"][0] - source_dec = self.source_table[self.source_table["ID_NO."] == uv_data[scan_start_row]["SOURCE"]]["DECAPP"][0] - c = SkyCoord(source_ra, source_dec, frame="icrs", unit="deg") - source_radec = c.to_string("hmsdms") - frequencies = [(self.get_reference_frequency() + self.getfrequency(f)) for f in frequency_ids] - frequency_list = np.concatenate(frequencies, axis=0) / 1000000 - total_bandwidth = self.getbandwidth(1) - current_scan = [ - scan, - scan_source, - scan_start_time.mjd, - scan_end_time.mjd, - scan_time_on_source.sec, - scan_integration_time, - " ".join(map(str, frequency_list)), - total_bandwidth, - source_ra, - source_dec, - source_radec, - polarizations, - ] - scan_list.append(current_scan) - - # Build scan table from list of scans and increment start scan number in case there is another UV_DATA table - return scan + 1, Table( - rows=scan_list, - names=( - "SCAN_ID", - "SOURCE", - "START_TIME", - "END_TIME", - "TIME_ON_SOURCE", - "INTEGRATION_TIME", - "FREQUENCY", - "BANDWIDTH", - "RA", - "DEC", - "RA/DEC", - "POLARIZATION", - ), - ) - - # Observation attributes - - def getfitsfile(self): - return self.fitsfile - - def number_of_scans(self): - return len(self.scans) - - def get_reference_frequency(self): - return self.reference_frequency - - # Scan attributes - - def get_source(self, scan_id): - return self.get_column_scalar_data(scan_id, "SOURCE") - - def get_start_time(self, scan_id): - return self.get_column_scalar_data(scan_id, "START_TIME") - - def get_end_time(self, scan_id): - return self.get_column_scalar_data(scan_id, "END_TIME") - - def get_ra(self, scan_id): - return self.get_column_scalar_data(scan_id, "RA") - - def get_dec(self, scan_id): - return self.get_column_scalar_data(scan_id, "DEC") - - def get_integration_time(self, scan_id): - return self.get_column_scalar_data(scan_id, "INTEGRATION_TIME") - - def get_bandwidth(self, scan_id): - return self.get_column_scalar_data(scan_id, "BANDWIDTH") - - # Helper function - - def get_column_scalar_data(self, scan_id, column_name): - return self.scans[self.scans["SCAN_ID"] == scan_id][column_name].data[0] - - # Polarization - - def get_polarizations(self): - # The final polarization code is the sum of the individual ones - polarization_code = 0 - number_polarizations = self.uv_header["NO_STKD"] - for i in range(number_polarizations): - pol_key = f"STK_{i+1}" - if pol_key not in self.uv_header.keys(): - LOG.warning(f"Stokes key: {pol_key} is not present in UV_DATA table") - continue - polarization = self.lookup_polarization(self.uv_header[pol_key]) - polarization_code = polarization_code + polarization - return au.getpolarization(polarization_code) - return polarization_code - - def lookup_polarization(self, polarization_code): - # Map of polarization codes used by FITS to observation polarization codes - polarization_codes = { - 1: "I", - 2: "Q", - 3: "U", - 4: "V", - -1: "RR", - -2: "LL", - -3: "RL", - -4: "LR", - -5: "XX", - -6: "YY", - -7: "XY", - -8: "YX", - } - - if polarization_code not in polarization_codes.keys(): - LOG.error(f"Invalid polarization code: {polarization_code}") - exit(-5) - - return au.getpolarizationcode(polarization_codes[polarization_code]) - - def getproject(self): - return self.source_header["OBSCODE"] - - def getexperiment(self): - return "" - - def getcorrelatorpass(self): - fflist = os.path.basename(self.getfitsfile()).split("_") - return fflist[2] - - def getobservingband(self): - ref_frequency = self.reference_frequency - return self.lookup_observing_band(ref_frequency) - - def getfrequency(self, frequency): - frequency_row = self.frequency_table[self.frequency_table["FREQID"] == frequency] - frequencies = frequency_row[0]["BANDFREQ"] - if np.isscalar(frequencies): - # If the frequency is a scalar, put it in a numpy ndarray - freq_array = np.ndarray(shape=(1)) - freq_array[0] = frequency_row[0]["BANDFREQ"] - return freq_array - return frequencies - - def getbandwidth(self, frequency): - frequency_row = self.frequency_table[self.frequency_table["FREQID"] == frequency] - if np.isscalar(frequency_row[0]["TOTAL_BANDWIDTH"]): - return frequency_row[0]["TOTAL_BANDWIDTH"] - else: - return frequency_row[0]["TOTAL_BANDWIDTH"][0] - - def lookup_observing_band(self, reference_frequency): - ref_freq = reference_frequency / 1000000000 - obs_band = "" - - if 0.058 <= ref_freq <= 0.084: - obs_band = "4" - elif 0.236 <= ref_freq <= 0.492: - obs_band = "P" - elif 1.0 <= ref_freq <= 2.0: - obs_band = "L" - elif 2.0 < ref_freq <= 4.0: - obs_band = "S" - elif 4.0 < ref_freq <= 8.0: - obs_band = "C" - elif 8.0 < ref_freq <= 12.0: - obs_band = "X" - elif 12.0 < ref_freq <= 18.0: - obs_band = "Ku" - elif 18.0 < ref_freq <= 26.5: - obs_band = "K" - elif 26.5 < ref_freq <= 40.0: - obs_band = "Ka" - elif 40.0 < ref_freq <= 50.0: - obs_band = "Q" - else: - LOG.warning(f"Reference frequency {ref_freq} could not be located in a band") - - return obs_band - - def dump_scans(self): - self.scans.pprint(max_lines=-1, max_width=-1) - - -def test_file(file): - if os.path.isfile(file): - print(f"File {file} exists") - assert True - else: - print(f"File {file} doesn't exist'") - assert False - - -def test_headers(file): - # with fits.open(file) as fh: - # for i in range(1, 17): - # print(fh[i].header['EXTNAME']) - pass - - -def test_source(uv_fits, source_id, expected): - source_name = uv_fits.getsource(source_id) - assert source_name == expected - - -def test_scans(uv_fits): - columns = uv_fits.scans.columns - num_rows = len(uv_fits.scans[:]) - print(f"Number of rows: {num_rows}") - LOG.error(columns) - - -if __name__ == "__main__": - path = "/Users/rlively/vlba" - file = "VLBA_VSN005405_file24.uvfits" - - uv_fits_file = os.path.join(path, file) - uv_fits = UVFits(uv_fits_file) - - print(f"Fits file: {uv_fits.get_fits_file()}") - print(uv_fits.get_polarizations()) - uv_fits.scans.pprint(max_lines=-1, max_width=-1) - print(uv_fits.get_polarizations()) diff --git a/apps/cli/executables/pexable/ingest/ingest/VLBAFITSUtil.py b/apps/cli/executables/pexable/ingest/ingest/VLBAFITSUtil.py deleted file mode 100644 index cea168260c13fc9867258ef94cf966dd887b54c8..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/VLBAFITSUtil.py +++ /dev/null @@ -1,376 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import logging -import os -import re -import sys -import time - -import numpy as np -from astropy.coordinates import SkyCoord -from astropy.io import fits -from astropy.table import Table -from astropy.time import Time, TimeDelta - -from . import archiveutils as au - -LOG = logging.getLogger("ingestion") - -""" -Represents a VLBA IDIFITS file -""" - - -class VLBAFits: - def __init__(self, fits_file): - self._idifitsfile = fits_file - if not os.path.exists(self.getfitsfile()) or os.path.getsize(self.getfitsfile()) == 0: - LOG.error(f"IDIFITS file {self.getfitsfile()} could not be found or is empty.") - exit(-1) - self._scans = self._build_scans(self.getfitsfile()) - - def _build_scans(self, fitsfile): - """ - Build a table of scans from the IDIFITS file. A scan occurs when the source id changes between - rows and, in the case of multiple UV_DATA tables, when a new table is encountered (assumption - that is consistent with the legacy archive). - """ - scans_start_time = time.time() - with fits.open(fitsfile) as hdu: - self._project = self._getproject(hdu) - self._correlator_pass = self._getcorrelatorpass() - self._segment = self._getsegment(hdu) - table = 0 - scan = 0 - number_rows = 0 - scan_table_rows = [] - while True: - # Extracting the UV_DATA table(s) in this way is done because older IDIFITS files - # were permitted to have multiple UV_DATA tables and the is no way to extract the - # list of those tables. hdu['UV_DATA'] only returns the first table - try: - if "EXTNAME" in hdu[table].header: - if hdu[table].name == "UV_DATA": - # New UV_DATA table triggers a new scan. This is consistent with the legacy - # archive, but seems suspicious. Good question for VLBA subsystem scientist. - scan = scan + 1 # New table triggers new scan (??) - uv_data = hdu[table].data - uv_hdr = hdu[table].header - - polarizations = self.getpolarizations(hdu["UV_DATA"].header) - - uv_length = uv_hdr["NAXIS2"] - if uv_length == 0: - LOG.error(f"No UV_DATA table for file {self.getfitsfile()}") - exit(-1) - scan_start_row = 0 - for row in range(uv_length): - number_rows = number_rows + 1 - - if (row < uv_length - 1) and (uv_data[row]["SOURCE"] != uv_data[row + 1]["SOURCE"]): - # Scan break - src_mask = self.getsourcetable()[self._source_id_column] == uv_data[row]["SOURCE"] - source, source_ra, source_dec = self._getsourceinfo(src_mask) - frequency_id = uv_data[row]["FREQID"] - integration_time = uv_data[row]["INTTIM"] - frequencies = self.getfrequencies(frequency_id) - bandwidth = self.getbandwidths(frequency_id) - start_time = Time(uv_data[scan_start_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_start_row]["Time"], format="jd" - ) - stop_time = Time(uv_data[row]["DATE"], format="jd") + TimeDelta( - uv_data[row]["Time"], format="jd" - ) - - scan_table_rows.append( - ( - self.getproject(), - scan, - source, - start_time.mjd, - stop_time.mjd, - round((stop_time - start_time).sec, 2), - integration_time, - ", ".join(str(x) for x in frequencies), - bandwidth, - polarizations, - source_ra, - source_dec, - ) - ) - - scan_start_row = row + 1 - scan = scan + 1 - elif (row == uv_length - 1) and (uv_data[row]["SOURCE"] != uv_data[row - 1]["SOURCE"]): - # Last row in uv_data table and different source as next to last row - src_mask = self.getsourcetable()[self._source_id_column] == uv_data[row]["SOURCE"] - source, source_ra, source_dec = self._getsourceinfo(src_mask) - frequency_id = uv_data[row]["FREQID"] - integration_time = uv_data[row]["INTTIM"] - frequencies = self.getfrequencies(frequency_id) - bandwidth = self.getbandwidths(frequency_id) - start_time = Time(uv_data[row]["DATE"], format="jd") + TimeDelta( - uv_data[row]["Time"], format="jd" - ) - stop_time = Time(uv_data[row]["DATE"], format="jd") + TimeDelta( - uv_data[row]["Time"], format="jd" - ) - - scan_table_rows.append( - ( - self.getproject(), - scan, - source, - start_time.mjd, - stop_time.mjd, - round((stop_time - start_time).sec, 2), - integration_time, - ", ".join(str(x) for x in frequencies), - bandwidth, - polarizations, - source_ra, - source_dec, - ) - ) - elif row == uv_length - 1: - # Last row in uv_data table and same source as next to last row - src_mask = self.getsourcetable()[self._source_id_column] == uv_data[row]["SOURCE"] - source, source_ra, source_dec = self._getsourceinfo(src_mask) - frequency_id = uv_data[row]["FREQID"] - integration_time = uv_data[row]["INTTIM"] - frequencies = self.getfrequencies(frequency_id) - bandwidth = self.getbandwidths(frequency_id) - start_time = Time(uv_data[scan_start_row]["DATE"], format="jd") + TimeDelta( - uv_data[scan_start_row]["Time"], format="jd" - ) - stop_time = Time(uv_data[row]["DATE"], format="jd") + TimeDelta( - uv_data[row]["Time"], format="jd" - ) - - scan_table_rows.append( - ( - self.getproject(), - scan, - source, - start_time.mjd, - stop_time.mjd, - round((stop_time - start_time).sec, 2), - integration_time, - ", ".join(str(x) for x in frequencies), - bandwidth, - polarizations, - source_ra, - source_dec, - ) - ) - elif hdu[table].header["EXTNAME"] == "SOURCE": - # Construct the source table - src_table = Table(hdu[table].data) - if "ID_NO." in src_table.columns: - self._source_id_column = "ID_NO." - elif "SOURCE_ID" in src_table.columns: - self._source_id_column = "SOURCE_ID" - - self._source_table = src_table - elif hdu[table].header["EXTNAME"] == "FREQUENCY": - # Construct the frequency table and get the header - frequency_header = hdu[table].header - frequency_table = Table(hdu[table].data) - self._ref_frequency = frequency_header["REF_FREQ"] - self._frequency_table = frequency_table - - table = table + 1 - except OSError: - break - except IndexError: - break - - # The column names are the interface to persistVLBAmetadata. Be careful! - # The order in scan_table_rows must correspond to the order of the columns names below. Be careful! - scan_table_column_names = ( - "Project", - "Scan", - "SOURCE", - "START_TIME", - "END_TIME", - "TIME_ON_SOURCE", - "INTEGRATION_TIME", - "FREQUENCY", - "BANDWIDTH", - "POLARIZATION", - "RA", - "DEC", - ) - scan_table = Table(rows=scan_table_rows, names=scan_table_column_names) - LOG.info(f"File {self.getfitsfile()} has {number_rows} rows and {scan} scans.") - LOG.info(f"{scan} scans built in {time.time() - scans_start_time}s") - return scan_table # Return a table of scans where each row is built by build_scan - - def getfitsfile(self): - return self._idifitsfile - - def getscantable(self): - return self._scans - - def _getsourceinfo(self, src_mask): - source = self.getsourcetable()[src_mask]["SOURCE"][0] - source_ra = self.getsourcetable()[src_mask]["RAAPP"][0] - source_dec = self.getsourcetable()[src_mask]["DECAPP"][0] - - c = SkyCoord(source_ra, source_dec, frame="icrs", unit="deg") - # For debugging - source_radec = c.to_string("hmsdms") - - # Converting to radians - source_ra_rad = c.ra.radian - source_dec_rad = c.dec.radian - - # Currently returning the ra and dec in degrees, but modifying the return allows - # using radians or an 'hmsdms' string - return source, source_ra, source_dec - - def _getproject(self, hdu): - """ - Extract the project code from the observer string in the FITS file - e.g., BB100 from BB100A1 - """ - m = re.match("([A-Z]+\d*)(.*)", hdu["PRIMARY"].header["OBSERVER"]) - return m.group(1) - - def getproject(self): - return self._project - - def _getsegment(self, hdu): - """ - Extract the segment code from the observer string in the FITS file - e.g., A1 from BB100A1 - """ - m = re.match("([A-Z]+\d*)(.*)", hdu["PRIMARY"].header["OBSERVER"]) - return m.group(2) - - def getsegment(self): - return self._segment - - def _getcorrelatorpass(self): - """Extract the correlator pass from the file name (not present in the IDIFITS file)""" - fflist = os.path.basename(self.getfitsfile()).split("_") - return fflist[2] - - def getcorrelatorpass(self): - return self._correlator_pass - - def getsourcetable(self): - return self._source_table - - def getreffrequency(self): - return self._ref_frequency - - def getfrequencytable(self): - return self._frequency_table - - def getfrequencies(self, frequency_id): - frequency_row = self.getfrequencytable()[self.getfrequencytable()["FREQID"] == frequency_id] - frequencies = frequency_row[0]["BANDFREQ"] - if np.isscalar(frequencies): - # If the frequency is a scalar, put it in a numpy ndarray - freq_array = np.ndarray(shape=(1)) - freq_array[0] = frequency_row[0]["BANDFREQ"] - return freq_array - return (self.getreffrequency() + frequencies) / 1000000 - - def getbandwidths(self, frequency_id): - frequency_row = self.getfrequencytable()[self.getfrequencytable()["FREQID"] == frequency_id] - # If the frequency is a scalar, put it in a numpy ndarray - if np.isscalar(frequency_row[0]["TOTAL_BANDWIDTH"]): - return frequency_row[0]["TOTAL_BANDWIDTH"] / 1000000 - else: - return frequency_row[0]["TOTAL_BANDWIDTH"][0] / 1000000 - - def getpolarizations(self, uv_header): - numpolarizations = uv_header["NO_STKD"] - polarization_code = 0 - for i in range(numpolarizations): - pol_key = f"STK_{i+1}" - if pol_key not in uv_header.keys(): - LOG.warning(f"Stokes key: {pol_key} is not present in UV_DATA table") - continue - polarization = self.lookup_polarization(uv_header[pol_key]) - polarization_code = polarization_code + polarization - return au.getpolarization(polarization_code) - - def lookup_polarization(self, polarization_code): - """Return the polarization code for the numeric polarization in the IDIFITS file""" - polarization_codes = { - 1: "I", - 2: "Q", - 3: "U", - 4: "V", - -1: "RR", - -2: "LL", - -3: "RL", - -4: "LR", - -5: "XX", - -6: "YY", - -7: "XY", - -8: "YX", - } - - if polarization_code not in polarization_codes.keys(): - LOG.warn(f"Invalid polarization code: {polarization_code}") - exit(-1) - - return au.getpolarizationcode(polarization_codes[polarization_code]) - - def lookup_band(self, frequency): - """Lookup the observing band from frequency (in GHz)""" - - if 0.058 <= frequency <= 0.084: - obs_band = "4" - elif 0.236 <= frequency <= 0.492: - obs_band = "P" - elif 1.0 <= frequency <= 2.0: - obs_band = "L" - elif 2.0 < frequency <= 4.0: - obs_band = "S" - elif 4.0 < frequency <= 8.0: - obs_band = "C" - elif 8.0 < frequency <= 12.0: - obs_band = "X" - elif 12.0 < frequency <= 18.0: - obs_band = "Ku" - elif 18.0 < frequency <= 26.5: - obs_band = "K" - elif 26.5 < frequency <= 40.0: - obs_band = "Ka" - elif 40.0 < frequency <= 50.0: - obs_band = "Q" - elif frequency > 50.0: - obs_band = "W" - else: - LOG.error(f"No band found for frequency {frequency}") - obs_band = "" - - return obs_band - - -if __name__ == "__main__": - path = "/Users/rlively/test/VLBA" - file = "VLBA_CI2010_ci2010_BIN0_SRC0_8_201029T192435.idifits" - - fits = VLBAFits(os.path.join(path, file)) - print(f"Frequencies {1}: {fits.getfrequencies(1)/1000}") diff --git a/apps/cli/executables/pexable/ingest/ingest/__init__.py b/apps/cli/executables/pexable/ingest/ingest/__init__.py deleted file mode 100644 index e99954499ab09ec25422147b942ae1921bf15d69..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/__init__.py +++ /dev/null @@ -1,46 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - - -import numpy -from psycopg2.extensions import AsIs, register_adapter - -from .files import * -from .metadata import * - - -def addapt_numpy_float32(numpy_float32): - return AsIs(numpy_float32) - - -register_adapter(numpy.float32, addapt_numpy_float32) - -__all__ = [ - "SDM", - "SDMTable", - "SDMBinaryTable", - "buildtable", - "ngasstatus", - "archivefile", - "retrievefile", - "ingest", - "ingestBDF", - "ingestSDM", - "ingestmetadata", -] diff --git a/apps/cli/executables/pexable/ingest/ingest/_version.py b/apps/cli/executables/pexable/ingest/ingest/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/ingest/ingest/almautils.py b/apps/cli/executables/pexable/ingest/ingest/almautils.py deleted file mode 100644 index 5332b4b05656daafef110be6ab1e7d113f7b37b6..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/almautils.py +++ /dev/null @@ -1,231 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import logging - -from sqlalchemy import select -from sqlalchemy.orm import aliased -from sqlalchemy.orm.exc import MultipleResultsFound - -from .schema import Author, create_session -from .schema.almamodel import ( - AquaExecblock, - AsaEnergy, - AsaProductFile, - AsaScience, - BmmvObsproject, - BmmvObsproposal, - BmmvSchedblock, - NgasFiles, - ShiftlogEntry, - t_asp_obs_proposal_author, - t_mv_obsproposal, -) - -LOG = logging.getLogger("ingestion") - -session = create_session("ALMA") - - -def getproject(projectid): - project = session.query(BmmvObsproject).filter_by(prj_archive_uid=projectid).first() - return project - - -def getabstract(projectid): - proposal = session.query(BmmvObsproposal).filter_by(obsproject_archive_uid=projectid).first() - return proposal.abstract_text - - -def getauthors(projectid): - """ - Return project authors - :param projectid: project for which authors are desired - :return: list of authors info - """ - - """ - select aut.firstname, aut.lastname, aut.account_id, aut.author_index - from ALMA.ASP_OBS_PROPOSAL_AUTHOR aut - inner join ALMA.MV_OBSPROPOSAL mop - on mop.archive_uid = aut.proposal_archive_uid - where mop.obsproject_archive_uid = ? - ; - """ - - s = ( - select( - [ - t_asp_obs_proposal_author.c.firstname, - t_asp_obs_proposal_author.c.lastname, - t_asp_obs_proposal_author.c.account_id, - t_asp_obs_proposal_author.c.author_index, - ] - ) - .select_from( - t_asp_obs_proposal_author.join( - t_mv_obsproposal, t_mv_obsproposal.c.archive_uid == t_asp_obs_proposal_author.c.proposal_archive_uid - ) - ) - .where(t_mv_obsproposal.c.obsproject_archive_uid == projectid) - ) - - result = [ - Author(author_id=None, firstname=r[0], lastname=r[1], username=r[2], project_code=projectid, is_pi=r[3] == 0) - for r in session.execute(s).fetchall() - ] - - return result - - -def getalmaoushierarchy(execblock): - """ - Build the ALMA OUS hierarchy for this execblock and return the MOUS, GOUS, and SOUS ids - :param execblock: - :return: MOUS, GOUS, SOUS ids - """ - - """ - select SGOUS_STATUS_UID, sbs.GOUS_STATUS_UID, sbs.MOUS_STATUS_UID - FROM BMMV_SCHEDBLOCK sbs - join ALMA.SHIFTLOG_ENTRIES shifts ON shifts.SE_SB_ID = sbs.ARCHIVE_UID - join AQUA_EXECBLOCK ebs ON ebs.EXECBLOCKUID = shifts.SE_EB_UID - where ebs.EXECBLOCKUID= ? -; - """ - - sbs = aliased(BmmvSchedblock) - shifts = aliased(ShiftlogEntry) - ebs = aliased(AquaExecblock) - - execblockuid = execblock.replace("___", "://").replace("_", "/") - LOG.info(f"Execblock UID: {execblockuid}") - - sb, sh, eb = ( - session.query(sbs, shifts, ebs) - .filter(shifts.se_sb_id == sbs.archive_uid) - .filter(ebs.execblockuid == shifts.se_eb_uid) - .filter(ebs.execblockuid == execblockuid) - .one() - ) - - LOG.info( - f"Execblock: {execblock} MOUS: {sb.mous_status_uid} GOUS: {sb.gous_status_uid} SOUS: {sb.sgous_status_uid}" - ) - return sb.mous_status_uid, sb.gous_status_uid, sb.sgous_status_uid - - -def getalmacalfiles(mous): - """ - :param mous: - :return: list of calibration products - """ - - """ - select FILE_ID,FILE_SIZE from ngas.ngas_files where file_id in (select ngas_file_id from - alma.asa_product_files where ASA_OUS_ID=? and FILE_CLASS in ('calibration','script')); - """ - - LOG.info(f"Getting calibration products for mous {mous}") - - files = ( - session.query(AsaProductFile.ngas_file_id, NgasFiles.file_size) - .filter(AsaProductFile.asa_ous_id == mous) - .filter(AsaProductFile.file_class.in_(["calibration", "script"])) - .filter(AsaProductFile.ngas_file_id == NgasFiles.file_id) - .all() - ) - - for file in files: - LOG.info(f"File name: {file[0]} size: {file[1]}") - - return [(file[0], file[1]) for file in files] - - -def getschedblockname(mous): - """ - Return the sched block name given the mous id - - :param mous: MOUS uid - :return: schedblock name - """ - - """ - SELECT SB_NAME FROM BMMV_SCHEDBLOCK WHERE STATUS NOT IN ('Suspended', 'Cancelled') AND STATUS NOT LIKE 'CSV%' - AND MOUS_STATUS_UID='uid://A001/X1284/X15db'; - - """ - - LOG.info(f"Mous id for sched block name: {mous}") - sbs = aliased(BmmvSchedblock) - try: - sb = ( - session.query(sbs) - .filter(sbs.status.notin_(["Suspended", "Cancelled"])) - .filter(~(sbs.status.ilike("csv%"))) - .filter(sbs.mous_status_uid == mous) - .one_or_none() - ) - except MultipleResultsFound: - LOG.warning("Multiple results found for SB name of {}. Setting to NULL.".format(mous)) - return None - - if sb is not None: - LOG.info(sb.sb_name) - return sb.sb_name - else: - LOG.info("No Appropriate SB Found.") - return None - - -def get_source_list(mous): - """ - Get source list from MOUS id - :param mous: - :return: - """ - # mous = 'uid://A001/X1284/X15db' - - # _SOURCE_DATA_QUERY = """SELECT SOURCE_NAME, RA_SOURCE, DEC_SOURCE, INT_TIME, SPATIAL_SCALE_MIN, SPATIAL_SCALE_MAX, DATASET_ID FROM ALMA.ASA_SCIENCE WHERE ASA_OUS_ID=:mous_uid AND DATASET_ID LIKE :like_this""" - - source_list = ( - session.query(AsaScience) - .filter(AsaScience.asa_ous_id == mous) - .filter(AsaScience.dataset_id.ilike(mous + "%")) - .all() - ) - - return source_list - - -def get_spectral_window_data(source): - # _SPW_DATA_FOR_SOURCE = """SELECT SPW_NUM, FREQUENCY_MIN, FREQUENCY_MAX, BANDWIDTH, CHANNEL_NUM, RESOLUTION_MIN, RESOLUTION_MAX FROM ALMA.ASA_ENERGY WHERE ASA_DATASET_ID=:dsid""" - spectral_window_data = session.query(AsaEnergy).filter(AsaEnergy.asa_dataset_id == source.dataset_id).all() - - return spectral_window_data - - -def update_alma_source_data(): - pass - - -def update_alma_spectral_window_data(): - pass - - -def update_alma_spectral_window_source_data(): - pass diff --git a/apps/cli/executables/pexable/ingest/ingest/archive.py b/apps/cli/executables/pexable/ingest/ingest/archive.py deleted file mode 100644 index 206f7196093feeaa5ea9cc72e8cc6bbf1fec7ce6..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/archive.py +++ /dev/null @@ -1,339 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import argparse -import glob -import logging -import os -import sys -import time -from pathlib import Path - -from pycapo import CapoConfig - -from . import IngestionManifest as im -from . import NGASUtil as ng -from . import archiveutils as au -from . import evlasciencedatamodel as sc -from . import manifestpersist as mp -from . import persistcaltables as pct -from . import persistimages as pimg -from . import persistmetadata as pm -from . import persistVLBAmetadata as vlbamd -from ._version import ___version___ as _version -from .IngestionManifest import IngestionManifest -from .pymygdala import LogHandler, SendNRAOEvent - -capoprofile = os.environ["CAPO_PROFILE"] - -LOG = logging.getLogger("ingestion") - -LOG.setLevel(logging.DEBUG) -handler = LogHandler(profile=capoprofile, application="Ingestion") -handler.setLevel(logging.DEBUG) -LOG.addHandler(handler) - -ch = logging.StreamHandler(sys.stdout) -ch.setLevel(logging.DEBUG) -LOG.addHandler(ch) - -_HELP_MESSAGE = """AAT Ingestion Utility, version {}:\n\tCreates metadata structures and places files into NGAS.""" -ingest_parser = argparse.ArgumentParser( - description=_HELP_MESSAGE.format(_version), formatter_class=argparse.RawTextHelpFormatter -) - -__send_event = SendNRAOEvent(profile=capoprofile, application="SDM Ingestion") - -_INGESTION_MANIFEST_FILENAME = "ingestion_manifest.json" -_SDM_INGESTION = "meta" -_BDF_INGESTION = "bdf" -_CALIBRATION_INGESTION = "cal" -_IMAGE_INGESTION = "img" -_VLBA_IDIFITS_INGESTION = "vlba" -_JSON_MANIFEST_INGESTION = "json" -_INVALID_INGESTION_OPERATION = "invalid" - - -def main(): - """ - Main method for ingesting files into metadata database and NGAS - :return: - :error returns - -5: Invalid operation - """ - - # Primary flags indicating operation to perform - mxg = ingest_parser.add_mutually_exclusive_group(required=True) - mxg.add_argument("-b", "--bdf", help="Ingest BDFs for observation", action="store_true") - mxg.add_argument("-c", "--cal", help="Ingest calibration products", action="store_true") - mxg.add_argument("-i", "--img", help="Ingest imaging products and images", action="store_true") - mxg.add_argument("-m", "--meta", help="Ingest science metadata for observation", action="store_true") - mxg.add_argument("-v", "--vlba", help="Ingest VLBA science metadata", action="store_true") - mxg.add_argument("-j", "--json", help="Ingestion using ingestion manifest", action="store_true") - ingest_parser.add_argument("-p", "--path", help="Path to data") - ingest_parser.add_argument( - "-o", "--file", help="File (observation file set, calibration product tar file, BDF file, image)" - ) - ingest_parser.add_argument("-g", "--filegroup", help="Calibration products parent eb or image project") - ingest_parser.add_argument("-r", "--reingest", help="Re-ingest (delete) existing data", action="store_true") - ingest_parser.add_argument("-n", "--nocal", help="Do not perform calibration", action="store_true") - ingest_parser.add_argument( - "-d", "--nongas", help="Only extract metadata, do not ingest into NGAS", action="store_true" - ) - - args = ingest_parser.parse_args() - - config = CapoConfig(profile=capoprofile) - - operation = getingestionoperation(args) - if operation == _INVALID_INGESTION_OPERATION: - LOG.critical(f"The operation is unspecified or is invalid.") - sys.exit(1) - elif operation == _IMAGE_INGESTION: - pass - # Retrieve paths to SDM tables, BDF files, and the NGAS staging area - - # First the pathy stuff - if args.path: - sdmpath = args.path - bdfpath = args.path - calproductpath = args.path - else: - # TODO This should be an error for the required flags - sdmpath = config.getstring("archive-ingestion.SDMPath") - bdfpath = config.getstring("archive-ingestion.BDFPath") - calproductpath = config.getstring("archive-ingestion.BDFPath") - - if operation == _JSON_MANIFEST_INGESTION: - operation = getoperationfromjson() - - if args.meta: # Ingest science metadata for SDM-based observations - filegroups = [] - if args.file: # single file - filegroups.append(args.file) - else: # all files in path - filegroups = [x.name for x in list(Path(sdmpath).glob("*"))] - LOG.debug(f"filesets: {filegroups}") - - groupcount = 0 - starttime = time.time() - for filegroup in filegroups: - filepath = Path(sdmpath) / filegroup - if not filepath.exists(): - LOG.error(f"Observation {filepath.name} doesn't exist in {filepath.parent}") - continue - asdm_table = Path(filepath) / "ASDM.xml" - if not asdm_table.exists(): # If the directory has ASDM.xml, it is a valid filegroup - LOG.error(f"{filepath.name} is missing ASDM.xml. Not a valid observation") - continue - exec_block = au.getexecutionblockfromname(filegroup) - if exec_block is not None: # Already exists - if args.reingest: - LOG.info(f"Re-ingestion requested") - else: - LOG.warning( - f"Observation {filepath.name} already exists in metadata database and re-ingestion not requested" - ) - continue - LOG.info(f"Ingesting SDM metadata for execution block {filegroup}") - sdm = sc.buildsdm(filegroup, sdmpath) - if len(sdm.bdffiles) > 0: # ingest science meta data - project, science_products = pm.persist(sdm, args.nocal) - else: - LOG.error(f"Execution block: {filepath.name} has no bdfs and will not be ingested") - continue - - LOG.info(f"SDM metadata ingestion complete for {filepath.name} in {round(time.time() - starttime, 2)}s") - if args.stage: - LOG.info( - "-t flag set. SDM tables and BDF files will be staged for NGAS ingestion in {}".format(args.stage) - ) - ng.ingestsdmintongas(sdm, os.path.join(sdmpath, filegroup), args.stage) - groupcount += 1 - - # Send completion even to amygdala - send_event( - { - "logData": { - "fileset_id": os.path.basename(filegroup), - "ingestion_type": "observation", - "project_code": project.project_code, - }, - "message": "ingestion complete", - "request": "de nada", - } - ) - - elif args.bdf: - # BDF Files - # Path (-p) and file set (-o) required - - if args.nongas: - LOG.warning("-d flag was set for no ingestion into NGAS. For bdf ingestion, this is a no-op.") - sys.exit(0) - - if args.file and args.path: - filelist = args.file.split(",") - pathfilelist = [] - for file in filelist: - filepath = os.path.join(args.path, file.strip()) - if not (filepath.endswith(".bdf") or filepath.endswith(".sdm") or filepath.endswith(".bin")): - LOG.warning("Invalid extension for ingestion: {}".format(filepath)) - continue - if not os.path.exists(filepath): - LOG.error("Path to file doesnt exist: {}".format(filepath)) - continue - - pathfilelist.append(filepath) - if len(pathfilelist) > 0: - # Not ingesting bdfs yet - pass - # ng.archivefiles(pathfilelist) - else: - LOG.info("No files located for BDF ingestion") - else: - LOG.error("-b requires arguments -p and -o") - - elif args.cal: - # Calibration products - # Path (-p) and calibration product tar file (-o) required. Parent execution block (-g) required for calibration - # workflow, but not bulk calibration ingestion - if args.path and args.file and args.filegroup: - calibration_products_file = Path(args.path) / args.file - if not calibration_products_file.exists(): - LOG.error( - f"Calibration file {calibration_products_file.name} does not exist in {calibration_products_file.parent}" - ) - sys.exit(1) - else: - pct.ingestcalmetadata(calibration_products_file, args.filegroup, args.nongas) - elif args.path and args.file: - calibration_file = Path(args.path) / args.file - if not calibration_file.exists(): - # TODO calfile - LOG.error(f"Path to calibration products tar file doesnt exist: {str(calibration_file)}") - sys.exit(1) - # Ingest file where parent execution block must be extracted from the .tar file - pct.ingestcaltable(os.path.join(args.path, args.file)) - LOG.info(f"Calibration products {os.path.join(args.path, args.file)} ingested") - elif args.filegroup: - pct.ingestalmacalibration(args.filegroup) - else: - LOG.error("-c requires arguments -p, -o, and -g for VLA or just -g for ALMA") - - elif args.img: - if args.path and args.filegroup: - if not os.path.exists(args.path): - LOG.error(f"Path to image products doesnt exist: {args.path}") - sys.exit(1) - LOG.info(f"Ingesting images for project {args.filegroup} in {args.path}") - - filegroup = au.getimagesetfilegroupfromname(os.path.basename(args.path)) - if filegroup is not None: # Filegroup already exists - if args.reingest: - LOG.info("Removing image set {} for re-ingestion".format(os.path.basename(args.path))) - au.removeimageset(filegroup) - else: - LOG.warning( - "Image set {} already exists in the metadata database. If you wish to re-ingest, use -i -r".format( - os.path.basename(args.path) - ) - ) - sys.exit(1) - else: - LOG.info("Ingesting image set {}".format(os.path.basename(args.path))) - - pimg.ingestimagemetaData(args.path, args.filegroup, args.nongas) - else: - LOG.error("-i requires arguments -p and -g") - elif args.vlba: - if not args.path or not args.file: - LOG.error("VLBA ingestion requires a path and file name") - sys.exit(1) - file_path = Path(args.path) - fits_file = file_path / args.file - starttime = time.time() - existingfile = au.getvlbafile(args.file) - if existingfile is not None: - if args.reingest: - # Re-ingestion - remove the existing file before ingesting - au.removefile(existingfile) - else: - LOG.error(f"File: {fits_file} has already been ingested.") - sys.exit(1) - vlbamd.persistVLBAMetadata(fits_file) - LOG.info(f"IDIFITS file {fits_file.name} ingested in {time.time() - starttime}s") - elif args.json: - if not args.path: - LOG.critical(f"-p flag is required for ingestion via ingestion-manifest.json") - sys.exit(1) - ingestion_manifest_file = Path(args.path) / im.INGESTION_MANIFEST_FILE - if not ingestion_manifest_file.is_file(): - LOG.critical( - f"Ingestion manifest {ingestion_manifest_file.name} does not exist in {ingestion_manifest_file.parent}" - ) - sys.exit(1) - ingestion_manifest = IngestionManifest(ingestion_manifest_file) - mp.ingest_from_manifest(ingestion_manifest_file.parent, ingestion_manifest) - else: - LOG.critical("Invalid command-line argument") - sys.exit(1) - - -def getingestionoperation(args): - if args.meta: - return _SDM_INGESTION - elif args.bdf: - return _BDF_INGESTION - elif args.cal: - # Path (-p) and calibration product tar file (-o) required. Parent execution block (-g) required for calibration - return _CALIBRATION_INGESTION - elif args.img: - return _IMAGE_INGESTION - elif args.vlba: - return _VLBA_IDIFITS_INGESTION - elif args.json: - return _JSON_MANIFEST_INGESTION - else: - return _INVALID_INGESTION_OPERATION - - -def getoperationfromjson(): - pass - - -def getargs(operation): - if operation == _SDM_INGESTION: - pass - elif operation == _BDF_INGESTION: - pass - elif operation == _CALIBRATION_INGESTION: - pass - elif operation == _IMAGE_INGESTION: - pass - elif operation == _VLBA_IDIFITS_INGESTION: - pass - elif operation == _JSON_MANIFEST_INGESTION: - pass - - -def send_event(event): - __send_event.send(routing_key="ingestion-complete.metadata", event=event) - - -if __name__ == "__main__": - main() diff --git a/apps/cli/executables/pexable/ingest/ingest/archive_caltables.py b/apps/cli/executables/pexable/ingest/ingest/archive_caltables.py deleted file mode 100644 index a6ce96f4f86c76006dfa9dfc5dce07ac1e0052c2..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/archive_caltables.py +++ /dev/null @@ -1,65 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import argparse -import glob -import os -import shutil -import tarfile - -import evlasciencedatamodel as sc -import NGASUtil as ng -import persistmetadata as pm -from lxml import objectify as obj -from persistcaltables import persistcalibrations -from pycapo import CapoConfig - -# TODO incorporate this in as an option of archive.py ? -# Capofy the location of the temporary location for tar unpacking -# No manifest file? - - -def main(): - parser = argparse.ArgumentParser(description="Ingest Calibration Tables") - parser.add_argument("-f", "--file", help="Calibration File") - args = parser.parse_args() - - capoprofile = os.environ["CAPO_PROFILE"] - config = CapoConfig(profile=capoprofile) - calibrationtablepath = config.getstring("archive-ingestion.CalibrationTablePath") - - if args.file is None: - tarfiles = glob.glob(calibrationtablepath + "/*.tar") - else: - tarfiles = [] - tarfiles.append(os.path.join(calibrationtablepath, args.file)) - print("{} calibration file(s) to be archived".format(len(tarfiles))) - calcount = 0 - calibrationfiles = [] - for calfile in tarfiles: - print("Tar file to be ingested: {}".format(tarfile)) - calcount += 1 - calibrationfiles.append(calfile) - - ng.archivefiles(calibrationfiles) - print("Total of {} calibrations(s) ingested".format(calcount)) - persistcalibrations(calibrationfiles) - - -if __name__ == "__main__": - # Do the argparse thing - main() diff --git a/apps/cli/executables/pexable/ingest/ingest/archiveutils.py b/apps/cli/executables/pexable/ingest/ingest/archiveutils.py deleted file mode 100644 index eb470f3fab40d2378f09fce77c1307d407540013..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/archiveutils.py +++ /dev/null @@ -1,408 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import logging - -from sqlalchemy import text -from sqlalchemy.orm import aliased - -from .schema import create_session -from .schema.model import ( - AlmaOus, - AlmaOusType, - Author, - Calibration, - Configuration, - DataDescription, - ExecutionBlock, - File, - Filegroup, - Polarization, - ProductGroup, - Project, - ScienceProduct, - ScienceProductsProductGroup, -) - -session = create_session("SDM") -LOG = logging.getLogger("ingestion") - - -def getpolarizationcode(polarization): - polarizationid = ( - session.query(Polarization.polarization_id) - .filter(text("name=:polarization")) - .params(polarization=polarization) - .one_or_none() - ) - if polarizationid is None: - return 0 - session.close() - return polarizationid[0] - - -def getproject(projectcode): - project = session.query(Project).filter(Project.project_code == projectcode).one_or_none() - if project is not None: - project.authors - session.close() - return project - - -def getauthor(projectcode, personid): - author = ( - session.query(Author) - .filter(Author.project_code == projectcode) - .filter(Author.pst_person_id == str(personid)) - .first() - ) - session.close() - return author - - -def get_filegroup_from_name(external_name): - science_product = session.query(ScienceProduct).filter(ScienceProduct.external_name == external_name).one_or_none() - - return science_product.filegroup - - -def get_file_from_group(group): - file = session.query(File).filter(File.filegroup1 == group).one_or_none() - return file - - -def getexecutionblockfromname(ngas_name): - executionblock = ( - session.query(ExecutionBlock) - .filter(ExecutionBlock.ngas_fileset_id.isnot(None)) - .filter(ExecutionBlock.ngas_fileset_id == ngas_name) - .one_or_none() - ) - return executionblock - - -def get_execution_block_from_external_name(external_name): - """ - Get execution block with the given external name - :param external_name: external name of the execution block - :return: execution block - """ - execution_block = ( - session.query(ExecutionBlock) - .filter(ScienceProduct.external_name == external_name) - .filter(ExecutionBlock.science_product_locator == ScienceProduct.science_product_locator) - .one_or_none() - ) - - return execution_block - - -def get_execution_block(science_product_locator): - execution_block = ( - session.query(ExecutionBlock) - .filter(ExecutionBlock.ngas_fileset_id.isnot(None)) - .filter(ExecutionBlock.science_product_locator == science_product_locator) - .one_or_none() - ) - session.close() - return execution_block - - -def get_science_product_by_spl(science_product_locator): - science_product = ( - session.query(ScienceProduct) - .filter(ScienceProduct.science_product_locator == science_product_locator) - .one_or_none() - ) - return science_product - - -def get_science_product(filename): - """ - Get the science product associated with this file - :param filename: - :return: - """ - science_product = ( - session.query(ScienceProduct) - .filter(File.filename == filename) - .filter(File.filegroup == Filegroup.filegroup_id) - .filter(Calibration.filegroup_id == Filegroup.filegroup_id) - .filter(ScienceProduct.science_product_locator == Calibration.science_product_locator) - .one_or_none() - ) - return science_product - - -def get_file(filename): - file = session.query(File).filter(File.filename == filename).one_or_none() - return file - - -def getvlbaexecutionblock(project_code, segment): - executionblock = ( - session.query(ExecutionBlock) - .filter(ExecutionBlock.project_code == project_code) - .filter(ExecutionBlock.segment == segment) - .one_or_none() - ) - session.close() - return executionblock - - -def get_vlba_correlations_filegroup(project_code, segment, filegroup_type): - filegroup = ( - session.query(ExecutionBlock, Filegroup) - .filter(ExecutionBlock.project_code == project_code) - .filter(ExecutionBlock.segment == segment) - .filter(ExecutionBlock.filegroup_id == Filegroup.filegroup_id) - .filter(Filegroup.type == filegroup_type) - .one_or_none() - ) - if filegroup is None: - LOG.debug(f"Filegroup type {filegroup_type} not found for segment {project_code}{segment}.") - session.close() - return filegroup - - -def get_vlba_correlator_pass_filegroup(project_code, segment, filegroup_type): - eb, filegroup = ( - session.query(ExecutionBlock, Filegroup) - .filter(ExecutionBlock.project_code == project_code) - .filter(ExecutionBlock.segment == segment) - .filter(ExecutionBlock.filegroup_id == Filegroup.parent_filegroup_id) - .filter(Filegroup.type == filegroup_type) - .one_or_none() - ) - if filegroup is None: - LOG.debug(f"Filegroup type {filegroup_type} not found for segment {project_code}{segment}.") - session.close() - return filegroup - - -def getvlbafile(ngas_id): - file = session.query(File).filter(File.ngas_id == ngas_id).one_or_none() - return file - - -def removeexecutionblock(executionblock): - session.delete(executionblock) - session.commit() - - -def removefilegroup(filegroup): - session.delete(filegroup) - session.commit() - - -def removefile(file): - session.delete(file) - session.commit() - - -def getpolarization(polarizationcode): - polarization = session.query(Polarization).filter(Polarization.polarization_id == polarizationcode).one() - session.close() - return polarization - - -def getdatadescription(bandwidth, frequency, polarization): - datadescription = ( - asession.query(DataDescription) - .filter(DataDescription.bandwidth == bandwidth) - .filter(DataDescription.frequency == frequency) - .filter(DataDescription.polarization_id == polarization) - .first() - ) - return datadescription - - -def getconfiguration(execblocid, configurationid, asession): - configuration = ( - asession.query(Configuration) - .filter(Configuration.execution_block_id == execblocid) - .filter(Configuration.configuration == configurationid) - .one_or_none() - ) - return configuration - - -def getimagesetfilegroupfromname(groupname): - filegroup = ( - session.query(Filegroup) - .filter(Filegroup.groupname == groupname) - .filter(Filegroup.type == "image_set") - .one_or_none() - ) - session.close() - return filegroup - - -def removeimageset(filegroup): - session.delete(filegroup) - session.commit() - - -# Check for the existence of OUSes respectively since they will have -# to be built if they don't exist - - -def ousexists(id, type): - """ - - :param id: alma_ous_id - :param type: MOUS, GOUS, or SOUS - :return True if OUS exists in the archive db: - """ - - cnt = ( - session.query(AlmaOus, AlmaOusType) - .filter(AlmaOus.ous_type == AlmaOusType.ous_type) - .filter(AlmaOus.alma_ous_id == id) - .filter(AlmaOusType.ous_type == type) - .count() - ) - return True if cnt > 0 else False - - -def getprojectcodefrommous(mous): - """ - Get the project code from the MOUS using OUS hierarchy - :param mous: - :return: project code - """ - - LOG.info(f"Find project code for MOUS: {mous}") - - almaouss = aliased(AlmaOus) - almaousg = aliased(AlmaOus) - almaousm = aliased(AlmaOus) - - projectcode = ( - session.query(almaouss.project_code) - .join(almaousg, almaousg.parent_ous_id == almaouss.alma_ous_id) - .join(almaousm, almaousm.parent_ous_id == almaousg.alma_ous_id) - .filter(almaousm.alma_ous_id == mous) - .filter(almaouss.ous_type == "SOUS") - .filter(almaousg.ous_type == "GOUS") - .filter(almaousm.ous_type == "MOUS") - .one_or_none() - ) - - session.close() - - return projectcode[0] - - -def getmousesfromprojectcode(project_code): - """ - Get MOUSes for a project - :param project_code: - :return: list of MOUSes - """ - - mset = set() - - project = session.query(Project).filter(Project.project_code == project_code).one_or_none() - - for sous in project.alma_ouses: - gouses = sous.children_ouses - for gous in gouses: - mouses = gous.children_ouses - for mous in mouses: - mset.add(mous) - - sessopm / c - pse - return list(mset) - - -def getcalibrationsfrommous(mousid): - """ - Get calibrations for MOUS - :param MOUS id: - :return list of calibrations: - """ - - mous = session.query(AlmaOus).filter(AlmaOus.alma_ous_id == mousid).filter(AlmaOus.ous_type == "MOUS").one_or_none() - - session.close() - - return mous.calibrations - - -def getcalibrationsfromeb(ngas_fileset_id): - """ - Get calibrations for execution block - :param MGAS fileset id: - :return list of calibrations: - """ - - eb = session.query(ExecutionBlock).filter(ExecutionBlock.ngas_fileset_id == ngas_fileset_id).one_or_none() - - session.close() - return eb.calibrations - - -def getexecutionblocksfrommous(mousid): - """ - Get execution blocks for MOUS - :param MOUS id: - :return list of execution_blocks: - """ - - mous = session.query(AlmaOus).filter(AlmaOus.alma_ous_id == mousid).filter(AlmaOus.ous_type == "MOUS").one_or_none() - - session.close() - return mous.execution_blocks - - -def get_mous_from_eb_science_product_locator_list(locators): - """ - Get the mous from a list of ebs (should be identical) - :param locators: - :return: - """ - - mous_set = set() - for locator in locators: - eb = session.query(ExecutionBlock).filter(ExecutionBlock.science_product_locator == locator).one_or_none() - if eb.alma_ous is not None: - mous_set.add(eb.alma_ous) - if len(mous_set) > 1: - LOG.critical("List of EB science product locators resulted in multiple MOUS") - - LOG.debug(f"MOUS set: {mous_set}") - session.close() - return mous_set.pop() - - -def get_project_from_science_product_locator(science_product_locator): - """ - Return the project given the science product - :param science_product_locator: Science product locator - :return: project - """ - - science_product = ( - session.query(ScienceProduct) - .filter(ScienceProduct.science_product_locator == science_product_locator) - .one_or_none() - ) - - # session.close() - return science_product.project diff --git a/apps/cli/executables/pexable/ingest/ingest/commands.py b/apps/cli/executables/pexable/ingest/ingest/commands.py deleted file mode 100644 index 03aaf77d44a963f5f2ee27c6baf23314b76d93d8..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/commands.py +++ /dev/null @@ -1,28 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from __future__ import print_function - - -def ingestion(): - print("Hello World!") - - -if __name__ == "__main__": - ingestion() diff --git a/apps/cli/executables/pexable/ingest/ingest/evlasciencedatamodel.py b/apps/cli/executables/pexable/ingest/ingest/evlasciencedatamodel.py deleted file mode 100644 index 654d7416347bb12d811f358ff6b5c3dacd91de83..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/evlasciencedatamodel.py +++ /dev/null @@ -1,132 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# Construct a Science Data Model from a set of SDM XML tables - -# Consider doing validation on the presence of the BDF files -# General validation of the SDM - -import logging -import os -import sys - -from lxml import objectify as obj - -# Verify the contents of the SDM and cross-verify with BDFs -from lxml.etree import XMLSyntaxError - -logger = logging.getLogger("ingestion") - - -class SDM: - def __init__(self, fileset, sdmbasepath=".", bdfbasepath=None): - self.fileset = fileset - self.sdmtables = buildsdmtables(self, os.path.join(sdmbasepath, fileset)) - self.bdffiles = addbdffiles(self) - - -class SDMTable: - def __init__(self, tablename, entityid, size): - self.tablename = tablename - self.entityid = entityid - self.size = size - - -class SDMXMLTable(SDMTable): - def __init__(self, tablename, entityid, table, size): - SDMTable.__init__(self, tablename, entityid, size) - self.table = table - - -class SDMBinaryTable(SDMTable): - def __init__(self, tablename, entityid, size): - SDMTable.__init__(self, tablename, entityid, size) - - -class BDFFile: - def __init__(self, entityid, filesize): - self.entityid = entityid - self.filesize = filesize - - -def buildsdm(fileset="abc23", sdmbasepath=".", bdfbasepath="."): - sdm = SDM(fileset, sdmbasepath, bdfbasepath) - return sdm - - -def buildsdmtables(sdm, sdmbasepath): - sdmtables = {} - - # Get the SDM Table files - sdmtree = obj.parse(os.path.join(sdmbasepath, "ASDM.xml")) - sdmroot = sdmtree.getroot() - if sdmroot.find("Table") is None: - logger.error("ASDM.xml has no table entries in {}".format(sdmbasepath)) - sys.exit(-1) - for table in sdmroot.Table: - tablepath = os.path.join(sdmbasepath, str(table.Name)) - if os.path.isfile(tablepath + ".xml"): - # Don't parse if it's the old format SysPower.xml due to the size - if table.Name == "SysPower": - sdmtabletree = None - else: - try: - sdmtabletree = obj.parse(tablepath + ".xml") - sdmxmltable = SDMXMLTable( - table.Name.text, table.Entity.get("entityId"), sdmtabletree, os.path.getsize(tablepath + ".xml") - ) - sdmtables[table.Name] = sdmxmltable - except XMLSyntaxError: - pass - elif os.path.isfile(tablepath + ".bin"): - sdmbintable = SDMBinaryTable( - table.Name.text, table.Entity.get("entityId"), os.path.getsize(tablepath + ".bin") - ) - sdmtables[table.Name] = sdmbintable - else: - logger.error("SDM Table {} does not exist for {}".format(table.Name, sdm.fileset)) - asdmtable = SDMXMLTable("ASDM", sdmroot.Entity.get("entityId"), sdmtree, os.path.getsize(sdmbasepath + "/ASDM.xml")) - sdmtables["ASDM"] = asdmtable - - return sdmtables - - -def addbdffiles(sdm): - bdffiles = [] - maintableroot = sdm.sdmtables["Main"].table.getroot() - if len(maintableroot.findall("row")) == 0: - logger.error("No BDF files to be loaded for {}".format(sdm.fileset)) - return bdffiles - for row in maintableroot.row: - if row.find("dataUID") is not None: - entityid = row.dataUID.EntityRef.get("entityId") - elif row.find("dataOid") is not None: - entityid = row.dataOid.EntityRef.get("entityId") - else: - logger.critical("Invalid XML element in Main") - if row.find("dataSize") is not None: - filesize = row.dataSize - else: - # TODO for legacy data, find a better way - filesize = 0 - bdffile = BDFFile(entityid, filesize) - bdffiles.append(bdffile) - return bdffiles - - -if __name__ == "__main__": - sdm = buildsdm("15A-017.sb30393593.eb30429744.57067.21779167824", "/Users/rlively/Development/python/testdata", ".") diff --git a/apps/cli/executables/pexable/ingest/ingest/files/__init__.py b/apps/cli/executables/pexable/ingest/ingest/files/__init__.py deleted file mode 100644 index 71910f49e5f3ada370e4a4765e1da4a7bf70e223..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/files/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from .ingestobs import ingest, ingestBDF, ingestmetadata, ingestSDM -from .ngasclient import archivefile, ngasstatus, retrievefile - -__all__ = ["ngasstatus", "archivefile", "retrievefile", "ingest", "ingestBDF", "ingestSDM", "ingestmetadata"] diff --git a/apps/cli/executables/pexable/ingest/ingest/files/ingestobs.py b/apps/cli/executables/pexable/ingest/ingest/files/ingestobs.py deleted file mode 100644 index f758dba7e830f102d4420e2ebf0c9296efa77bdd..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/files/ingestobs.py +++ /dev/null @@ -1,66 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import os -import shutil - -from . import ngasclient as nc - - -def ingest(sdm, ngasstagingpath): - ingestSDM(sdm, ngasstagingpath) - ingestBDF(sdm, ngasstagingpath) - # ingestmetadata(sdm) - - -def ingestSDM(sdm, ngasstagingpath): - for table in sdm.tables: - filename = sdm.tables[table].entityid - filename = filename.replace("://", "___").replace("/", "_") - if sdm.tables[table].path.endswith(".xml"): - extension = ".sdm" - else: - extension = ".bin" - stagingfile = os.path.join(ngasstagingpath, filename) + extension - if os.path.exists(sdm.tables[table].path): - # For now copy, don't move file - # shutil.move(sdm.tables[table].path, stagingfile) - shutil.copy(sdm.tables[table].path, stagingfile) - if os.path.isfile(stagingfile): - nc.archivefile(stagingfile) - else: - print("File {} does not exist in the ngas staging area".format(stagingfile)) - - -def ingestBDF(sdm, ngasstagingpath): - extension = ".bdf" - for sourcefile in sdm.bdffiles: - destinationfile = os.path.join(ngasstagingpath, os.path.basename(sourcefile)) + extension - if os.path.exists(sourcefile): - shutil.copy(sourcefile, destinationfile) - if os.path.isfile(destinationfile): - nc.archivefile(destinationfile) - else: - print("File {} does not exist in the ngas staging area".format(destinationfile)) - - -def ingestmetadata(sdm): - # TODO - # Add entries to the metadata db for each SDM Table and BDF ingested into NGAS - # Add the science data to the metadata db - print("ingesting metadata") - # Call the model and pass it the SDM diff --git a/apps/cli/executables/pexable/ingest/ingest/files/ngasclient.py b/apps/cli/executables/pexable/ingest/ingest/files/ngasclient.py deleted file mode 100644 index 67d2054c428ba0b9d813a7018dfd784c073a7a68..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/files/ngasclient.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import os - -import requests - -# TODO logging -# TODO capo -# TODO Error checking -# TODO Validation - -# Example HTTP requests -# wget -O - http://ngas-alpha.aoc.nrao.edu:7777/STATUS -# wget -O - http://ngas-alpha.aoc.nrao.edu:7777/ARCHIVE?filename=file:///users/rlively/ngas/Scan.xml -# wget -O - http://ngas-alpha.aoc.nrao.edu:7777/STATUS?file_id=Scan.xml - -NGASHOST = "http://ngas-alpha.aoc.nrao.edu:7777/" -archivecommand = {"status": "STATUS", "archive": "ARCHIVE", "retrieve": "RETRIEVE"} - - -def ngasstatus(): - response = requests.get(NGASHOST + archivecommand["status"]) - return response - - -def archivefile(path): - print("archive request: " + NGASHOST + archivecommand["archive"] + "?filename=file://" + path) - response = requests.get(NGASHOST + archivecommand["archive"] + "?filename=file://" + path) - return response - - -def retrievefile(fileid): - print(NGASHOST + archivecommand["retrieve"] + "?" + "file_id=" + fileid) - response = requests.get(NGASHOST + archivecommand["retrieve"] + "?" + "file_id=" + fileid) - return response diff --git a/apps/cli/executables/pexable/ingest/ingest/logging-config.ini b/apps/cli/executables/pexable/ingest/ingest/logging-config.ini deleted file mode 100644 index 0c521446f399633efafaacb05a6be8e81b58fd4e..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/logging-config.ini +++ /dev/null @@ -1,28 +0,0 @@ -[loggers] -keys=root,ingestion - -[handlers] -keys=consoleHandler - -[formatters] -keys=simpleFormatter - -[logger_root] -level=DEBUG -handlers=consoleHandler - -[logger_ingestion] -level=DEBUG -handlers=consoleHandler -qualname=ingestion -propagate=0 - -[handler_consoleHandler] -class=StreamHandler -level=INFO -formatter=simpleFormatter -args=(sys.stdout,) - -[formatter_simpleFormatter] -format=%(asctime)s %(module)s[%(funcName)s:%(lineno)s] %(levelname)s: %(message)s -datefmt= diff --git a/apps/cli/executables/pexable/ingest/ingest/manifestpersist.py b/apps/cli/executables/pexable/ingest/ingest/manifestpersist.py deleted file mode 100644 index 8f551c70c4192392fab23eafcf46ec651a2e5285..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/manifestpersist.py +++ /dev/null @@ -1,1074 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import datetime -import hashlib -import logging -import os -import sys -import time -from pathlib import Path - -from pycapo import CapoConfig - -from . import FITSUtil as fi -from . import IngestionManifest as im -from . import NGASUtil as ng -from . import almautils as alu -from . import archiveutils as au -from . import evlasciencedatamodel as sc -from . import persistmetadata as pm -from . import remotecopy as rc -from .IngestionManifest import IngestionManifest -from .JSONMetadataUtil import JSONMetadata -from .NGASUtil import sha256 -from .schema import create_session -from .schema.model import ( - AlmaSourceDatum, - AlmaSpwDatum, - AncillaryProduct, - Calibration, - File, - Filegroup, - Image, - ProductGroup, - ScienceProduct, - ScienceProductsProductGroup, -) - -config = CapoConfig() -site_name = config.getstring("archive-ingestion.NGASSite") -ngas_cluster = config.getstring("archive-ingestion.NGASCluster") - -LOG = logging.getLogger("ingestion") -_SCIENCE_TARGET = "target" - -session = create_session("SDM") -ngas_files_to_ingest = [] - - -def ingest_from_manifest(path, manifest): - LOG.info("Ingestion via ingestion manifest") - ( - telescope, - operation, - reingest, - ngas_ingest, - ingestion_path, - additional_metadata_file, - collection_metadata_file, - ) = manifest.get_ingestion_parameters2() - LOG.debug(f"telescope: {telescope}") - LOG.debug(f"operation: {operation}") - LOG.debug(f"reingest: {reingest}") - LOG.debug(f"ngas_ingest: {ngas_ingest}") - LOG.debug(f"path: {path}") - LOG.debug(f"ingestion_path: {ingestion_path}") - LOG.debug(f"collection metadata file: {collection_metadata_file}") - input_group = manifest.get_input_group() - output_group = manifest.get_output_group() - associate_group = manifest.get_associate_group() - LOG.debug(f"associaate group: {associate_group}") - - fileset = "" - - if operation == im.NAASC_CALIBRATION: - mous = manifest.get_output_group_science_products()[0]["filename"] - elif operation == im.EXECUTION_BLOCK: - fileset = manifest.get_output_group_science_products()[0]["filename"] - mous = None - else: - mous = None - - # Most of the time: We've got an output_group, so we go through this path - if output_group is not None: - input_science_products, output_science_products = persist_science_metadata( - telescope, - operation, - input_group, - output_group, - reingest, - ngas_ingest, - ingestion_path, - additional_metadata_file, - collection_metadata_file, - path, - ) - LOG.debug(f"*Input science products-2: {input_science_products}") - LOG.debug(f"*Output science products-2: {output_science_products}") - LOG.debug(f"*Output group ancillary products: {output_group['ancillary_products']}") - # Persist product groups and associated objects (science_product_product_groups, science_product_project) - persist_groups( - telescope, - mous, - input_science_products, - output_science_products, - output_group["ancillary_products"], - associate_group, - manifest, - ingestion_path, - ) - else: - # However, adding products after the fact (science or ancillary) are functions too - # For now, we only have use cases for after-the-fact ancillary products - - ancillary_list = manifest.get_additional_ancillary_products() - if ancillary_list is not None: - - for product in ancillary_list: - LOG.debug(product["filename"]) - - persist_ancillary_product_metadata(product, ingestion_path, telescope) - - # - # handle any collection implications - # - if collection_metadata_file is not None: - collection_data = JSONMetadata(collection_metadata_file) - # Only expect ELWA so far: - if collection_data.isElwa(): - # - # Simplist case - # - locator = product["science_associate"] - LOG.info("Handling ELWA collection update") - science_product = ( - session.query(ScienceProduct) - .filter(ScienceProduct.science_product_locator == locator) - .one() - ) - science_product.collection = "ELWA" - session.add(science_product) - # Then, commit the list here. - # in practice, it's just the one file/call for ELWA right now - session.commit() - else: - LOG.error("Neither output_group nor ancillary_products list defined, cannot continue!") - sys.exit(-5) - - if ngas_ingest and len(ngas_files_to_ingest) > 0: - ngas_archive(ngas_files_to_ingest, ingestion_path, fileset) - - -def persist_science_metadata( - telescope, - operation, - input_group, - output_group, - reingest, - ngas_ingest, - ingestion_path, - additional_metadata_file, - collection_metadata_file, - path, -): - if input_group is not None: - # Input group will be empty for SDM ingestion - input_group_science_products = input_group["science_products"] - else: - input_group_science_products = [] - input_science_products = [] - output_group_science_products = output_group["science_products"] - output_group_ancillary_products = output_group["ancillary_products"] - - LOG.debug(f"Operation: {operation}") - - if operation == im.CALIBRATION: - input_science_products, output_science_products = persist_calibration_metadata( - telescope, - input_group_science_products, - output_group_science_products, - output_group_ancillary_products, - reingest, - ngas_ingest, - ingestion_path, - ) - elif operation == im.NAASC_CALIBRATION: - input_science_products, output_science_products = persist_naasc_calibration_metadata( - telescope, - input_group_science_products, - output_group_science_products, - output_group_ancillary_products, - reingest, - ngas_ingest, - ingestion_path, - ) - elif operation == im.EXECUTION_BLOCK: - output_science_products = persist_sdm( - telescope, - output_group_science_products, - reingest, - ingestion_path, - additional_metadata_file, - collection_metadata_file, - path, - ) - elif operation == im.CONTINUUM_IMAGE or im.IMAGE_CUBE: - input_science_products, output_science_products = persist_images( - telescope, - input_group_science_products, - output_group_science_products, - output_group_ancillary_products, - reingest, - ingestion_path, - additional_metadata_file, - collection_metadata_file, - path, - ) - else: - LOG.critical(f"{operation} is not a valid operation") - sys.exit(1) - - return input_science_products, output_science_products - - -def persist_sdm( - telescope, - output_group_science_products, - reingest, - ingestion_path, - additional_metadata_file, - collection_metadata_file, - path, -): - LOG.debug(f"SDM OGSP: {output_group_science_products}") - input_science_products = [] - output_science_products = [] - output_ancillary_products = [] - - sdm_identifier = output_group_science_products[0]["filename"] - if telescope == "ALMA": - # ASDM UIDs are not disk-friendly, so look for a modified name: - sdm_identifier = sdm_identifier.replace(":", "_").replace("/", "_") - - exec_block_file = Path(ingestion_path) / sdm_identifier - if not exec_block_file.exists(): - LOG.error(f"File set {exec_block_file.name} not found in {ingestion_path}.") - sys.exit(1) - # Now make sure the ASDM file exists - asdm_file = exec_block_file / "ASDM.xml" - if not asdm_file.exists(): - LOG.error(f"ASDM.xml not found in {exec_block_file.name}") - sys.exit(1) - - execution_block = au.getexecutionblockfromname(exec_block_file.name) - - if execution_block is not None: - if reingest: - LOG.debug(f"Re-ingestion requested") - else: - LOG.error( - f"Execution block {execution_block.ngas_fileset_id} already exists in archive and re-ingestion not requested." - ) - sys.exit(1) - - else: - LOG.debug(f"Initial ingestion of {exec_block_file.name}") - - sdm = sc.buildsdm(exec_block_file.name, ingestion_path) - if len(sdm.bdffiles) > 0: # ingest science meta data - LOG.debug(f"SDM for {sdm.fileset} has {len(sdm.bdffiles)} BDFs") - LOG.debug(f"SDM Tables {sdm.sdmtables.keys()}") - starttime = time.time() - additional_metadata = None - if additional_metadata_file is not None: - additional_metadata_file = Path(path) / additional_metadata_file - if additional_metadata_file.exists(): - # Execution block has additional metadata - additional_metadata = JSONMetadata(additional_metadata_file) - collection_metadata = None - if collection_metadata_file is not None: - collection_metadata_file = Path(path) / collection_metadata_file - if collection_metadata_file.exists(): - # Execution block has additional metadata - collection_metadata = JSONMetadata(collection_metadata_file) - project, science_products, ingest_files = pm.persist( - sdm, - False, - additional_metadata, - collection_metadata, - output_group_science_products, - ingestion_path, - ngas_cluster, - ) - ngas_files_to_ingest.extend(ingest_files) - LOG.info(f"SDM metadata ingestion complete for {sdm.fileset} in {round(time.time() - starttime, 2)}s") - else: - LOG.error(f"Execution block: {sdm.fileset} has no bdfs and will not be ingested") - - return science_products - - -def persist_calibration_metadata( - telescope, - input_group_science_products, - output_group_science_products, - output_group_ancillary_products, - reingest, - ngas_ingest, - ingestion_path, -): - LOG.debug(f"Persisting {telescope} calibration") - if not valid_calibration_groups( - telescope, input_group_science_products, output_group_science_products, output_group_ancillary_products - ): - sys.exit(1) - - LOG.debug(f"IG SP: {input_group_science_products}") - LOG.debug(f"OG SP: {output_group_science_products}") - LOG.debug(f"OG AP: {output_group_ancillary_products}") - - input_science_products = [] - output_science_products = [] - - for science_product in input_group_science_products: - input_science_products.append(au.get_science_product_by_spl(science_product["locator"])) - - for science_product in output_group_science_products: - calibration_filename = science_product["filename"] - tar_file = Path(ingestion_path) / calibration_filename - if not tar_file.exists(): - LOG.warning(f"Calibration products file: {tar_file.name} does not exist in {tar_file.parent}.") - sys.exit(1) - calibration_tar_file = au.get_file(calibration_filename) - if calibration_tar_file is not None: # The file already exists - if reingest: - LOG.info("Re-ingestion") - calibration_science_product = au.get_science_product(calibration_filename) - calibration_science_product.metadata_ingestion_date = datetime.datetime.utcnow() - calibration_science_product.metadata_ingestion_version = ( - int(calibration_science_product.metadata_ingestion_version) + 1 - ) - output_science_products.append(calibration_science_product) - LOG.debug(f"Output science products: {output_science_products}") - - calibration_tar_file.ingestion_time = datetime.datetime.utcnow() - calibration_tar_file.checksum = sha256(Path(ingestion_path) / calibration_tar_file.filename) - db_session = session.object_session(calibration_science_product) - db_session.add(calibration_science_product) - db_session.add(calibration_tar_file) - ngas_files_to_ingest.append((calibration_tar_file, calibration_tar_file.filesize)) - else: - LOG.error(f"The file {calibration_filename} exists and re-ingestion not requested. Exiting.") - sys.exit(1) - else: - LOG.debug("Initial ingestion") - - calibration_science_product_locator = ng.generate_science_product_locator( - input_science_products[0].execution_block.telescope.lower(), science_product["type"] - ) - - # Create calibration Filegroup and File - calibration_filegroup = Filegroup(datasize=tar_file.stat().st_size, type="calibration") - - calibration_products_file = File( - file_path=str(tar_file.parent), - ngas_id=ng.generate_uuids_for_ngas(telescope, "calibration", "tar"), - ngas_location=site_name, - ngas_cluster=ngas_cluster, - filename=tar_file.name, - filegroup1=calibration_filegroup, - filesize=calibration_filegroup.datasize, - format="tar", - type="cal", - checksum=sha256(tar_file), - checksum_type="SHA256", - ingestion_time=datetime.datetime.utcnow(), - ) - - ngas_files_to_ingest.append((calibration_products_file, calibration_products_file.filesize)) - - calibration = Calibration(science_product_locator=calibration_science_product_locator) - - calibration.execution_block = input_science_products[0].execution_block - calibration.project = input_science_products[0].execution_block.project - calibration.filegroup = calibration_filegroup - - # Create ScienceProduct - output_science_product = ScienceProduct( - science_product_locator=calibration_science_product_locator, - science_product_type="Calibration", - metadata_ingestion_date=datetime.datetime.utcnow(), - filegroup=calibration_filegroup, - metadata_ingestion_version=1, - external_system="EVLA Processing", - external_name=tar_file.name, - ) - - output_science_products.append(output_science_product) - - # Update science_products_projects - calibration.execution_block.project.science_products.append(output_science_product) - - db_session = session.object_session(calibration.execution_block) - db_session.add(calibration_filegroup) - db_session.add(calibration_products_file) - db_session.add(calibration) - db_session.add(output_science_product) - - LOG.debug(f"Input science products: {input_science_products}") - LOG.debug(f"Output science products: {output_science_products}") - - db_session.commit() - - # output_auxiliary_products will only contain auxiliary products associated with science products - # auxiliary products associated with a group will be added when groups are created - - return input_science_products, output_science_products - - -def persist_naasc_calibration_metadata( - telescope, - input_group_science_products, - output_group_science_products, - output_group_ancillary_products, - reingest, - ngas_ingest, - ingestion_path, -): - LOG.debug(f"Persisting {telescope} calibration") - if not valid_calibration_groups( - telescope, input_group_science_products, output_group_science_products, output_group_ancillary_products - ): - sys.exit(1) - - LOG.debug(f"IG SP: {input_group_science_products}") - LOG.debug(f"OG SP: {output_group_science_products}") - LOG.debug(f"OG SP: {output_group_ancillary_products}") - - input_science_products = [] - output_science_products = [] - eb_locator_list = [] - - for science_product in input_group_science_products: - input_science_products.append(au.get_science_product_by_spl(science_product["locator"])) - eb_locator_list.append(science_product["locator"]) - - # Returns AlmaOus object - mous = au.get_mous_from_eb_science_product_locator_list(eb_locator_list) - session.add(mous) - - LOG.debug(f"Input science products: {input_group_science_products}") - - science_product_locator = ng.generate_science_product_locator(telescope.lower(), "calibration") - session.add(input_science_products[0]) - project_code = input_science_products[0].filegroup.project_code - - LOG.debug(f"Project code: {project_code}") - - calibration_filegroup = Filegroup(project_code=project_code, datasize=0, type="calibration") - - LOG.debug( - f"Calibration filegroup: project_code={calibration_filegroup.project_code} type={calibration_filegroup.type}" - ) - - calibration_files = alu.getalmacalfiles(mous.alma_ous_id) - - for calibration_file in calibration_files: - file = File( - ngas_id=calibration_file[0], - ngas_location="NAASC", - ngas_cluster="NAASC", - filename=calibration_file[0], - filesize=calibration_file[1], - filegroup1=calibration_filegroup, - format="cal", - type="cal", - ingestion_time=datetime.datetime.utcnow(), - ) - calibration_filegroup.datasize += file.filesize - LOG.debug( - f"File ngas_id={file.ngas_id} ngas_location={file.ngas_location} filename={file.filename} filesize={file.filesize} ingestion time: {file.ingestion_time}" - ) - session.add(file) - session.add(calibration_filegroup) - - calibration = Calibration( - science_product_locator=science_product_locator, - alma_ous=mous, - project=input_science_products[0].filegroup.project, - filegroup=calibration_filegroup, - ) - - LOG.debug( - f"Calibration science product locator={calibration.science_product_locator} alma ous={calibration.alma_ous.alma_ous_id} project code={calibration.project.project_code}" - ) - - session.add(calibration) - - output_science_product = ScienceProduct( - science_product_locator=science_product_locator, - science_product_type="Calibration", - metadata_ingestion_date=datetime.datetime.utcnow(), - filegroup=calibration_filegroup, - metadata_ingestion_version=1, - external_system="ALMA Processing", - external_name=mous.alma_ous_id, - ) - - output_science_products.append(output_science_product) - session.add(output_science_product) - - # Update science_products_projects - this is the problem. No, this is working now - calibration.project.science_products.append(output_science_product) - - LOG.debug( - f"Science product science product locator={output_science_product.science_product_locator} science product type={output_science_product.science_product_type} metadata ingestion date={output_science_product.metadata_ingestion_date} metadata ingestion version={output_science_product.metadata_ingestion_version}" - ) - - source_list = alu.get_source_list(mous.alma_ous_id) - - for source in source_list: - alma_source = AlmaSourceDatum( - alma_ous_id=mous.alma_ous_id, - field_name=source.source_name, - ra=source.ra_source, - dec=source.dec_source, - integration_time=source.int_time, - angular_resolution=source.spatial_scale_min, - largest_angular_scale=source.spatial_scale_max, - science_field=_SCIENCE_TARGET in source.scan_intent.lower(), - ) - - LOG.debug( - f"AlmaSourceDatum alma_ouss_id={alma_source.alma_ous_id} field name={alma_source.field_name} ra={alma_source.ra} dec={alma_source.dec} integration time={alma_source.integration_time}" - ) - - spectral_window_data = alu.get_spectral_window_data(source) - for spw in spectral_window_data: - spectral_window = AlmaSpwDatum( - alma_ous_id=mous.alma_ous_id, - spw_name=spw.spectral_window_name, - min_frequency=spw.frequency_min, - max_frequency=spw.frequency_max, - bandwidth=spw.bandwidth, - num_channels=spw.channel_num, - spectral_resolution=spw.resolution_max, - ) - if spw.resolution_min != spw.resolution_max: - spectral_window.spectral_resolution = (spw.resolution_max + spw.resolution_min) / 2 - - LOG.debug(f"AlmaSpwDatum alma_ous id={spectral_window.alma_ous_id} spw name: {spectral_window.spw_name}") - - session.merge(spectral_window) - alma_source.spectral_windows.append(spectral_window) - session.merge(alma_source) - - session.commit() - - return input_science_products, output_science_products - - -def persist_images( - telescope, - input_group_science_products, - output_group_science_products, - output_group_ancillary_products, - reingest, - ingestion_path, - metadata_file, - collection_metadata_file, - path, -): - """ - Persist an image (quicklook, image cube, etc.) - - :param telescope: - :param input_group_science_products: - :param output_group_science_products: - :param output_group_ancillary_products: - :param reingest: - :param ngas_ingest: - :param ingestion_path: - :param metadata_file: - :param path: - :return: - """ - - LOG.debug(f"IG SP: {input_group_science_products}") - LOG.debug(f"OG SP: {output_group_science_products}") - LOG.debug(f"OG AP: {output_group_ancillary_products}") - - input_science_products = [] - output_science_products = [] - - # JSON metadata - json_metadata_file = Path(path) / metadata_file - if not json_metadata_file.exists(): - LOG.critical(f"Metadata file {json_metadata_file.name} does not exist in {json_metadata_file.parent}") - sys.exit(1) - json_metadata = JSONMetadata(json_metadata_file) - json_metadata.from_json(json_metadata_file) - project_code = json_metadata.get_project_code() - - project = au.getproject(project_code) - - LOG.debug(f"Project code: {project.project_code}") - if project is None: - LOG.error(f"Project {project.project_code} not found") - sys.exit(1) - - for science_product in input_group_science_products: - input_science_products.append(au.get_science_product_by_spl(science_product["locator"])) - - for science_product in output_group_science_products: - science_product_type = science_product["type"] - LOG.debug(f"Science product type: {science_product_type}") - image_file = Path(ingestion_path) / science_product["filename"] - LOG.debug(f"Image path: {image_file.parent} Image file: {image_file.name}") - science_product_locator = ng.generate_science_product_locator(telescope.lower(), science_product_type) - - # Create image Filegroup and File - filegroup = Filegroup( - parent_filegroup=None, - # parent_filegroup=input_science_products[0].execution_block.filegroup, - type=science_product_type, - ) - - file = File( - file_path=str(image_file.parent), - ngas_id=ng.generate_uuids_for_ngas(telescope, science_product_type, image_file.suffix[1:]), - ngas_location=site_name, - ngas_cluster=ngas_cluster, - filename=image_file.name, - filegroup1=filegroup, - filesize=image_file.stat().st_size, - format="fits", - type=science_product_type, - checksum=sha256(image_file), - checksum_type="SHA256", - ingestion_time=datetime.datetime.utcnow(), - ) - - ngas_files_to_ingest.append((file, file.filesize)) - - session.add(filegroup) - session.add(file) - - ( - source_name, - telescope, - spatial_resolution, - field_of_view, - min_intensity, - max_intensity, - ra, - dec, - min_freq, - max_freq, - rest_frequency, - ra_element_count, - dec_element_count, - image_units, - beam_axis_ratio, - polarization_id, - rms_noise, - spatial_region, - ra_pixel_size, - dec_pixel_size, - ) = fi.get_fits_data(image_file) - - start_time = json_metadata.get_starttime() - if start_time is None: - start_time = 0 - end_time = json_metadata.get_endtime() - if end_time is None: - end_time = 0 - if rms_noise is None and json_metadata.get_rms_noise() is None: - rms_noise = 0 - - image = Image( - target_name=source_name, - telescope=telescope, - spatial_resolution=spatial_resolution, - image_field_of_view=field_of_view, - max_intensity=max_intensity, - min_intensity=min_intensity, - rms_noise=rms_noise, - polarization_id=polarization_id, - ra=ra, - dec=dec, - min_frequency=min_freq, - max_frequency=max_freq, - ra_element_count=ra_element_count, - dec_element_count=dec_element_count, - starttime=start_time, - endtime=end_time, - exposure_time=end_time, - rest_frequency=rest_frequency, - image_units=image_units, - spatial_region=spatial_region, - beam_axis_ratio=beam_axis_ratio, - band_code=json_metadata.get_band_code(), - ra_pixel_size=ra_pixel_size, - dec_pixel_size=dec_pixel_size, - tags=json_metadata.get_image_tags(), - collection_name=json_metadata.get_collection_name(), - calibration_level=json_metadata.get_calibration_level(), - science_product_locator=science_product_locator, - file=file, - ) - - # Ignore re-ingestion for now, but how would you do this - - external_system = telescope + " Processing" - output_science_product = ScienceProduct( - science_product_locator=science_product_locator, - science_product_type="Image", - metadata_ingestion_date=datetime.datetime.utcnow(), - filegroup=filegroup, - metadata_ingestion_version=1, - external_system=external_system, - external_name=image_file.name, - ) - - session.add(image) - session.add(output_science_product) - - output_science_product.project = project - session.add(output_science_product) - - output_science_products.append(output_science_product) - - # If this science product has ancillary products - if "ancillary_products" in science_product.keys(): - for anc_product in science_product["ancillary_products"]: - LOG.debug(f"Ancillary product: {anc_product}") - product_file = Path(ingestion_path) / anc_product["filename"] - ancillary_product_locator = ng.generate_science_product_locator(telescope.lower(), "ancillary_product") - product_extension = product_file.suffix[1:] - - ancillary_product_filegroup = Filegroup( - type="ancillary_product", - datasize=-1, - ) - if anc_product["type"] == "thumbnail_image": - thumbnail_path = str(Path(ingestion_path) / product_file.name) - preview_path = str(Path(calculate_thumbnail_path(thumbnail_path)[0]).parent) - else: - preview_path = None - - ancillary_product_file = File( - ngas_id=ng.generate_uuids_for_ngas(telescope, "ancillary_product", product_extension), - ngas_location=site_name, - ngas_cluster=ngas_cluster, - filename=product_file.name, - filesize=product_file.stat().st_size, - format=product_extension, - type=anc_product["type"], - checksum=sha256(product_file), - checksum_type="SHA256", - ingestion_time=datetime.datetime.utcnow(), - filegroup1=ancillary_product_filegroup, - preview_storage_path=preview_path, - ) - ngas_files_to_ingest.append((ancillary_product_file, ancillary_product_file.filesize)) - ancillary_product = AncillaryProduct( - ancillary_product_locator=ancillary_product_locator, - ancillary_product_type=anc_product["type"], - filegroup=ancillary_product_filegroup, - science_product_locator=science_product_locator, - ) - session.add(ancillary_product_file) - session.add(ancillary_product) - - session.commit() - - return input_science_products, output_science_products - - -# -# Stolen from the process for images, and mildly reworked for the ELWA case -# -def persist_ancillary_product_metadata(anc_product, ingestion_path, telescope): - LOG.debug(f"Ancillary product: {anc_product}") - product_file = Path(ingestion_path) / anc_product["filename"] - ancillary_product_locator = ng.generate_science_product_locator(telescope.lower(), "ancillary_product") - product_extension = product_file.suffix[1:] - # Handle weird ELWA extensions (FITS_N) - if product_extension.lower().find("fits") != -1: - product_extension = "fits" - - ancillary_product_filegroup = Filegroup( - type="ancillary_product", - datasize=-1, - ) - if anc_product["type"] == "thumbnail_image": - thumbnail_path = str(Path(ingestion_path) / product_file.name) - preview_path = str(Path(calculate_thumbnail_path(thumbnail_path)[0]).parent) - else: - preview_path = None - ancillary_product_file = File( - ngas_id=ng.generate_uuids_for_ngas(telescope, "ancillary_product", product_extension), - ngas_location=site_name, - ngas_cluster=ngas_cluster, - filename=product_file.name, - filesize=product_file.stat().st_size, - format=product_extension, - type=anc_product["type"], - checksum=sha256(product_file), - checksum_type="SHA256", - ingestion_time=datetime.datetime.utcnow(), - filegroup1=ancillary_product_filegroup, - preview_storage_path=preview_path, - ) - ngas_files_to_ingest.append((ancillary_product_file, ancillary_product_file.filesize)) - - # - # Direct, or group ancillary? - # - if "science_associate" in anc_product: - ancillary_product = AncillaryProduct( - ancillary_product_locator=ancillary_product_locator, - ancillary_product_type=anc_product["type"], - filegroup=ancillary_product_filegroup, - science_product_locator=anc_product["science_associate"], - ) - elif "group_with" in anc_product: - # - # Need to lookup the group to which this product belongs: - # Use case not needed yet (as of Nov 2021) - product_group = -1 - - ancillary_product = AncillaryProduct( - ancillary_product_locator=ancillary_product_locator, - ancillary_product_type=anc_product["type"], - filegroup=ancillary_product_filegroup, - product_group_id=product_group, - ) - else: - LOG.error("Incomplete data provided with after-the-fact ancillary product") - exit(-1) - - session.add(ancillary_product_file) - session.add(ancillary_product) - - -def persist_groups( - telescope, - mous, - input_science_products, - output_science_products, - output_group_ancillary_products, - associate_group, - manifest, - ingestion_path, -): - LOG.debug(f"ISPs: {input_science_products}") - LOG.debug(f"OSPs: {output_science_products}") - LOG.debug(f"OGAPs: {output_group_ancillary_products}") - LOG.debug(f"mous: {mous}") - - input_product_group = ProductGroup(product_group_type="pipeline input") - - db_session = session.object_session(output_science_products[0]) - - input_product_group.science_products.extend(input_science_products) - - output_product_group = ProductGroup( - product_group_type="pipeline output", parent_product_group=input_product_group, alma_ous_id=mous - ) - - output_product_group.science_products.extend(output_science_products) - - for anc_product in output_group_ancillary_products: - product_file = Path(ingestion_path) / anc_product["filename"] - ancillary_product_locator = ng.generate_science_product_locator(telescope.lower(), "ancillary_product") - ancillary_product_filegroup = Filegroup( - type="ancillary_product", - datasize=-1, - ) - - if anc_product["type"] == "thumbnail_image": - thumbnail_path = str(Path(ingestion_path) / product_file.name) - preview_path = str(Path(calculate_thumbnail_path(thumbnail_path)[0]).parent) - else: - preview_path = None - - ancillary_product_file = File( - ngas_id=ng.generate_uuids_for_ngas(telescope, anc_product["type"], product_file.suffix[1:]), - ngas_location=site_name, - ngas_cluster=ngas_cluster, - filename=product_file.name, - filesize=product_file.stat().st_size, - format=product_file.suffix[1:], - type=anc_product["type"], - checksum=sha256(product_file), - checksum_type="SHA256", - ingestion_time=datetime.datetime.utcnow(), - filegroup1=ancillary_product_filegroup, - preview_storage_path=preview_path, - ) - - ngas_files_to_ingest.append((ancillary_product_file, ancillary_product_file.filesize)) - - ancillary_product = AncillaryProduct( - ancillary_product_locator=ancillary_product_locator, - ancillary_product_type=anc_product["type"], - filegroup=ancillary_product_filegroup, - product_group=output_product_group, - ) - db_session.add(ancillary_product_file) - db_session.add(ancillary_product) - - db_session.add(input_product_group) - db_session.add(output_product_group) - - # Associate group links ebs - if associate_group is not None: - donor_science_product = au.get_science_product_by_spl(manifest.get_associate_group_locator()) - if donor_science_product is None: - LOG.critical(f"Science product for donor eb not found: {manifest.get_associate_group_locator()}") - else: - associate_product_group = ProductGroup( - product_group_type="associate", - ) - # Add the SPL for the associated eb - associate_product_group.science_products.extend(output_science_products) - # Add the SPL for the donor eb - local_donor_science_product = db_session.merge(donor_science_product) - associate_product_group.science_products.extend([local_donor_science_product]) - - db_session.add(associate_product_group) - - db_session.commit() - - -def valid_calibration_groups(telescope, input_science_products, output_science_products, output_ancillary_products): - if telescope.lower() == "evla": - if len(input_science_products) != 1: - print(f"{len(input_science_products)} science products in input group. Only 1 execution block is permitted") - return False - if len(output_science_products) != 1: - print( - f"{len(output_science_products)} science products in output group. Only 1 calibration product is permitted" - ) - return False - elif telescope.lower() == "alma": - return True - if len(output_science_products) != 1: - print( - f"{len(output_science_products)} science products in output group. Only 1 calibration product is permitted" - ) - return False - else: - print(f"Invalid telescope in manifest: {telescope}") - return False - return True - - -def ngas_archive(files_to_archive, ingestion_path, fileset=""): - LOG.debug(f"Ingesting {len(files_to_archive)} files into ngas....") - thumbnails = [] - files_to_ingest = [] - for file in files_to_archive: - # Some convenience variables: - file_type = file[0].type - file_format = file[0].format - if file_type == "raw": - if file_format == "sdm": - path_to_file = Path(ingestion_path) / fileset / file[0].filename - path_to_ngas_rename = Path(ingestion_path) / fileset / file[0].ngas_id - elif file_format == "bdf": - path_to_file = Path(ingestion_path) / fileset / "ASDMBinary" / file[0].filename - path_to_ngas_rename = Path(ingestion_path) / fileset / "ASDMBinary" / file[0].ngas_id - else: - path_to_file = Path(ingestion_path) / file[0].filename - path_to_ngas_rename = Path(ingestion_path) / file[0].ngas_id - - if file_type == "thumbnail_image": - # Thumbnails need to go to the cache as well as NGAS, - # track those for the additional step. - thumbnails.append(path_to_file) - - if path_to_file != path_to_ngas_rename: - if os.access(path_to_ngas_rename, os.F_OK): - # If the file's NGAS name exists in the staging area already, it means this file was - # recently ingested, and we're re-ingesting an updated version. Remove the - # old hard link to facilitate the new data. - os.unlink(path_to_ngas_rename) - # There are cases, in particular with old calibrations, where the - # ngas id is the filename. That causes os.link to nuke the file - # which is just bad news. So, don't link if we don't have to. - os.link(path_to_file, path_to_ngas_rename) - - # add the file with appropriate NGAS naming to the to-do list: - # LOG.debug(f"Adding {path_to_ngas_rename} to the ingestion list") - files_to_ingest.append([str(path_to_ngas_rename), file[1]]) - - # With everything prepped, make the NGAS calls. - # LOG.debug(f"Total set of files: {files_to_ingest}") - ng.archivefiles(files_to_ingest) - - # Handle the thumbnails: - LOG.debug(f"Thumbs: {thumbnails}") - # copy_thumbnails(thumbnails, ingestion_path) - - -def calculate_thumbnail_path(thumbnail_image_file): - sha1 = hashlib.sha1() - - with open(str(thumbnail_image_file), "rb") as f: - for block in iter(lambda: f.read(1024), b""): - sha1.update(block) - key = sha1.hexdigest() - - # $1 is the first two characters of the sha1 sum, $2 the second two, and $3 the third two - # ea887dea73301fab8b9da760014449b59e1211ae - # $ROOT/ea/88/7d/thumbnail - - root_thumbnail_path = config.getstring("archive-ingestion.vlass.ThumbnailPath") - - # Return path without and with ROOT - return key[0:2] + "/" + key[2:4] + "/" + key[4:6] + "/" + os.path.basename( - thumbnail_image_file - ), root_thumbnail_path + "/" + key[0:2] + "/" + key[2:4] + "/" + key[4:6] + "/" + os.path.basename( - thumbnail_image_file - ) - - -# def copy_thumbnail(thumbnail_image_file, thumbnail_destination): -# if not os.path.isdir(os.path.dirname(thumbnail_destination)): -# os.makedirs(os.path.dirname(thumbnail_destination)) -# shutil.copyfile(thumbnail_image_file, thumbnail_destination) - - -def copy_thumbnails(thumbnails, ingestion_path): - for thumbnail in thumbnails: - # full path to the png: - thumb_source = Path(ingestion_path) / thumbnail - # figure out where it goes (based on checksum): - doubled_locations = calculate_thumbnail_path(thumb_source) - # - # The above returns the resultant path with and without the root value from CAPO - # we want the second value of the returned tuple - # - rc.copy_thumbnail(thumb_source, doubled_locations[1]) - - -def filesdump(ingest_files): - for file in ingest_files: - LOG.info(f"File name: {file[0].filename} Size: {file[1]}") - - -def test1(): - path = Path(".") - ingest_from_manifest(path.name, im.INGESTION_MANIFEST_FILE) - - -if __name__ == "__main__": - test1() diff --git a/apps/cli/executables/pexable/ingest/ingest/metadata/__init__.py b/apps/cli/executables/pexable/ingest/ingest/metadata/__init__.py deleted file mode 100644 index dfd1532155a5506a0727767b766bce331f92d4c8..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/metadata/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from .sciencemodel import SDM, SDMBinaryTable, SDMTable, buildtable - -__all__ = [ - "SDM", - "SDMTable", - "SDMBinaryTable", - "buildtable", -] diff --git a/apps/cli/executables/pexable/ingest/ingest/metadata/sciencemodel.py b/apps/cli/executables/pexable/ingest/ingest/metadata/sciencemodel.py deleted file mode 100644 index 23777725a0241c6a783b82b564ba35b896179216..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/metadata/sciencemodel.py +++ /dev/null @@ -1,75 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import os - -from lxml import objectify - - -class SDM: - def __init__(self, sdmpath=".", bdfpath="."): - self.sdmpath = os.path.abspath(sdmpath) - self.bdfpath = os.path.abspath(bdfpath) - self.tables = {} # These are the SDM Tables {name : root of the xml doc} - self.bdffiles = [] - asdmtree = objectify.parse(sdmpath + "/ASDM.xml") - self.asdm = asdmtree.getroot() - - # Load the SDM tables - for table in self.asdm.Table: - entityid = table.Entity.get("entityId") - self.tables[table.Name] = buildtable(table.Name, self.sdmpath, entityid) - # Load the BDF files - bdffiletree = objectify.parse(sdmpath + "/Main.xml") - bdfs = bdffiletree.getroot() - for rw in bdfs.row: - # XML Change - if row.dataUID is not None: - file = rw.dataUID.EntityRef.get("entityId") - elif row.dataOid is not None: - file = rw.dataOid.EntityRef.get("entityId") - else: - raise "Invalid XML element" - # for testing - # self.bdffiles.append(os.path.join(bdfpath, file.replace(':///', '____').replace('/', '_') + '.loaded')) - self.bdffiles.append(os.path.join(bdfpath, file.replace(":///", "____").replace("/", "_"))) - - -def buildtable(name, path, entityid): - filename = os.path.join(path, str(name)) - if os.path.exists(filename + ".xml"): - return SDMTable(name, filename + ".xml", entityid) - elif os.path.exists(filename + ".bin"): - return SDMBinaryTable(name, filename + ".bin", entityid) - else: - raise "Not a valid table type" - - -class SDMTable: - def __init__(self, name, path, entityid): - self.name = name - self.path = path - # self._tree = objectify.parse(path) - # self._table = self._tree.getroot() - self.entityid = entityid - - -class SDMBinaryTable: - def __init__(self, name, path, entityid): - self.name = name - self.path = path - self.entityid = entityid diff --git a/apps/cli/executables/pexable/ingest/ingest/persistVLBAmetadata.py b/apps/cli/executables/pexable/ingest/ingest/persistVLBAmetadata.py deleted file mode 100644 index e534a50fb3f39383620aef1476246ffc3a1d078e..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/persistVLBAmetadata.py +++ /dev/null @@ -1,366 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" -Persist VLBA metadata extracted from .idifits files -""" - -import datetime -import hashlib -import logging -import os -import re -import sys -import time - -from pycapo import CapoConfig - -from . import NGASUtil as ng -from . import archiveutils, proposalutils -from .schema import create_session -from .schema.model import ( - Author, - Configuration, - DataDescription, - ExecutionBlock, - File, - Filegroup, - Intent, - Polarization, - Project, - Scan, - ScienceProduct, - Subscan, -) -from .VLBAFITSUtil import VLBAFits - -session = create_session("VLBA") -LOG = logging.getLogger("ingestion") -config = CapoConfig() - - -def persistVLBAMetadata(fits_file): - LOG.info(f"Persisting fits file: {fits_file}") - # Basically want to bail out of the whole process if the file name is already in the Files table - starttime = time.time() - vlba_fits = VLBAFits(fits_file) - LOG.info(f"Fits file completed in {time.time() - starttime}s") - starttime = time.time() - projectcode = vlba_fits.getproject() - segment = vlba_fits.getsegment() - - project = persistproject(projectcode) - session.add(project) - # Persist archive location information - correlation_filegroup = persistfilegroups(project, segment) - file = persistfile(correlation_filegroup, fits_file) - - # Now the science data - executionblock = persistexecblock("VLBA", project, segment, correlation_filegroup, vlba_fits, file) - if executionblock is not None: - if project.starttime is None or project.starttime > executionblock.starttime: - project.starttime = executionblock.starttime - if project.endtime is None or project.endtime < executionblock.endtime: - project.endtime = executionblock.endtime - - session.add(project) - - LOG.info(f"Database updates for file {executionblock.ngas_fileset_id} completed in {time.time() - starttime}s") - LOG.info( - f"Correlation file: {executionblock.ngas_fileset_id} successfully ingested for Project: {executionblock.project_code} Segment: {executionblock.segment}" - ) - - session.commit() - - -def is_test_project(project_code): - """ - Is this a test project? Then don't set the proprietary period. - Test projects follow the pattern: LI*, SI*, CI*, XI*, KI*, UI*, DQ*, PPM*, T* - - In addition there is a handful of test observations with a bit of a one off codes, so I suppose these could be just - handled as they come (hopefully not too many!). Such three observations from past 2 years are: MK617, PI2010, IPTFEB02 - - :param projectcode: - :return: - """ - - if ( - project_code.startswith("LI") - or project_code.startswith("SI") - or project_code.startswith("CI") - or project_code.startswith("XI") - or project_code.startswith("KI") - or project_code.startswith("UI") - or project_code.startswith("DQ") - or project_code.startswith("PPM") - or project_code.startswith("T") - or project_code == "MK617" - or project_code == "PI2010" - or project_code == "IPTFEB02" - ): - return True - else: - return False - - -def persistproject(projectcode): - - existingproject = archiveutils.getproject(projectcode) - if existingproject is None: - searchproposalcode = re.sub("([A-Z]+)0", "\g<1>", projectcode) - pstproposal = proposalutils.getproposal("VLBA", searchproposalcode) - pstauthors = persistauthors(projectcode) - if pstproposal is None: - psttitle = "" - pstabstract = "" - if is_test_project(projectcode): - proprietaryduration = 0 - else: - proprietaryduration = 365 - else: - if pstproposal.PROPOSAL_TYPE == "Director's Discretionary Time": - proprietaryduration = round(365 / 2, 0) - else: - proprietaryduration = 365 - psttitle = pstproposal.TITLE - pstabstract = pstproposal.ABSTRACT - - project = Project( - project_code=projectcode, - opt_project_id=0, - legacy_id=projectcode, - title=psttitle, - abstract=pstabstract, - total_observation_time=None, - last_addition=datetime.datetime.utcnow(), - starttime=None, - endtime=None, - proprietary_duration=proprietaryduration, - ) - project.authors = pstauthors - return project - return existingproject - - -def persistauthors(project): - searchproposalcode = re.sub("([A-Z]+)0", "\g<1>", project) - pstauthors = proposalutils.getauthors("VLBA", searchproposalcode) - projauthors = [] - if pstauthors is None or len(pstauthors) == 0: - author = Author( - project_code=project, - username="operations", - firstname="VLBA", - lastname="Operations", - pst_person_id=10154, - is_pi=True, - ) - session.add(author) - projauthors.append(author) - else: - for pstauthor in pstauthors: - projauthors.append( - Author( - project_code=project, - username=pstauthor.user.personName, - firstname=pstauthor.FIRST_NAME, - lastname=pstauthor.LAST_NAME, - pst_person_id=pstauthor.person_id, - is_pi=proposalutils.ispi(pstauthor), - ) - ) - - return projauthors - - -def persistfilegroups(project, segment): - filegroup = Filegroup(project_code=project.project_code, datasize=0, type="correlation") - session.add(filegroup) - return filegroup - - -def persistfile(filegroup, fits_file): - file_path = os.path.basename(fits_file) - ngas_id = os.path.basename(fits_file) - existingfile = archiveutils.getvlbafile(ngas_id) - site_name = config.getstring("archive-ingestion.NGASSite") - cluster_name = config.getstring("archive-ingestion.NGASCluster") - if existingfile is None: - file = File( - file_path=file_path, - ngas_id=ngas_id, - ngas_location=site_name, - ngas_cluster=cluster_name, - filegroup1=filegroup, - filename=os.path.basename(fits_file), - filesize=os.path.getsize(fits_file), - format=fits_file.suffix[1:].upper(), - type=fits_file.suffix[1:].upper(), - checksum=sha256(fits_file), - checksum_type="SHA256", - ingestion_time=datetime.datetime.utcnow(), - ) - - file.filegroup1.datasize = file.filegroup1.datasize + file.filesize - session.add(file) - return file - LOG.critical(f"File {ngas_id} already exists. Exiting.") - exit(-1) - - -def persistexecblock(telescope, project, segment, filegroup, vlba_fits, file): - science_product_locator = ng.generate_science_product_locator(telescope, "correlation") - current_band_set = set() # for the file - execblock = ExecutionBlock( - ost_exec_block_id=0, - filegroup=filegroup, - calibration_level=0, - telescope=telescope, - configuration=None, - scheduling_block_id=0, - project=project, - segment=project.project_code + segment, - ngas_fileset_id=file.filename, - starttime=0, - endtime=0, - calibration_status="Do Not Calibrate", - scheduling_block_type=None, - science_product_locator=science_product_locator, - ) - - science_product = ScienceProduct( - science_product_locator=science_product_locator, - science_product_type="Correlation", - metadata_ingestion_date=datetime.datetime.utcnow(), - metadata_ingestion_version=1, - filegroup=filegroup, - external_name=file.filename, - external_system="VLBA Operations", - execution_block=execblock, - ) - - execblock.project.science_products.append(science_product) - - session.add(execblock) - session.add(science_product) - - starttime, endtime, bandset = persistscans(vlba_fits, execblock, filegroup, file) - execblock.starttime = starttime - execblock.endtime = endtime - - execblock.band_code = " ".join(sorted(bandset)) - - return execblock - - -def persistscans(vlba_fits, execution_block, filegroup, file): - minstarttime, maxendtime = 1000000000.0, 0.0 - scans = vlba_fits.getscantable() - bandset = set() - for scan_number in range(len(scans)): - scan = Scan( - execution_block=execution_block, - filegroup=filegroup, - min_bandwidth=0.0, - max_bandwidth=0.0, - min_frequency=0.0, - max_frequency=0.0, - polarization_code=0, - ) - minfrequency, maxfrequency, bandwidth, starttime, endtime, polarization = persistsubscans( - execution_block, scan, scans[scan_number], file - ) - - # MHz --> Hz - scan.min_frequency = minfrequency * 1000000 - scan.max_frequency = maxfrequency * 1000000 - - scan.min_bandwidth = bandwidth - scan.max_bandwidth = bandwidth - # scan.polarization_code = polarization.polarization_id - session.add(scan) - if starttime < minstarttime: - minstarttime = starttime - if endtime > maxendtime: - maxendtime = endtime - - # get the band for the minfrequency and add to a set - bandset.add(vlba_fits.lookup_band(minfrequency / 1000)) - bandset.add(vlba_fits.lookup_band(maxfrequency / 1000)) - - return minstarttime, maxendtime, bandset - - -def persistsubscans(execution_block, scan, scandata, file): - configuration = persistconfiguration(execution_block, 0) - subscan = Subscan( - scan=scan, - obstype="", - starttime=scandata["START_TIME"], - endtime=scandata["END_TIME"], - sourcename=scandata["SOURCE"].split("\x00", 1)[0], # Fix some source names with terminating nulls - sourcetype="STAR", - ra=scandata["RA"], - dec=scandata["DEC"], - exposure_time=scandata["TIME_ON_SOURCE"], - integration_time=scandata["INTEGRATION_TIME"], - receiver_id=0, - backend="DIFX", - configuration=configuration, - intent="TRACK", - file=file, - ) - - bandwidth = scandata["BANDWIDTH"] - frequencies = [float(freq) for freq in scandata["FREQUENCY"].split(",")] - minfrequency = min(frequencies) - maxfrequency = max(frequencies) - polarization = scandata["POLARIZATION"] - for frequency in frequencies: - persistdatadescription(subscan, configuration, frequency, bandwidth, polarization) - - session.add(subscan) - return minfrequency, maxfrequency, bandwidth, subscan.starttime, subscan.endtime, polarization - - -def persistdatadescription(subscan, configuration, frequency, bandwidth, polarization): - local_polarization = session.merge(polarization) - datadescription = DataDescription( - bandwidth=bandwidth, frequency=frequency, polarization=local_polarization, configuration=configuration - ) - session.add(datadescription) - - -def persistconfiguration(execution_block, configuration): - configuration = Configuration(execution_block=execution_block, configuration=configuration) - session.add(configuration) - return configuration - - -def sha256(fname): - hash_sha256 = hashlib.sha256() - with open(fname, "rb") as f: - for chunk in iter(lambda: f.read(4096), b""): - hash_sha256.update(chunk) - return hash_sha256.hexdigest() - - -if __name__ == "__main__": - path = sys.argv[1] - fits_file = sys.argv[2] - persistVLBAMetadata(os.path.join(path, fits_file)) diff --git a/apps/cli/executables/pexable/ingest/ingest/persistcaltables.py b/apps/cli/executables/pexable/ingest/ingest/persistcaltables.py deleted file mode 100644 index 974d7acc0e62faebd38311efcbd10d3abeb52956..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/persistcaltables.py +++ /dev/null @@ -1,360 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import datetime -import hashlib -import logging -import os -import sys -import tarfile -from pathlib import Path - -from pycapo import CapoConfig - -from . import NGASUtil as ng -from . import almautils as alu -from . import archiveutils as au -from .schema import create_session -from .schema.model import Calibration, File, Filegroup, ProductGroup, ScienceProduct - -LOG = logging.getLogger("ingestion") - -session = create_session("SDM") - -config = CapoConfig() -site_name = config.getstring("archive-ingestion.NGASSite") -ngas_cluster = config.getstring("archive-ingestion.NGASCluster") - - -def ingestcaltable(file): - """ - Ingest a single calibration product tar file. Create the metadata and - store the file on NGAS - :param file: the tar file to be ingested - :return: - """ - # No filegroup is given, so it must be extracted from the tar file - found = False - tar = tarfile.open(file) - for tarinfo in tar: - # ms.calapply.txt has the file set id embedded in it - if tarinfo.isreg() and tarinfo.name.endswith(".ms.calapply.txt"): - found = True - if found: - fsstart = tarinfo.name.find("products/") - fsend = tarinfo.name.find(".ms") - fileset = tarinfo.name[fsstart + 9 : fsend] - ingestcalmetadata(file, fileset) - break - if not found: - LOG.error("Unable to find matching file group for calibration products file {}".format(file)) - - -def ingestcalmetadata(file, external_name, nongas): - """ - Ingest a single calibration product tar file, given the file and associated file group - :param file: the tar file to be ingested - :param external_name: the external name of the parent execution block - :param nongas: flag to indicate if ingestion to NGAS should not occur - :return: - """ - - ngas_id = ng.generate_uuids_for_ngas("evla", "calibration", "tar") - exec_block = au.get_execution_block_from_external_name(external_name) - LOG.debug(f"EB ID: {exec_block.ngas_fileset_id}") - if exec_block is None: - LOG.error(f"Parent execution block {external_name} not found for calibration products {file}") - sys.exit(1) - else: - if exec_block.filegroup is None: - LOG.error(f"Execution block filegroup not found for execution block {external_name}") - sys.exit(1) - - calibration_filegroup = au.get_filegroup_from_name(file.name) - - if calibration_filegroup is not None: - # Calibration products file exists, replace - calfile = au.get_file_from_group(calibration_filegroup) - calfile.filesize = (file.stat().st_size,) - calfile.checksum = sha256(file) - calfile.checksum_type = "SHA256" - calfile.ingestion_time = datetime.datetime.utcnow() - calfile.ngas_id = ngas_id - LOG.info(f"Replacing calibrations products: {file.name} for execution block: {external_name}") - else: - calibration_filegroup = Filegroup(parent_filegroup=exec_block.filegroup, type="calibration") - session.add(calibration_filegroup) - filesize = file.stat().st_size - site_name = config.getstring("archive-ingestion.NGASSite") - ngas_cluster = config.getstring("archive-ingestion.NGASCluster") - calfile = File( - file_path=groupname, - ngas_id=ngas_id, - ngas_location=site_name, - ngas_cluster=ngas_cluster, - filename=os.path.basename(file), - filegroup1=calibration_filegroup, - filesize=filesize, - format="tar", - type="cal", - checksum=sha256(file), - checksum_type="SHA256", - ingestion_time=datetime.datetime.utcnow(), - ) - - calibration_filegroup.datasize = calfile.filesize - session.add(calfile) - - science_product_locator = ng.generate_science_product_locator(execblock.telescope.lower(), "calibration") - - calibration = Calibration( - execution_block=execblock, - alma_ous_id=None, - filegroup=calibration_filegroup, - project_code=exec_block.project_code, - science_product_locator=science_product_locator, - ) - - science_product = ScienceProduct( - science_product_locator=science_product_locator, - science_product_type="Calibration", - metadata_ingestion_date=datetime.datetime.utcnow(), - metadata_ingestion_version=1, # TBD - filegroup=calibration_filegroup, - ) - - # Ordering matters to satisfy FK constraints: - session.add(science_product) - session.add(calibration) - - # Add to science_products_projects - project = execblock.project - project.science_products.append(science_product) - session.add(project) - - session.commit() - - # Now do the NGAS ingestion, if not disabled - if nongas: - LOG.info(f"NGAS ingestion is disabled. File {ngas_id} will not be ingested.") - else: - LOG.info(f"Linking file {file} to {str(Path(file.parent) / ngas_id)}") - os.link(file, file.parent / ngas_id) - ingestcalfile(file.parent / ngas_id, calfile.filesize) - - -def ingestalmacalibration(mous): - LOG.debug(f"MOUS for calibrations: {mous}") - # Need the eb filegroup - # Get eb from MOUS - projectcode = au.getprojectcodefrommous(mous) - LOG.debug(f"Project code: {projectcode}") - calfilegroup = Filegroup(groupname=mous, project_code=projectcode, type="calibration") - session.add(calfilegroup) - - # Now get the files and create File entries - # Get the list of files - Alma query - calfiles = alu.getalmacalfiles(mous) - LOG.info(f"Cal files: {str(calfiles)}") - # ALMA calibration files are not stored on our NGAS system, so indicate that: - for file in calfiles: - calfile = File( - ngas_id=file[0], - ngas_location="NAASC", - ngas_cluster="NAASC", - filename=file[0], - filesize=file[1], - filegroup1=calfilegroup, - format="cal", - type="cal", - ) - session.add(calfile) - - # Now do the calibrations table - calibrations = Calibration(alma_ous_id=mous, filegroup=calfilegroup, project_code=projectcode) - session.add(calibrations) - # session.commit() - - -def ingest_from_manifest(manifest): - telescope = manifest.get_telescope() - ( - path, - calibration_tar_file, - input_product_locators, - reingest, - ngas_ingest, - ) = manifest.get_calibration_ingestion_parameters() - ngas_id = ng.generate_uuids_for_ngas("evla", "calibration", "tar") - # In theory, I should be able to pass a list of execution block science product locators - ingest_calibration(telescope, input_product_locators, path, calibration_tar_file, ngas_id, reingest) - - if ngas_ingest: - LOG.info(f"TEST Linking file {os.path.join(path, calibration_tar_file)} to {os.path.join(path, ngas_id)}") - # LOG.info(f"Linking file {os.path.join(path, calibration_tar_file)} to {os.path.join(path, ngas_id)}") - # os.link(os.path.join(path, calibration_tar_file), os.path.join(os.path.dirname(file), ngas_id)) - # ingestcalfile(os.path.join(path, ngas_id), os.path.getsize(os.path.join(path, ngas_id))) - else: - LOG.info(f"NGAS ingestion is disabled. File {calibration_tar_file} will not be ingested.") - - -def xingest_from_manifest(manifest): - telescope = manifest.get_telescope() - # Pass telescope, path to - ( - path, - calibration_tar_file, - input_product_locators, - reingest, - ngas_ingest, - ) = manifest.get_calibration_ingestion_parameters() - ngas_id = ng.generate_uuids_for_ngas("evla", "calibration", "tar") - # In theory, I should be able to pass a list of execution block science product locators - ingest_calibration(telescope, input_product_locators, path, calibration_tar_file, ngas_id, reingest) - - if ngas_ingest: - LOG.info(f"TEST Linking file {os.path.join(path, calibration_tar_file)} to {os.path.join(path, ngas_id)}") - # LOG.info(f"Linking file {os.path.join(path, calibration_tar_file)} to {os.path.join(path, ngas_id)}") - # os.link(os.path.join(path, calibration_tar_file), os.path.join(os.path.dirname(file), ngas_id)) - # ingestcalfile(os.path.join(path, ngas_id), os.path.getsize(os.path.join(path, ngas_id))) - else: - LOG.info(f"NGAS ingestion is disabled. File {calibration_tar_file} will not be ingested.") - - -def ingest_calibration( - telescope, execution_block_science_product_locators, path, calibration_tar_file, ngas_id, reingest -): - """ - Ingest calibration products, attach to executiion block, and add to product groups - :param telescope: telescope (evla or alma) - :param execution_block_science_product_locator: list of science product locators of the execution blocks that were calibrated - :param path: Location of calibration products file - :param calibration_tar_file: tar file containing the calibration products - :param reingest: should existing products be delete and reingested? - :return: - """ - - # Get the parent eb using its science product locator; for now, only do the first - # since there should only be one - execblock = au.get_execution_block(execution_block_science_product_locators[0]) - if execblock is None: - LOG.error(f"Execution block with science product locator {execution_block_science_product_locator} not found.") - sys.exit(1) - execution_block_science_product = au.get_science_product_by_spl(execution_block_science_product_locator) - - # Add the calibration products filegroup and file - # Look for calibration by filename, in case already ingested - calibration_products_file = au.get_file(calibration_tar_file) - if calibration_products_file is not None: - if reingest: - # TODO fix reingestion - LOG.debug(f"Reingestion of cal products requested for {calibration_tar_file}") - # Delete the existing entry - else: - LOG.error(f"Calibration products file {calibration_tar_file} already ingested") - sys.exit(1) - else: - LOG.debug(f"Initial ingestion of cal products requested for {os.path.join(path, calibration_tar_file)}") - - calibration_filegroup = Filegroup( - groupname=calibration_tar_file, parent_filegroup=execblock.filegroup, type="calibration" - ) - db_session = session.object_session(calibration_filegroup) - db_session.add(calibration_filegroup) - - calibration_products_file = File( - file_path=os.path.dirname(path), - ngas_id=ngas_id, - ngas_location=site_name, - ngas_cluster=ngas_cluster, - filename=calibration_tar_file, - filegroup1=calibration_filegroup, - filesize=os.path.getsize(os.path.join(path, calibration_tar_file)), - format="tar", - type="cal", - checksum=sha256(os.path.join(path, calibration_tar_file)), - checksum_type="SHA256", - ingestion_time=datetime.datetime.utcnow(), - ) - db_session.add(calibration_products_file) - - science_product_locator = ng.generate_science_product_locator(execblock.telescope.lower(), "calibration") - - calibration = Calibration( - project_code=execblock.project_code, - execution_block=execblock, - alma_ous_id=None, - filegroup=calibration_filegroup, - science_product_locator=science_product_locator, - ) - - db_session.add(calibration) - - science_product = ScienceProduct( - science_product_locator=science_product_locator, - science_product_type="Calibration", - metadata_ingestion_date=datetime.datetime.utcnow(), - metadata_ingestion_version=1, - filegroup=calibration_filegroup, - ) - - db_session.add(science_product) - - # TODO ancillary products for calibrations - - # Add to science_products_projects - execblock.project.science_products.append(science_product) - - # Add to product_groups and science_products_product_groups - input_product_group = ProductGroup(product_group_type="input_group", parent_product_group=None, ALMA_ous=None) - input_product_group.science_products.append(execution_block_science_product) - db_session.add(input_product_group) - - output_product_group = ProductGroup( - product_group_type="output_group", parent_product_group=input_product_group, ALMA_ous=None - ) - output_product_group.science_products.append(science_product) - db_session.add(output_product_group) - - db_session.commit() - - -# def ingest_calibrationx(telescope, execution_block_science_product_locators, path, -# calibration_tar_file, ngas_id, reingest): - - -def ingestcalfile(calibration_file, file_size): - ingestion_list = [] - ingestion_list.append([calibration_file, file_size]) - LOG.info(f"Ingesting file: {calibration_file.name}") - ng.archivefiles(ingestion_list) - - -def sha256(fname): - hash_sha256 = hashlib.sha256() - with open(fname, "rb") as f: - for chunk in iter(lambda: f.read(4096), b""): - hash_sha256.update(chunk) - return hash_sha256.hexdigest() - - -def test1(): - LOG.debug("TEST") - - -if __name__ == "__main__": - test1() diff --git a/apps/cli/executables/pexable/ingest/ingest/persistimages.py b/apps/cli/executables/pexable/ingest/ingest/persistimages.py deleted file mode 100644 index 35f191fe391811148b2aa37fba36ad7c3c17c2a5..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/persistimages.py +++ /dev/null @@ -1,312 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import datetime -import glob -import hashlib -import logging -import os -import shutil -import tarfile - -from pycapo import CapoConfig - -from . import FITSUtil as fi -from . import NGASUtil as ng -from . import archiveutils as au -from .JSONMetadataUtil import JSONMetadata -from .schema import create_session -from .schema.model import File, Filegroup, Image, ImageProduct -from .weblog_thumbs.weblogUtil import Weblog - -LOG = logging.getLogger("ingestion") - -session = create_session("SDM") - -config = CapoConfig() - - -def ingestimagemetaData(imagepath, projectcode, nongas): - """ - Ingest a image products file and a set of images - :param imagepath: the parent directory containing the image products file and the image fits files - :param projectcode: the project containing the images - :param nongas: flag to indicate if ingestion to NGAS should not occur - :return: - """ - - LOG.info("In image ingestion for project {} located in {}".format(projectcode, imagepath)) - project = au.getproject(projectcode) - if project is None: - LOG.error("Project {} could not be found for images located in {}".format(projectcode, imagepath)) - return False - else: - LOG.info("Loading images for project {} located in {}".format(project.project_code, imagepath)) - - # image set filegroup --> image set - groupname = os.path.basename(os.path.normpath(imagepath)) - imagesetfilegroup = Filegroup(project=project, groupname=groupname, type="image_set") - session.add(imagesetfilegroup) - session.commit() - - # image product filegroup - image_product_filegroup = Filegroup( - parent_filegroup_id=imagesetfilegroup.filegroup_id, groupname=groupname, type="image_products" - ) - session.add(image_product_filegroup) - - files_to_ingest = [] - - # Obtain the NGAS site/cluster info: - site_name = config.getstring("archive-ingestion.NGASSite") - cluster_name = config.getstring("archive-ingestion.NGASCluster") - - # Image product file - image_product_files = glob.glob(imagepath + "/*.tar") - image_product_file = image_product_files[0] - - if len(image_product_files) == 0: - LOG.error("No image product files found in {}".format(imagepath)) - return False - elif len(image_product_files) > 1: - LOG.error("Multiple image product files found in {}".format(imagepath)) - return False - else: - ngas_id = ng.generate_uuids_for_ngas("evla", "imageproduct", "tar") - product_file = File( - file_path=imagepath, - ngas_id=ngas_id, - ngas_location=site_name, - ngas_cluster=cluster_name, - filegroup1=image_product_filegroup, - filename=os.path.basename(image_product_file), - filesize=os.path.getsize(image_product_file), - format="tar", - type="image_products", - ingestion_time=datetime.datetime.utcnow(), - ) - session.add(product_file) - LOG.info(f"Moving file {image_product_file} to {os.path.join(os.path.dirname(image_product_file), ngas_id)}") - os.link(image_product_file, os.path.join(os.path.dirname(image_product_file), ngas_id)) - files_to_ingest.append([os.path.join(imagepath, ngas_id), product_file.filesize]) - - # Image product - # Get the json metadata - json_metadata_files = glob.glob(imagepath + "/*.json") - if len(json_metadata_files) == 0: - LOG.error("No json metadata file found in {}".format(imagepath)) - elif len(json_metadata_files) > 1: - LOG.error("Multiple json metadata files found in {}".format(imagepath)) - json_metadata_file = json_metadata_files[0] - # File doesn't exist' - json_metadata = JSONMetadata(json_metadata_file) - json_metadata.from_json(json_metadata_file) - image_product = ImageProduct( - configurations=json_metadata.get_configurations(), - collection_name=json_metadata.get_collection_name(), - calibration_level=json_metadata.get_calibration_level(), - tags=json_metadata.get_product_tags(), - product_file=product_file, - project=project, - image_set_filegroup=imagesetfilegroup.filegroup_id, - ) - session.add(image_product) - session.commit() - - # Images file group - imagesfilegroup = Filegroup(parent_filegroup=imagesetfilegroup, groupname=groupname, type="images") - session.add(imagesfilegroup) - - # Image file(s) - imagefiles = glob.glob(imagepath + "/*.fits") - - # Gather the fields for the image table from the weblog - image_product_file is the .tar file - # What to extract? - - weblog = get_weblog_from_image_products(image_product_file) - - band_codes = weblog.get_band_codes() - - for imagefile in imagefiles: - # imagefile is the full path to a fits image - # filename = is the file name itself - filename = os.path.basename(imagefile) - - thumbnail_image_file = weblog.find_quicklook_thumbnail_for(filename) - if thumbnail_image_file is not None: - # Path to the thumbnail without and with the ROOT from CAPO - thumbnail_path, thumbnail_destination = calculate_thumbnail_path(thumbnail_image_file) - # Copy the thumbnail image to the thumbnails directory - copy_thumbnail(thumbnail_image_file, thumbnail_destination) - else: - LOG.info(f"Skipping thumbnail for {imagefile}.") - # Stick a NULL in the field - thumbnail_path = None - - if "rms" in filename: - image_type = "quicklook_image_rms" - else: - image_type = "quicklook_image" - ngas_id = ng.generate_uuids_for_ngas("evla", "image", "fits") - imgfile = File( - file_path=imagepath, - ngas_id=ngas_id, - ngas_location=site_name, - ngas_cluster=cluster_name, - filegroup1=imagesfilegroup, - filename=filename, - filesize=os.path.getsize(os.path.join(imagepath, imagefile)), - format="fits", - type=image_type, - ingestion_time=datetime.datetime.utcnow(), - ) - # Gather the fields for the image table from the fits file(s) - ( - source_name, - telescope, - spatial_resolution, - field_of_view, - min_intensity, - max_intensity, - ra, - dec, - min_freq, - max_freq, - rest_frequency, - ra_element_count, - dec_element_count, - image_units, - beam_axis_ratio, - polarization_id, - rms_noise, - spatial_region, - ra_pixel_size, - dec_pixel_size, - ) = fi.get_fits_data(imagefile) - - # Add image product id to image - image = Image( - target_name=source_name, - telescope=telescope, - thumbnail=thumbnail_path, - spatial_resolution=spatial_resolution, - image_field_of_view=field_of_view, - max_intensity=max_intensity, - min_intensity=min_intensity, - rms_noise=rms_noise, - polarization_id=polarization_id, - ra=ra, - dec=dec, - min_frequency=min_freq, - max_frequency=max_freq, - ra_element_count=ra_element_count, - dec_element_count=dec_element_count, - starttime=json_metadata.get_starttime(), - endtime=json_metadata.get_endtime(), - exposure_time=json_metadata.get_endtime(), - rest_frequency=rest_frequency, - image_units=image_units, - spatial_region=spatial_region, - beam_axis_ratio=beam_axis_ratio, - band_code=" ".join(band_codes), - ra_pixel_size=ra_pixel_size, - dec_pixel_size=dec_pixel_size, - tags=json_metadata.get_image_tags(), - file=imgfile, - image_products_id=image_product.image_product_id, - ) - - # Image - session.add(imgfile) - session.add(image) - - LOG.info(f"Moving file {imagefile} to {os.path.join(os.path.dirname(imagefile), ngas_id)}") - os.link(imagefile, os.path.join(os.path.dirname(imagefile), ngas_id)) - files_to_ingest.append([os.path.join(imagepath, ngas_id), imgfile.filesize]) - - session.commit() - - # Now do the NGAS ingestion, if not disabled - if nongas: - LOG.info(f"NGAS ingestion is disabled. Image products and FITS images will not be ingested.") - else: - ingestimagefiles(files_to_ingest) - - -def ingestimagefiles(files_to_ingest): - """ - Ingest fits images and image product .tar files into NGAS - :param files_to_ingest: files to be ingested - :return: - """ - ng.archivefiles(files_to_ingest) - - -def calculate_thumbnail_path(thumbnail_image_file): - sha1 = hashlib.sha1() - - with open(thumbnail_image_file, "rb") as f: - for block in iter(lambda: f.read(1024), b""): - sha1.update(block) - key = sha1.hexdigest() - - # $1 is the first two characters of the sha1 sum, $2 the second two, and $3 the third two - # ea887dea73301fab8b9da760014449b59e1211ae - # $ROOT/ea/88/7d/thumbnail - - root_thumbnail_path = config.getstring("archive-ingestion.vlass.ThumbnailPath") - - # Return path without and with ROOT - return key[0:2] + "/" + key[2:4] + "/" + key[4:6] + "/" + os.path.basename( - thumbnail_image_file - ), root_thumbnail_path + "/" + key[0:2] + "/" + key[2:4] + "/" + key[4:6] + "/" + os.path.basename( - thumbnail_image_file - ) - - -def copy_thumbnail(thumbnail_image_file, thumbnail_destination): - if not os.path.isdir(os.path.dirname(thumbnail_destination)): - os.makedirs(os.path.dirname(thumbnail_destination)) - shutil.copyfile(thumbnail_image_file, thumbnail_destination) - - -def get_weblog_from_image_products(image_product_file): - """ - Extract data from the weblog - :param image_product_file: the image products tar file containing the weblog.tgz - :return: - """ - - products_dir = os.path.dirname(image_product_file) - product_tar_file = tarfile.open(image_product_file) - - # The pipeline gives us a uniform weblog.tgz file for VLA stuff... but ALMA - # tacks on the sanitzed MOUS UID & the name of the processing procedures. - files_list = product_tar_file.getnames() - weblog_candidates = [place for place, name in enumerate(files_list) if "weblog" in name] - - # We expect a single file to match the pattern: - if len(weblog_candidates) != 1: - # So throw an exception when that's not the case. - raise NameError("Cannot isolate the weblog!") - - weblog_file_name = files_list.pop(weblog_candidates[0]) - product_tar_file.extract(weblog_file_name, path=products_dir) - # LOG.info('weblog: {}'.format(os.path.join(products_dir, weblog_file_name))) - weblog = Weblog(products_dir, weblog_file_name) - - return weblog diff --git a/apps/cli/executables/pexable/ingest/ingest/persistmetadata.py b/apps/cli/executables/pexable/ingest/ingest/persistmetadata.py deleted file mode 100644 index 18df080a151a46766733d86d4c61dee55b37ceeb..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/persistmetadata.py +++ /dev/null @@ -1,1123 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import copy -import datetime -import logging -import math -import os -import re -from pathlib import Path - -from pycapo import CapoConfig - -from . import NGASUtil as ng -from . import almautils, archiveutils, projectutils, proposalutils -from .evlasciencedatamodel import SDMBinaryTable, SDMXMLTable -from .RealFastMetadata import RealFastMetadata -from .schema import create_session -from .schema.model import ( - AlmaOus, - AncillaryProduct, - Author, - Configuration, - DataDescription, - ExecutionBlock, - File, - Filegroup, - Intent, - Polarization, - Project, - RealfastExecutionBlock, - Scan, - ScienceProduct, - Subscan, -) - -LOG = logging.getLogger("ingestion") - -session = create_session("SDM") - -config = CapoConfig() -site_name = config.getstring("archive-ingestion.NGASSite") -cluster_name = config.getstring("archive-ingestion.NGASCluster") - - -def persist(sdm, nocal, additional_metadata, collection_metadata, science_products, ingestion_path, ngas_cluster): - """ - Persist an sdm (Science Data Model) to the metadata db, including the NGAS index to be - used by the Data Fetcher via SOLR - :param sdm: Science Data Model for an EVLA fileset - :param nocal: - :param additional_metadata: Addition metadata - :param collection_metadata: Collection metadata - :param science_products: Science products for output group - :param ingestion_path Path of files to be ingested - :param ngas_cluster: ngas cluster - :return: the project - """ - - sdmtables = sdm.sdmtables - bdffiles = sdm.bdffiles - fileset = sdm.fileset - - # The set of XML tables contained in the SDM - maintable = sdm.sdmtables["Main"].table.getroot() - sbsummarytable = sdm.sdmtables["SBSummary"].table.getroot() - execblocktable = sdm.sdmtables["ExecBlock"].table.getroot() - scantable = sdm.sdmtables["Scan"].table.getroot() - subscantable = sdm.sdmtables["Subscan"].table.getroot() - polarizationtable = sdm.sdmtables["Polarization"].table.getroot() - spectralwindowtable = sdm.sdmtables["SpectralWindow"].table.getroot() - datadescriptiontable = sdm.sdmtables["DataDescription"].table.getroot() - configtable = sdm.sdmtables["ConfigDescription"].table.getroot() - fieldtable = sdm.sdmtables["Field"].table.getroot() - sourcetable = sdm.sdmtables["Source"].table.getroot() - receivertable = sdm.sdmtables["Receiver"].table.getroot() - - try: - window_receivers = { - row.spectralWindowId.text: row.frequencyBand.text.split("_")[-1] for row in receivertable.row - } - except: - LOG.warning("Unable to obtain spectral window -> receiver mapping") - window_receivers = {} - - # Persist the NGAS metadata - project, filegroup, bdffilemap, sdm_ingest_files = persistngasmetadata( - sdmtables, bdffiles, fileset, sbsummarytable, execblocktable, subscantable - ) - session.commit() - - # Persist the science metadata - output_products, ingest_files = persistsciencemetadata( - fileset, - bdffilemap, - project, - filegroup, - sbsummarytable, - execblocktable, - scantable, - subscantable, - maintable, - configtable, - datadescriptiontable, - polarizationtable, - spectralwindowtable, - fieldtable, - sourcetable, - nocal, - window_receivers, - additional_metadata, - collection_metadata, - science_products, - ingestion_path, - ngas_cluster, - ) - session.commit() - return project, output_products, sdm_ingest_files + ingest_files - - -def persistngasmetadata(sdmtables, bdffiles, fileset, sbsummarytable, execblocktable, subscantable): - """ - Persist the NGAS index entries - :param sdmtables: the set of sdm tables - :param bdffiles: the set of bdf files - :param fileset: the file set being persisted - :param sbsummarytable: SBSummary table - :param execblocktable: ExecBlock table - :param subscantable: SubScan table - :return: project, filegroup, map of bdffiles - """ - - # Persist the project - ingest_files = [] - project = persistproject(sbsummarytable, execblocktable, subscantable) - - if project.authors is None or len(project.authors) == 0: - # Persist the authors if not an existing project - authors = persistauthors(project) - for author in authors: - session.add(author) - project.authors = authors - - # Persist the filegroup - filegroup = createfilegroup() - - # Persist files for sdm tables - filegroupsize = 0 - for sdmtable in sdmtables: - file = createsdmtable(sdmtables, filegroup, sdmtable, execblocktable.row.telescopeName) - session.add(file) - filegroupsize += file.filesize - ingest_files.append((file, file.filesize)) - - # Persist files for bdf files - bdffilemap = {} - for bdffile in bdffiles: - if execblocktable.row.telescopeName == "EVLA" and "X" in bdffile.entityid: - LOG.warning(f"Observation {fileset} has invalid BDF {bdffile.entityid}") - continue - file = createbdffile(bdffile, filegroup, execblocktable.row.telescopeName) - session.add(file) - filegroupsize += file.filesize - bdffilemap[bdffile.entityid] = file - ingest_files.append((file, file.filesize)) - - filegroup.datasize = filegroupsize - session.add(filegroup) - session.add(project) - return project, filegroup, bdffilemap, ingest_files - - -def persistsciencemetadata( - fileset, - bdffilemap, - project, - filegroup, - sbsummarytable, - execblocktable, - scantable, - subscantable, - maintable, - configtable, - datadescriptiontable, - polarizationtable, - spectralwindowtable, - fieldtable, - sourcetable, - nocal, - window_receivers, - additional_metadata, - collection_metadata, - output_science_products, - ingestion_path, - ngas_cluster, -): - """ - Persist the science meta data from the SDM tables - :param bdffilemap: - :param project: - :param filegroup: Top level filegroup for the observation - :param sbsummarytable: - :param execblocktable: - :param scantable: - :param subscantable: - :param maintable: - :param configtable: - :param datadescriptiontable: - :param polarizationtable: - :param spectralwindowtable: - :param fieldtable: - :param sourcetable: - :param nocal: - :param window_receivers: - :param additional_metadata: additional metadata - :param collection_metadata: collection metadata - :param output_science_products: Output group science products - :param ingestion_path: Path of files to ingest - :param ngas_cluster: ngas cluster - :return: - """ - # Persist ExecBlock - execblockdict = {} - science_products = [] - ingest_files = [] - for execblock in execblocktable.row: - execblockobject, science_product, files_to_ingest = persistexecblock( - fileset, - project, - filegroup, - sbsummarytable, - execblocktable, - subscantable, - nocal, - additional_metadata, - collection_metadata, - output_science_products, - ingestion_path, - ngas_cluster, - ) - ingest_files = ingest_files + files_to_ingest - execblockdict[execblock.execBlockId.text] = execblockobject - session.add(science_product, execblockobject) - science_products.append(science_product) - session.commit() - - for execblock in execblocktable.row: - execblockobject = execblockdict[execblock.execBlockId.text] - scans = getscans(execblock.execBlockId, scantable) - # Persist scans - bandset = set() - for scan in scans: - try: - scanobject = persistscan( - scan, - execblockobject, - filegroup, - maintable, - fieldtable, - sourcetable, - spectralwindowtable, - configtable, - datadescriptiontable, - polarizationtable, - ) - session.add(scanobject) - - # Persist subscans - subscans = getsubscans(scanobject.ost_scan_id, subscantable) - for subscan in subscans: - subscanobject, bands = persistsubscan( - bdffilemap, - execblockobject, - scanobject, - subscan, - scan.scanIntent.text, - maintable, - configtable, - datadescriptiontable, - polarizationtable, - spectralwindowtable, - fieldtable, - sourcetable, - execblocktable, - window_receivers, - ) - bandset = bandset.union(bands) - session.add(subscanobject) - except ValueError: - continue - execblockbands = " ".join(sorted(bandset)) - execblockobject.band_code = execblockbands - session.add(science_product, execblockobject) - return science_products, ingest_files - - -def lookup_external_project(telescope, sbsummarytable): - title = "" - abstract = "" - legacyid = "" - schedulingblocktype = sbsummarytable.row.sbType.text - authors = [] - - # Assign the proprietary duration - if schedulingblocktype == "OBSERVER": - proprietaryduration = 365 - else: - proprietaryduration = 0 - - if telescope == "ALMA": - projectid = sbsummarytable.row.projectUID.EntityRef.get("entityId") - almaproject = almautils.getproject(projectid) - authors.extend(almautils.getauthors(projectid)) - - title = almaproject.title - abstract = almautils.getabstract(projectid) - legacyid = None - projectcode = almaproject.code - optprojectid = None - else: - # EVLA stuff - projectid = getid(sbsummarytable.row.projectUID.EntityRef) - - if "X" in projectid: - # Project id was not available in the sdm table, set to 'Operations' - projectcode = "Operations" - optprojectid = 0 - else: - optproject = projectutils.getproject(projectid) - if optproject is None: # No match in the OPT - projectcode = "Not-in-OPT" - optprojectid = 0 - else: - projectcode = optproject.projectcode - optprojectid = optproject.id - - # All VLASS project codes should be mapped onto the VLASS proposal - if optproject.projectcode.startswith("VLASS"): - proposal = proposalutils.getproposal("VLA", "VLASS") - else: - proposal = proposalutils.getproposal("VLA", optproject.projectcode) - - authors.extend(projectutils.getauthors("VLA", projectid)) - - if proposal is not None: - title = proposal.TITLE - abstract = proposal.ABSTRACT - legacyid = proposal.LEGACY_ID - if proposal.PROPOSAL_TYPE == "Director's Discretionary Time": - proprietaryduration = round(365 / 2, 0) - - return ExternalProject( - projectcode, title, abstract, proprietaryduration, legacyid=legacyid, optprojectid=optprojectid, authors=authors - ) - - -def persistproject(sbsummarytable, execblocktable, subscantable): - """ - Persist project - :param sbsummarytable: - :param execblocktable: - :param subscantable: - :return: - """ - # If the project is already persisted, just update the last_addition date - # and the start time and end time - telescope = execblocktable.row.telescopeName - extproject = lookup_external_project(telescope, sbsummarytable) - existingproject = archiveutils.getproject(extproject.project_code) - if existingproject is not None: - # Get the min, max for the exec block - minstarttime, maxendtime = getminmaxtime(execblocktable.row.execBlockId, subscantable) - # Propagate to project if appropriate - if minstarttime < existingproject.starttime: - existingproject.starttime = minstarttime - if maxendtime > existingproject.endtime: - existingproject.endtime = maxendtime - existingproject.last_addition = datetime.datetime.utcnow() - return existingproject - - totaltime = totalobservingtime(execblocktable) - # If semester proposal = 365 - # If test = 0 - # If semester and DDT = 365 / 2 - minstarttime, maxendtime = getminmaxtime(execblocktable.row.execBlockId, subscantable) - # last_addition - update when another run for this project - lastaddition = datetime.datetime.utcnow() - project = Project( - project_code=extproject.project_code, - opt_project_id=extproject.opt_project_id, - legacy_id=extproject.legacy_id, - title=extproject.title, - abstract=extproject.abstract, - total_observation_time=totaltime, - last_addition=lastaddition, - starttime=minstarttime, - endtime=maxendtime, - proprietary_duration=extproject.proprietary_duration, - ) - if telescope == "ALMA": - project.authors = extproject.authors - - return project - - -class ExternalProject: - def __init__(self, projectcode, title, abstract, proprietaryduration, **kwargs): - self.project_code = projectcode - self.opt_project_id = kwargs["optprojectid"] - self.legacy_id = kwargs["legacyid"] - self.title = title - self.abstract = abstract - self.proprietary_duration = proprietaryduration - self.authors = kwargs["authors"] if "authors" in kwargs else [] - - -def persistauthors(project): - """ - Persist authors - :param projectid: - :return: - """ - saveauthors = [] - authors = projectutils.getauthors(project.opt_project_id) - for author in authors: - existingauthor = archiveutils.getauthor(project.project_code, author.globalid) - if existingauthor is not None: - saveauthors.append(existingauthor) - else: - # Now get the user information from the PST using the globalid - pstuser = proposalutils.getpstuser(author.globalid) - saveauthors.append( - Author( - project_code=project.project_code, - username=pstuser.personAuthentication.personName, - firstname=pstuser.firstName, - lastname=pstuser.lastName, - pst_person_id=author.globalid, - is_pi=projectutils.ispi(project.project_code, author.globalid), - ) - ) - return saveauthors - - -def createfilegroup(): - """ - Create filegroup - :return: - """ - filegroup = Filegroup(type="rawdata") - return filegroup - - -def createsdmtable(sdmtables, filegroup, sdmtable, telescope): - """ - Create file for sdm table - :param sdmtables: - :param filegroup: - :param sdmtable: - :param telescope: - :return: - """ - file_path = filegroup.type - if isinstance(sdmtables[sdmtable], SDMXMLTable): - ngas_id = sdmtables[sdmtable].entityid.replace("://", "___").replace("/", "_") + ".sdm" - filename = sdmtables[sdmtable].tablename + ".xml" - elif isinstance(sdmtables[sdmtable], SDMBinaryTable): - ngas_id = sdmtables[sdmtable].entityid.replace("://", "___").replace("/", "_") + ".bin" - filename = sdmtables[sdmtable].tablename + ".bin" - else: - raise Exception("Invalid SDM table type") - filesize = sdmtables[sdmtable].size / 1000 - format = "sdm" - type = "raw" - - file = File( - file_path=file_path, - ngas_id=ngas_id, - ngas_location=site_name, - ngas_cluster=cluster_name, - filegroup1=filegroup, - filename=filename, - filesize=filesize, - format=format, - type=type, - ingestion_time=datetime.datetime.utcnow(), - ) - - if telescope == "ALMA": - file.ngas_location = "NAASC" - file.ngas_cluster = "NAASC" - - return file - - -TELESCOPE_SIZE_CORRECTION_FACTORS = {"EVLA": 1000, "ALMA": 1000} - - -def createbdffile(bdffile, filegroup, telescope): - """ - Create file for bdf - :param bdffile: - :param filegroup: - :return: - """ - file_path = filegroup.type - if telescope == "EVLA" and "X" in bdffile.entityid: # dummy uid; I think this is deprecated - ngas_id = None - filename = bdffile.entityid # The id given in the XML - filesize = 0 - elif ":///" in bdffile.entityid: # EVLA - filename = bdffile.entityid.replace(":///", "____").replace("/", "_") - ngas_id = filename + ".bdf" - # the filesize sometimes appears to be -99, what's that about? - filesize = int(bdffile.filesize) / TELESCOPE_SIZE_CORRECTION_FACTORS.get(telescope, 1) - if filesize < 0: - LOG.warning(f"Negative filesize {filesize} for filename {filename}") - elif "://" in bdffile.entityid: # ALMA - filename = bdffile.entityid.replace("://", "___").replace("/", "_") - ngas_id = filename + ".bdf" - # the filesize sometimes appears to be -99, what's that about? - filesize = int(bdffile.filesize) / TELESCOPE_SIZE_CORRECTION_FACTORS.get(telescope, 1) - if filesize < 0: - LOG.warning(f"Negative filesize {filesize} for filename {filename}") - format = "bdf" - type = "raw" - file = File( - file_path=file_path, - ngas_id=ngas_id, - ngas_location=site_name, - ngas_cluster=cluster_name, - filegroup1=filegroup, - filename=filename, - filesize=filesize, - format=format, - type=type, - ingestion_time=datetime.datetime.utcnow(), - ) - return file - - -def getid(entityref): - entityid = entityref.get("entityId") - idloc = entityid.rfind("/") - return entityid[idloc + 1 :] - - -def totalobservingtime(execblock): - # TODO units? - observingtime = 0.0 - for row in execblock.row: - starttime = row.startTime / 86400e09 - stoptime = row.endTime / 86400e09 - observingtime += stoptime - starttime - return observingtime - - -def persistexecblock( - fileset, - project, - filegroup, - sbsummarytable, - execblocktable, - subscantable, - nocal, - additional_metadata, - collection_metadata, - output_science_products, - ingestion_path, - ngas_cluster, -): - - files_to_ingest = [] - ost_exec_block_id = getid(execblocktable.row.execBlockUID.EntityRef) - if "X" in ost_exec_block_id: - ost_exec_block_id = 0 - calibration_level = "0" - telescope = execblocktable.row.telescopeName.text - configuration = None - if len(execblocktable.row.findall("configName")) > 0: - configuration = execblocktable.row.configName.text - scheduling_block_id = getid(sbsummarytable.row.sbSummaryUID.EntityRef) - if "X" in scheduling_block_id: - scheduling_block_id = 0 - minstarttime, maxendtime = getminmaxtime(execblocktable.row.execBlockId, subscantable) - schedulingblocktype = sbsummarytable.row.sbType.text - if nocal: - calibration_status = "Do Not Calibrate" - else: - calibration_status = None - - science_product_locator = ng.generate_science_product_locator(telescope.lower(), "execblock") - - if collection_metadata is not None and collection_metadata.isRealFast(): - realfast_metadata = RealFastMetadata(collection_metadata) - execblock = RealfastExecutionBlock( - ost_exec_block_id=ost_exec_block_id, - filegroup=filegroup, - calibration_level=calibration_level, - telescope=telescope, - configuration=configuration, - scheduling_block_id=scheduling_block_id, - project=project, - ngas_fileset_id=fileset, - starttime=minstarttime, - endtime=maxendtime, - calibration_status=calibration_status, - scheduling_block_type=schedulingblocktype, - science_product_locator=science_product_locator, - transient_ra=realfast_metadata.get_transient_ra(), - transient_ra_error=realfast_metadata.get_transient_ra_error(), - transient_dec=realfast_metadata.get_transient_dec(), - transient_dec_error=realfast_metadata.get_transient_dec_error(), - transient_snr=realfast_metadata.get_transient_snr(), - transient_dm=realfast_metadata.get_transient_dm(), - transient_dm_error=realfast_metadata.get_transient_dm_error(), - preaverage_time=realfast_metadata.get_preaverage_time(), - rfpipe_version=realfast_metadata.get_rfpipe_version(), - prefs_id=realfast_metadata.get_prefs_id(), - rf_qa_label=realfast_metadata.get_rf_qa_label(), - rf_qa_zero_fraction=realfast_metadata.get_rf_qa_zero_fraction(), - rf_qa_visibility_noise=realfast_metadata.get_rf_qa_visibility_noise(), - rf_qa_image_noise=realfast_metadata.get_rf_qa_image_noise(), - portal_candidate_ids=realfast_metadata.get_portal_candidate_ids(), - ) - else: - execblock = ExecutionBlock( - ost_exec_block_id=ost_exec_block_id, - filegroup=filegroup, - calibration_level=calibration_level, - telescope=telescope, - configuration=configuration, - scheduling_block_id=scheduling_block_id, - project=project, - ngas_fileset_id=fileset, - starttime=minstarttime, - endtime=maxendtime, - calibration_status=calibration_status, - scheduling_block_type=schedulingblocktype, - science_product_locator=science_product_locator, - ) - science_product = ScienceProduct( - science_product_locator=science_product_locator, - science_product_type="Execution Block", - metadata_ingestion_date=datetime.datetime.utcnow(), - metadata_ingestion_version=1, - external_system="EVLA Operations", - external_name=fileset, - filegroup=filegroup, - ) - - execblock.project.science_products.append(science_product) - - if "ancillary_products" in output_science_products[0].keys(): - ancillary_products = output_science_products[0]["ancillary_products"] - for anc_product in ancillary_products: - LOG.debug(f"Ancillary product: {anc_product}") - product_file = Path(ingestion_path) / anc_product["filename"] - ancillary_product_locator = ng.generate_science_product_locator(telescope.lower(), "ancillary_product") - ancillary_product_filegroup = Filegroup( - type="ancillary_product", - datasize=-1, - ) - if anc_product["type"] == "thumbnail_image": - thumbnail_path = str(Path(ingestion_path) / product_file.name) - preview_path = str(Path(calculate_thumbnail_path(thumbnail_path)[0]).parent) - else: - preview_path = None - ancillary_product_file = File( - ngas_id=ng.generate_uuids_for_ngas(telescope, "ancillary_product", product_file.suffix[1:]), - ngas_location=site_name, - ngas_cluster=ngas_cluster, - filename=product_file.name, - filesize=product_file.stat().st_size, - format=product_file.suffix[1:], - type=anc_product["type"], - checksum=ng.sha256(product_file), - checksum_type="SHA256", - ingestion_time=datetime.datetime.utcnow(), - filegroup1=ancillary_product_filegroup, - preview_storage_path=preview_path, - ) - - files_to_ingest.append((ancillary_product_file, ancillary_product_file.filesize)) - - ancillary_product = AncillaryProduct( - ancillary_product_locator=ancillary_product_locator, - ancillary_product_type=anc_product["type"], - filegroup=ancillary_product_filegroup, - science_product_locator=science_product_locator, - ) - session.add(ancillary_product_filegroup) - session.add(ancillary_product_file) - session.add(ancillary_product) - - # For everything other than ALMA, just null out the alma_ous_uid - if telescope == "ALMA": - mous, gous, sous = almautils.getalmaoushierarchy(execblock.ngas_fileset_id) - createalmaoushierarchy(project.project_code, mous, gous, sous) - execblock.alma_ous_id = mous - science_product.external_system = "ALMA Operations" - science_product.external_name = fileset - else: - execblock.alma_ous_id = None - science_product.external_system = "EVLA Operations" - science_product.external_name = fileset - - return execblock, science_product, files_to_ingest - - -def createalmaoushierarchy(project_code, mousid, gousid, sousid): - """ - Create the OUS hierarchy for an ALMA execblock - :param project_code: - :param mousid: - :param gousid: - :param sousid: - :return: - """ - - schedblock_name = almautils.getschedblockname(mousid) - if archiveutils.ousexists(mousid, "MOUS"): - # Nothing needed. Hierarchy already exists, just add eb - LOG.info(f"MOUS exists, do nothing") - return - elif archiveutils.ousexists(gousid, "GOUS"): - LOG.info(f"No MOUS, but GOUS exists, add MOUS") - mous = AlmaOus(alma_ous_id=mousid, parent_ous_id=gousid, ous_type="MOUS", schedblock_name=schedblock_name) - session.add(mous) - elif archiveutils.ousexists(sousid, "SOUS"): - LOG.info(f"MOUS and GOUS don't exist, but SOUS exists. Add MOUS and GOUS") - gous = AlmaOus(alma_ous_id=gousid, parent_ous_id=sousid, ous_type="GOUS") - session.add(gous) - mous = AlmaOus(alma_ous_id=mousid, parent_ous_id=gousid, ous_type="MOUS", schedblock_name=schedblock_name) - session.add(mous) - else: - LOG.info("SOUS doesn't exist. Create MOUS, GOUS, and SOUS") - sous = AlmaOus(alma_ous_id=sousid, project_code=project_code, ous_type="SOUS") - session.add(sous) - gous = AlmaOus(alma_ous_id=gousid, parent_ous_id=sousid, ous_type="GOUS") - session.add(gous) - mous = AlmaOus(alma_ous_id=mousid, parent_ous_id=gousid, ous_type="MOUS", schedblock_name=schedblock_name) - session.add(mous) - - -def getscans(execblockid, scantable): - # Get only scans associated with this - scanlist = [] - for scan in scantable.row: - if scan.execBlockId == execblockid: - scanlist.append(scan) - - return scanlist - - -def getsubscans(scanid, subscantable): - subscanlist = [] - for subscan in subscantable.row: - if subscan.scanNumber.text == scanid: - subscanlist.append(subscan) - return subscanlist - - -def persistscan( - scan, - execblock, - filegroup, - maintable, - fieldtable, - sourcetable, - spectralwindowtable, - configtable, - datadescriptiontable, - polarizationtable, -): - ost_scan_id = scan.scanNumber.text - minfrequency, maxfrequency, minbandwidth, maxbandwidth, polarizationcode = getaggregatedatadescriptionfields( - ost_scan_id, maintable, configtable, datadescriptiontable, polarizationtable, spectralwindowtable - ) - if "OBSERVE" in scan.scanIntent.text: - obstype = "OBS" - elif "CALIBRATE" in scan.scanIntent.text: - obstype = "CAL" - else: - obstype = "OTHER" - scanobject = Scan( - ost_scan_id=ost_scan_id, - execution_block=execblock, - filegroup=filegroup, - max_bandwidth=maxbandwidth, - min_bandwidth=minbandwidth, - polarization_code=polarizationcode, - max_frequency=maxfrequency, - min_frequency=minfrequency, - ) - return scanobject - - -def getdatadescriptions(scanid, subscanid, maintable, configtable): - maintablerow = getmaintablerow(maintable, scanid, subscanid) - configdescriptionrow = getconfigtablerow(configtable, maintablerow.configDescriptionId) - dataDescriptions = configdescriptionrow.dataDescriptionId.text.split()[2:] - return dataDescriptions - - -def persistdatadescription( - scanid, subscanid, subscanobject, datadescriptionid, datadescriptiontable, polarizationtable, spectralwindowtable -): - frequency, bandwidth, polarizationcode, polarizations = getdatadescriptionfields( - scanid, subscanid, datadescriptionid, datadescriptiontable, polarizationtable, spectralwindowtable - ) - polarization = archiveutils.getpolarization(polarizationcode) - # datadescription = archiveutils.getdatadescription(bandwidth, frequency, polarization.polarization_id, session) - # if datadescription is None: - datadescription = DataDescription( - bandwidth=bandwidth, frequency=frequency, polarization_id=polarization.polarization_id - ) - session.add(datadescription) - return datadescription - - -def persistsubscan( - bdffilemap, - execblock, - scan, - subscan, - scanIntent, - maintable, - configtable, - datadescriptiontable, - polarizationtable, - spectralwindowtable, - fieldtable, - sourcetable, - execblocktable, - window_receivers, -): - backend = "none" - intent = " ".join(scanIntent.split(" ")[2:]) - starttimeMJD = datetoMJD(subscan.startTime) - endtimeMJD = datetoMJD(subscan.endTime) - subscanid = subscan.subscanNumber.text - - if intent == "CALIBRATE_POINTING": - obstype = "POINT" - elif intent == "UNSPECIFIED": - obstype = "UNKWN" - elif "OBSERVE_TARGET" in intent: - obstype = "OBS" - elif "CALIBRATE" in intent: - obstype = "CAL" - elif intent == "none": - obstype = "TRACK" - else: - obstype = "OTHER" - - exposure_time = round((endtimeMJD - starttimeMJD) * 86400, 2) # 4 decimal places - if subscan.find("numIntegration") is not None and subscan.numIntegration != 0: - integration_time = round(exposure_time / subscan.numIntegration, 3) - elif subscan.find("numberIntegration") is not None and subscan.numberIntegration != 0: - integration_time = round(exposure_time / subscan.numberIntegration, 3) - else: - integration_time = 0 - ra, dec = getraanddec(maintable, fieldtable, sourcetable, scan.ost_scan_id, subscan.subscanNumber) - # TODO receiver id and build receiver table - bands = getbands( - scan.ost_scan_id, - subscan.subscanNumber, - maintable, - configtable, - datadescriptiontable, - spectralwindowtable, - execblocktable, - window_receivers, - ) - receiver_id = 0 - - subscanobject = Subscan( - scan=scan, - file_id=10, - ost_subscan_id=subscanid, - obstype=obstype, - starttime=starttimeMJD, - endtime=endtimeMJD, - sourcename="", - sourcetype="STAR", - ra=ra, - dec=dec, - exposure_time=exposure_time, - integration_time=integration_time, - receiver_id=receiver_id, - backend=backend, - intent=intent, - ) - # Get list of data descriptions for this subscan / config - datadescriptionlist = getdatadescriptions(scan.ost_scan_id, subscan.subscanNumber, maintable, configtable) - # Build data_descripions rows - maintablerow = getmaintablerow(maintable, scan.ost_scan_id, subscan.subscanNumber) - configuration = re.sub("\w*_", "", maintablerow.configDescriptionId.text) - configobject = archiveutils.getconfiguration(execblock.execution_block_id, int(configuration), session) - if configobject is None: - # Not found, create a new one - configobject = Configuration(configuration=int(configuration), execution_block=execblock) - for datadescription in datadescriptionlist: - datadescriptionobject = persistdatadescription( - scan.ost_scan_id, - subscan.subscanNumber, - subscanobject, - datadescription, - datadescriptiontable, - polarizationtable, - spectralwindowtable, - ) - datadescriptionobject.configuration = configobject - session.add(datadescriptionobject) - session.add(configobject) - - # XML change - bdffileid = None - if maintablerow.find("dataUID") is not None: - bdffileid = maintablerow.dataUID.EntityRef.get("entityId") - elif maintablerow.find("dataOid") is not None: - bdffileid = maintablerow.dataOid.EntityRef.get("entityId") - else: - LOG.critical("Invalid XML element in Main table") - - if execblocktable.row.telescopeName == "EVLA" and "X" in bdffileid: - subscanobject.file = None - else: - subscanobject.file = bdffilemap[bdffileid] - fieldtablerow = getfieldrow(fieldtable, maintablerow.fieldId) - sourcetablerow = getsourcerow(sourcetable, fieldtablerow.sourceId) - subscanobject.sourcename = sourcetablerow.sourceName.text - subscanobject.configuration = configobject - return subscanobject, bands - - -def getaggregatedatadescriptionfields( - scanid, maintable, configtable, datadescriptiontable, polarizationtable, spectralwindowtable -): - minfrequency, maxfrequency, minbandwidth, maxbandwidth, pcode = 0, 0, 0, 0, 240 - frequencies = [] - bandwidths = [] - polarizationset = set() - subscans = [] - datadescriptions = [] - for row in maintable.row: - if row.scanNumber.text == scanid: - subscans.append(row.subscanNumber.text) - for subscan in subscans: - datadescriptions = getdatadescriptions(scanid, subscan, maintable, configtable) - for datadescription in datadescriptions: - pcode = 0 - frequency, bandwidth, polarizationcode, polarizations = getdatadescriptionfields( - scanid, subscans, datadescription, datadescriptiontable, polarizationtable, spectralwindowtable - ) - frequencies.append(frequency) - bandwidths.append(bandwidth) - polarizationset = polarizationset.union(polarizations) - for polarizationelement in polarizationset: - pcode += archiveutils.getpolarizationcode(polarizationelement) - minfrequency = min(frequencies) - maxfrequency = max(frequencies) - minbandwidth = min(bandwidths) - maxbandwidth = max(bandwidths) - - return minfrequency, maxfrequency, minbandwidth, maxbandwidth, pcode - - -def getdatadescriptionfields( - scanid, subscanid, dataDescriptionId, datadescriptiontable, polarizationtable, spectralwindowtable -): - datadescriptionrow = getdatadescriptionrow(datadescriptiontable, dataDescriptionId) - spectralwindowrow = getspectralwindowrow(spectralwindowtable, datadescriptionrow.spectralWindowId) - frequency = spectralwindowrow.refFreq.text - bandwidth = spectralwindowrow.totBandwidth.text - polarizationrow = getpolarizationrow(polarizationtable, datadescriptionrow.polOrHoloId) - polarization = polarizationrow.corrType.text - - polarizations = ", ".join(polarization.split()[2:]) - polarizationlist = polarization.split()[2:] - polarizationcode = archiveutils.getpolarizationcode(polarizations) - - return float(frequency), float(bandwidth), int(polarizationcode), polarizationlist - - -def getbands( - scanid, - subscanid, - maintable, - configtable, - datadescriptiontable, - spectralwindowtable, - execblocktable, - window_receivers, -): - # TODO use this for bands - - bandsset = set() - datadescriptionlist = getdatadescriptions(scanid, subscanid, maintable, configtable) - # Build data_descripions rows - for datadescription in datadescriptionlist: - datadescriptionrow = getdatadescriptionrow(datadescriptiontable, datadescription) - # NB. The ALMA method here is ostensibly the right way to do this. - # However, the CBE in the past guessed what the receiver should be, and - # wrote that guess into the SDM in the Receivers table. So, the value - # in the Receivers table cannot be trusted in all cases for EVLA, hence, - # the inference is made by the spectral window's name, which apparently - # is correct in all cases for EVLA. - if execblocktable.row.telescopeName == "ALMA": - # make sure we have a receiver band - if datadescriptionrow.spectralWindowId.text in window_receivers: - bandsset.add(window_receivers[datadescriptionrow.spectralWindowId.text]) - else: - LOG.error("Unable to locate any receivers for this spectral window!") - else: - spectralwindowrow = getspectralwindowrow(spectralwindowtable, datadescriptionrow.spectralWindowId) - band = re.sub("\w*_", "", spectralwindowrow.name.text) - band = re.sub("#\w*", "", band) - bandsset.add(re.sub("#\w*", "", band)) - return bandsset - - -# Methods to return row matching id -def getmaintablerow(maintable, scanid, subscanid): - for row in maintable.row: - if int(row.scanNumber.text) == int(scanid) and int(row.subscanNumber.text) == int(subscanid): - return row - return None - - -def getconfigtablerow(configtable, configid): - for row in configtable.row: - if row.configDescriptionId == configid: - return row - return None - - -def getdatadescriptionrow(datadescriptiontable, datadescriptionid): - for row in datadescriptiontable.row: - if row.dataDescriptionId == datadescriptionid: - return row - return None - - -def getpolarizationrow(polarizationtable, polarizationid): - for row in polarizationtable.row: - if row.polarizationId == polarizationid: - return row - return None - - -def getspectralwindowrow(spectralwindowtable, spectralwindowid): - for row in spectralwindowtable.row: - if row.spectralWindowId == spectralwindowid: - return row - return None - - -def getfieldrow(fieldtable, fieldId): - for row in fieldtable.row: - if row.fieldId == fieldId: - return row - return None - - -def getsourcerow(sourcetable, sourceId): - for row in sourcetable.row: - if row.sourceId == sourceId: - return row - return None - - -def getraanddec(maintable, fieldtable, sourcetable, scanid, subscanid): - mainrow = getmaintablerow(maintable, scanid, subscanid) - fieldrow = getfieldrow(fieldtable, mainrow.fieldId) - sourcerow = getsourcerow(sourcetable, fieldrow.sourceId) - radeclist = sourcerow.direction.text.split(" ") - return radeclist[2], radeclist[3] - - -def datetoMJD(subscantime): - iat_utc = 0.0 - asdmMjd = 54500.0 - - asdmMjd = (subscantime + iat_utc) / 86400.0e9 - return asdmMjd - - -def getminmaxtime(execblockid, subscantable): - minstarttime, maxendtime = math.inf, -math.inf - - for row in subscantable.row: - if row.execBlockId == execblockid: - if row.startTime < minstarttime: - minstarttime = row.startTime - if row.endTime > maxendtime: - maxendtime = row.endTime - return datetoMJD(minstarttime), datetoMJD(maxendtime) - - -def filesdump(ingest_files): - for file in ingest_files: - LOG.info(f"File name: {file[0].filename} Size: {file[1]}") - - -def dump_bdf_files(bdffiles): - for bdffile in bdffiles: - LOG.info(f"BDF file name: {bdffile.entityid} Size: {bdffile.filesize}") diff --git a/apps/cli/executables/pexable/ingest/ingest/projectutils.py b/apps/cli/executables/pexable/ingest/ingest/projectutils.py deleted file mode 100644 index 10237ec64c44a415398923a7078a846747216460..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/projectutils.py +++ /dev/null @@ -1,65 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -from sqlalchemy import text - -from .schema import create_session -from .schema.optmodel import Coauthor, Project, Projectauthor - -session = create_session("OPT") - - -def getproject(projectid): - project = session.query(Project).filter(text("id=:projectid")).params(projectid=projectid).first() - session.close() - return project - - -# Get the global ids for the PI and coauthors of the project -def getauthors(projectid): - pi = ( - session.query(Projectauthor) - .join(Project, Projectauthor.id == Project.pi) - .filter(text("Project.id=:projectid")) - .params(projectid=projectid) - ) - coauthors = ( - session.query(Projectauthor) - .join(Coauthor, Projectauthor.id == Coauthor.projectauthor_id) - .join(Project, Coauthor.project_id == Project.id) - .filter(text("Project.id=:projectid")) - .params(projectid=projectid) - ) - authors = pi.union(coauthors).all() - session.close() - return authors - - -def ispi(projectcode, globalid): - pi = ( - session.query(Projectauthor) - .join(Project, Projectauthor.id == Project.pi) - .filter(text("Project.projectcode=:projectcode")) - .filter(text("Projectauthor.globalid=:globalid")) - .params(projectcode=projectcode) - .params(globalid=globalid) - .one_or_none() - ) - if pi is None: - return False - else: - return True diff --git a/apps/cli/executables/pexable/ingest/ingest/proposalqueries.py b/apps/cli/executables/pexable/ingest/ingest/proposalqueries.py deleted file mode 100644 index 6bc6f6608cc2aa53dbe59830ad579e6bdbd8495f..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/proposalqueries.py +++ /dev/null @@ -1,36 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -from sqlalchemy import create_engine, text -from sqlalchemy.orm import sessionmaker - -from .schema.pstmodel import Proposal - -# CAPO ! -pstengine = create_engine("mysql://jerry:garcia@webtest.aoc.nrao.edu/nrao_200", echo=True) -Session = sessionmaker(bind=pstengine) -session = Session() - - -def getproposal(proposalcode): - proposal = ( - session.query(Proposal) - .filter(text("PROP_ID like :proposalcode")) - .params(proposalcode="%" + proposalcode + "%") - .first() - ) - return proposal diff --git a/apps/cli/executables/pexable/ingest/ingest/proposalutils.py b/apps/cli/executables/pexable/ingest/ingest/proposalutils.py deleted file mode 100644 index e515d5b1d0f9676a5552f9d49c210175f781a91e..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/proposalutils.py +++ /dev/null @@ -1,100 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -from sqlalchemy import text - -from .schema import create_session -from .schema.pstmodel import Author, Person, Proposal, UserAuthentication - -session = create_session("PST") - - -def getproposal(telescope, proposalcode): - code = f"%{proposalcode}%" - - if telescope == "VLBA": - proposal = ( - session.query(Proposal) - .filter(Proposal.TELESCOPE == telescope) - .filter(Proposal.LEGACY_ID.like(code)) - .one_or_none() - ) - else: # VLA - proposal = ( - session.query(Proposal) - .filter(Proposal.TELESCOPE == telescope) - .filter(Proposal.PROP_ID.like(code)) - .one_or_none() - ) - session.close() - return proposal - - -def getauthors(telescope, proposalcode): - code = f"%{proposalcode}%" - - if telescope == "VLBA": - authors = ( - session.query(Author) - .join(Proposal, Author.proposal_id == Proposal.proposal_id) - .join(UserAuthentication, Author.user_id == UserAuthentication.userAuthentication_id) - .filter(Proposal.TELESCOPE == telescope) - .filter(Proposal.LEGACY_ID.like(code)) - .all() - ) - else: # VLA - authors = ( - session.query(Author) - .join(Proposal, Author.proposal_id == Proposal.proposal_id) - .join(UserAuthentication, Author.user_id == UserAuthentication.userAuthentication_id) - .filter(Proposal.TELESCOPE == telescope) - .filter(Proposal.PROP_ID.like(code)) - .all() - ) - - session.close() - return authors - - -def getpstuser(globalid): - user = session.query(Person).filter(text("person_id=:personid")).params(personid=globalid).one() - - return user - - -def ispi(author): - if author.proposal.principal_investigator_id == author.author_id: - return True - else: - return False - - -def main(): - telescope = "VLA" - proposal_code = "22A-011" - # telescope = 'VLBA' - # proposal_code = 'BF132' - proposal = getproposal(telescope, proposal_code) - if proposal is not None: - print(f"Proposal: {proposal.PROP_ID}") - authors = getauthors(telescope, proposal_code) - for author in authors: - print(f"Author: {author.LAST_NAME}") - - -if __name__ == "__main__": - main() diff --git a/apps/cli/executables/pexable/ingest/ingest/pymygdala/__init__.py b/apps/cli/executables/pexable/ingest/ingest/pymygdala/__init__.py deleted file mode 100644 index dcc3a9cdfd474c01dd1522daa4923b2480b2d361..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/pymygdala/__init__.py +++ /dev/null @@ -1,26 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -r""" Pymygdala: a CAPO aware Python library built atop pika for interacting with RabbitMQ, plus assorted simple command line applications built on the library. - -Using this library you can log messages to RabbitMQ with a standard-isg logging handler and the Python logging package, you can monitor a RabbitMQ server and dump out the logs, and you can send various events to the server. -Many (most?) of the defaults for things like routing keys, exchange names and CAPO properties are heavily NRAO-centric but you can order-ride them if you want. -""" - -from .models import LogDumper, LogHandler, RPCEvent, SendEvent, SendNRAOEvent diff --git a/apps/cli/executables/pexable/ingest/ingest/pymygdala/commands.py b/apps/cli/executables/pexable/ingest/ingest/pymygdala/commands.py deleted file mode 100644 index 61a531a8976e961be31f980dd15ee18f8629fe4d..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/pymygdala/commands.py +++ /dev/null @@ -1,367 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import argparse as ap -import json -import logging -import os -import re -import subprocess -import sys - -from pyat import version -from pyat.pymygdala import LogDumper, LogHandler, SendEvent, SendNRAOEvent -from pyat.pymygdala.models import MotDBroadcaster - -_ERR_MISSING_PROFILE = r"""ERROR: {script} can't deduce the 'profile', give it the --profile argument or set the CAPO_PROFILE environment variable! Geeze! - -""" -_ERR_UNKNOWN_LEVEL = r"""ERROR: {script} pass unknown logging level {level}, expected DEBUG, INFO, WARN or ERROR -""" - -_DUMPLOGS_NAME = "pym-dumplogs" -_DUMPLOGS_DESCRIPTION = r"""{script}, {version}: connect to a RabbitMQ server and dump the logs out. -""" -_DUMPLOGS_EPILOG = r"""Return values: - 0: everything worked as expected - 1: missing CAPO profile, no --profile argument or environment variable - 2: can't connect to specified RabbitMQ server -""" - - -def get_common_parser(description, epilog): - r"""Returns a parser for all these scripts with all the common parameters. - - :param description: - :param epilog: - :return: - """ - p = ap.ArgumentParser(description=description, epilog=epilog, formatter_class=ap.RawDescriptionHelpFormatter) - p.add_argument("--profile", action="store", help="CAPO profile name to use, e.g. test, production") - p.add_argument("--exchange", action="store", help="exchange name to use, e.g. archive.logs") - p.add_argument("--type", action="store", dest="exchange_type", help="exchange type to use, e.g. fanout") - p.add_argument("--hostname", action="store", help="server name of the RabbitMQ server") - p.add_argument("--username", action="store", help="username of the RabbitMQ server") - p.add_argument("--password", action="store", help="password of the RabbitMQ server") - p.add_argument("--port", action="store", type=int, help="port number of the RabbitMQ server") - p.add_argument("--key", action="store", dest="routing_key", help="routing key, e.g. archive.logs") - return p - - -def ns_to_d(ns): - r"""Convert a namespace into a dict, dropping properties that are 'None' along the way. - - :param ns: - :return: - """ - return {key: value for key, value in vars(ns).items() if value is not None} - - -def get_settings(parser, script, **kwargs): - r"""Get the settings from a given parser, for a given script. - - :param parser: - :param script: - :return: - """ - d = ns_to_d(parser.parse_args(**kwargs)) - - if "profile" not in d and "CAPO_PROFILE" not in os.environ: - sys.stderr.write(_ERR_MISSING_PROFILE.format(script=script)) - parser.print_help() - sys.exit(1) - d["profile"] = os.environ["CAPO_PROFILE"] if "profile" not in d else d["profile"] - return d - - -def get_dumplogs_parser(): - r"""Get a parser for the pym-dumplogs CLI. - - :return: - """ - p = get_common_parser(_DUMPLOGS_DESCRIPTION.format(script=_DUMPLOGS_NAME, version=version), _DUMPLOGS_EPILOG) - p.add_argument("--outfile", action="store", default="-", help="write output to file, - for STDOUT") - return p - - -def dumplogs(): - r"""The pym-dumplogs CLI. - - :return: - """ - parser = get_dumplogs_parser() - settings = get_settings(parser, _DUMPLOGS_NAME) - dumper = LogDumper(**settings) - dumper.dump() - - -_SENDLOG_NAME = "pym-sendlog" -_SENDLOG_DESCRIPTION = r"""{script}, {version}: a command line tool for logging to RabbitMQ.""" -_SENDLOG_EPILOG = r"""Return values: - 0: everything worked as expected - 1: missing CAPO profile, no '--profile' argument or environment variable - 2: can't connect to specified RabbitMQ server - 3: unknown logging level, should be DEBUG, INFO, WARN or ERROR -""" - - -def get_sendlog_parser(): - p = get_common_parser(_SENDLOG_DESCRIPTION.format(script=_SENDLOG_NAME, version=version), _SENDLOG_EPILOG) - r = p.add_argument_group("Required Arguments") - r.add_argument("--level", action="store", required=True, help="logging level, e.g. DEBUG, WARN") - r.add_argument("--message", action="store", required=True, help="message to log") - r.add_argument("--app", dest="application", action="store", required=True, help="the application name to log as") - return p - - -def sendlog(): - r"""The pym-sendlog CLI. - - :Returns: - 0: everything worked as expected - 1: can't deduce CAPO_PROFILE - 2: error talking to RabbitMQ - 3: bad level (not DEBUG, INFO, WARN or ERROR) - """ - parser = get_sendlog_parser() - settings = get_settings(parser, _SENDLOG_NAME) - log = logging.getLogger(__name__) - log.setLevel(logging.DEBUG) - handler = LogHandler(**settings) - log.addHandler(handler) - fn = None - if settings["level"] == "DEBUG": - fn = log.debug - elif settings["level"] == "INFO": - fn = log.debug - elif settings["level"] == "WARN": - fn = log.debug - elif settings["level"] == "ERROR": - fn = log.debug - - if fn is not None: - try: - fn(settings["message"]) - except: - sys.stderr.write(_ERR_MISSING_PROFILE.format(script=_SENDLOG_NAME)) - parser.print_help() - sys.exit(2) - else: - sys.stderr.write(_ERR_UNKNOWN_LEVEL.format(script=_SENDLOG_NAME, level=settings["level"])) - parser.print_help() - sys.exit(4) - - -def amqp_logging_shell_wrapper(): - parser = get_common_parser( - "logwrapper, {version}: a command line tool for sending console output " - "of some other command to RabbitMQ.".format(version=version), - "", - ) - parser.add_argument("cmd", type=str, nargs="*") - settings = get_settings(parser, _SENDLOG_NAME) - log = logging.getLogger(__name__) - log.setLevel(logging.DEBUG) - settings["application"] = settings["cmd"][0] - handler = LogHandler(**settings) - log.addHandler(handler) - with subprocess.Popen( - settings["cmd"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1, universal_newlines=True - ) as p: - for line in p.stdout: - log.info(line.strip()) - return p.returncode - - -_SENDEVENT_NAME = "pym-sendevent" -_SENDEVENT_DESCRIPTION = r"""{script}, {version}: send an event to a RabbitMQ server.""" -_SENDEVENT_EPILOG = r"""Return values: - 0: everything worked as expected - 1: missing CAPO profile, no '--profile' argument or environment variable - 2: can't connect to specified RabbitMQ server -""" - - -def get_sendevent_parser(): - p = get_common_parser(_SENDEVENT_DESCRIPTION.format(script=_SENDEVENT_NAME, version=version), _SENDEVENT_EPILOG) - p.add_argument("--event", dest="eventName", action="store", help="eventName to send, e.g. runSdmIngestionWorkflow") - p.add_argument( - "--nrao", dest="nrao_event", action="store_true", default=False, help="add NRAO specific fields to the event" - ) - p.add_argument("--message", action="store", default="", help="provide a string for the event message") - p.add_argument( - "--md-name", dest="md_name", action="store", default="logData", help="name of an extra metadata message section" - ) - p.add_argument( - "--metadata", - action="append", - default=[], - help="provide a KEY=VALUE pair in the md-name section of the message; can be used multiple times", - ) - r = p.add_argument_group("Required Arguments") - r.add_argument("--app", dest="application", action="store", required=True, help="the application name to log as") - return p - - -def build_event(settings): - result = {"message": settings["message"]} - if "md_name" in settings: - result[settings["md_name"]] = dict(arg.split("=") for arg in settings["metadata"]) - if "eventName" in settings: - result["eventName"] = settings["eventName"] - return result - - -def sendevent(**kwargs): - r"""The pym-sendevent CLI. - - :Returns: - 0: everything worked as expected - 1: can't deduce CAPO_PROFILE - 2: error talking to RabbitMQ - """ - parser = get_sendevent_parser() - settings = get_settings(parser, _SENDEVENT_NAME, **kwargs) - event = build_event(settings) - try: - if settings["nrao_event"]: - se = SendNRAOEvent(**settings) - else: - se = SendEvent(**settings) - se.send(event) - except: - sys.stderr.write(_ERR_MISSING_PROFILE.format(script=_SENDEVENT_NAME)) - parser.print_help() - sys.exit(2) - - -def ingestion_complete(): - parser = get_common_parser("Simulate an ingestion-complete event", "") - parser.add_argument( - "--ingestion_type", - type=str, - action="store", - default="rawdata", - help="Type of ingestion which just finished (ex. rawdata, calibration", - ) - parser.add_argument( - "--execblock_id", type=str, action="store", help="Execution block ID which just finished ingesting" - ) - parser.add_argument( - "--skip_screen", - type=str, - action="store", - default="False", - help="If set to True launches CIPL independent of current cal status (False by default)", - ) - parser.add_argument("--fileset_id", type=str, required=True, help="File set ID of the ingestion that completed") - parser.add_argument("--telescope", type=str, action="store", default="EVLA", help="Telescope originating this data") - parser.add_argument("--schedblock_id", type=str, action="store", help="Scheduling block ID for this data") - parser.add_argument( - "--schedblock_type", - type=str, - action="store", - default="SCIENCE", - help="Scheduling block type (SCIENCE, OPERATIONS, EXPERT, TEST)", - ) - parser.add_argument("--project_code", type=str, action="store", help="Project code for this data") - parser.add_argument("--vlass", action="store_true", default=False, help="Wait for VLASS Manager reply") - parser.add_argument( - "--file_count", type=str, action="store", default="1", help="Number of files that were just ingested here" - ) - args = parser.parse_args() - - settings = get_settings(parser, "ingestion-complete") - settings["message"] = "Ingestion complete" - settings["routing_key"] = "ingestion-complete." + ( - "rawdata" if settings["ingestion_type"] == "observation" else settings["ingestion_type"] - ) - - # let's try parsing the data we need from the fileset ID - match = re.search(r"(.*)\.sb(\d+)\.eb(\d+)\..*", args.fileset_id) - if match: - project_code, schedblock_id, execblock_id = match.groups() - else: - project_code, schedblock_id, execblock_id = None, None, None - - event = build_event(settings) - eb_id = args.execblock_id or execblock_id - event["logData"] = { - "ingestion_type": args.ingestion_type, - "execblock_id": eb_id, - "override_db_screen": args.skip_screen, - "fileset_id": args.fileset_id, - "telescope": args.telescope, - "schedblock_id": args.schedblock_id or schedblock_id, - "schedblock_type": args.schedblock_type, - "project_code": args.project_code or project_code, - "file_count": args.file_count, - "profile": args.profile, - } - - try: - if "nrao_event" in settings and settings["nrao_event"]: - se = SendNRAOEvent(**settings) - else: - se = SendEvent(**settings) - - # make the queue and get ready for the callback message - if args.vlass or "VLASS" in (args.project_code or project_code): - queue = se.channel.queue_declare(queue="", exclusive=True, auto_delete=True, durable=False).method.queue - se.channel.queue_bind(queue=queue, exchange="archive.events", routing_key="VlassMngr." + eb_id) - - se.send(event) - - if args.vlass or "VLASS" in (args.project_code or project_code): - print("message sent, waiting for reply from the manager") - - # we're going to iterate that queue, but we really just want the first message - # so we'll exit at the end of the first loop iteration - for _, properties, message in se.channel.consume(queue): - response = json.loads(message) - print("VlassMngr response: " + response["message"]) - se.close() - sys.exit(0 if response["logData"]["launching_jobs"] == "true" else 1) - else: - print("message sent") - except Exception as e: - sys.stdout.write(e) - sys.stderr.write(_ERR_MISSING_PROFILE.format(script=_SENDEVENT_NAME)) - parser.print_help() - sys.exit(2) - - -def sendmotd(): - r"""The pym-sendmotd CLI. - - :Returns: - 0: everything worked as expected - 1: can't deduce CAPO_PROFILE - 2: error talking to RabbitMQ - 3: bad level (not DEBUG, INFO, WARN or ERROR) - """ - parser = get_sendlog_parser() - settings = get_settings(parser, _SENDLOG_NAME) - handler = MotDBroadcaster(**settings) - handler.broadcast(settings["message"]) - - -# if __name__ == '__main__': -# try: -# sendmotd() -# except Exception as mex: -# print('__main__:{0}'.format(mex)) diff --git a/apps/cli/executables/pexable/ingest/ingest/pymygdala/models.py b/apps/cli/executables/pexable/ingest/ingest/pymygdala/models.py deleted file mode 100644 index 9d967ccd81e3aa2ee07420dab0b12b75ec964c3f..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/pymygdala/models.py +++ /dev/null @@ -1,717 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -import contextlib -import datetime -import getpass -import logging -import os -import socket -import sys -import uuid -from threading import Lock - -import pika -import simplejson as json -from dateutil.parser import parse -from pycapo import CapoConfig - -# CAPO properties we care about -CAPO_PROP_HOSTNAME = "edu.nrao.archive.configuration.AmqpServer.hostname" -CAPO_PROP_USERNAME = "edu.nrao.archive.configuration.AmqpServer.username" -CAPO_PROP_PASSWORD = "edu.nrao.archive.configuration.AmqpServer.password" -CAPO_PROP_PORT = "edu.nrao.archive.configuration.AmqpServer.port" - -# Assorted other defaults. -CONNECTION_ATTEMPTS = 5 -RETRY_DELAY = 500 -SOCKET_TIMEOUT = 5000 -LOG_ROUTING_KEY_FORMAT = "{application}.{level}" -EVENT_ROUTING_KEY_FORMAT = "{application}.event" -EVENT_EXCHANGE = "archive.events" -EVENT_EXCHANGE_TYPE = "topic" -LOG_EXCHANGE = "archive.logs" -LOG_EXCHANGE_TYPE = "fanout" -MOTD_ROUTING_KEY_FORMAT = "{application}.motd" -MOTD_EXCHANGE = "archive.frontend.motd" -MOTD_EXCHANGE_TYPE = "fanout" -MOTD_LEVEL = "info" -LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" -LOG_LEVEL = logging.NOTSET -LOGDUMPER_FORMAT = ( - "{hostname} - {date} [{threadName}] {level:<5} {loggerName:<36}#{method}:{line} - {formattedMessage}\n" -) - - -def _now(): - r"""Get the current date and time in UTC as a string, round the fractional seconds to the precision that won't break jaxb.""" - t = datetime.datetime.now() - s = t.strftime("%Y-%m-%dT%H:%M:%S.%f") - f = round(float(s[-7:]), 3) - temp = "%.3f" % f - temp = "%s%s" % (s[:-7], temp[1:]) - return temp + "+00:00" - - -@contextlib.contextmanager -def _smart_open(filename=None): - """If we get a filename and it isn't '-', return a file handle to it for appending, else return a file handle to stdout. Saw on stack overflow, I'm not this clever. - http://stackoverflow.com/questions/17602878/how-to-handle-both-with-open-and-sys-stdout-nicely - """ - if filename and filename != "-": - fh = open(filename, "a") - else: - fh = sys.stdout - - try: - yield fh - finally: - if fh is not sys.stdout: - fh.close() - - -class _Pymygdala: - r"""Class for sending events to a RabbitMQ server. This gets used as a base class for the other exposed classes in the package. - - :Keyword Arguments: - *profile* ("string"): the name of the profile to use, e.g. 'test', 'production'. If missing this defaults to the CAPO_PROFILE environment variable, if that is missing as well it explodes, throwing a ValueError exception. A profile should be a simple word, one without spaces or tabs or evil things in it. This is not checked and no guarantee is provided. - - *application* ("string"): the name of the application sending the event or message, "unknown" by default. - - *hostname* ("string"): name of the AMQP server to use, defaults to CAPO property pymygdala.CAPO_PROP_HOSTNAME. - - *username* ("string"): username to connect to AMQP with, defaults to CAPO property pymygdala.CAPO_PROP_USERNAME. - - *password* ("string"): password to connect to AMQP with, defaults to CAPO property pymygdala.CAPO_PROP_PASSWORD. - - *port* ("int"): port number to connect to AMQP with, defaults to CAPO property pymygdala.CAPO_PROP_PORT. - - *exchange* ("string"): the exchange to use, defaults to pymygdala.EVENT_EXCHANGE. - - *exchange_type* ("string"): type of exchange to use, defaults to pymygdala.EVENT_EXCHANGE_TYPE. - - *routing_key* ("string"): how messages will be routed to queues, format defaults to pymygdala.EVENT_ROUTING_KEY_FORMAT. - - *connection_attempts* (int): maximum number of retry attempts. - - *retry_delay* (int|float): time to wait in seconds, before the next. - - *socket_timeout* (int|float): use for high latency networks. - - :Example: - """ - - def __init__(self, **kwargs): - if "profile" in kwargs: - self.profile = kwargs["profile"] - elif "CAPO_PROFILE" in os.environ: - self.profile = os.environ["CAPO_PROFILE"] - else: - raise ValueError("Can not deduce CAPO profile to use") - self.config = CapoConfig(profile=self.profile) - self.application = kwargs.get("application", "unknown") - self.exchange = kwargs.get("exchange", EVENT_EXCHANGE) - self.exchange_type = kwargs.get("exchange_type", EVENT_EXCHANGE_TYPE) - self.routing_key = kwargs.get("routing_key", EVENT_ROUTING_KEY_FORMAT.format(application=self.application)) - - # Connection parameters for talking to RabbitMQ - self.connection_parameters = pika.ConnectionParameters( - host=kwargs.get("hostname", self.config.getstring(CAPO_PROP_HOSTNAME)), - port=kwargs.get("port", self.config.getint(CAPO_PROP_PORT)), - connection_attempts=kwargs.get("connection_attempts", CONNECTION_ATTEMPTS), - socket_timeout=kwargs.get("socket_timeout", SOCKET_TIMEOUT), - retry_delay=kwargs.get("retry_delay", RETRY_DELAY), - credentials=pika.PlainCredentials( - username=kwargs.get("username", self.config.getstring(CAPO_PROP_USERNAME)), - password=kwargs.get("password", self.config.getstring(CAPO_PROP_PASSWORD)), - ), - ) - - # Parameters we derive or produce and don't let the caller set - self.sender_username = getpass.getuser() - self.sender_hostname = socket.gethostname() - self.connection = None - self.channel = None - self._lock = Lock() - self._open_connection() - - def _close_connection(self): - if self.channel: - self.channel.close() - if self.connection: - self.connection.close() - self.connection, self.channel = None, None - - def _open_connection(self): - self.connection = pika.BlockingConnection(self.connection_parameters) - self.channel = self.connection.channel() - self.channel.exchange_declare(self.exchange, exchange_type=self.exchange_type, durable=True, auto_delete=False) - - def close(self): - self._lock.acquire() - try: - self._close_connection() - finally: - self._lock.release() - - def _create_basic_props(self, prop_dict): - """Takes a dictionary of values and generates a pika.BasicProperties() call - - From the Spec - class pika.spec.BasicProperties( - content_type=None, - content_encoding=None, - headers=None, - delivery_mode=None, - priority=None, - correlation_id=None, - reply_to=None, - expiration=None, - message_id=None, - timestamp=None, - type=None, - user_id=None, - app_id=None, - cluster_id=None - ) - - - """ - my_content_type = None - my_content_encoding = None - my_headers = None - my_delivery_mode = None - my_priority = None - my_correlation_id = None - my_reply_to = None - my_expiration = None - my_message_id = None - my_timestamp = None - my_type = None - my_user_id = None - my_app_id = None - my_cluster_id = None - - # TODO: The rest of the properties. I'm sure we'll use them at some point. - - if "reply_to" in prop_dict: - my_reply_to = prop_dict["reply_to"] - - if "correlation_id" in prop_dict: - my_correlation_id = prop_dict["correlation_id"] - - return pika.BasicProperties( - content_type=my_content_type, - content_encoding=my_content_encoding, - headers=my_headers, - delivery_mode=my_delivery_mode, - priority=my_priority, - correlation_id=my_correlation_id, - reply_to=my_reply_to, - expiration=my_expiration, - message_id=my_message_id, - timestamp=my_timestamp, - type=my_type, - user_id=my_user_id, - app_id=my_app_id, - cluster_id=my_cluster_id, - ) - - def _send(self, event, routing_key=None, headers=None): - """I need a docstring here.""" - if routing_key is None: - routing_key = self.routing_key - self._lock.acquire() - try: - if headers is not None: - publication_properties = self._create_basic_props(headers) - self.channel.basic_publish( - exchange=self.exchange, routing_key=routing_key, properties=publication_properties, body=event - ) - else: - self.channel.basic_publish(exchange=self.exchange, routing_key=routing_key, body=event) - except Exception: - self.channel, self.connection = None, None - finally: - self._lock.release() - - -class LogHandler(logging.Handler, _Pymygdala): - r"""Logging handler for a RabbitMQ server. - - :Keyword Arguments: - *profile* ("string"): the name of the profile to use, e.g. 'test', 'production'. If missing this defaults to the CAPO_PROFILE environment variable, if that is missing as well it explodes, throwing a ValueError exception. A profile should be a simple word, one without spaces or tabs or evil things in it. This is not checked and no guarantee is provided. - - *hostname* ("string"): name of the AMQP server to use, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.hostname". - - *username* ("string"): username to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.username". - - *password* ("string"): password to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.password". - - *port* ("int"): port number to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.port". - - *connection_attempts* (int): maximum number of retry attempts. - - *retry_delay* (int|float): time to wait in seconds, before the next. - - *socket_timeout* (int|float): use for high latency networks. - - *exchange* ("string"): the exchange to use, defaults to pymygdala.LOG_EXCHANGE. - - *exchange_type* ("string"): type of exchange to use, defaults to pymygdala.LOG_EXCHANGE_TYPE. - - *application* ("string"): the name of the application sending the event or message, "unknown" by default. - - *level* ("level"): the logging level to use. - - :Example: - - >>> import logging - >>> from pyat.pymygdala import LogHandler - >>> log = logging.getLogger(__name__) - >>> handler = LogHandler(profile='test', application='test-app', level=logging.DEBUG) - >>> log.addHandler(handler) - >>> log.error("my hovercraft is full of eels") - - """ - - def __init__(self, **kwargs): - self.level = kwargs.get("level", LOG_LEVEL) - self.exchange = kwargs.get("exchange", LOG_EXCHANGE) - self.exchange_type = kwargs.get("exchange_type", LOG_EXCHANGE_TYPE) - self.application = kwargs.get("application", "unknown") - self.routing_key = LOG_ROUTING_KEY_FORMAT.format(application=self.application, level="WARNING") - _Pymygdala.__init__( - self, **dict(kwargs, exchange=self.exchange, exchange_type=self.exchange_type, routing_key=self.routing_key) - ) - logging.Handler.__init__(self) - - def close(self): - _Pymygdala.close(self) - - def record_to_dict(self, record): - r"""Turn a Python logging.LogRecord into a simple dictionary, with the structure we expect, - that can easily be turned into a JSON string and sent off to RabbitMQ.""" - d = dict() - d["timestamp"] = _now() - d["formattedMessage"] = record.msg - d["loggerName"] = record.pathname - d["level"] = record.levelname - d["threadName"] = record.threadName - d["referenceMask"] = 1 - d["filename"] = "" - d["class"] = "" - d["method"] = record.name - d["line"] = record.lineno - d["properties"] = dict() - d["properties"]["user"] = self.sender_username - d["properties"]["HOSTNAME"] = self.sender_hostname - d["properties"]["profile"] = self.profile - return d - - def emit(self, record): - r"""Emit a logging message, build the routing key per emission because it has the logging - level as part of it.""" - self._send( - json.dumps(self.record_to_dict(record)), - routing_key=LOG_ROUTING_KEY_FORMAT.format(application=self.application, level=record.levelname), - ) - - -class LogDumper(_Pymygdala): - r"""Dump the logs from a RabbitMQ server. - - :Keyword Arguments: - *profile* ("string"): the name of the profile to use, e.g. 'test', 'production'. If missing this defaults to the CAPO_PROFILE environment variable, if that is missing as well it explodes, throwing a ValueError exception. A profile should be a simple word, one without spaces or tabs or evil things in it. This is not checked and no guarantee is provided. - - *hostname* ("string"): name of the AMQP server to use, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.hostname". - - *username* ("string"): username to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.username". - - *password* ("string"): password to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.password". - - *port* ("int"): port number to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.port". - - *connection_attempts* (int): maximum number of retry attempts. - - *retry_delay* (int|float): time to wait in seconds, before the next. - - *socket_timeout* (int|float): use for high latency networks. - - *exchange* ("string"): the exchange to use, defaults to pymygdala.LOG_EXCHANGE. - - *exchange_type* ("string"): type of exchange to use, defaults to pymygdala.LOG_EXCHANGE_TYPE. - - *outfile* ("string"): the name of the file to write to, default '-' for sys.stdout. - - :Example: - - >>> # Dump the 'test' logs to stdout - >>> from pyat.pymygdala import LogDumper - >>> dumper = LogDumper(profile='test') - >>> dumper.dump() - - """ - - def __init__(self, **kwargs): - _Pymygdala.__init__(self, **kwargs) - self.outfile = kwargs.get("outfile", "-") - self.queue = self.channel.queue_declare("", exclusive=True, auto_delete=True, durable=False).method.queue - self.channel.queue_bind(self.queue, LOG_EXCHANGE) - self.channel.basic_consume(self.queue, on_message_callback=self._callback, auto_ack=True) - - def close(self): - _Pymygdala.close(self) - - def _callback(self, ch, method, properties, body): - r"""I need more docstrings.""" - with _smart_open(self.outfile) as fh: - try: - parsed = json.loads(body) - parsed["hostname"] = parsed["properties"]["HOSTNAME"] if "HOSTNAME" in parsed["properties"] else "" - - if "formattedMessage" in parsed: - parsed["date"] = parse(parsed["timestamp"]) - fh.write(LOGDUMPER_FORMAT.format(**parsed)) - else: - fh.write("no formatted message: {}\n".format(body)) - - if "stackTrace" in parsed: - for stack in parsed["stackTrace"]: - for line in stack: - fh.write("{}\n".format(line)) - - except Exception as e: - fh.write("{}\n".format(e)) - fh.write("unparseable: {}\n".format(body)) - - def dump(self): - r"""I need more docstrings.""" - self.channel.start_consuming() - - -def _datetime_to_dict(): - # Turn 'now' in UTC into the date format events expect to speak. - d, t = dict(), dict() - now = datetime.datetime.utcnow() - d["year"], d["month"], d["day"] = now.year, now.month, now.day - t["hour"], t["minute"], t["second"], t["nano"] = now.hour, now.minute, now.second, now.microsecond * 1000 - return {"date": d, "time": t} - - -class SendEvent(_Pymygdala): - r""" - - :Keyword Arguments: - *profile* ("string"): the name of the profile to use, e.g. 'test', 'production'. If missing this defaults to the CAPO_PROFILE environment variable, if that is missing as well it explodes, throwing a ValueError exception. A profile should be a simple word, one without spaces or tabs or evil things in it. This is not checked and no guarantee is provided. - - *application* ("string"): the name of the application sending the event or message, "unknown" by default. - - *hostname* ("string"): name of the AMQP server to use, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.hostname" - - *username* ("string"): username to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.username". - - *password* ("string"): password to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.password". - - *port* ("int"): port number to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.port". - - *connection_attempts* (int): maximum number of retry attempts - - *retry_delay* (int|float): time to wait in seconds, before the next - - *socket_timeout* (int|float): use for high latency networks - - *exchange* ("string"): the exchange to use, defaults to pymygdala.EVENT_EXCHANGE - - *exchange_type* ("string"): type of exchange to use, defaults to pymygdala.EVENT_EXCHANGE_TYPE. - - *routing_key* ("string"): how messages will be routed to queues, format defaults to pymygdala.EVENT_ROUTING_KEY_FORMAT - - :Example: - - >>> # Send the kind of event the solr indexer does when it starts to index - >>> from pyat.pymygdala import SendEvent - >>> se = SendEvent(profile='test', application='solr-indexer') - >>> event = { - ... "logData": { - ... "dryRun": False, - ... "numberOfDocuments": 9999 - ... }, - ... "message": "Starting reindexing process", - ... "request": "some request" - ... } - >>> se.send(event) - - """ - - def __init__(self, **kwargs): - _Pymygdala.__init__(self, **kwargs) - - def close(self): - _Pymygdala.close(self) - - def _add_fields(self, event): - result = dict() - result["user"] = self.sender_username - result["hostname"] = self.sender_hostname - result["timestamp"] = _datetime_to_dict() - result["application"] = self.application - result["request"] = "snek asks nice-like" - result["version"] = 1.0 - result.update(event) - return result - - def send(self, event, routing_key=None, headers=None): - r"""Send an event to RabbitMQ: an 'event' here is a simple dictionary that can be converted into a JSON string. - - :Required Arguments: - *event* ("dict"): a dictionary representing the event to send. - :Optional Arguments: - *routing_key* ("string"): the routing key of the message, defaults to application.event - *headers* ("dict"): a dictionary of headers to send with the event as 'properties' - - """ - if routing_key is None: - routing_key = self.routing_key - event = self._add_fields(event) - # print(json.dumps(d, sort_keys=True, indent=4 * ' ')) - self._send(json.dumps(event), routing_key=routing_key, headers=headers) - - -class SendNRAOEvent(SendEvent): - r"""This subclasses SendEvent and just add some more fields to the event based on the exchange, so you can use it to trigger AAT/PPI workflows more easily. - - :Keyword Arguments: - *profile* ("string"): the name of the profile to use, e.g. 'test', 'production'. If missing this defaults to the CAPO_PROFILE environment variable, if that is missing as well it explodes, throwing a ValueError exception. A profile should be a simple word, one without spaces or tabs or evil things in it. This is not checked and no guarantee is provided. - - *application* ("string"): the name of the application sending the event or message, "unknown" by default. - - *hostname* ("string"): name of the AMQP server to use, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.hostname" - - *username* ("string"): username to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.username". - - *password* ("string"): password to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.password". - - *port* ("int"): port number to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.port". - - *connection_attempts* (int): maximum number of retry attempts - - *retry_delay* (int|float): time to wait in seconds, before the next - - *socket_timeout* (int|float): use for high latency networks - - *exchange* ("string"): the exchange to use, defaults to pymygdala.EVENT_EXCHANGE - - *exchange_type* ("string"): type of exchange to use, defaults to pymygdala.EVENT_EXCHANGE_TYPE. - - *routing_key* ("string"): how messages will be routed to queues, format defaults to pymygdala.EVENT_ROUTING_KEY_FORMAT - - :Example: - - >>> # Send the kind of event the solr indexer does when it starts to index - >>> from pyat.pymygdala import SendNRAOEvent - >>> se = SendEvent(profile='test', application='solr-indexer') - >>> headers = { - ... "reply-to": "jim@bob.foo" - ... } - >>> event = { - ... "logData": { - ... "dryRun": False, - ... "numberOfDocuments": 9999 - ... }, - ... "message": "Starting reindexing process", - ... "request": "some request" - ... } - >>> se.send(event, headers=headers) - - """ - - def __init__(self, **kwargs): - SendEvent.__init__(self, **kwargs) - - def close(self): - SendEvent.close(self) - - def _add_fields(self, event): - result = SendEvent._add_fields(self, event) - if self.exchange == "archive.workflow-commands": - result["type"] = "edu.nrao.archive.workflow.messaging.commands.StartWorkflow" - result["additionalPaths"] = [] - return result - - -class RPCEvent(SendEvent): - """A class to handle the nuances of a dedicated response queue & correlation ID. This is for events which will generate - a reply from the system. - - Usage: - sender = RPCEvent(...JustLikeTheOthers...) - my_id = sender.send() - start_workflow(corr_id=my_id) - my_answer = sender.get_reply() - - - TODO: Lay out the total set of variables, highlighting the additions. - - """ - - def __init__(self, **kwargs): - # Superclass handles most of it: - SendEvent.__init__(self, **kwargs) - - # Initializations - self.event_corr_id = str(uuid.uuid4()) - self.answer = None - self.reply_channel = None - - # New Channel for the replies: - self.reply_channel = self.connection.channel() - - # Start listening to the events exchange for our reply: - events_exchange = self.reply_channel.exchange_declare("archive.events", exchange_type="topic", durable=True) - specific_queue = "temp-queue-" + self.event_corr_id - new_queue = self.reply_channel.queue_declare(specific_queue, durable=False, exclusive=True) - - specific_key = "cli-response." + self.event_corr_id - self.reply_channel.queue_bind(specific_queue, "archive.events", routing_key=specific_key) - self.reply_queue = new_queue.method.queue - - # Start Listening - self.reply_channel.basic_consume(self.reply_queue, on_message_callback=self._response_handler, auto_ack=True) - - def close(self): - # Our superclass handles the basics: - SendEvent.close(self) - - # Basic Event handler, only provide the information if the correlation ids match. - def _response_handler(self, channel, method, properties, body): - # this used to check the properties, but they're harder to customize with an event - self.answer = body - - def send(self, event, routing_key=None, headers=None): - - # Configure the passed-in headers with reply information: - if headers is not None: - headers["correlation_id"] = self.event_corr_id - headers["reply_to"] = self.reply_queue - else: - # No header, populate one with what we need: - headers = {"correlation_id": self.event_corr_id, "reply_to": self.reply_queue} - - # Pick up the configurations of our superclass - event = super()._add_fields(event) - - # But call back to _Pymgydala for the actual send - self._send(json.dumps(event), routing_key=routing_key, headers=headers) - - # return the correlation ID to include in the workflow launch - return self.event_corr_id - - def get_reply(self): - # If we didn't send an event, we don't expect a reply - if self.event_corr_id is None: - print("No pending event!") - return None - - # Block while we're waiting for our answer - # if it has already come, then we'll skip the loop - while self.answer is None: - # Block, waiting for an answer - self.connection.process_data_events() - - decoded_event = json.loads(self.answer) - - self.event_corr_id = None - self.answer = None - - # Provide the true payload to caller, instead of the - # full event. - return decoded_event["logData"] - - -class MotDBroadcaster(_Pymygdala): - r"""MotD handler for a RabbitMQ server. - - :Keyword Arguments: - *profile* ("string"): the name of the profile to use, e.g. 'test', 'production'. If missing this defaults to the CAPO_PROFILE environment variable, if that is missing as well it explodes, throwing a ValueError exception. A profile should be a simple word, one without spaces or tabs or evil things in it. This is not checked and no guarantee is provided. - - *hostname* ("string"): name of the AMQP server to use, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.hostname". - - *username* ("string"): username to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.username". - - *password* ("string"): password to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.password". - - *port* ("int"): port number to connect to AMQP with, defaults to CAPO property "edu.nrao.archive.configuration.AmqpServer.port". - - *connection_attempts* (int): maximum number of retry attempts. - - *retry_delay* (int|float): time to wait in seconds, before the next. - - *socket_timeout* (int|float): use for high latency networks. - - *exchange* ("string"): the exchange to use, defaults to pymygdala.MOTD_EXCHANGE. - - *exchange_type* ("string"): type of exchange to use, defaults to pymygdala.MOTD_EXCHANGE_TYPE. - - *application* ("string"): the name of the application sending the event or message, "unknown" by default. - - """ - - def __init__(self, **kwargs): - self.level = kwargs.get("level", MOTD_LEVEL) - self.exchange = kwargs.get("exchange", MOTD_EXCHANGE) - self.exchange_type = kwargs.get("exchange_type", MOTD_EXCHANGE_TYPE) - self.application = kwargs.get("application", "unknown") - self.routing_key = MOTD_ROUTING_KEY_FORMAT.format(application=self.application) - _Pymygdala.__init__( - self, **dict(kwargs, exchange=self.exchange, exchange_type=self.exchange_type, routing_key=self.routing_key) - ) - - def close(self): - _Pymygdala.close(self) - - def broadcast(self, message): - r"""Emit a logging message, build the routing key per emission because it has the logging - level as part of it.""" - logging.info("MotD broadcasting: {0}".format(message)) - self._send(json.dumps(dict(motd=message, level=self.level)), routing_key=self.routing_key) - - -def test_sendlog(): - # A quick and dirty test of logging in our environment. - LOG = logging.getLogger(__name__) - handler = LogHandler(profile="test", application="test-app", level=logging.DEBUG) - LOG.addHandler(handler) - LOG.error("my hovercraft is full of eels") - - -def test_sendevent(): - # Send the kind of event the solr indexer does when it starts to index - se = SendEvent(profile="test", application="solr-indexer") - event = { - "logData": {"dryRun": False, "numberOfDocuments": 9999}, - "message": "Starting reindexing process", - "request": "some request", - } - se.send(event) - - -if __name__ == "__main__": - test_sendlog() - # test_sendevent() diff --git a/apps/cli/executables/pexable/ingest/ingest/remotecopy.py b/apps/cli/executables/pexable/ingest/ingest/remotecopy.py deleted file mode 100644 index ea14e07256ae34435384bc047d23da660179c699..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/remotecopy.py +++ /dev/null @@ -1,47 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import logging -from pathlib import Path - -import pysftp -from pycapo import CapoConfig - -LOG = logging.getLogger("ingestion") -config = CapoConfig() - -KEY_FILE = str(Path.home() / ".ssh" / "scp_only") -SSH_USER = "vlapipe" -SSH_HOST = "mcilroy.aoc.nrao.edu" -OUT_DIR = config.getstring("archive-ingestion.vlass.ThumbnailPath") - -# Disable the use of host keys. -cnopts = pysftp.CnOpts() -cnopts.hostkeys = None - - -def copy_thumbnail(source, target): - """ - Remote copy of thumbnail images - """ - target_path = Path(target) - - LOG.debug(f"Copying thumbnail from {source} to {target}") - - with pysftp.Connection(SSH_HOST, username=SSH_USER, private_key=KEY_FILE, cnopts=cnopts) as sftp: - sftp.makedirs(str(target_path.parent)) - sftp.put(source, remotepath=str(target_path)) diff --git a/apps/cli/executables/pexable/ingest/ingest/schema/__init__.py b/apps/cli/executables/pexable/ingest/ingest/schema/__init__.py deleted file mode 100644 index 0960c0067f3b999d01279c39d077ea4936f70e88..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/schema/__init__.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# publish our behavior-enhanced table classes -import sqlalchemy -from pycapo import CapoConfig -from sqlalchemy.orm import sessionmaker - -from .model import * - -INSTRUMENT_CAPO_PREFIXES = { - "SDM": "metadataDatabase.jdbc", - "VLBA": "metadataDatabase.jdbc", - "ALMA": "almaMetadataDatabase.jdbc", - "OPT": "evlaopt.nrao.jdbc.", - "PST": "my.nrao.jdbc.", - "NGAS": "ngasDatabase.jdbc", - "NGAS_NAASC": "almaMetadataDatabase.jdbc", - "VLASS": "edu.nrao.vlass.config.VlassMngrSettings.jdbc", - "LEGACY": "oracleMetadataDatabase.jdbc", -} - - -def create_engine(instrument, **kwargs): - config = CapoConfig(profile=kwargs["profile"]) if "profile" in kwargs else CapoConfig() - - prefix = INSTRUMENT_CAPO_PREFIXES[instrument] - - user = config[prefix + "Username"] - passwd = config[prefix + "Password"] - url = config[prefix + "Url"] - - if "oracle" in url: - hostport, service_name = url.split("/")[-2:] - if instrument == "LEGACY": - archiveurl = "oracle://{}:{}@{}/{}".format(user, passwd, hostport, service_name) - else: - host, port = hostport.split(":") - import cx_Oracle - - dsn = cx_Oracle.makedsn(host, port, service_name=service_name) - archiveurl = "oracle://{}:{}@{}".format(user, passwd, dsn) - else: - archiveurl = url.replace("jdbc:", "").replace("://", "://" + user + ":" + passwd + "@") - - return sqlalchemy.create_engine(archiveurl) - - -def create_session(instrument, **kwargs): - engine = create_engine(instrument, **kwargs) - session_mkr = sessionmaker(engine) - session = session_mkr() - return session - - -class ArchiveDBSession: - """A class to create context manager around an archive connection.""" - - def __init__(self, instrument, **kwargs): - config = CapoConfig(profile=kwargs["profile"]) if "profile" in kwargs else CapoConfig() - - prefix = INSTRUMENT_CAPO_PREFIXES[instrument] - - user = config[prefix + "Username"] - passwd = config[prefix + "Password"] - url = config[prefix + "Url"] - - if "oracle" in url: - hostport, service_name = url.split("/")[-2:] - if instrument == "LEGACY": - self.archiveurl = "oracle://{}:{}@{}/{}".format(user, passwd, hostport, service_name) - else: - host, port = hostport.split(":") - import cx_Oracle - - dsn = cx_Oracle.makedsn(host, port, service_name=service_name) - self.archiveurl = "oracle://{}:{}@{}".format(user, passwd, dsn) - else: - self.archiveurl = url.replace("jdbc:", "").replace("://", "://" + user + ":" + passwd + "@") - self.session = None - - def __enter__(self): - engine = sqlalchemy.create_engine(self.archiveurl) - session_mkr = sessionmaker(engine) - self.session = session_mkr(bind=engine) - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.session.close() diff --git a/apps/cli/executables/pexable/ingest/ingest/schema/almamodel.py b/apps/cli/executables/pexable/ingest/ingest/schema/almamodel.py deleted file mode 100644 index dd7cfc00f78729eb3fb090b88c57920e17fb9221..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/schema/almamodel.py +++ /dev/null @@ -1,6713 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - Column, - DateTime, - Float, - ForeignKey, - Index, - LargeBinary, - Numeric, - String, - Table, - Text, - text, -) -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship -from sqlalchemy.sql.sqltypes import NullType - -Base = declarative_base() -metadata = Base.metadata - - -t_SLOG_ENTRY_ATTR_bak = Table( - "SLOG_ENTRY_ATTR_bak", - metadata, - Column("slog_attr_id", Numeric(19, 0, asdecimal=False), nullable=False), - Column("slog_attr_type", Numeric(10, 0, asdecimal=False), nullable=False), - Column("slog_attr_value", String(256)), - Column("slog_se_id", Numeric(19, 0, asdecimal=False)), - schema="ALMA", -) - - -class Aaa6(Base): - __tablename__ = "aaa6" - __table_args__ = {"schema": "ALMA"} - - ccc = Column(String(100), primary_key=True) - - -t_aaa7 = Table("aaa7", metadata, Column("ddd", String(100)), schema="ALMA") - - -class Account(Base): - __tablename__ = "account" - __table_args__ = {"schema": "ALMA"} - - account_id = Column(String(32), primary_key=True) - request_handler_id = Column(Numeric(22, 0, asdecimal=False), unique=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - password_digest = Column(String(256)) - firstname = Column(String(256), nullable=False) - lastname = Column(String(256), nullable=False) - initials = Column(String(256)) - creationtimestamp = Column(String(32)) - modificationtimestamp = Column(String(32)) - preferredarc = Column(String(32)) - email = Column(String(256), unique=True) - executive = Column(String(5)) - aliases = Column(String(256)) - inst_no = Column(ForeignKey("ALMA.institution.inst_no"), nullable=False) - active = Column(String(1), nullable=False, server_default=text("'T' ")) - account_id_merged_to = Column(ForeignKey("ALMA.account.account_id")) - merge_time = Column(DateTime) - receiveemails = Column(String(1), nullable=False) - passwordtimestamp = Column(DateTime) - provides_user_demographics = Column(String(1)) - - parent = relationship("Account", remote_side=[account_id]) - institution = relationship("Institution") - nodes = relationship("DrmNode", secondary="ALMA.drm_data_reducer") - role = relationship("Role", secondary="ALMA.account_role") - - -class AccountDelegation(Base): - __tablename__ = "account_delegation" - __table_args__ = ( - Index("account_del_unique", "pi_rh_id", "project_code", "delegee_rh_id", "delegation_type", unique=True), - {"schema": "ALMA"}, - ) - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - pi_rh_id = Column(ForeignKey("ALMA.account.request_handler_id"), nullable=False) - project_code = Column(String(18), nullable=False) - delegee_rh_id = Column(ForeignKey("ALMA.account.request_handler_id"), nullable=False) - delegation_type = Column(String(10), nullable=False, index=True, server_default=text("'DATA' ")) - - delegee_rh = relationship("Account", primaryjoin="AccountDelegation.delegee_rh_id == Account.request_handler_id") - pi_rh = relationship("Account", primaryjoin="AccountDelegation.pi_rh_id == Account.request_handler_id") - - -t_account_role = Table( - "account_role", - metadata, - Column("role_no", ForeignKey("ALMA.role.role_no"), primary_key=True, nullable=False), - Column("account_id", ForeignKey("ALMA.account.account_id"), primary_key=True, nullable=False), - schema="ALMA", -) - - -t_alma_alarms = Table( - "alma_alarms", - metadata, - Column("descriptor", Numeric(10, 0, asdecimal=False)), - Column("user_timestamp_secs", Numeric(20, 0, asdecimal=False)), - Column("user_timestamp_ms", Numeric(20, 0, asdecimal=False)), - Column("activated_by_backup", Numeric(1, 0, asdecimal=False)), - Column("terminated_by_backup", Numeric(1, 0, asdecimal=False)), - Column("family", String(100)), - Column("member", String(100)), - Column("code", Numeric(10, 0, asdecimal=False)), - Column("user_properties", String(1000)), - Column("source_name", String(100)), - Column("source_hostname", String(100)), - Column("source_timestamp_sec", Numeric(20, 0, asdecimal=False)), - Column("source_timestamp_ms", Numeric(20, 0, asdecimal=False)), - Column("backup", Numeric(1, 0, asdecimal=False)), - Column("version", String(100)), - schema="ALMA", -) - - -class AquaAttachment(Base): - __tablename__ = "aqua_attachment" - __table_args__ = (Index("aqua_attachment_uni", "name", "ttimestamp", unique=True), {"schema": "ALMA"}) - - attachmentid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - ttimestamp = Column(DateTime) - name = Column(String(256), nullable=False) - contents = Column(LargeBinary, nullable=False) - - aqua_session = relationship("AquaSession", secondary="ALMA.aqua_session_attachment") - aqua_execblock = relationship("AquaExecblock", secondary="ALMA.aqua_execblock_attachment") - - -class AquaComment(Base): - __tablename__ = "aqua_comment" - __table_args__ = (Index("aqua_comment_uni", "author", "ttimestamp", unique=True), {"schema": "ALMA"}) - - commentid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - author = Column(String(32), nullable=False) - ttimestamp = Column(DateTime, nullable=False) - ccomment = Column(Text) - - aqua_session = relationship("AquaSession", secondary="ALMA.aqua_session_comment") - aqua_execblock = relationship("AquaExecblock", secondary="ALMA.aqua_execblock_comment") - - -class AquaExecblock(Base): - __tablename__ = "aqua_execblock" - __table_args__ = {"schema": "ALMA"} - - execblockid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - execblockuid = Column(String(32), nullable=False, unique=True) - sessionid = Column(ForeignKey("ALMA.aqua_session.sessionid"), nullable=False) - qa0status = Column(String(32), nullable=False, index=True) - starttime = Column(DateTime) - endtime = Column(DateTime) - finalcommentid = Column(ForeignKey("ALMA.aqua_comment.commentid"), unique=True) - schedblockuid = Column(String(32)) - obsprojectcode = Column(String(25)) - obsprojectname = Column(String(256)) - obsprojectuid = Column(String(32)) - location = Column(String(32)) - correlatortype = Column(String(4)) - execfraction = Column(Numeric(5, 3), nullable=False, server_default=text("0 ")) - - aqua_comment = relationship("AquaComment") - aqua_session = relationship("AquaSession") - - -t_aqua_execblock_attachment = Table( - "aqua_execblock_attachment", - metadata, - Column("attachmentid", ForeignKey("ALMA.aqua_attachment.attachmentid"), primary_key=True), - Column("execblockid", ForeignKey("ALMA.aqua_execblock.execblockid"), nullable=False), - schema="ALMA", -) - - -t_aqua_execblock_comment = Table( - "aqua_execblock_comment", - metadata, - Column("commentid", ForeignKey("ALMA.aqua_comment.commentid"), primary_key=True), - Column("execblockid", ForeignKey("ALMA.aqua_execblock.execblockid")), - schema="ALMA", -) - - -class AquaExecblockEtlDatum(Base): - __tablename__ = "aqua_execblock_etl_data" - __table_args__ = (Index("eb_type_unique", "execblockid", "etl_data_type", unique=True), {"schema": "ALMA"}) - - etl_data_id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - execblockid = Column(ForeignKey("ALMA.aqua_execblock.execblockid")) - etl_data_type = Column(String(16)) - etl_schema_version = Column(Numeric(3, 0, asdecimal=False)) - etl_data = Column(Text) - - aqua_execblock = relationship("AquaExecblock") - - -class AquaOu(Base): - __tablename__ = "aqua_ous" - __table_args__ = (Index("aqua_ous_uni", "obsunitsetuid", "obsunitsetpartid", unique=True), {"schema": "ALMA"}) - - obsunitsetid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - obsunitsetuid = Column(String(32), nullable=False) - qa2status = Column(String(8), nullable=False) - finalcommentid = Column(ForeignKey("ALMA.aqua_comment.commentid"), unique=True) - obsunitsetpartid = Column(String(32), nullable=False) - qa2semipassreason = Column(String(11)) - qa2statustime = Column(DateTime) - achievedsens = Column(Numeric(6, 2)) - achievedresol = Column(Numeric(6, 2)) - qa2plcalstatus = Column(String(8)) - qa2mancalstatus = Column(String(8)) - plcalfinalcommentid = Column(Numeric(10, 0, asdecimal=False)) - mcalfinalcommentid = Column(Numeric(10, 0, asdecimal=False)) - casatickets = Column(String(128)) - analyst = Column(String(32)) - execfraction = Column(Numeric(5, 3), nullable=False, server_default=text("0 ")) - plimgfinalcommentid = Column(Numeric(10, 0, asdecimal=False)) - mimgfinalcommentid = Column(Numeric(10, 0, asdecimal=False)) - rmsatbandwidth = Column(NullType) - rmscontinuum = Column(NullType) - beamsemimajor = Column(NullType) - beamsemiminor = Column(NullType) - beamposangle = Column(NullType) - ous_status_entity_id = Column(String(64)) - - aqua_comment = relationship("AquaComment") - - -class AquaOusAttachment(Base): - __tablename__ = "aqua_ous_attachment" - __table_args__ = {"schema": "ALMA"} - - attachmentid = Column(ForeignKey("ALMA.aqua_attachment.attachmentid"), primary_key=True, nullable=False) - obsunitsetid = Column(ForeignKey("ALMA.aqua_ous.obsunitsetid"), primary_key=True, nullable=False) - attachment_section = Column(String(8)) - - aqua_attachment = relationship("AquaAttachment") - aqua_ou = relationship("AquaOu") - - -class AquaOusFlag(Base): - __tablename__ = "aqua_ous_flag" - __table_args__ = ( - Index("unique_ous_flag", "ous_status_entity_id", "flag_name", unique=True), - Index("idx_aqua_ous_flag_val", "flag_name", "flag_value"), - {"schema": "ALMA"}, - ) - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(4, 0, asdecimal=False), nullable=False) - ous_status_entity_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id"), nullable=False, index=True) - flag_name = Column(String(32), nullable=False) - flag_value = Column(String(2000)) - update_account_id = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - update_timestamp = Column(DateTime, nullable=False) - - ous_status_entity = relationship("ObsUnitSetStatu") - update_account = relationship("Account") - - -class AquaOusFlagHistory(Base): - __tablename__ = "aqua_ous_flag_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - ous_status_entity_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id"), nullable=False) - flag_name = Column(String(32), nullable=False) - flag_value = Column(String(2000)) - update_account_id = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - update_timestamp = Column(DateTime, nullable=False) - - ous_status_entity = relationship("ObsUnitSetStatu") - update_account = relationship("Account") - - -class AquaPipelineRun(Base): - __tablename__ = "aqua_pipeline_run" - __table_args__ = (Index("uk_mous_uid_timestamp", "mous_uid", "timestamp", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - gous_uid = Column(String(32)) - mous_uid = Column(String(32)) - report = Column(Text) - sous_uid = Column(String(32)) - timestamp = Column(String(32)) - version = Column(Numeric(10, 0, asdecimal=False)) - pipeline_run_dir_id = Column(ForeignKey("ALMA.aqua_pipeline_run_directory.id")) - weblog_id = Column(ForeignKey("ALMA.aqua_weblog.id")) - - pipeline_run_dir = relationship("AquaPipelineRunDirectory") - weblog = relationship("AquaWeblog") - - -class AquaPipelineRunDirectory(Base): - __tablename__ = "aqua_pipeline_run_directory" - __table_args__ = (Index("uk_project_code_timestamp", "project_code", "timestamp", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - remark = Column(String(2000)) - last_op_timestamp = Column(String(32)) - pathname = Column(String(512)) - project_code = Column(String(32)) - status = Column(String(32)) - timestamp = Column(String(32)) - version = Column(Numeric(10, 0, asdecimal=False)) - last_op_account = Column(String(32)) - products_sub_dir = Column(String(512)) - region = Column(String(32)) - upload_timestamp = Column(String(32)) - data_reduction_type = Column(String(32)) - - -class AquaQa2EcHistory(Base): - __tablename__ = "aqua_qa2_ec_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - ttimestamp = Column(DateTime, nullable=False) - entityuid = Column(String(32), nullable=False) - author = Column(String(32), nullable=False) - ec = Column(NullType) - - -class AquaQa2FailReason(Base): - __tablename__ = "aqua_qa2_fail_reason" - __table_args__ = {"schema": "ALMA"} - - qa2reasonid = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - obsunitsetid = Column(ForeignKey("ALMA.aqua_ous.obsunitsetid"), nullable=False) - qa2failreason = Column(String(20), nullable=False) - - aqua_ou = relationship("AquaOu") - - -class AquaQa2ImagingHistory(Base): - __tablename__ = "aqua_qa2_imaging_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - ttimestamp = Column(DateTime, nullable=False) - entityuid = Column(String(32), nullable=False) - author = Column(String(32), nullable=False) - rmsatbandwidth = Column(NullType) - rmscontinuum = Column(NullType) - beamsemimajor = Column(NullType) - beamsemiminor = Column(NullType) - beamposangle = Column(NullType) - - -class AquaSensitivity(Base): - __tablename__ = "aqua_sensitivity" - __table_args__ = {"schema": "ALMA"} - - asdmuid = Column(String(32), primary_key=True, nullable=False) - spwid = Column(Numeric(38, 0, asdecimal=False), primary_key=True, nullable=False) - mediantsys = Column(NullType) - - -class AquaSession(Base): - __tablename__ = "aqua_session" - __table_args__ = (Index("aqua_session_uni", "sessionuid", "sessionpartid", unique=True), {"schema": "ALMA"}) - - sessionid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - sessionuid = Column(String(32), nullable=False) - schedblockuid = Column(String(32), nullable=False) - schedblockname = Column(String(128)) - projectcode = Column(String(64)) - qlfocussummuid = Column(String(32)) - qlpointsummuid = Column(String(32)) - qlphasesummuid = Column(String(32)) - qlatmsummuid = Column(String(32)) - qa1status = Column(String(5), nullable=False) - starttime = Column(DateTime, nullable=False) - endtime = Column(DateTime) - finalcommentid = Column(ForeignKey("ALMA.aqua_comment.commentid"), unique=True) - sessionpartid = Column(String(32), nullable=False) - location = Column(String(32)) - tmcdbconfigurationname = Column(String(128)) - correlatortype = Column(String(4)) - - aqua_comment = relationship("AquaComment") - - -t_aqua_session_attachment = Table( - "aqua_session_attachment", - metadata, - Column("attachmentid", ForeignKey("ALMA.aqua_attachment.attachmentid"), primary_key=True), - Column("sessionid", ForeignKey("ALMA.aqua_session.sessionid"), nullable=False), - schema="ALMA", -) - - -t_aqua_session_comment = Table( - "aqua_session_comment", - metadata, - Column("commentid", ForeignKey("ALMA.aqua_comment.commentid"), primary_key=True), - Column("sessionid", ForeignKey("ALMA.aqua_session.sessionid")), - schema="ALMA", -) - - -class AquaStatusHistory(Base): - __tablename__ = "aqua_status_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - entityuid = Column(String(32), nullable=False) - author = Column(String(32), nullable=False) - ttimestamp = Column(DateTime, nullable=False) - qastatus = Column(String(32), nullable=False) - qastatustype = Column(String(32), nullable=False) - ccomment = Column(Text) - - -t_aqua_v_execblock = Table( - "aqua_v_execblock", - metadata, - Column("execblockid", Numeric(10, 0, asdecimal=False), nullable=False), - Column("execblockuid", String(32), nullable=False), - Column("execfraction", Numeric(5, 3), nullable=False), - Column("qa0status", String(32), nullable=False), - Column("finalcommentid", Numeric(10, 0, asdecimal=False)), - Column("sessionid", Numeric(10, 0, asdecimal=False), nullable=False), - Column("sessionuid", String(32)), - Column("sessionpartid", String(32)), - Column("starttime", DateTime), - Column("endtime", DateTime), - Column("schedblockuid", String(32)), - Column("schedblockname", String(128)), - Column("obsprojectcode", String(128)), - Column("obsprojectname", String(256)), - Column("obsprojectpi", String(20)), - Column("obsprojectversion", String(20)), - Column("location", String(32)), - Column("status", String(32)), - Column("archivingstatus", String(32)), - Column("bandname", String(10)), - Column("representativefrequency", Numeric(15, 10)), - Column("almabuild", String(70)), - Column("arrayname", String(10)), - Column("arraystart", DateTime), - Column("arrayend", DateTime), - Column("correlatortype", String(4)), - Column("arrayfamily", String(11)), - Column("arraytype", String(9)), - Column("photonicreferencename", String(18)), - Column("obsprojectuid", String(32)), - schema="ALMA", -) - - -class AquaWeblog(Base): - __tablename__ = "aqua_weblog" - __table_args__ = (Index("uk_ous_uid_timestamp", "ous_uid", "timestamp", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - cached = Column(String(1)) - last_access = Column(String(32)) - ous_uid = Column(String(32)) - timestamp = Column(String(32)) - version = Column(Numeric(10, 0, asdecimal=False)) - last_op_account = Column(String(32)) - remark = Column(String(2000)) - last_op_timestamp = Column(String(32)) - ngas_file_id = Column(String(128)) - status = Column(String(32)) - - -class AsaBibliography(Base): - __tablename__ = "asa_bibliography" - __table_args__ = {"schema": "ALMA"} - - bibcode = Column(String(30), nullable=False, unique=True) - publication_year = Column(Numeric(4, 0, asdecimal=False)) - journal = Column(String(100), nullable=False) - title = Column(String(255), nullable=False, index=True) - first_author = Column(String(255), nullable=False) - volume = Column(Numeric(8, 0, asdecimal=False)) - pages = Column(String(100)) - abstract = Column(String(4000)) - authors = Column(String(4000)) - keywords = Column(String(4000)) - bib_id = Column(Numeric(30, 0, asdecimal=False), primary_key=True) - - -t_asa_bibliography_temp = Table( - "asa_bibliography_temp", - metadata, - Column("bibcode", String(30), nullable=False), - Column("publication_year", Numeric(4, 0, asdecimal=False)), - Column("journal", String(100), nullable=False), - Column("title", String(255), nullable=False), - Column("first_author", String(255), nullable=False), - Column("volume", Numeric(8, 0, asdecimal=False)), - Column("pages", String(100)), - Column("abstract", String(4000)), - Column("authors", String(4000)), - Column("keywords", String(4000)), - Column("bib_id", Numeric(30, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -class AsaColumn(Base): - __tablename__ = "asa_columns" - __table_args__ = (Index("asa_columns_unique", "table_name", "column_name", unique=True), {"schema": "ALMA"}) - - column_name = Column(String(128), nullable=False) - table_name = Column(String(128), nullable=False) - description = Column(String(1024)) - tooltip = Column(String(256)) - unit = Column(String(32)) - dimensions = Column(String(32)) - scale = Column(Float) - ucd = Column(String(128)) - utype = Column(String(512)) - datatype = Column(String(32)) - type_size = Column(Numeric(11, 0, asdecimal=False)) - principal = Column(Numeric(1, 0, asdecimal=False), nullable=False) - indexed = Column(Numeric(1, 0, asdecimal=False), nullable=False) - std = Column(Numeric(1, 0, asdecimal=False), nullable=False) - is_enum = Column(Numeric(1, 0, asdecimal=False), nullable=False) - enum_table = Column(String(128)) - examples = Column(String(1024)) - is_queriable = Column(String(1), nullable=False) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - - -class AsaDeliveryAsdmOu(Base): - __tablename__ = "asa_delivery_asdm_ous" - __table_args__ = (Index("dp_delao_ad_unq", "asdm_uid", "deliverable_name", unique=True), {"schema": "ALMA"}) - - asdm_uid = Column(ForeignKey("ALMA.xml_asdm_entities.archive_uid"), index=True) - ous_status_id = Column(String(33), index=True) - deliverable_name = Column(String(64), nullable=False, index=True) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - delivery_id = Column(ForeignKey("ALMA.asa_delivery_status.id"), nullable=False) - - xml_asdm_entity = relationship("XmlAsdmEntity") - delivery = relationship("AsaDeliveryStatu") - - -class AsaDeliveryStatu(Base): - __tablename__ = "asa_delivery_status" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - delivery_id = Column(String(64), nullable=False, unique=True) - pi_account_id = Column(Numeric(22, 0, asdecimal=False), nullable=False) - qa2_passed = Column(String(1), nullable=False) - notification_date = Column(DateTime) - original_release_date = Column(DateTime) - release_date = Column(DateTime, server_default=text("to_date('3000-01-01', 'YYYY-MM-DD')")) - release_date_comment = Column(String(4000)) - delivery_name = Column(String(64), nullable=False) - - -class AsaEnergy(Base): - __tablename__ = "asa_energy" - __table_args__ = {"schema": "ALMA"} - - asa_energy_id = Column(String(128), primary_key=True) - asa_dataset_id = Column(ForeignKey("ALMA.asa_science.dataset_id"), index=True) - frequency_min = Column(NullType, nullable=False) - frequency_max = Column(NullType, nullable=False) - resolution_min = Column(NullType, nullable=False) - resolution_max = Column(NullType, nullable=False) - channel_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - channel_width_min = Column(NullType, nullable=False) - channel_width_max = Column(NullType, nullable=False) - resolving_power_min = Column(NullType, nullable=False) - resolving_power_max = Column(NullType, nullable=False) - spectral_window_uid = Column(String(64)) - bandwidth = Column(NullType) - pol_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - pol_product = Column(String(64), nullable=False) - exptimtp = Column(NullType) - exptim7 = Column(NullType) - exptim12 = Column(NullType) - restfreq = Column(NullType) - chanrms = Column(NullType) - crval3 = Column(NullType) - crpix3 = Column(NullType) - crval4 = Column(NullType) - crpix4 = Column(NullType) - cdelt4 = Column(NullType) - parent_asa_energy_ids = Column(String(256)) - spw_num = Column(Numeric(38, 0, asdecimal=False)) - spw_id_original = Column(Numeric(38, 0, asdecimal=False)) - spw_id_orig_list = Column(String(64)) - spectral_window_name = Column(String(64)) - asa_energy_product_id = Column(String(128)) - asdm_spw_id = Column(Numeric(38, 0, asdecimal=False)) - ms_spw_id = Column(Numeric(38, 0, asdecimal=False)) - sensitivity_channel = Column(NullType) - sensitivity_10kms = Column(NullType) - sensitivity_bandwidth = Column(NullType) - line_id = Column(String(256)) - rest_frequency_max = Column(NullType) - rest_frequency_min = Column(NullType) - rest_frequency_resolution_min = Column(NullType) - rest_frequency_resolution_max = Column(NullType) - rest_resolving_power_min = Column(NullType) - rest_resolving_power_max = Column(NullType) - rest_channel_width_min = Column(NullType) - rest_channel_width_max = Column(NullType) - rest_bandwidth = Column(NullType) - parent_energy_id = Column(String(128)) - - asa_dataset = relationship("AsaScience") - - -class AsaEnergyTemp(Base): - __tablename__ = "asa_energy_temp" - __table_args__ = {"schema": "ALMA"} - - asa_energy_id = Column(String(128), primary_key=True) - asa_dataset_id = Column(String(128), index=True) - frequency_min = Column(NullType, nullable=False) - frequency_max = Column(NullType, nullable=False) - resolution_min = Column(NullType, nullable=False) - resolution_max = Column(NullType, nullable=False) - channel_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - channel_width_min = Column(NullType, nullable=False) - channel_width_max = Column(NullType, nullable=False) - resolving_power_min = Column(NullType, nullable=False) - resolving_power_max = Column(NullType, nullable=False) - spectral_window_uid = Column(String(64)) - bandwidth = Column(NullType) - pol_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - pol_product = Column(String(64), nullable=False) - exptimtp = Column(NullType) - exptim7 = Column(NullType) - exptim12 = Column(NullType) - restfreq = Column(NullType) - chanrms = Column(NullType) - crval3 = Column(NullType) - crpix3 = Column(NullType) - crval4 = Column(NullType) - crpix4 = Column(NullType) - cdelt4 = Column(NullType) - parent_asa_energy_ids = Column(String(256)) - spw_num = Column(Numeric(38, 0, asdecimal=False)) - spw_id_original = Column(Numeric(38, 0, asdecimal=False)) - spw_id_orig_list = Column(String(64)) - spectral_window_name = Column(String(64)) - asa_energy_product_id = Column(String(128), index=True) - asdm_spw_id = Column(Numeric(38, 0, asdecimal=False), index=True) - ms_spw_id = Column(Numeric(38, 0, asdecimal=False)) - sensitivity_channel = Column(NullType) - sensitivity_10kms = Column(NullType) - sensitivity_bandwidth = Column(NullType) - line_id = Column(String(256)) - rest_frequency_max = Column(NullType) - rest_frequency_min = Column(NullType) - rest_frequency_resolution_min = Column(NullType) - rest_frequency_resolution_max = Column(NullType) - rest_resolving_power_min = Column(NullType) - rest_resolving_power_max = Column(NullType) - rest_channel_width_min = Column(NullType) - rest_channel_width_max = Column(NullType) - rest_bandwidth = Column(NullType) - parent_energy_id = Column(String(128)) - - -class AsaMailTemplate(Base): - __tablename__ = "asa_mail_templates" - __table_args__ = {"schema": "ALMA"} - - templatename = Column(String(100), primary_key=True, nullable=False) - application = Column(String(100), primary_key=True, nullable=False) - templatecontent = Column(Text, nullable=False) - - -class AsaOu(Base): - __tablename__ = "asa_ous" - __table_args__ = {"schema": "ALMA"} - - asa_ous_id = Column(String(64), primary_key=True) - asa_project_code = Column(String(64)) - sg_ous_uid = Column(String(64)) - group_ous_uid = Column(String(64)) - member_ous_uid = Column(String(64)) - member_num = Column(Numeric(10, 0, asdecimal=False)) - completed = Column(Numeric(1, 0, asdecimal=False)) - xml_scipiperesults_archive_uid = Column(ForeignKey("ALMA.xml_scipiperesults_entities.archive_uid")) - individual_files = Column(Numeric(1, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - - xml_scipiperesults_entity = relationship("XmlScipiperesultsEntity") - - -class AsaOusRedshift(Base): - __tablename__ = "asa_ous_redshift" - __table_args__ = {"schema": "ALMA"} - - group_ous_uid = Column(String(64), primary_key=True, nullable=False) - member_ous_uid = Column(String(64), primary_key=True, nullable=False) - source_name = Column(String(256), primary_key=True, nullable=False) - best_source_redshift = Column(NullType) - - -class AsaOusTemp(Base): - __tablename__ = "asa_ous_temp" - __table_args__ = {"schema": "ALMA"} - - asa_ous_id = Column(String(64), primary_key=True) - asa_project_code = Column(String(64)) - sg_ous_uid = Column(String(64)) - group_ous_uid = Column(String(64)) - member_ous_uid = Column(String(64)) - member_num = Column(Numeric(10, 0, asdecimal=False)) - completed = Column(Numeric(1, 0, asdecimal=False)) - xml_scipiperesults_archive_uid = Column(String(33)) - individual_files = Column(Numeric(1, 0, asdecimal=False), nullable=False) - - -class AsaProductFile(Base): - __tablename__ = "asa_product_files" - __table_args__ = {"schema": "ALMA"} - - ngas_file_id = Column(String(220), primary_key=True, nullable=False) - asa_ous_id = Column(ForeignKey("ALMA.asa_ous.asa_ous_id"), primary_key=True, nullable=False) - asa_science_id = Column(ForeignKey("ALMA.asa_science.dataset_id")) - asa_energy_id = Column(ForeignKey("ALMA.asa_energy.asa_energy_id")) - stored_size = Column(Numeric(20, 0, asdecimal=False), nullable=False) - subdirectory = Column(String(128), nullable=False) - file_class = Column(String(64)) - file_type = Column(String(64)) - pack = Column(Numeric(1, 0, asdecimal=False), nullable=False) - vo = Column(Numeric(1, 0, asdecimal=False)) - creation_date = Column(DateTime, nullable=False) - naxis = Column(Numeric(38, 0, asdecimal=False)) - naxis1 = Column(Numeric(38, 0, asdecimal=False)) - naxis2 = Column(Numeric(38, 0, asdecimal=False)) - naxis3 = Column(Numeric(38, 0, asdecimal=False)) - naxis4 = Column(Numeric(38, 0, asdecimal=False)) - parent_product_files_id = Column(String(64)) - main_product_source = Column(Numeric(1, 0, asdecimal=False)) - main_product_spw = Column(Numeric(1, 0, asdecimal=False)) - origin = Column(String(32)) - user_id = Column(String(32)) - processing_recipe = Column(String(7), nullable=False, server_default=text("'CAL+IMG' ")) - - asa_energy = relationship("AsaEnergy") - asa_ous = relationship("AsaOu") - asa_science = relationship("AsaScience") - - -class AsaProject(Base): - __tablename__ = "asa_project" - __table_args__ = {"schema": "ALMA"} - - code = Column(String(20), primary_key=True) - project_uid = Column(String(32), nullable=False, unique=True) - proposal_uid = Column(ForeignKey("ALMA.xml_obsproposal_entities.archive_uid"), nullable=False) - pi_name = Column(String(256), nullable=False) - pi_userid = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - coi_name = Column(String(2000)) - title = Column(String(256)) - type = Column(String(16), nullable=False) - associated_arc = Column(String(8), nullable=False) - proposal_cycle = Column(String(6), nullable=False) - proposed_start_date = Column(String(128)) - proposed_end_date = Column(String(128)) - first_obs_start = Column(String(128)) - first_obs_end = Column(String(128)) - last_obs_start = Column(String(128)) - last_obs_end = Column(String(128)) - arc_release = Column(String(128)) - scientific_category = Column(String(200)) - science_keyword = Column(String(200)) - proposal_abstract = Column(String(4000)) - - account = relationship("Account") - xml_obsproposal_entity = relationship("XmlObsproposalEntity") - - def __repr__(self): - return '<AsaProject#{code} "{title}" start={first_obs_start} end={last_obs_end}>'.format(**self.__dict__) - - -class AsaProjectBibliography(Base): - __tablename__ = "asa_project_bibliography" - __table_args__ = (Index("bibprojectcode_pk", "bibcode", "project_code", unique=True), {"schema": "ALMA"}) - - bibcode = Column(String(30), nullable=False) - project_code = Column(ForeignKey("ALMA.asa_project.code"), primary_key=True, nullable=False) - bib_id = Column(ForeignKey("ALMA.asa_bibliography.bib_id"), primary_key=True, nullable=False) - - bib = relationship("AsaBibliography") - asa_project = relationship("AsaProject") - - -t_asa_project_bibliography_temp = Table( - "asa_project_bibliography_temp", - metadata, - Column("bibcode", String(30), nullable=False), - Column("project_code", String(20), nullable=False), - Column("bib_id", Numeric(30, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -class AsaProjectTemp(Base): - __tablename__ = "asa_project_temp" - __table_args__ = {"schema": "ALMA"} - - code = Column(String(20), primary_key=True) - project_uid = Column(String(32), nullable=False) - proposal_uid = Column(String(32), nullable=False) - pi_name = Column(String(256), nullable=False) - pi_userid = Column(String(256), nullable=False) - coi_name = Column(String(2000)) - title = Column(String(256)) - type = Column(String(16), nullable=False) - associated_arc = Column(String(8), nullable=False) - proposal_cycle = Column(String(6), nullable=False) - proposed_start_date = Column(String(128)) - proposed_end_date = Column(String(128)) - first_obs_start = Column(String(128)) - first_obs_end = Column(String(128)) - last_obs_start = Column(String(128)) - last_obs_end = Column(String(128)) - arc_release = Column(String(128)) - scientific_category = Column(String(200)) - science_keyword = Column(String(200)) - proposal_abstract = Column(String(4000)) - - -class AsaScience(Base): - __tablename__ = "asa_science" - __table_args__ = {"schema": "ALMA"} - - dataset_id = Column(String(128), primary_key=True) - asdm_uid = Column(String(32), index=True) - field_uid = Column(String(32)) - spectral_window_uid = Column(String(32)) - project_uid = Column(ForeignKey("ALMA.asa_project.project_uid")) - schedblock_uid = Column(String(32)) - execblock_uid = Column(String(32)) - ra = Column(NullType, nullable=False) - dec = Column(NullType, nullable=False) - ra_source = Column(NullType, nullable=False) - dec_source = Column(NullType, nullable=False) - cx = Column(NullType) - cy = Column(NullType) - cz = Column(NullType) - az_min = Column(NullType, nullable=False) - az_max = Column(NullType, nullable=False) - elevation_min = Column(NullType, nullable=False) - elevation_max = Column(NullType, nullable=False) - wcs_cd1_1 = Column(NullType) - wcs_cd1_2 = Column(NullType) - wcs_cd2_1 = Column(NullType) - wcs_cd2_2 = Column(NullType) - wcs_crpix1 = Column(NullType) - wcs_crpix2 = Column(NullType) - wcs_crval1 = Column(NullType) - wcs_crval2 = Column(NullType) - spatial_scale_min = Column(NullType, nullable=False) - spatial_scale_max = Column(NullType, nullable=False) - gal_longitude = Column(NullType, nullable=False) - gal_latitude = Column(NullType, nullable=False) - ecliptic_longitude = Column(NullType, nullable=False) - ecliptic_latitude = Column(NullType, nullable=False) - footprint = Column(String(2048)) - fov = Column(NullType, nullable=False) - bounding_box = Column(String(2048)) - source_name = Column(String(256)) - source_is_in_simbad = Column(String(1), nullable=False, server_default=text("'N' ")) - source_class = Column(String(128)) - source_redshift = Column(NullType) - source_alma_catalog_id = Column(Numeric(22, 0, asdecimal=False)) - start_date = Column(DateTime, nullable=False) - end_date = Column(DateTime, nullable=False) - int_time = Column(Numeric(10, 3), nullable=False) - time_resolution = Column(Numeric(8, 4), nullable=False) - frequency = Column(NullType) - frequency_resolution = Column(NullType) - velocity_resolution = Column(NullType) - resolving_power = Column(NullType) - bandwidth = Column(NullType) - rest_frequency = Column(NullType) - rest_frequency_min = Column(NullType) - rest_frequency_max = Column(NullType) - rest_frequency_resolution = Column(NullType) - rest_velocity_resolution = Column(NullType, nullable=False) - rest_resolving_power = Column(NullType, nullable=False) - rest_frequency_support = Column(String(512), nullable=False) - channel_num = Column(Numeric(scale=0, asdecimal=False)) - spectral_window_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - continuum_window_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - obs_unitset_id = Column(String(32), nullable=False) - science_goal_ouss_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id")) - group_ouss_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id")) - member_ouss_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id")) - sensitivity = Column(Numeric(22, 0, asdecimal=False)) - flux_min = Column(NullType) - flux_max = Column(NullType) - uv_coverage_param1 = Column(NullType) - uv_coverage_param2 = Column(NullType) - pol_num = Column(Numeric(scale=0, asdecimal=False)) - pol_products = Column(String(64)) - airmass = Column(NullType) - pwv = Column(NullType) - temperature = Column(NullType) - windspeed = Column(NullType) - winddirection = Column(NullType) - antennas = Column(String(660)) - baseline_max = Column(NullType, nullable=False) - baseline_min = Column(NullType, nullable=False) - scan_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - project_code = Column(ForeignKey("ALMA.asa_project.code"), nullable=False, index=True) - schedblock_name = Column(String(128)) - observation_category = Column(String(128), nullable=False) - scan_intent = Column(String(256)) - access_format = Column(String(10), nullable=False) - processing_level = Column(Numeric(scale=0, asdecimal=False), nullable=False) - frequency_support = Column(String(4000)) - spatial_resolution = Column(NullType, nullable=False, server_default=text("-1.0 ")) - spatres = Column(NullType) - mineltp = Column(NullType) - minel12 = Column(NullType) - minel7 = Column(NullType) - max_angscale = Column(NullType) - obs_mode = Column(String(80)) - pipver = Column(String(80)) - asdm_list = Column(String(200)) - ant_tp_num = Column(Numeric(3, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - ant_num = Column(Numeric(3, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - ant_main_num = Column(Numeric(3, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - ant_aca_num = Column(Numeric(3, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - frequency_max = Column(NullType, nullable=False, server_default=text("-1. ")) - frequency_min = Column(NullType, nullable=False, server_default=text("-1. ")) - requestedarray = Column(String(8)) - asa_ous_id = Column(ForeignKey("ALMA.asa_ous.asa_ous_id")) - band_list = Column(String(30)) - antenna_string = Column(String(30)) - product_type = Column(String(10)) - dataset_product_id = Column(String(128)) - rms = Column(NullType) - is_mosaic = Column(String(1), nullable=False, server_default=text("'N' ")) - best_source_redshift = Column(NullType) - redshift_provenance = Column(String(1)) - cont_sensitivity_channel = Column(NullType) - cont_sensitivity_10kms = Column(NullType) - cont_sensitivity_bandwidth = Column(NullType) - parent_dataset_id = Column(String(128)) - - asa_ous = relationship("AsaOu") - group_ouss = relationship( - "ObsUnitSetStatu", primaryjoin="AsaScience.group_ouss_id == ObsUnitSetStatu.status_entity_id" - ) - member_ouss = relationship( - "ObsUnitSetStatu", primaryjoin="AsaScience.member_ouss_id == ObsUnitSetStatu.status_entity_id" - ) - asa_project = relationship("AsaProject", primaryjoin="AsaScience.project_code == AsaProject.code") - asa_project1 = relationship("AsaProject", primaryjoin="AsaScience.project_uid == AsaProject.project_uid") - science_goal_ouss = relationship( - "ObsUnitSetStatu", primaryjoin="AsaScience.science_goal_ouss_id == ObsUnitSetStatu.status_entity_id" - ) - - -class AsaScienceKeyword(Base): - __tablename__ = "asa_science_keyword" - __table_args__ = {"schema": "ALMA"} - - keyword = Column(String(100), nullable=False) - category_id = Column(ForeignKey("ALMA.asa_science_keyword_category.id"), nullable=False, index=True) - id = Column(Numeric(asdecimal=False), primary_key=True) - - category = relationship("AsaScienceKeywordCategory") - - -class AsaScienceKeywordCategory(Base): - __tablename__ = "asa_science_keyword_category" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(4, 0, asdecimal=False), primary_key=True) - catg_name = Column(String(100), nullable=False) - - -class AsaScienceTemp(Base): - __tablename__ = "asa_science_temp" - __table_args__ = ( - Index("asa_tmp_idx3", "source_name", "member_ouss_id"), - Index("asa_tmp_idx2", "source_name", "group_ouss_id"), - {"schema": "ALMA"}, - ) - - dataset_id = Column(String(128), primary_key=True) - asdm_uid = Column(String(32)) - field_uid = Column(String(32)) - spectral_window_uid = Column(String(32)) - project_uid = Column(String(32)) - schedblock_uid = Column(String(32)) - execblock_uid = Column(String(32)) - ra = Column(NullType, nullable=False) - dec = Column(NullType, nullable=False) - ra_source = Column(NullType, nullable=False) - dec_source = Column(NullType, nullable=False) - cx = Column(NullType) - cy = Column(NullType) - cz = Column(NullType) - az_min = Column(NullType, nullable=False) - az_max = Column(NullType, nullable=False) - elevation_min = Column(NullType, nullable=False) - elevation_max = Column(NullType, nullable=False) - wcs_cd1_1 = Column(NullType) - wcs_cd1_2 = Column(NullType) - wcs_cd2_1 = Column(NullType) - wcs_cd2_2 = Column(NullType) - wcs_crpix1 = Column(NullType) - wcs_crpix2 = Column(NullType) - wcs_crval1 = Column(NullType) - wcs_crval2 = Column(NullType) - spatial_scale_min = Column(NullType, nullable=False) - spatial_scale_max = Column(NullType, nullable=False) - gal_longitude = Column(NullType, nullable=False) - gal_latitude = Column(NullType, nullable=False) - ecliptic_longitude = Column(NullType, nullable=False) - ecliptic_latitude = Column(NullType, nullable=False) - footprint = Column(String(2048)) - fov = Column(NullType, nullable=False) - bounding_box = Column(String(2048)) - source_name = Column(String(256)) - source_is_in_simbad = Column(String(1), nullable=False) - source_class = Column(String(128)) - source_redshift = Column(NullType) - source_alma_catalog_id = Column(Numeric(22, 0, asdecimal=False)) - start_date = Column(DateTime, nullable=False) - end_date = Column(DateTime, nullable=False) - int_time = Column(Numeric(10, 3), nullable=False) - time_resolution = Column(Numeric(8, 4), nullable=False) - frequency = Column(NullType) - band = Column(Numeric(scale=0, asdecimal=False)) - frequency_resolution = Column(NullType) - velocity_resolution = Column(NullType) - resolving_power = Column(NullType) - bandwidth = Column(NullType) - rest_frequency = Column(NullType) - rest_frequency_min = Column(NullType) - rest_frequency_max = Column(NullType) - rest_frequency_resolution = Column(NullType) - rest_velocity_resolution = Column(NullType, nullable=False) - rest_resolving_power = Column(NullType, nullable=False) - rest_frequency_support = Column(String(512), nullable=False) - channel_num = Column(Numeric(scale=0, asdecimal=False)) - spectral_window_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - continuum_window_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - obs_unitset_id = Column(String(32), nullable=False) - science_goal_ouss_id = Column(String(32)) - group_ouss_id = Column(String(32)) - member_ouss_id = Column(String(32)) - sensitivity = Column(Numeric(22, 0, asdecimal=False)) - flux_min = Column(NullType) - flux_max = Column(NullType) - uv_coverage_param1 = Column(NullType) - uv_coverage_param2 = Column(NullType) - pol_num = Column(Numeric(scale=0, asdecimal=False)) - pol_products = Column(String(64)) - airmass = Column(NullType) - pwv = Column(NullType) - temperature = Column(NullType) - windspeed = Column(NullType) - winddirection = Column(NullType) - antennas = Column(String(660)) - baseline_max = Column(NullType, nullable=False) - baseline_min = Column(NullType, nullable=False) - scan_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - project_code = Column(String(20), nullable=False) - schedblock_name = Column(String(128)) - observation_category = Column(String(128), nullable=False) - scan_intent = Column(String(256)) - access_format = Column(String(10), nullable=False) - processing_level = Column(Numeric(scale=0, asdecimal=False), nullable=False) - frequency_support = Column(String(4000)) - spatial_resolution = Column(NullType, nullable=False) - spatres = Column(NullType) - mineltp = Column(NullType) - minel12 = Column(NullType) - minel7 = Column(NullType) - max_angscale = Column(NullType) - obs_mode = Column(String(80)) - pipver = Column(String(80)) - asdm_list = Column(String(200)) - ant_tp_num = Column(Numeric(3, 0, asdecimal=False), nullable=False) - ant_num = Column(Numeric(3, 0, asdecimal=False), nullable=False) - ant_main_num = Column(Numeric(3, 0, asdecimal=False), nullable=False) - ant_aca_num = Column(Numeric(3, 0, asdecimal=False), nullable=False) - frequency_max = Column(NullType, nullable=False) - frequency_min = Column(NullType, nullable=False) - requestedarray = Column(String(8)) - asa_ous_id = Column(String(64)) - band_list = Column(String(30)) - antenna_string = Column(String(30)) - product_type = Column(String(10)) - dataset_product_id = Column(String(128)) - rms = Column(NullType) - is_mosaic = Column(String(1), nullable=False) - best_source_redshift = Column(NullType) - redshift_provenance = Column(String(1)) - cont_sensitivity_channel = Column(NullType) - cont_sensitivity_10kms = Column(NullType) - cont_sensitivity_bandwidth = Column(NullType) - parent_dataset_id = Column(String(128)) - - -class AsaTable(Base): - __tablename__ = "asa_tables" - __table_args__ = (Index("asa_tables_unique", "schema_name", "table_name", unique=True), {"schema": "ALMA"}) - - schema_name = Column(String(128), nullable=False) - table_name = Column(String(128), nullable=False) - table_type = Column(String(5), nullable=False) - description = Column(String(1024)) - utype = Column(String(512)) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - - -class AsaTablesKey(Base): - __tablename__ = "asa_tables_keys" - __table_args__ = {"schema": "ALMA"} - - key_id = Column(String(128), primary_key=True) - from_table = Column(String(128), nullable=False) - target_table = Column(String(128), nullable=False) - description = Column(String(1024), nullable=False) - utype = Column(String(512)) - - -class AsaTablesKeysColumn(Base): - __tablename__ = "asa_tables_keys_columns" - __table_args__ = {"schema": "ALMA"} - - key_id = Column(String(128), primary_key=True) - from_column = Column(String(128), nullable=False) - target_column = Column(String(128), nullable=False) - - -class AsaTapSchema(Base): - __tablename__ = "asa_tap_schemas" - __table_args__ = {"schema": "ALMA"} - - schema_name = Column(String(128), nullable=False, unique=True) - description = Column(String(1024)) - utype = Column(String(512)) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - - -t_asp_accounts = Table( - "asp_accounts", - metadata, - Column("account_id", String(32), nullable=False), - Column("provides_user_demographics", String(1)), - Column("last_demographics_page_visit", DateTime), - schema="ALMA", -) - - -t_asp_obs_proposal = Table( - "asp_obs_proposal", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("cycle", String(32)), - Column("code", String(64), nullable=False), - Column("priority", String(2)), - Column("title", String(256)), - Column("pi_id", String(32)), - Column("affiliation", String(64)), - Column("executive", String(32)), - Column("qa0passcount", Numeric(asdecimal=False)), - Column("final_scientific_category", String(32)), - Column("project_state", String(32)), - schema="ALMA", -) - - -t_asp_obs_proposal_author = Table( - "asp_obs_proposal_author", - metadata, - Column("proposal_archive_uid", String(255), nullable=False), - Column("author_index", Numeric(scale=0, asdecimal=False), nullable=False), - Column("account_id", String(32), nullable=False), - Column("firstname", String(256), nullable=False), - Column("initials", String(256)), - Column("lastname", String(256), nullable=False), - schema="ALMA", -) - - -t_assignment = Table( - "assignment", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("participant_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("score", Float), - Column("proposal_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("state_change_date", DateTime), - Column("status", String(32)), - Column("assignment_type", String(32)), - Column("conflict", String(32)), - Column("normalized_score", Float), - Column("vote_score", Float), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("rejection_type", String(32)), - Column("normalized_vote_score", Numeric(asdecimal=False)), - Column("assignment_comment", String(4000)), - Column("reason_for_rejection", String(4000)), - Column("comment_to_sa", String(4000)), - Column("comment_to_phase2", String(4000)), - Column("resurrection_justification", String(4000)), - schema="ALMA", -) - - -t_assignment_view = Table( - "assignment_view", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("proposal_code", String(64)), - Column("cycle_code", String(32)), - Column("title", String(256)), - Column("pi_userid", String(32)), - Column("abstract_text", Text), - Column("scientific_category", String(32)), - Column("new_scientific_category", String(16)), - Column("overridden_sci_cat", String(32)), - Column("proposal_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("feasible", String(8)), - Column("arp_avg_score", Float), - Column("arp_std_dev_scores", Float), - Column("arp_score", Float), - Column("arp_prop_strength", String(4000)), - Column("arp_prop_weakness", String(4000)), - Column("arp_prop_improvement", String(4000)), - Column("arp_prop_evaluation", String(4000)), - Column("arp_comment", String(4000)), - Column("aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("aprc_letter_grade", String(1)), - Column("aprc_prop_strength", String(4000)), - Column("aprc_prop_weakness", String(4000)), - Column("aprc_prop_improvement", String(4000)), - Column("aprc_prop_evaluation", String(4000)), - Column("aprc_comment", String(4000)), - Column("dc_letter_grade", String(1)), - Column("assignment_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("status", String(32)), - Column("conflict", String(32)), - Column("assignment_type", String(32)), - Column("assignment_comment", String(4000)), - Column("comment_to_sa", String(4000)), - Column("comment_to_phase2", String(4000)), - Column("score", Float), - Column("normalized_score", Float), - Column("reason_for_rejection", String(4000)), - Column("assessor_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("participant_type", String(64), nullable=False), - Column("assessor_userid", String(32), nullable=False), - Column("assessor_first_name", String(256)), - Column("assessor_last_name", String(256)), - Column("assessor_email", String(256)), - Column("arp_id", Numeric(38, 0, asdecimal=False)), - Column("panel_name", String(255)), - Column("role_on_panel", String(255)), - schema="ALMA", -) - - -class BmmvObsproject(Base): - __tablename__ = "bmmv_obsproject" - __table_args__ = {"schema": "ALMA"} - - prj_archive_uid = Column(String(33), primary_key=True) - deleted = Column(Numeric(1, 0, asdecimal=False), index=True) - pi = Column(String(64), index=True) - prj_name = Column(String(256)) - title = Column(String(256)) - array = Column(String(64)) - prj_code = Column(String(64), nullable=False) - code = Column(String(64), index=True) - prj_time_of_creation = Column(String(23)) - prj_scientific_rank = Column(Numeric(8, 0, asdecimal=False)) - prj_version = Column(String(32)) - prj_assigned_priority = Column(Numeric(asdecimal=False)) - prj_letter_grade = Column(String(2)) - p2g_attention = Column(String(5), index=True) - p2g_attention_reasons = Column(String(4000)) - manual_mode = Column(String(5)) - - -class BmmvObsproposal(Base): - __tablename__ = "bmmv_obsproposal" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - deleted = Column(Numeric(1, 0, asdecimal=False)) - abstract_text = Column(Text) - scientific_category = Column(String(32)) - proposal_type = Column(String(32)) - pi_userid = Column(String(32)) - associatedexec = Column(String(32)) - datereceived = Column(String(32)) - obsproject_archive_uid = Column(String(32), nullable=False, index=True) - projectuid = Column(String(32), nullable=False, index=True) - pi_fullname = Column(String(64)) - organization = Column(String(64)) - email = Column(String(64)) - cycle = Column(String(32), index=True) - keyword1 = Column(String(128)) - keyword2 = Column(String(128)) - keywordcode1 = Column(String(128)) - keywordcode2 = Column(String(128)) - studentproject = Column(String(32)) - - -class BmmvObsproposalAuthor(Base): - __tablename__ = "bmmv_obsproposal_authors" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), nullable=False, index=True) - deleted = Column(Numeric(1, 0, asdecimal=False)) - cycle = Column(String(32), nullable=False) - project_archive_uid = Column(String(33), nullable=False) - userid = Column(String(32), nullable=False) - organisation = Column(String(32)) - executive = Column(String(32)) - authtype = Column(String(4), nullable=False) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - organisation_id = Column(Numeric(38, 0, asdecimal=False)) - - -class BmmvObsproposalFeedback(Base): - __tablename__ = "bmmv_obsproposal_feedback" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - nonalmaexectimefraction = Column(String(16)) - chileexectimefraction = Column(String(16)) - eaexectimefraction = Column(String(16)) - euexectimefraction = Column(String(16)) - naexectimefraction = Column(String(16)) - integration_time = Column(String(64)) - integration_time_unit = Column(String(64)) - receiverband01time = Column(Numeric(asdecimal=False)) - receiverband02time = Column(Numeric(asdecimal=False)) - receiverband03time = Column(Numeric(asdecimal=False)) - receiverband04time = Column(Numeric(asdecimal=False)) - receiverband05time = Column(Numeric(asdecimal=False)) - receiverband06time = Column(Numeric(asdecimal=False)) - receiverband07time = Column(Numeric(asdecimal=False)) - receiverband08time = Column(Numeric(asdecimal=False)) - receiverband09time = Column(Numeric(asdecimal=False)) - receiverband10time = Column(Numeric(asdecimal=False)) - receiverbanduntime = Column(Numeric(asdecimal=False)) - array_time_alma = Column(Numeric(asdecimal=False)) - array_time_unit_alma = Column(String(8)) - array_time_aca = Column(Numeric(asdecimal=False)) - array_time_unit_aca = Column(String(8)) - array_time_twelve_m = Column(Numeric(asdecimal=False)) - array_time_unit_twelve_m = Column(String(8)) - array_time_seven_m = Column(Numeric(asdecimal=False)) - array_time_unit_seven_m = Column(String(8)) - array_time_tp_array = Column(Numeric(asdecimal=False)) - array_time_unit_tp_array = Column(String(8)) - max_data_rate_twelve_m = Column(Numeric(asdecimal=False)) - max_data_rate_unit_twelve_m = Column(String(8)) - data_volume_twelve_m = Column(Numeric(asdecimal=False)) - data_volume_unit_twelve_m = Column(String(8)) - max_data_rate_seven_m = Column(Numeric(asdecimal=False)) - max_data_rate_unit_seven_m = Column(String(8)) - data_volume_seven_m = Column(Numeric(asdecimal=False)) - data_volume_unit_seven_m = Column(String(8)) - max_data_rate_tp_array = Column(Numeric(asdecimal=False)) - max_data_rate_unit_tp_array = Column(String(8)) - data_volume_tp_array = Column(Numeric(asdecimal=False)) - data_volume_unit_tp_array = Column(String(8)) - - -class BmmvObsproposalTarget(Base): - __tablename__ = "bmmv_obsproposal_target" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - prop_archive_uid = Column(String(33), nullable=False, index=True) - science_goal_name = Column(String(1000)) - source_coord_system = Column(String(10)) - target_longitude = Column(Numeric(asdecimal=False)) - target_longitude_unit = Column(String(10)) - target_latitude = Column(Numeric(asdecimal=False)) - target_latitude_unit = Column(String(10)) - desired_sensitivity = Column(Numeric(asdecimal=False)) - desired_sensitivity_unit = Column(String(10)) - desired_angular_resolution = Column(Numeric(asdecimal=False)) - desired_ang_res_unit = Column(String(10)) - spectral_resolution = Column(Numeric(asdecimal=False)) - spectral_resolution_unit = Column(String(10)) - center_frequency = Column(Numeric(asdecimal=False)) - center_frequency_unit = Column(String(10)) - band_width = Column(Numeric(asdecimal=False)) - band_width_unit = Column(String(10)) - is_sky_frequency = Column(String(5)) - group_index = Column(Numeric(asdecimal=False)) - science_goal_index = Column(Numeric(asdecimal=False)) - start_frequency = Column(Numeric(asdecimal=False)) - start_frequency_unit = Column(String(10)) - end_frequency = Column(Numeric(asdecimal=False)) - end_frequency_unit = Column(String(10)) - - -class BmmvObsunitset(Base): - __tablename__ = "bmmv_obsunitset" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - archive_uid = Column(String(32), nullable=False, index=True) - partid = Column(String(64)) - name = Column(String(256)) - scienceprocessingscript = Column(String(1024)) - runsciencepipeline = Column(String(32)) - numberschedblocks = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - ousstatusref = Column(String(32)) - requestedarray = Column(String(8)) - is_resubmission = Column(String(5)) - resubmission_of_name = Column(String(1000)) - resolution_option = Column(String(32)) - solar_system_object = Column(String(32)) - sg_mode = Column(String(16)) - - -class BmmvProjTimeConstraint(Base): - __tablename__ = "bmmv_proj_time_constraint" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - prj_archive_uid = Column(String(33), nullable=False, index=True) - deleted = Column(Numeric(1, 0, asdecimal=False)) - time_constraint_type = Column(String(32)) - start_time = Column(String(32)) - end_time = Column(String(32)) - allowed_margin = Column(String(32)) - allowed_margin_unit = Column(String(5)) - required_delay = Column(String(32)) - required_delay_unit = Column(String(5)) - visit_id = Column(String(32)) - previous_visit_id = Column(String(32)) - monitoring_length = Column(String(32)) - monitoring_length_unit = Column(String(5)) - - -class BmmvQuicklook(Base): - __tablename__ = "bmmv_quicklook" - __table_args__ = ( - Index("bmmv_quicklook_uni", "ousstatus_uid", "ousstatus_part_id", unique=True), - {"schema": "ALMA"}, - ) - - archive_uid = Column(String(33), primary_key=True) - schedblock_uid = Column(String(64)) - qlfocussummary_uid = Column(String(64)) - qlpointingsummary_uid = Column(String(64)) - qlatmospheresummary_uid = Column(String(64)) - ousstatus_uid = Column(String(64), nullable=False) - ousstatus_part_id = Column(String(64), nullable=False) - qlphasesummary_uid = Column(String(64)) - - -class BmmvSchedblock(Base): - __tablename__ = "bmmv_schedblock" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - prj_ref = Column(String(32), index=True) - receiver_band = Column(String(32)) - frequency = Column(String(32)) - ref_ra = Column(String(32)) - ref_dec = Column(String(32)) - sb_name = Column(String(32)) - time_string = Column(String(32)) - time_units = Column(String(32)) - receiverband = Column(String(32)) - refra = Column(String(32)) - refdec = Column(String(32)) - sbname = Column(String(32)) - totalestimatedasstring = Column(String(32)) - totalestimatedtimeunits = Column(String(32)) - status = Column(String(32)) - totalestimatedtime = Column(String(32)) - execution_count = Column(String(32)) - requestedarray = Column(String(8)) - minacceptableangresolution = Column(Float) - maxacceptableangresolution = Column(Float) - representativefrequency = Column(Float) - nominalconfiguration = Column(String(32)) - gous_status_uid = Column(String(32)) - mous_status_uid = Column(String(32)) - sgous_status_uid = Column(String(32)) - - -class BmmvSchedblockPolarisation(Base): - __tablename__ = "bmmv_schedblock_polarisation" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - archive_uid = Column(String(33), nullable=False, index=True) - products = Column(String(32), nullable=False) - - -class BmmvSchedblockSource(Base): - __tablename__ = "bmmv_schedblock_sources" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - archive_uid = Column(String(33), nullable=False, index=True) - field_source_name = Column(String(32), nullable=False) - - -class Country(Base): - __tablename__ = "country" - __table_args__ = {"schema": "ALMA"} - - country_id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - country_name = Column(String(256), nullable=False, unique=True) - executive = Column(String(32), nullable=False) - - -t_cycle = Table( - "cycle", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("code", String(255), nullable=False), - Column("cycle_step", String(64), nullable=False), - Column("total_hours", Numeric(8, 0, asdecimal=False)), - Column("ea_percent", Numeric(8, 2)), - Column("eu_percent", Numeric(8, 2)), - Column("na_percent", Numeric(8, 2)), - Column("cl_percent", Numeric(8, 2)), - Column("other_percent", Numeric(8, 2)), - Column("percent_marker_1", Numeric(8, 0, asdecimal=False)), - Column("percent_marker_2", Numeric(8, 0, asdecimal=False)), - Column("percent_marker_3", Numeric(8, 0, asdecimal=False)), - Column("scientific_categories", String(255)), - Column("start_date", DateTime), - Column("end_date", DateTime), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("triage_std_dev_factor", Numeric(8, 2)), - Column("triage_percent", Numeric(8, 2)), - Column("ddt", String(1)), - Column("active", String(1)), - Column("eu_triage_percent", Numeric(8, 2)), - Column("na_triage_percent", Numeric(8, 2)), - Column("ea_triage_percent", Numeric(8, 2)), - Column("cl_triage_percent", Numeric(8, 2)), - Column("duplication_arc_seconds", Numeric(8, 2)), - Column("keyword_codes", String(4000)), - Column("score_mean", Numeric(8, 6)), - Column("score_std_dev", Numeric(8, 6)), - schema="ALMA", -) - - -t_dbmaintain_scripts = Table( - "dbmaintain_scripts", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_account = Table( - "dbmaintain_scripts_account", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_apdm = Table( - "dbmaintain_scripts_apdm", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_asa = Table( - "dbmaintain_scripts_asa", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_ph1m = Table( - "dbmaintain_scripts_ph1m", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_protrack = Table( - "dbmaintain_scripts_protrack", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_version = Table( - "dbmaintain_scripts_version", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -class DpCacheAsdmInfo(Base): - __tablename__ = "dp_cache_asdm_info" - __table_args__ = {"schema": "ALMA"} - - asdm_id = Column(String(64), primary_key=True) - tar_size_bytes = Column(Numeric(12, 0, asdecimal=False)) - - -class DpCacheXmlInfo(Base): - __tablename__ = "dp_cache_xml_info" - __table_args__ = {"schema": "ALMA"} - - xml_id = Column(String(64), primary_key=True) - size_bytes = Column(Numeric(9, 0, asdecimal=False)) - - -t_dp_delegation = Table( - "dp_delegation", - metadata, - Column("id", Numeric(22, 0, asdecimal=False), nullable=False), - Column("pi_rh_id", Numeric(22, 0, asdecimal=False), nullable=False), - Column("project_code", String(18), nullable=False), - Column("delegee_rh_id", Numeric(22, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -t_dp_delegation_backup = Table( - "dp_delegation_backup", - metadata, - Column("id", Numeric(22, 0, asdecimal=False), nullable=False), - Column("pi_rh_id", Numeric(22, 0, asdecimal=False), nullable=False), - Column("project_code", String(18), nullable=False), - Column("delegee_rh_id", Numeric(22, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -t_dp_delivery_asdm_ous_bkp = Table( - "dp_delivery_asdm_ous_bkp", - metadata, - Column("asdm_uid", String(33)), - Column("ous_status_id", String(33)), - Column("deliverable_name", String(64), nullable=False), - Column("id", Numeric(22, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -t_drm_data_reducer = Table( - "drm_data_reducer", - metadata, - Column("dr_user_id", ForeignKey("ALMA.account.account_id"), primary_key=True), - Column("node_id", ForeignKey("ALMA.drm_node.id")), - schema="ALMA", -) - - -class DrmDrHistory(Base): - __tablename__ = "drm_dr_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - author = Column(String(32)) - entityuid = Column(String(32), nullable=False) - datareducer = Column(String(32)) - ttimestamp = Column(DateTime, nullable=False) - arc = Column(String(8)) - - -class DrmDrQualification(Base): - __tablename__ = "drm_dr_qualification" - __table_args__ = {"schema": "ALMA"} - - dr_user_id = Column(ForeignKey("ALMA.account.account_id"), primary_key=True, nullable=False) - qualification = Column(String(32), primary_key=True, nullable=False) - - dr_user = relationship("Account") - - -class DrmNode(Base): - __tablename__ = "drm_node" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(3, 0, asdecimal=False), primary_key=True) - arc = Column(String(8), nullable=False) - node = Column(String(32)) - - -t_email_template = Table( - "email_template", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("name", String(255), nullable=False), - Column("content_type", String(64)), - Column("subject", String(255)), - Column("body", Text), - Column("query", Text), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("system_email", String(1)), - schema="ALMA", -) - - -class ErrorLog(Base): - __tablename__ = "error_log" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - archive_uid = Column(String(32)) - table_name = Column(String(30)) - ora_error_code = Column(Numeric(scale=0, asdecimal=False)) - ora_error_message = Column(String(4000)) - ora_backtrace = Column(Text) - ora_callstack = Column(Text) - created_on = Column(DateTime) - created_by = Column(String(30)) - - -class Eu1(Base): - __tablename__ = "eu1" - __table_args__ = {"schema": "ALMA"} - - data1 = Column(String(100), primary_key=True) - - -class Institution(Base): - __tablename__ = "institution" - __table_args__ = ( - Index("institution_name_unique", "name1", "name2", "name3", "country_id", "state", unique=True), - {"schema": "ALMA"}, - ) - - inst_no = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - sibling_no = Column(ForeignKey("ALMA.institution.inst_no")) - name1 = Column(String(2048), nullable=False) - name2 = Column(String(256)) - name3 = Column(String(256)) - altnames = Column(String(256)) - city = Column(String(64)) - postcode = Column(String(32)) - executive = Column(String(5), nullable=False) - state = Column(String(32)) - email = Column(String(256)) - url = Column(String(256)) - phone = Column(String(128)) - fax = Column(String(128)) - recorder = Column(String(256)) - superseding_no = Column(Numeric(38, 0, asdecimal=False)) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - country_id = Column(ForeignKey("ALMA.country.country_id")) - user_defined = Column(String(1), server_default=text("'F'")) - ignored = Column(String(1), server_default=text("'F'")) - address1 = Column(String(512)) - address2 = Column(String(512)) - address3 = Column(String(512)) - - country = relationship("Country") - parent = relationship("Institution", remote_side=[inst_no]) - - -t_mv_obsproject = Table( - "mv_obsproject", - metadata, - Column("prj_archive_uid", String(33), nullable=False), - Column("pi", String(32)), - Column("prj_name", String(256)), - Column("array", String(64)), - Column("prj_code", String(64), nullable=False), - Column("prj_time_of_creation", String(23)), - Column("prj_scientific_rank", Numeric(8, 0, asdecimal=False)), - Column("prj_version", String(32)), - Column("prj_assigned_priority", Numeric(asdecimal=False)), - Column("prj_letter_grade", String(2)), - Column("ph1m_priority_grade", String(2)), - Column("pi_fullname", String(64)), - Column("organization", String(64)), - Column("email", String(64)), - Column("cycle", String(32)), - Column("executive", String(32)), - Column("p2g_attention", String(5)), - Column("p2g_attention_reasons", String(4000)), - schema="ALMA", -) - - -t_mv_obsproject_derived = Table( - "mv_obsproject_derived", - metadata, - Column("prj_archive_uid", String(33), nullable=False), - Column("total_time", Numeric(asdecimal=False)), - Column("used_time", Numeric(asdecimal=False)), - schema="ALMA", -) - - -t_mv_obsproposal = Table( - "mv_obsproposal", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("deleted", Numeric(1, 0, asdecimal=False)), - Column("title", String(256)), - Column("code", String(64)), - Column("cycle", String(32)), - Column("abstract_text", Text), - Column("scientific_category", String(32)), - Column("proposal_type", String(32)), - Column("pi_userid", String(32)), - Column("obsproject_archive_uid", String(32), nullable=False), - Column("pi_executive", String(32)), - Column("datereceived", String(32)), - Column("keyword1", String(128)), - Column("keyword2", String(128)), - Column("keywordcode1", String(128)), - Column("keywordcode2", String(128)), - Column("studentproject", String(32)), - Column("nonalmaexectimefraction", String(16)), - Column("chileexectimefraction", String(16)), - Column("eaexectimefraction", String(16)), - Column("euexectimefraction", String(16)), - Column("naexectimefraction", String(16)), - Column("integration_time", Numeric(asdecimal=False)), - Column("integration_time_unit", String(8)), - Column("receiverband01time", Numeric(asdecimal=False)), - Column("receiverband02time", Numeric(asdecimal=False)), - Column("receiverband03time", Numeric(asdecimal=False)), - Column("receiverband04time", Numeric(asdecimal=False)), - Column("receiverband05time", Numeric(asdecimal=False)), - Column("receiverband06time", Numeric(asdecimal=False)), - Column("receiverband07time", Numeric(asdecimal=False)), - Column("receiverband08time", Numeric(asdecimal=False)), - Column("receiverband09time", Numeric(asdecimal=False)), - Column("receiverband10time", Numeric(asdecimal=False)), - Column("receiverbanduntime", Numeric(asdecimal=False)), - Column("array_time_alma", Numeric(asdecimal=False)), - Column("array_time_unit_alma", String(8)), - Column("array_time_twelve_m", Numeric(asdecimal=False)), - Column("array_time_unit_twelve_m", String(8)), - Column("array_time_aca", Numeric(asdecimal=False)), - Column("array_time_unit_aca", String(8)), - Column("array_time_seven_m", Numeric(asdecimal=False)), - Column("array_time_unit_seven_m", String(8)), - Column("array_time_tp_array", Numeric(asdecimal=False)), - Column("array_time_unit_tp_array", String(8)), - Column("max_data_rate_twelve_m", Numeric(asdecimal=False)), - Column("max_data_rate_unit_twelve_m", String(8)), - Column("data_volume_twelve_m", Numeric(asdecimal=False)), - Column("data_volume_unit_twelve_m", String(8)), - Column("max_data_rate_seven_m", Numeric(asdecimal=False)), - Column("max_data_rate_unit_seven_m", String(8)), - Column("data_volume_seven_m", Numeric(asdecimal=False)), - Column("data_volume_unit_seven_m", String(8)), - Column("max_data_rate_tp_array", Numeric(asdecimal=False)), - Column("max_data_rate_unit_tp_array", String(8)), - Column("data_volume_tp_array", Numeric(asdecimal=False)), - Column("data_volume_unit_tp_array", String(8)), - Column("domain_entity_state", String(32), nullable=False), - Column("status_entity_id", String(64), nullable=False), - schema="ALMA", -) - - -t_mv_obsproposal_authors = Table( - "mv_obsproposal_authors", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("prj_code", String(64), nullable=False), - Column("deleted", Numeric(1, 0, asdecimal=False)), - Column("cycle", String(32), nullable=False), - Column("project_archive_uid", String(33), nullable=False), - Column("userid", String(32), nullable=False), - Column("organisation", String(32)), - Column("organisation_id", Numeric(38, 0, asdecimal=False)), - Column("executive", String(32)), - Column("authtype", String(4), nullable=False), - schema="ALMA", -) - - -t_mv_obsproposal_target = Table( - "mv_obsproposal_target", - metadata, - Column("id", Numeric(asdecimal=False), nullable=False), - Column("prop_archive_uid", String(33), nullable=False), - Column("cycle", String(32)), - Column("code", String(64)), - Column("scientific_category", String(32)), - Column("new_scientific_category", String(16)), - Column("science_goal_name", String(1000)), - Column("source_coord_system", String(10)), - Column("target_longitude", Numeric(asdecimal=False)), - Column("target_longitude_unit", String(10)), - Column("target_latitude", Numeric(asdecimal=False)), - Column("target_latitude_unit", String(10)), - Column("desired_sensitivity", Numeric(asdecimal=False)), - Column("desired_sensitivity_unit", String(10)), - Column("desired_angular_resolution", Numeric(asdecimal=False)), - Column("desired_ang_res_unit", String(10)), - Column("spectral_resolution", Numeric(asdecimal=False)), - Column("spectral_resolution_unit", String(10)), - Column("center_frequency", Numeric(asdecimal=False)), - Column("center_frequency_unit", String(10)), - Column("band_width", Numeric(asdecimal=False)), - Column("band_width_unit", String(10)), - Column("is_sky_frequency", String(4)), - Column("group_index", Numeric(asdecimal=False)), - Column("aprc_letter_grade", String(1)), - Column("dc_letter_grade", String(1)), - Column("science_goal_index", Numeric(asdecimal=False)), - Column("project_status", String(32), nullable=False), - Column("start_frequency", Numeric(asdecimal=False)), - Column("start_frequency_unit", String(10)), - Column("end_frequency", Numeric(asdecimal=False)), - Column("end_frequency_unit", String(10)), - schema="ALMA", -) - - -t_mv_obsunitset = Table( - "mv_obsunitset", - metadata, - Column("archive_uid", String(32), nullable=False), - Column("partid", String(64)), - Column("name", String(256)), - Column("scienceprocessingscript", String(1024)), - Column("runsciencepipeline", String(32)), - Column("numberschedblocks", String(32)), - Column("requestedarray", String(8)), - Column("ousstatusref", String(32)), - Column("is_resubmission", String(5)), - Column("resubmission_of_name", String(1000)), - Column("resolution_option", String(32)), - Column("solar_system_object", String(32)), - Column("sg_mode", String(16)), - schema="ALMA", -) - - -t_mv_proj_time_constraint = Table( - "mv_proj_time_constraint", - metadata, - Column("id", Numeric(asdecimal=False), nullable=False), - Column("prj_archive_uid", String(33), nullable=False), - Column("deleted", Numeric(1, 0, asdecimal=False)), - Column("time_constraint_type", String(32)), - Column("start_time", String(32)), - Column("end_time", String(32)), - Column("allowed_margin", String(32)), - Column("allowed_margin_unit", String(5)), - Column("required_delay", String(32)), - Column("required_delay_unit", String(5)), - Column("visit_id", String(32)), - Column("previous_visit_id", String(32)), - Column("monitoring_length", String(32)), - Column("monitoring_length_unit", String(5)), - schema="ALMA", -) - - -t_mv_quicklook = Table( - "mv_quicklook", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("schedblock_uid", String(64)), - Column("qlfocussummary_uid", String(64)), - Column("qlpointingsummary_uid", String(64)), - Column("qlatmospheresummary_uid", String(64)), - schema="ALMA", -) - - -t_mv_schedblock = Table( - "mv_schedblock", - metadata, - Column("sb_archive_uid", String(33), nullable=False), - Column("prj_ref", String(32)), - Column("receiver_band", String(32)), - Column("frequency", String(32)), - Column("ref_ra", String(32)), - Column("ref_dec", String(32)), - Column("sb_name", String(32)), - Column("requested_array", String(8)), - Column("minacceptableangresolution", Float), - Column("maxacceptableangresolution", Float), - Column("representativefrequency", Float), - Column("status", String(32), nullable=False), - Column("used_time", Numeric(asdecimal=False)), - Column("time_string", String(32)), - Column("time_units", String(32)), - Column("execution_count", String(32)), - Column("nominalconfiguration", String(32)), - Column("time", Numeric(asdecimal=False)), - Column("phase1_flag", Numeric(asdecimal=False)), - schema="ALMA", -) - - -t_mv_schedblock_sourcename = Table( - "mv_schedblock_sourcename", - metadata, - Column("id", Numeric(asdecimal=False), nullable=False), - Column("archive_uid", String(33), nullable=False), - Column("sourcename", String(32), nullable=False), - schema="ALMA", -) - - -class ObsProjectStatu(Base): - __tablename__ = "obs_project_status" - __table_args__ = {"schema": "ALMA"} - - status_entity_id = Column(String(64), primary_key=True) - domain_entity_id = Column(String(64), nullable=False, index=True) - domain_entity_state = Column(String(32), nullable=False, index=True) - obs_project_status_id = Column(String(64), nullable=False) - obs_program_status_id = Column(String(64), nullable=False) - obs_project_id = Column(ForeignKey("ALMA.xml_obsproject_entities.archive_uid"), nullable=False, unique=True) - project_was_timed_out = Column(DateTime) - xml = Column(NullType) - flags = Column(String(200), index=True) - - obs_project = relationship("XmlObsprojectEntity") - - -class ObsUnitSetStatu(Base): - __tablename__ = "obs_unit_set_status" - __table_args__ = (Index("ous_status_project_entity_idx", "obs_project_id", "domain_entity_id"), {"schema": "ALMA"}) - - status_entity_id = Column(String(64), primary_key=True) - domain_entity_id = Column(String(64)) - domain_entity_state = Column(String(32), nullable=False) - parent_obs_unit_set_status_id = Column(String(64)) - obs_project_status_id = Column(String(64), nullable=False) - obs_project_id = Column(ForeignKey("ALMA.xml_obsproject_entities.archive_uid"), nullable=False) - total_required_time_in_sec = Column(Numeric(scale=0, asdecimal=False), nullable=False) - total_used_time_in_sec = Column(Numeric(scale=0, asdecimal=False), nullable=False) - xml = Column(NullType) - flags = Column(String(200), index=True) - - obs_project = relationship("XmlObsprojectEntity") - - -class OcdObservingCycle(Base): - __tablename__ = "ocd_observing_cycle" - __table_args__ = {"schema": "ALMA"} - - observingcycleid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - cycle = Column(String(32), nullable=False, unique=True) - description = Column(String(256)) - clfraction = Column(Numeric(8, 2)) - eafraction = Column(Numeric(8, 2)) - eufraction = Column(Numeric(8, 2)) - nafraction = Column(Numeric(8, 2)) - otherfraction = Column(Numeric(8, 2)) - - -class OcdObservingSession(Base): - __tablename__ = "ocd_observing_session" - __table_args__ = ( - Index("ocd_obssession_uni", "observingcycleid", "blocknumber", "startdate", unique=True), - {"schema": "ALMA"}, - ) - - sessionid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - observingcycleid = Column(ForeignKey("ALMA.ocd_observing_cycle.observingcycleid"), nullable=False) - blocknumber = Column(Numeric(8, 0, asdecimal=False), nullable=False) - startdate = Column(DateTime, nullable=False) - enddate = Column(DateTime, nullable=False) - comments = Column(String(256)) - - ocd_observing_cycle = relationship("OcdObservingCycle") - - -t_old_dbmaintain_scripts = Table( - "old_dbmaintain_scripts", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -class OusOperation(Base): - __tablename__ = "ous_operations" - __table_args__ = {"schema": "ALMA"} - - obs_unit_set_id = Column(String(64), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - data_reducer_account_id = Column(ForeignKey("ALMA.account.account_id")) - data_reducer_executive = Column(String(64)) - qa2recipients = Column(String(512)) - drm_account_id = Column(ForeignKey("ALMA.account.account_id")) - - data_reducer_account = relationship( - "Account", primaryjoin="OusOperation.data_reducer_account_id == Account.account_id" - ) - drm_account = relationship("Account", primaryjoin="OusOperation.drm_account_id == Account.account_id") - - -t_panel = Table( - "panel", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("panel_name", String(255), nullable=False), - Column("minutes", Text), - Column("panel_type", String(32), nullable=False), - Column("scientific_category", String(32)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - schema="ALMA", -) - - -t_panel_member = Table( - "panel_member", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("participant_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("panel_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("role_on_panel", String(255)), - Column("package_downloaded", DateTime), - schema="ALMA", -) - - -t_participant = Table( - "participant", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("package_downloaded", DateTime), - Column("userid", String(32), nullable=False), - Column("participant_type", String(64), nullable=False), - Column("alma_location", String(32)), - Column("keyword_codes", String(256)), - Column("score_mean", Numeric(8, 6)), - Column("score_std_dev", Numeric(8, 6)), - schema="ALMA", -) - - -class Ph1mAssignment(Base): - __tablename__ = "ph1m_assignment" - __table_args__ = (Index("assignment_unique", "proposal_id", "participant_id", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - participant_id = Column(ForeignKey("ALMA.ph1m_participant.id"), nullable=False, index=True) - score = Column(Float) - proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id"), nullable=False, index=True) - state_change_date = Column(DateTime) - status = Column(String(32)) - assignment_type = Column(String(32)) - conflict = Column(String(32)) - normalized_score = Column(Float) - vote_score = Column(Float) - update_date = Column(DateTime) - update_userid = Column(String(32)) - rejection_type = Column(String(32)) - normalized_vote_score = Column(Numeric(asdecimal=False)) - assignment_comment = Column(String(4000)) - reason_for_rejection = Column(String(4000)) - comment_to_sa = Column(String(4000)) - comment_to_phase2 = Column(String(4000)) - resurrection_justification = Column(String(4000)) - - participant = relationship("Ph1mParticipant") - proposal = relationship("Ph1mProposal") - - -class Ph1mAutosave(Base): - __tablename__ = "ph1m_autosave" - __table_args__ = {"schema": "ALMA"} - - table_name = Column(String(32), primary_key=True, nullable=False) - column_name = Column(String(32), primary_key=True, nullable=False) - row_id = Column(Numeric(38, 0, asdecimal=False), primary_key=True, nullable=False) - user_id = Column(String(32), primary_key=True, nullable=False) - update_date = Column(DateTime, nullable=False) - saved_text = Column(Text, nullable=False) - - -class Ph1mCycle(Base): - __tablename__ = "ph1m_cycle" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - code = Column(String(255), nullable=False, unique=True) - cycle_step = Column(String(64), nullable=False) - total_hours = Column(Numeric(8, 0, asdecimal=False)) - ea_percent = Column(Numeric(8, 2)) - eu_percent = Column(Numeric(8, 2)) - na_percent = Column(Numeric(8, 2)) - cl_percent = Column(Numeric(8, 2)) - other_percent = Column(Numeric(8, 2)) - percent_marker_1 = Column(Numeric(8, 0, asdecimal=False)) - percent_marker_2 = Column(Numeric(8, 0, asdecimal=False)) - percent_marker_3 = Column(Numeric(8, 0, asdecimal=False)) - scientific_categories = Column(String(255)) - start_date = Column(DateTime) - end_date = Column(DateTime) - update_date = Column(DateTime) - update_userid = Column(String(32)) - triage_std_dev_factor = Column(Numeric(8, 2)) - triage_percent = Column(Numeric(8, 2)) - ddt = Column(String(1), server_default=text("'F'")) - active = Column(String(1), server_default=text("'T'")) - eu_triage_percent = Column(Numeric(8, 2), server_default=text("70")) - na_triage_percent = Column(Numeric(8, 2), server_default=text("70")) - ea_triage_percent = Column(Numeric(8, 2), server_default=text("70")) - cl_triage_percent = Column(Numeric(8, 2), server_default=text("70")) - duplication_arc_seconds = Column(Numeric(8, 2), server_default=text("120")) - keyword_codes = Column(String(4000)) - score_mean = Column(Numeric(8, 6)) - score_std_dev = Column(Numeric(8, 6)) - triage_oversub_percent = Column( - Numeric(8, 2), - server_default=text( - """\ -300 - """ - ), - ) - - -class Ph1mEmailTemplate(Base): - __tablename__ = "ph1m_email_template" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - name = Column(String(255), nullable=False, unique=True) - content_type = Column(String(64)) - subject = Column(String(255)) - body = Column(Text) - query = Column(Text) - update_date = Column(DateTime) - update_userid = Column(String(32)) - system_email = Column( - String(1), - server_default=text( - """\ -'F' - """ - ), - ) - - -class Ph1mPanel(Base): - __tablename__ = "ph1m_panel" - __table_args__ = (Index("unique_panel_name", "cycle_id", "panel_name", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - cycle_id = Column(ForeignKey("ALMA.ph1m_cycle.id"), nullable=False) - panel_name = Column(String(255), nullable=False) - minutes = Column(Text) - panel_type = Column(String(32), nullable=False) - scientific_category = Column(String(32)) - update_date = Column(DateTime) - update_userid = Column(String(32)) - - cycle = relationship("Ph1mCycle") - proposals = relationship("Ph1mProposal", secondary="ALMA.ph1m_panel_proposal") - - -class Ph1mPanelMember(Base): - __tablename__ = "ph1m_panel_member" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - participant_id = Column(ForeignKey("ALMA.ph1m_participant.id"), nullable=False) - panel_id = Column(ForeignKey("ALMA.ph1m_panel.id"), nullable=False) - role_on_panel = Column(String(255)) - package_downloaded = Column(DateTime) - - panel = relationship("Ph1mPanel") - participant = relationship("Ph1mParticipant") - - -t_ph1m_panel_proposal = Table( - "ph1m_panel_proposal", - metadata, - Column("panel_id", ForeignKey("ALMA.ph1m_panel.id"), primary_key=True, nullable=False), - Column("proposal_id", ForeignKey("ALMA.ph1m_proposal.id"), primary_key=True, nullable=False), - schema="ALMA", -) - - -class Ph1mParticipant(Base): - __tablename__ = "ph1m_participant" - __table_args__ = (Index("participant_unique", "userid", "cycle_id", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - cycle_id = Column(ForeignKey("ALMA.ph1m_cycle.id"), nullable=False) - package_downloaded = Column(DateTime) - userid = Column(String(32), nullable=False, index=True) - participant_type = Column(String(64), nullable=False) - alma_location = Column(String(32)) - keyword_codes = Column(String(256)) - score_mean = Column(Numeric(8, 6)) - score_std_dev = Column(Numeric(8, 6)) - max_workload = Column(Numeric(3, 0, asdecimal=False)) - - cycle = relationship("Ph1mCycle") - - -class Ph1mProposal(Base): - __tablename__ = "ph1m_proposal" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - cycle_id = Column(ForeignKey("ALMA.ph1m_cycle.id"), nullable=False) - archive_uid = Column(String(255), nullable=False, unique=True) - panel_id_back = Column(Numeric(38, 0, asdecimal=False), index=True) - cancelled = Column(String(1), server_default=text("'F'")) - new_integration_time_hours = Column(Numeric(8, 2), server_default=text("0")) - new_scientific_category = Column(String(16)) - needs_more_time = Column(String(1), server_default=text("'F'")) - arp_score = Column(Float) - arp_avg_score = Column(Float) - arp_std_dev_scores = Column(Float) - aprc_letter_grade = Column(String(1)) - aprc_rank = Column(Numeric(scale=0, asdecimal=False)) - aprc_original_rank = Column(Numeric(scale=0, asdecimal=False)) - arp_work_progress = Column(String(10)) - aprc_work_progress = Column(String(10), server_default=text("'NOT_SEEN'")) - feasible = Column(String(8)) - dc_score = Column(Float) - dc_letter_grade = Column(String(1)) - dc_rank = Column(Numeric(scale=0, asdecimal=False)) - dc_original_rank = Column(Numeric(scale=0, asdecimal=False)) - dc_rank_changed = Column(String(1), server_default=text("'F'")) - dc_work_progress = Column(String(10), server_default=text("'NOT_SEEN'")) - arp_rank = Column(Numeric(scale=0, asdecimal=False)) - update_date = Column(DateTime) - update_userid = Column(String(32)) - triage_flag = Column(String(1), server_default=text("'A'")) - arp_vote_avg = Column(Float) - arp_vote_std_dev = Column(Float) - arp_nr_votes = Column(Numeric(scale=0, asdecimal=False), server_default=text("0")) - arp_original_rank = Column(Numeric(scale=0, asdecimal=False)) - arp_rank_manually_changed = Column(String(1), server_default=text("'F'")) - aprc_rank_manually_changed = Column(String(1), server_default=text("'F'")) - arp_score_normalized = Column(Float, server_default=text("999999")) - arp_rank_normalized = Column(Float, server_default=text("999999")) - duplication_flags = Column(String(250)) - arp_comment = Column(String(4000)) - aprc_comment = Column(String(4000)) - new_time_set_by_sg_descope = Column(String(1)) - arp_prop_strength = Column(String(4000)) - arp_prop_weakness = Column(String(4000)) - arp_prop_improvement = Column(String(4000)) - arp_prop_evaluation = Column(String(4000)) - aprc_prop_strength = Column(String(4000)) - aprc_prop_weakness = Column(String(4000)) - aprc_prop_improvement = Column(String(4000)) - aprc_prop_evaluation = Column(String(4000)) - ta_comment_to_pi = Column(String(4000)) - arp_grouping_flag = Column(Numeric(2, 0, asdecimal=False)) - non_standard_twelve_m_hours = Column(Numeric(8, 2)) - manual_flag = Column(String(255)) - new_keywordcode1 = Column(String(4)) - new_keywordcode2 = Column(String(4)) - - cycle = relationship("Ph1mCycle") - - -class Ph1mProposalAuthor(Base): - __tablename__ = "ph1m_proposal_author" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id"), nullable=False, index=True) - sequence = Column(Numeric(scale=0, asdecimal=False), nullable=False) - userid = Column(String(32), nullable=False, index=True) - institution_id = Column(Numeric(asdecimal=False)) - author_type = Column(String(4)) - - proposal = relationship("Ph1mProposal") - - -class Ph1mProposalScienceGoal(Base): - __tablename__ = "ph1m_proposal_science_goal" - __table_args__ = (Index("ph1m_psg_unique", "proposal_id", "sg_name", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(19, 0, asdecimal=False), nullable=False) - proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id"), nullable=False, index=True) - sg_name = Column(String(512), nullable=False) - sg_mode = Column(String(10), nullable=False) - sg_12m_hours = Column(Numeric(8, 2)) - sg_aca_hours = Column(Numeric(8, 2)) - sg_7m_hours = Column(Numeric(8, 2)) - sg_tp_hours = Column(Numeric(8, 2)) - - proposal = relationship("Ph1mProposal") - - -class Ph1mRecommScienceGoal(Base): - __tablename__ = "ph1m_recomm_science_goal" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - recommendation_id = Column(ForeignKey("ALMA.ph1m_recommendation.id"), nullable=False) - science_goal_name = Column(String(512)) - descope = Column(String(1)) - proposal_science_goal_id = Column(ForeignKey("ALMA.ph1m_proposal_science_goal.id"), index=True) - - proposal_science_goal = relationship("Ph1mProposalScienceGoal") - recommendation = relationship("Ph1mRecommendation") - - -class Ph1mRecommendation(Base): - __tablename__ = "ph1m_recommendation" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - recommendation_type = Column(String(32), nullable=False) - aprc_flag = Column(String(1), server_default=text("null")) - dc_flag = Column(String(1), server_default=text("'F'")) - proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id")) - update_date = Column(DateTime) - update_userid = Column(String(32)) - duplicate_proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id")) - arc_seconds = Column(Numeric(8, 2)) - text = Column(String(4000)) - text_from_aprc = Column(String(4000)) - prop_recom_uid = Column(Numeric(19, 0, asdecimal=False)) - - duplicate_proposal = relationship( - "Ph1mProposal", primaryjoin="Ph1mRecommendation.duplicate_proposal_id == Ph1mProposal.id" - ) - proposal = relationship("Ph1mProposal", primaryjoin="Ph1mRecommendation.proposal_id == Ph1mProposal.id") - - -t_piv_account = Table( - "piv_account", - metadata, - Column("account_id", String(32), nullable=False), - Column("request_handler_id", Numeric(22, 0, asdecimal=False)), - Column("firstname", String(256), nullable=False), - Column("lastname", String(256), nullable=False), - Column("initials", String(256)), - Column("preferredarc", String(32)), - Column("email", String(256)), - Column("executive", String(5), nullable=False), - Column("instno", Numeric(38, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -t_piv_execblock = Table( - "piv_execblock", - metadata, - Column("execblockuid", String(32), nullable=False), - Column("qa0status", String(32), nullable=False), - Column("aquastarttime", DateTime), - Column("aquaendtime", DateTime), - Column("starttime", DateTime), - Column("endtime", DateTime), - Column("schedblockuid", String(32)), - Column("obsprojectpi", String(20)), - Column("representativefrequency", Numeric(15, 10)), - Column("obsprojectuid", String(32)), - schema="ALMA", -) - - -t_piv_obs_project = Table( - "piv_obs_project", - metadata, - Column("code", String(64)), - Column("pi", String(64)), - Column("contact_account_id", String(64)), - Column("firstname", String(256)), - Column("lastname", String(256)), - Column("contact_firstname", String(256)), - Column("contact_lastname", String(256)), - Column("title", String(256)), - Column("prj_version", String(32)), - Column("prj_letter_grade", String(2)), - Column("prj_grade", String(1)), - Column("rank", Numeric(8, 0, asdecimal=False)), - Column("obs_project_id", String(64), nullable=False), - Column("domain_entity_state", String(32), nullable=False), - schema="ALMA", -) - - -t_piv_obs_proposals = Table( - "piv_obs_proposals", - metadata, - Column("code", String(64)), - Column("title", String(256)), - Column("creation_date", String(23)), - Column("priority_flag", String(2)), - Column("associatedexec", String(32)), - Column("scientific_category", String(32)), - Column("scientific_category_string", String(4000)), - Column("abstract_text", Text), - Column("cycle", String(32)), - Column("proposal_type", String(32)), - Column("projectuid", String(32), nullable=False), - Column("archiveuid", String(33), nullable=False), - Column("consensus_report", String(4000)), - Column("consensus_report1", String(4000)), - Column("project_state", String(32), nullable=False), - schema="ALMA", -) - - -t_piv_obs_unit_set = Table( - "piv_obs_unit_set", - metadata, - Column("obs_project_id", String(64), nullable=False), - Column("status_entity_id", String(64), nullable=False), - Column("parent_obs_unit_set_status_id", String(64)), - Column("domain_entity_state", String(32), nullable=False), - Column("partid", String(64)), - Column("name", String(256)), - Column("requestedarray", String(8)), - Column("qa2status", String(8)), - schema="ALMA", -) - - -t_piv_proposal_authors = Table( - "piv_proposal_authors", - metadata, - Column("account_id", String(32), nullable=False), - Column("firstname", String(256), nullable=False), - Column("lastname", String(256), nullable=False), - Column("initials", String(256)), - Column("sequence", Numeric(22, 0, asdecimal=False), nullable=False), - Column("author_type", String(4), nullable=False), - Column("project_uid", String(32), nullable=False), - schema="ALMA", -) - - -t_piv_sched_block = Table( - "piv_sched_block", - metadata, - Column("obs_project_id", String(64), nullable=False), - Column("status_entity_id", String(64), nullable=False), - Column("parent_obs_unit_set_status_id", String(64), nullable=False), - Column("domain_entity_state", String(32), nullable=False), - Column("flags", String(200)), - Column("sched_block_uid", String(64), nullable=False), - Column("sb_name", String(32)), - Column("totalestimatedtime", String(32)), - Column("totalestimatedtimeunits", String(32)), - Column("ref_ra", String(32)), - Column("ref_dec", String(32)), - Column("execution_count", String(32)), - Column("qa2status", String(8)), - Column("nominalconfiguration", String(32)), - schema="ALMA", -) - - -t_piv_science_goal = Table( - "piv_science_goal", - metadata, - Column("project_uid", String(33), nullable=False), - Column("project_code", String(64)), - Column("science_goal_name", String(256)), - Column("ous_part_id", String(256)), - Column("ous_status_uid", String(64)), - Column("sb_uid", String(64)), - schema="ALMA", -) - - -t_piv_science_goal_ous_subview = Table( - "piv_science_goal_ous_subview", - metadata, - Column("ous_status_uid", String(64), nullable=False), - Column("project_uid", String(64), nullable=False), - Column("ous_part_id", String(64)), - Column("sb_uid", String(64), nullable=False), - schema="ALMA", -) - - -t_piv_science_goal_subview = Table( - "piv_science_goal_subview", - metadata, - Column("project_uid", String(33), nullable=False), - Column("project_code", String(64)), - Column("science_goal_name", String(256)), - Column("ous_part_id", String(256)), - schema="ALMA", -) - - -t_piv_state_changes = Table( - "piv_state_changes", - metadata, - Column("state_changes_id", Numeric(32, 0, asdecimal=False), nullable=False), - Column("status_entity_id", String(64), nullable=False), - Column("domain_entity_id", String(64), nullable=False), - Column("domain_entity_state", String(32), nullable=False), - Column("timestamp", DateTime, nullable=False), - Column("entity_type", String(3), nullable=False), - Column("domain_part_id", String(64)), - Column("child_sb_uid", String(64)), - schema="ALMA", -) - - -class PrjAttachment(Base): - __tablename__ = "prj_attachment" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - obs_project_archive_uid = Column(String(64), nullable=False) - auth_account_id = Column(String(64), nullable=False) - created = Column(DateTime, nullable=False) - filename = Column(String(256), nullable=False) - contents = Column(LargeBinary, nullable=False) - - -class PrjComment(Base): - __tablename__ = "prj_comment" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - obs_project_archive_uid = Column(String(64), nullable=False) - auth_account_id = Column(String(64), nullable=False) - created = Column(DateTime, nullable=False) - updated = Column(DateTime) - comment_text = Column(String(3500), nullable=False) - - -class PrjOperation(Base): - __tablename__ = "prj_operations" - __table_args__ = {"schema": "ALMA"} - - obs_project_archive_uid = Column(String(64), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - p2g_account_id = Column(String(64)) - contact_account_id = Column(String(64)) - scops_ticket = Column(String(8)) - recipients = Column(String(512)) - helpdesk_ticket = Column(String(8)) - - -class ProjectCode(Base): - __tablename__ = "project_codes" - __table_args__ = {"schema": "ALMA"} - - year = Column(String(4), primary_key=True, nullable=False) - period = Column(String(64), primary_key=True, nullable=False) - sequence = Column(Numeric(asdecimal=False), nullable=False) - type_code = Column(String(3), primary_key=True, nullable=False) - - -t_project_codes_bkp = Table( - "project_codes_bkp", - metadata, - Column("year", String(4), nullable=False), - Column("period", String(64), nullable=False), - Column("sequence", Numeric(asdecimal=False), nullable=False), - Column("type_code", String(3), nullable=False), - schema="ALMA", -) - - -t_proposal = Table( - "proposal", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("archive_uid", String(255), nullable=False), - Column("panel_id_back", Numeric(38, 0, asdecimal=False)), - Column("cancelled", String(1)), - Column("new_integration_time_hours", Numeric(8, 2)), - Column("new_scientific_category", String(16)), - Column("needs_more_time", String(1)), - Column("arp_score", Float), - Column("arp_avg_score", Float), - Column("arp_std_dev_scores", Float), - Column("aprc_letter_grade", String(1)), - Column("aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("aprc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_work_progress", String(10)), - Column("aprc_work_progress", String(10)), - Column("feasible", String(8)), - Column("dc_score", Float), - Column("dc_letter_grade", String(1)), - Column("dc_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_rank_changed", String(1)), - Column("dc_work_progress", String(10)), - Column("arp_rank", Numeric(scale=0, asdecimal=False)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("triage_flag", String(1)), - Column("arp_vote_avg", Float), - Column("arp_vote_std_dev", Float), - Column("arp_nr_votes", Numeric(scale=0, asdecimal=False)), - Column("arp_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_rank_manually_changed", String(1)), - Column("aprc_rank_manually_changed", String(1)), - Column("arp_score_normalized", Float), - Column("arp_rank_normalized", Float), - Column("duplication_flags", String(250)), - Column("arp_comment", String(4000)), - Column("aprc_comment", String(4000)), - Column("new_time_set_by_sg_descope", String(1)), - Column("arp_prop_strength", String(4000)), - Column("arp_prop_weakness", String(4000)), - Column("arp_prop_improvement", String(4000)), - Column("arp_prop_evaluation", String(4000)), - Column("aprc_prop_strength", String(4000)), - Column("aprc_prop_weakness", String(4000)), - Column("aprc_prop_improvement", String(4000)), - Column("aprc_prop_evaluation", String(4000)), - Column("ta_comment_to_pi", String(4000)), - Column("arp_grouping_flag", Numeric(2, 0, asdecimal=False)), - Column("non_standard_twelve_m_hours", Numeric(8, 2)), - schema="ALMA", -) - - -t_proposal12_back = Table( - "proposal12_back", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("archive_uid", String(255), nullable=False), - Column("alma_review_panel_id", Numeric(38, 0, asdecimal=False)), - Column("cancelled", String(1)), - Column("new_integration_time_hours", Numeric(8, 2)), - Column("new_scientific_category", String(16)), - Column("needs_more_time", String(1)), - Column("arp_score", Float), - Column("arp_comment", Text), - Column("arp_avg_score", Float), - Column("arp_std_dev_scores", Float), - Column("aprc_comment", Text), - Column("aprc_letter_grade", String(1)), - Column("aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("aprc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_work_progress", String(10)), - Column("aprc_work_progress", String(10)), - Column("feasible", String(8)), - Column("dc_score", Float), - Column("dc_letter_grade", String(1)), - Column("dc_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_rank_changed", String(1)), - Column("dc_work_progress", String(10)), - Column("arp_rank", Numeric(scale=0, asdecimal=False)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("triage_flag", String(1)), - Column("arp_vote_avg", Float), - Column("arp_vote_std_dev", Float), - Column("arp_nr_votes", Numeric(scale=0, asdecimal=False)), - Column("arp_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_rank_manually_changed", String(1)), - Column("aprc_rank_manually_changed", String(1)), - Column("arp_score_normalized", Float), - Column("arp_rank_normalized", Float), - Column("duplication_flags", String(250)), - schema="ALMA", -) - - -t_proposal_author = Table( - "proposal_author", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("proposal_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("sequence", Numeric(scale=0, asdecimal=False), nullable=False), - Column("userid", String(32), nullable=False), - Column("institution_id", Numeric(asdecimal=False)), - schema="ALMA", -) - - -t_proposal_cycle2_backup = Table( - "proposal_cycle2_backup", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("archive_uid", String(255), nullable=False), - Column("alma_review_panel_id", Numeric(38, 0, asdecimal=False)), - Column("cancelled", String(1)), - Column("new_integration_time_hours", Numeric(8, 2)), - Column("new_scientific_category", String(16)), - Column("needs_more_time", String(1)), - Column("arp_score", Float), - Column("arp_comment", Text), - Column("arp_avg_score", Float), - Column("arp_std_dev_scores", Float), - Column("aprc_comment", Text), - Column("aprc_letter_grade", String(1)), - Column("aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("aprc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_work_progress", String(10)), - Column("aprc_work_progress", String(10)), - Column("feasible", String(8)), - Column("dc_score", Float), - Column("dc_letter_grade", String(1)), - Column("dc_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_rank_changed", String(1)), - Column("dc_work_progress", String(10)), - Column("arp_rank", Numeric(scale=0, asdecimal=False)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("triage_flag", String(1)), - Column("arp_vote_avg", Float), - Column("arp_vote_std_dev", Float), - Column("arp_nr_votes", Numeric(scale=0, asdecimal=False)), - Column("arp_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_rank_manually_changed", String(1)), - Column("aprc_rank_manually_changed", String(1)), - Column("arp_score_normalized", Float), - Column("arp_rank_normalized", Float), - Column("duplication_flags", String(250)), - schema="ALMA", -) - - -t_recommendation = Table( - "recommendation", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("recommendation_type", String(32), nullable=False), - Column("aprc_flag", String(1)), - Column("dc_flag", String(1)), - Column("proposal_id", Numeric(38, 0, asdecimal=False)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("duplicate_proposal_id", Numeric(38, 0, asdecimal=False)), - Column("arc_seconds", Numeric(8, 2)), - Column("text", String(4000)), - Column("text_from_aprc", String(4000)), - schema="ALMA", -) - - -class Role(Base): - __tablename__ = "role" - __table_args__ = (Index("role_name_unique", "application", "name", unique=True), {"schema": "ALMA"}) - - role_no = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - application = Column(String(32), nullable=False) - name = Column(String(32), nullable=False) - parent_role = Column(ForeignKey("ALMA.role.role_no")) - - parent = relationship("Role", remote_side=[role_no]) - - -class SchedBlockStatu(Base): - __tablename__ = "sched_block_status" - __table_args__ = (Index("sched_block_status_idx", "obs_project_id", "domain_entity_id"), {"schema": "ALMA"}) - - status_entity_id = Column(String(64), primary_key=True) - domain_entity_id = Column(ForeignKey("ALMA.xml_schedblock_entities.archive_uid"), nullable=False, index=True) - domain_entity_state = Column(String(32), nullable=False) - parent_obs_unit_set_status_id = Column(String(64), nullable=False, index=True) - obs_project_status_id = Column(String(64), nullable=False) - obs_project_id = Column(ForeignKey("ALMA.xml_obsproject_entities.archive_uid"), nullable=False) - total_required_time_in_sec = Column(Numeric(scale=0, asdecimal=False), nullable=False) - total_used_time_in_sec = Column(Numeric(scale=0, asdecimal=False), nullable=False) - xml = Column(NullType) - flags = Column(String(200), index=True) - - domain_entity = relationship("XmlSchedblockEntity") - obs_project = relationship("XmlObsprojectEntity") - - -class SchemaVersion(Base): - __tablename__ = "schema_version" - __table_args__ = {"schema": "ALMA"} - - name = Column(String(32), primary_key=True) - value = Column(String(32), nullable=False) - - -class ShiftlogEntry(Base): - __tablename__ = "shiftlog_entries" - __table_args__ = {"schema": "ALMA"} - - se_id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - se_type = Column(Numeric(10, 0, asdecimal=False), nullable=False, index=True) - se_subject = Column(String(256)) - se_timestamp = Column(DateTime, nullable=False, unique=True) - se_author = Column(String(32)) - se_start = Column(DateTime, index=True) - se_project_code = Column(String(128), index=True) - se_sb_code = Column(String(128)) - se_sb_id = Column(String(32), index=True) - se_eb_uid = Column(String(32)) - se_location = Column(String(32), index=True) - se_status = Column(String(32)) - se_calibration = Column(String(1)) - se_qa0flag = Column(String(32)) - se_archiving_status = Column(String(32)) - se_test_activity = Column(String(64)) - se_ispowercut = Column(String(1)) - se_pcrecoveryend = Column(DateTime) - se_pcrecoverystart = Column(DateTime) - se_wrecoveryend12m = Column(DateTime) - se_wrecoveryend7m = Column(DateTime) - se_wrecoveryendtp = Column(DateTime) - se_wrecoverystart12m = Column(DateTime) - se_wrecoverystart7m = Column(DateTime) - se_wrecoverystarttp = Column(DateTime) - se_arrayentry_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id")) - se_arrayname = Column(String(10)) - se_arraytype = Column(String(9)) - se_arrayfamily = Column(String(11)) - se_correlatortype = Column(String(4)) - se_photonicreferencename = Column(String(18)) - se_almabuild = Column(String(70)) - se_downtimetype = Column(String(9)) - se_mainactivity = Column(String(100)) - se_mainantennaname = Column(String(50)) - se_mainresponsible = Column(String(50)) - se_bandname = Column(String(10)) - se_executive = Column(String(23)) - se_obsprojectname = Column(String(256)) - se_obsprojectpi = Column(String(20)) - se_obsprojectversion = Column(String(20)) - se_acsversion = Column(String(12)) - se_shiftactivity = Column(String(11)) - se_dashboardantennasavailable = Column(String(2)) - se_dashboardantennasdelivered = Column(String(2)) - se_dashboardantennaspresent = Column(String(2)) - se_pwv = Column(Numeric(18, 10)) - se_reprfrequency = Column(Numeric(15, 10)) - se_test = Column(String(1)) - - se_arrayentry = relationship("ShiftlogEntry", remote_side=[se_id]) - - -t_shiftlog_entries_bak = Table( - "shiftlog_entries_bak", - metadata, - Column("se_id", Numeric(19, 0, asdecimal=False)), - Column("se_type", Numeric(10, 0, asdecimal=False), nullable=False), - Column("se_subject", String(256)), - Column("se_timestamp", DateTime, nullable=False), - Column("se_author", String(32)), - Column("se_start", DateTime), - Column("se_project_code", String(128)), - Column("se_sb_code", String(128)), - Column("se_sb_id", String(32)), - Column("se_eb_uid", String(32)), - Column("se_location", String(32)), - Column("se_status", String(32)), - Column("se_calibration", String(1)), - Column("se_qa0flag", String(10)), - Column("se_archiving_status", String(32)), - Column("se_test_activity", String(64)), - Column("se_ispowercut", String(1)), - Column("se_pcrecoveryend", DateTime), - Column("se_pcrecoverystart", DateTime), - Column("se_wrecoveryend12m", DateTime), - Column("se_wrecoveryend7m", DateTime), - Column("se_wrecoveryendtp", DateTime), - Column("se_wrecoverystart12m", DateTime), - Column("se_wrecoverystart7m", DateTime), - Column("se_wrecoverystarttp", DateTime), - Column("se_arrayentry_id", Numeric(10, 0, asdecimal=False)), - Column("se_arrayname", String(10)), - Column("se_arraytype", String(9)), - Column("se_arrayfamily", String(11)), - Column("se_correlatortype", String(4)), - Column("se_photonicreferencename", String(18)), - Column("se_almabuild", String(70)), - Column("se_downtimetype", String(9)), - Column("se_mainactivity", String(100)), - Column("se_mainantennaname", String(50)), - Column("se_mainresponsible", String(50)), - Column("se_bandname", String(10)), - Column("se_executive", String(20)), - Column("se_obsprojectname", String(256)), - Column("se_obsprojectpi", String(20)), - Column("se_obsprojectversion", String(20)), - Column("se_acsversion", String(12)), - Column("se_shiftactivity", String(11)), - Column("se_dashboardantennasavailable", String(2)), - Column("se_dashboardantennasdelivered", String(2)), - Column("se_dashboardantennaspresent", String(2)), - Column("se_pwv", Numeric(18, 10)), - Column("se_reprfrequency", Numeric(15, 10)), - schema="ALMA", -) - - -class ShiftlogReply(Base): - __tablename__ = "shiftlog_reply" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - reply_comment = Column(Text) - timestamp = Column(DateTime) - author = Column(String(32)) - entry_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id"), nullable=False, index=True) - - entry = relationship("ShiftlogEntry") - - -t_shiftlog_reply_bak = Table( - "shiftlog_reply_bak", - metadata, - Column("id", Numeric(19, 0, asdecimal=False)), - Column("reply_comment", Text), - Column("timestamp", DateTime), - Column("author", String(32)), - Column("entry_id", Numeric(19, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -class ShiftlogSbUsedTime(Base): - __tablename__ = "shiftlog_sb_used_time" - __table_args__ = {"schema": "ALMA"} - - sb_uid = Column(String(33), primary_key=True) - used_time = Column(Numeric(asdecimal=False), nullable=False) - - -t_shiftlog_sb_used_time_bak = Table( - "shiftlog_sb_used_time_bak", - metadata, - Column("sb_uid", String(33), nullable=False), - Column("used_time", Numeric(asdecimal=False), nullable=False), - schema="ALMA", -) - - -class SlogAllocatedTimeInterval(Base): - __tablename__ = "slog_allocated_time_interval" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - entry_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id"), nullable=False) - arrayfamily = Column(String(11), nullable=False) - starttime = Column(DateTime, nullable=False) - endtime = Column(DateTime) - - entry = relationship("ShiftlogEntry") - - -class SlogEntryAttach(Base): - __tablename__ = "slog_entry_attach" - __table_args__ = {"schema": "ALMA"} - - slog_attach_id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - slog_attach_name = Column(String(256)) - slog_attach_contents = Column(LargeBinary) - slog_se_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id"), nullable=False, index=True) - - slog_se = relationship("ShiftlogEntry") - - -t_slog_entry_attach_bak = Table( - "slog_entry_attach_bak", - metadata, - Column("slog_attach_id", Numeric(19, 0, asdecimal=False)), - Column("slog_attach_name", String(256)), - Column("slog_attach_contents", LargeBinary), - Column("slog_se_id", Numeric(19, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -class SlogEntryAttr(Base): - __tablename__ = "slog_entry_attr" - __table_args__ = {"schema": "ALMA"} - - slog_attr_id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - slog_attr_type = Column(Numeric(10, 0, asdecimal=False), nullable=False) - slog_attr_value = Column(String(256)) - slog_se_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id"), index=True) - - slog_se = relationship("ShiftlogEntry") - - -t_slog_entry_attr_bak = Table( - "slog_entry_attr_bak", - metadata, - Column("slog_attr_id", Numeric(19, 0, asdecimal=False), nullable=False), - Column("slog_attr_type", Numeric(10, 0, asdecimal=False), nullable=False), - Column("slog_attr_value", String(256)), - Column("slog_se_id", Numeric(19, 0, asdecimal=False)), - schema="ALMA", -) - - -class StateChange(Base): - __tablename__ = "state_changes" - __table_args__ = (Index("id_perf_schs", "status_entity_id", "domain_entity_state"), {"schema": "ALMA"}) - - state_changes_id = Column(Numeric(32, 0, asdecimal=False), primary_key=True) - status_entity_id = Column(String(64), nullable=False, index=True) - domain_entity_id = Column(String(64), nullable=False, index=True) - domain_entity_state = Column(String(32), nullable=False) - timestamp = Column(DateTime, nullable=False, index=True) - location = Column(String(3), nullable=False) - user_id = Column(String(64), nullable=False) - subsystem = Column(String(32), nullable=False) - info = Column(String(2000)) - entity_type = Column(String(3), nullable=False) - domain_part_id = Column(String(64)) - flags = Column(String(200), index=True) - - -t_submission_service_account = Table( - "submission_service_account", - metadata, - Column("account_id", String(32), nullable=False), - Column("password_digest", String(256)), - schema="ALMA", -) - - -t_submission_service_roles = Table( - "submission_service_roles", metadata, Column("account_id", String(32)), Column("name", String(66)), schema="ALMA" -) - - -t_submission_service_roles_orig = Table( - "submission_service_roles_orig", - metadata, - Column("account_id", String(32), nullable=False), - Column("name", String(66)), - schema="ALMA", -) - - -t_test_23 = Table("test_23", metadata, Column("a", Numeric(scale=0, asdecimal=False)), schema="ALMA") - - -t_test_24 = Table("test_24", metadata, Column("a", Numeric(scale=0, asdecimal=False)), schema="ALMA") - - -class TrustedAccount(Base): - __tablename__ = "trusted_accounts" - __table_args__ = ( - Index("trustedacc_unique", "alma_account_id", "trusted_account_id", "trusted_institution", unique=True), - {"schema": "ALMA"}, - ) - - id = Column(Numeric(asdecimal=False), primary_key=True) - alma_account_id = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - trusted_account_id = Column(String(32), nullable=False) - trusted_institution = Column(String(10), nullable=False) - - alma_account = relationship("Account") - - -t_uid_lookup = Table( - "uid_lookup", metadata, Column("archive_uid", String(33)), Column("schemaname", String(30)), schema="ALMA" -) - - -class UserDemographic(Base): - __tablename__ = "user_demographics" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - version = Column(Numeric(asdecimal=False)) - account_id = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - observing_mm_submm = Column(String(32), nullable=False) - observing_ir = Column(String(32), nullable=False) - observing_radio = Column(String(32), nullable=False) - observing_theory_modeling = Column(String(32), nullable=False) - observing_xray = Column(String(32), nullable=False) - professional_status = Column(String(32), nullable=False) - techniques_interferometry = Column(String(32), nullable=False) - techniques_total_power = Column(String(32), nullable=False) - year_of_phd = Column(Numeric(scale=0, asdecimal=False), nullable=False) - last_update = Column(DateTime, nullable=False) - observing_uv_optical = Column(String(32), nullable=False) - - account = relationship("Account") - - -t_v_region_props = Table( - "v_region_props", - metadata, - Column("v_proposal_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("v_pi_executive", String(32)), - Column("v_aprc_letter_grade", String(1)), - Column("v_aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("v_arp_score", Float), - Column("regional_rank", Numeric(asdecimal=False)), - Column("nr_props_region", Numeric(asdecimal=False)), - schema="ALMA", -) - - -t_v_schedblock_polarisation = Table( - "v_schedblock_polarisation", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("products", String(32), nullable=False), - schema="ALMA", -) - - -t_watchdog = Table("watchdog", metadata, Column("field", DateTime), Column("site", String(5)), schema="ALMA") - - -class XmlAcapolarizationEntity(Base): - __tablename__ = "xml_acapolarization_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAccummodeEntity(Base): - __tablename__ = "xml_accummode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcsalarmmessageEntity(Base): - __tablename__ = "xml_acsalarmmessage_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcscommandcenterpEntity(Base): - __tablename__ = "xml_acscommandcenterp_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcscommandcentertEntity(Base): - __tablename__ = "xml_acscommandcentert_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcserrorEntity(Base): - __tablename__ = "xml_acserror_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcslogtsEntity(Base): - __tablename__ = "xml_acslogts_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAddressEntity(Base): - __tablename__ = "xml_address_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAlarmsystemstatsEntity(Base): - __tablename__ = "xml_alarmsystemstats_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAlmaradiometertabEntity(Base): - __tablename__ = "xml_almaradiometertab_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAnnotationtableEntity(Base): - __tablename__ = "xml_annotationtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAntennamakeEntity(Base): - __tablename__ = "xml_antennamake_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAntennamotionpattEntity(Base): - __tablename__ = "xml_antennamotionpatt_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAntennatableEntity(Base): - __tablename__ = "xml_antennatable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAntennatypeEntity(Base): - __tablename__ = "xml_antennatype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAsdmEntity(Base): - __tablename__ = "xml_asdm_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAsdmbinarytableEntity(Base): - __tablename__ = "xml_asdmbinarytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAsiconfigurationEntity(Base): - __tablename__ = "xml_asiconfiguration_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAsimessageEntity(Base): - __tablename__ = "xml_asimessage_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAssociatedcalnatuEntity(Base): - __tablename__ = "xml_associatedcalnatu_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAssociatedfieldnaEntity(Base): - __tablename__ = "xml_associatedfieldna_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAtmphasecorrectioEntity(Base): - __tablename__ = "xml_atmphasecorrectio_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAxisnameEntity(Base): - __tablename__ = "xml_axisname_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBasebandnameEntity(Base): - __tablename__ = "xml_basebandname_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBaselinereferenceEntity(Base): - __tablename__ = "xml_baselinereference_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBeamtableEntity(Base): - __tablename__ = "xml_beamtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBinarydataflagsEntity(Base): - __tablename__ = "xml_binarydataflags_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBulktestEntity(Base): - __tablename__ = "xml_bulktest_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalamplitableEntity(Base): - __tablename__ = "xml_calamplitable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalappphasetableEntity(Base): - __tablename__ = "xml_calappphasetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalatmospheretablEntity(Base): - __tablename__ = "xml_calatmospheretabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalbandpasstableEntity(Base): - __tablename__ = "xml_calbandpasstable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalcurvetableEntity(Base): - __tablename__ = "xml_calcurvetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalcurvetypeEntity(Base): - __tablename__ = "xml_calcurvetype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaldataoriginEntity(Base): - __tablename__ = "xml_caldataorigin_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaldatatableEntity(Base): - __tablename__ = "xml_caldatatable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaldelaytableEntity(Base): - __tablename__ = "xml_caldelaytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaldevicetableEntity(Base): - __tablename__ = "xml_caldevicetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalfluxtableEntity(Base): - __tablename__ = "xml_calfluxtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalfocusmodeltablEntity(Base): - __tablename__ = "xml_calfocusmodeltabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalfocustableEntity(Base): - __tablename__ = "xml_calfocustable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalgaintableEntity(Base): - __tablename__ = "xml_calgaintable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalholographytablEntity(Base): - __tablename__ = "xml_calholographytabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationconfigEntity(Base): - __tablename__ = "xml_calibrationconfig_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationdeviceEntity(Base): - __tablename__ = "xml_calibrationdevice_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationfunctiEntity(Base): - __tablename__ = "xml_calibrationfuncti_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationmodeEntity(Base): - __tablename__ = "xml_calibrationmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationsetEntity(Base): - __tablename__ = "xml_calibrationset_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalphasetableEntity(Base): - __tablename__ = "xml_calphasetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalpointingmodeltEntity(Base): - __tablename__ = "xml_calpointingmodelt_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalpointingtableEntity(Base): - __tablename__ = "xml_calpointingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalpositiontableEntity(Base): - __tablename__ = "xml_calpositiontable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalprimarybeamtabEntity(Base): - __tablename__ = "xml_calprimarybeamtab_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalqueryparameterEntity(Base): - __tablename__ = "xml_calqueryparameter_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalreductiontableEntity(Base): - __tablename__ = "xml_calreductiontable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalseeingtableEntity(Base): - __tablename__ = "xml_calseeingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaltypeEntity(Base): - __tablename__ = "xml_caltype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalwvrtableEntity(Base): - __tablename__ = "xml_calwvrtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCommonentityEntity(Base): - __tablename__ = "xml_commonentity_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCommontypesEntity(Base): - __tablename__ = "xml_commontypes_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlConfigdescriptionEntity(Base): - __tablename__ = "xml_configdescription_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelationbitEntity(Base): - __tablename__ = "xml_correlationbit_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelationmodeEntity(Base): - __tablename__ = "xml_correlationmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelatorcalibraEntity(Base): - __tablename__ = "xml_correlatorcalibra_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelatormodetabEntity(Base): - __tablename__ = "xml_correlatormodetab_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelatornameEntity(Base): - __tablename__ = "xml_correlatorname_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelatortypeEntity(Base): - __tablename__ = "xml_correlatortype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDatacontentEntity(Base): - __tablename__ = "xml_datacontent_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDatadescriptiontaEntity(Base): - __tablename__ = "xml_datadescriptionta_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDatascaleEntity(Base): - __tablename__ = "xml_datascale_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDelaymodelfixedpaEntity(Base): - __tablename__ = "xml_delaymodelfixedpa_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDelaymodeltableEntity(Base): - __tablename__ = "xml_delaymodeltable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDelaymodelvariablEntity(Base): - __tablename__ = "xml_delaymodelvariabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDetectorbandtypeEntity(Base): - __tablename__ = "xml_detectorbandtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDifferencetypeEntity(Base): - __tablename__ = "xml_differencetype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDirectionreferencEntity(Base): - __tablename__ = "xml_directionreferenc_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDopplerreferencecEntity(Base): - __tablename__ = "xml_dopplerreferencec_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDopplertableEntity(Base): - __tablename__ = "xml_dopplertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDopplertrackingmoEntity(Base): - __tablename__ = "xml_dopplertrackingmo_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlEphemeristableEntity(Base): - __tablename__ = "xml_ephemeristable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlExecblocktableEntity(Base): - __tablename__ = "xml_execblocktable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlExecconfigEntity(Base): - __tablename__ = "xml_execconfig_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFeedtableEntity(Base): - __tablename__ = "xml_feedtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFieldcodeEntity(Base): - __tablename__ = "xml_fieldcode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFieldtableEntity(Base): - __tablename__ = "xml_fieldtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFiltermodeEntity(Base): - __tablename__ = "xml_filtermode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFlagcmdtableEntity(Base): - __tablename__ = "xml_flagcmdtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFlagtableEntity(Base): - __tablename__ = "xml_flagtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFluxcalibrationmeEntity(Base): - __tablename__ = "xml_fluxcalibrationme_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFocusmethodEntity(Base): - __tablename__ = "xml_focusmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFocusmodeltableEntity(Base): - __tablename__ = "xml_focusmodeltable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFocustableEntity(Base): - __tablename__ = "xml_focustable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFreqoffsettableEntity(Base): - __tablename__ = "xml_freqoffsettable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFrequencyreferencEntity(Base): - __tablename__ = "xml_frequencyreferenc_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlGaintrackingtableEntity(Base): - __tablename__ = "xml_gaintrackingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlHistorytableEntity(Base): - __tablename__ = "xml_historytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlHolographychannelEntity(Base): - __tablename__ = "xml_holographychannel_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlHolographytableEntity(Base): - __tablename__ = "xml_holographytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlIdentifierrangeEntity(Base): - __tablename__ = "xml_identifierrange_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlInvalidatingcondiEntity(Base): - __tablename__ = "xml_invalidatingcondi_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlLoggingmiEntity(Base): - __tablename__ = "xml_loggingmi_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlMaintableEntity(Base): - __tablename__ = "xml_maintable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlMetaHistory(Base): - __tablename__ = "xml_meta_history" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True, nullable=False) - timestamp = Column(DateTime, primary_key=True, nullable=False) - metacolumn = Column(Numeric(16, 0, asdecimal=False), primary_key=True, nullable=False) - newvalue = Column(String(64)) - - -t_xml_metainfo = Table( - "xml_metainfo", metadata, Column("name", String(32)), Column("value", String(128)), schema="ALMA" -) - - -t_xml_metainfo_backup = Table( - "xml_metainfo_backup", metadata, Column("name", String(32)), Column("value", String(128)), schema="ALMA" -) - - -class XmlNamespace(Base): - __tablename__ = "xml_namespaces" - __table_args__ = {"schema": "ALMA"} - - prefix = Column(String(16), primary_key=True) - namespace = Column(String(128)) - - -class XmlNetsidebandEntity(Base): - __tablename__ = "xml_netsideband_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObsattachmentEntity(Base): - __tablename__ = "xml_obsattachment_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObservationtableEntity(Base): - __tablename__ = "xml_observationtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObservingcontrolsEntity(Base): - __tablename__ = "xml_observingcontrols_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObservingmodeEntity(Base): - __tablename__ = "xml_observingmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObsprojectEntity(Base): - __tablename__ = "xml_obsproject_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObsproposalEntity(Base): - __tablename__ = "xml_obsproposal_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObsreviewEntity(Base): - __tablename__ = "xml_obsreview_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObstooluserprefsEntity(Base): - __tablename__ = "xml_obstooluserprefs_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlOtconfigurationEntity(Base): - __tablename__ = "xml_otconfiguration_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlOusstatusEntity(Base): - __tablename__ = "xml_ousstatus_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPointingmethodEntity(Base): - __tablename__ = "xml_pointingmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPointingmodelmodeEntity(Base): - __tablename__ = "xml_pointingmodelmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPointingmodeltablEntity(Base): - __tablename__ = "xml_pointingmodeltabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPointingtableEntity(Base): - __tablename__ = "xml_pointingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPolarizationtableEntity(Base): - __tablename__ = "xml_polarizationtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPolarizationtypeEntity(Base): - __tablename__ = "xml_polarizationtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPositionmethodEntity(Base): - __tablename__ = "xml_positionmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPositionreferenceEntity(Base): - __tablename__ = "xml_positionreference_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPreferencesEntity(Base): - __tablename__ = "xml_preferences_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPrimarybeamdescriEntity(Base): - __tablename__ = "xml_primarybeamdescri_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPrimitivedatatypeEntity(Base): - __tablename__ = "xml_primitivedatatype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlProcessorsubtypeEntity(Base): - __tablename__ = "xml_processorsubtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlProcessortableEntity(Base): - __tablename__ = "xml_processortable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlProcessortypeEntity(Base): - __tablename__ = "xml_processortype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlProjectstatusEntity(Base): - __tablename__ = "xml_projectstatus_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPsetEntity(Base): - __tablename__ = "xml_pset_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPsetdefEntity(Base): - __tablename__ = "xml_psetdef_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlalarmsEntity(Base): - __tablename__ = "xml_qlalarms_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlatmospheresummaEntity(Base): - __tablename__ = "xml_qlatmospheresumma_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlfocussummaryEntity(Base): - __tablename__ = "xml_qlfocussummary_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlphasesummaryEntity(Base): - __tablename__ = "xml_qlphasesummary_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlpointingsummaryEntity(Base): - __tablename__ = "xml_qlpointingsummary_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQuicklookdisplayEntity(Base): - __tablename__ = "xml_quicklookdisplay_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQuicklookdisplayxEntity(Base): - __tablename__ = "xml_quicklookdisplayx_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQuicklookresultEntity(Base): - __tablename__ = "xml_quicklookresult_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQuicklooksummaryEntity(Base): - __tablename__ = "xml_quicklooksummary_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlRadialvelocityrefEntity(Base): - __tablename__ = "xml_radialvelocityref_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlReceiverbandEntity(Base): - __tablename__ = "xml_receiverband_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlReceiversidebandEntity(Base): - __tablename__ = "xml_receiversideband_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlReceivertableEntity(Base): - __tablename__ = "xml_receivertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlRole(Base): - __tablename__ = "xml_roles" - __table_args__ = {"schema": "ALMA"} - - rolename = Column(String(64), primary_key=True) - - -class XmlSbstatusEntity(Base): - __tablename__ = "xml_sbstatus_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSbsummarytableEntity(Base): - __tablename__ = "xml_sbsummarytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSbtypeEntity(Base): - __tablename__ = "xml_sbtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlScaletableEntity(Base): - __tablename__ = "xml_scaletable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlScanintentEntity(Base): - __tablename__ = "xml_scanintent_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlScantableEntity(Base): - __tablename__ = "xml_scantable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchedblockEntity(Base): - __tablename__ = "xml_schedblock_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False), index=True) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchedulermodeEntity(Base): - __tablename__ = "xml_schedulermode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchedulingpolicyEntity(Base): - __tablename__ = "xml_schedulingpolicy_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchemaEntity(Base): - __tablename__ = "xml_schema_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - schemaname = Column(String(32), nullable=False) - version = Column(Numeric(16, 0, asdecimal=False), nullable=False) - timestamp = Column(DateTime, nullable=False) - xml = Column(Text) - schemauid = Column(String(33)) - owner = Column(String(128)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(128)) - writepermissions = Column(String(128)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchemanamespace(Base): - __tablename__ = "xml_schemanamespaces" - __table_args__ = {"schema": "ALMA"} - - schemauid = Column(String(33), primary_key=True, nullable=False) - prefix = Column(String(16), primary_key=True, nullable=False) - - -class XmlScipiperequestEntity(Base): - __tablename__ = "xml_scipiperequest_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlScipiperesultsEntity(Base): - __tablename__ = "xml_scipiperesults_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSdmdataheaderEntity(Base): - __tablename__ = "xml_sdmdataheader_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSeeingtableEntity(Base): - __tablename__ = "xml_seeingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSidebandprocessinEntity(Base): - __tablename__ = "xml_sidebandprocessin_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSourcemodelEntity(Base): - __tablename__ = "xml_sourcemodel_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSourcetableEntity(Base): - __tablename__ = "xml_sourcetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSpecialsbEntity(Base): - __tablename__ = "xml_specialsb_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSpectralresolutioEntity(Base): - __tablename__ = "xml_spectralresolutio_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSpectralwindowtabEntity(Base): - __tablename__ = "xml_spectralwindowtab_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSquarelawdetectorEntity(Base): - __tablename__ = "xml_squarelawdetector_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStatetableEntity(Base): - __tablename__ = "xml_statetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStationtableEntity(Base): - __tablename__ = "xml_stationtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStationtypeEntity(Base): - __tablename__ = "xml_stationtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStokesparameterEntity(Base): - __tablename__ = "xml_stokesparameter_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStylesheet(Base): - __tablename__ = "xml_stylesheets" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemaname = Column(String(32), nullable=False) - schemauid = Column(String(33), nullable=False) - version_from = Column(Numeric(16, 0, asdecimal=False)) - version_to = Column(Numeric(16, 0, asdecimal=False)) - alma_release = Column(String(32), nullable=False) - - -class XmlSubscanfieldsourcEntity(Base): - __tablename__ = "xml_subscanfieldsourc_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSubscanintentEntity(Base): - __tablename__ = "xml_subscanintent_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSubscanspectralspEntity(Base): - __tablename__ = "xml_subscanspectralsp_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSubscantableEntity(Base): - __tablename__ = "xml_subscantable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSwitchcycletableEntity(Base): - __tablename__ = "xml_switchcycletable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSwitchingmodeEntity(Base): - __tablename__ = "xml_switchingmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSynthprofEntity(Base): - __tablename__ = "xml_synthprof_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSyscalmethodEntity(Base): - __tablename__ = "xml_syscalmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSyscaltableEntity(Base): - __tablename__ = "xml_syscaltable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSyspowertableEntity(Base): - __tablename__ = "xml_syspowertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestobsprojectEntity(Base): - __tablename__ = "xml_testobsproject_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestobsproposalEntity(Base): - __tablename__ = "xml_testobsproposal_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestprojectEntity(Base): - __tablename__ = "xml_testproject_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestschedblockEntity(Base): - __tablename__ = "xml_testschedblock_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestvaluetypesEntity(Base): - __tablename__ = "xml_testvaluetypes_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTimesamplingEntity(Base): - __tablename__ = "xml_timesampling_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTimescaleEntity(Base): - __tablename__ = "xml_timescale_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTotalpowertableEntity(Base): - __tablename__ = "xml_totalpowertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlUpdate(Base): - __tablename__ = "xml_updates" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - asdm_uid = Column(ForeignKey("ALMA.xml_asdm_entities.archive_uid"), nullable=False) - timestamp = Column(DateTime, nullable=False) - modified_by = Column(String(32), nullable=False) - hostname = Column(String(32), nullable=False) - elaboration = Column(String(4000), nullable=False) - delta_version = Column(Numeric(5, 0, asdecimal=False), nullable=False) - - xml_asdm_entity = relationship("XmlAsdmEntity") - - -class XmlUserEntity(Base): - __tablename__ = "xml_user_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlUserrole(Base): - __tablename__ = "xml_userroles" - __table_args__ = {"schema": "ALMA"} - - username = Column(String(64), primary_key=True, nullable=False) - rolename = Column(String(64), primary_key=True, nullable=False) - - -class XmlUser(Base): - __tablename__ = "xml_users" - __table_args__ = {"schema": "ALMA"} - - username = Column(String(64), primary_key=True) - - -class XmlValuetypesEntity(Base): - __tablename__ = "xml_valuetypes_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWeathertableEntity(Base): - __tablename__ = "xml_weathertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWeighttypeEntity(Base): - __tablename__ = "xml_weighttype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWindowfunctionEntity(Base): - __tablename__ = "xml_windowfunction_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWvmcaltableEntity(Base): - __tablename__ = "xml_wvmcaltable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWvrmethodEntity(Base): - __tablename__ = "xml_wvrmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class Xslt(Base): - __tablename__ = "xslt" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(3, 0, asdecimal=False), primary_key=True) - t_xsl = Column(NullType) - - -class AquaOusComment(AquaComment): - __tablename__ = "aqua_ous_comment" - __table_args__ = {"schema": "ALMA"} - - commentid = Column(ForeignKey("ALMA.aqua_comment.commentid"), primary_key=True) - obsunitsetid = Column(ForeignKey("ALMA.aqua_ous.obsunitsetid")) - comment_section = Column(String(8)) - - aqua_ou = relationship("AquaOu") - - -class AquaQa2ReasonHistory(AquaStatusHistory): - __tablename__ = "aqua_qa2_reason_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(ForeignKey("ALMA.aqua_status_history.id"), primary_key=True) - qa2reason = Column(String(500)) - - -class NgasFiles(Base): - __tablename__ = "NGAS_FILES" - __table_args__ = {"schema": "NGAS"} - - file_id = Column(String(220), primary_key=True) - file_size = Column(Numeric(11, 0, asdecimal=True)) diff --git a/apps/cli/executables/pexable/ingest/ingest/schema/legacy_model.py b/apps/cli/executables/pexable/ingest/ingest/schema/legacy_model.py deleted file mode 100644 index 36104179127b9066f9c7af40ca7933384dd1427a..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/schema/legacy_model.py +++ /dev/null @@ -1,1935 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- -""" -An incomplete declarative base model of the legacy archive -Author: Richard Falardeau <rfalarde@nrao.edu> -""" -from sqlalchemy import ( - CHAR, - VARCHAR, - Column, - DateTime, - Float, - Index, - Integer, - Numeric, - String, - Table, - text, -) -from sqlalchemy.dialects.oracle import NUMBER -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.sql.sqltypes import NullType - -# pylint: disable=invalid-name -Base = declarative_base() -metadata = Base.metadata - - -# pylint: disable=too-few-public-methods -class LegacyProject(Base): - r"""The model of the project table in the legacy db""" - __tablename__ = "project" - - project_code = Column(String(16), primary_key=True) - observer = Column(String(48)) - observer_id = Column(Numeric) - starttime = Column(Numeric, primary_key=True) - stoptime = Column(Numeric, primary_key=True) - proprietary = Column(Numeric) - telescope = Column(String(12)) - telescope_config = Column(String(36)) - obs_bands = Column(String(24)) - total_obs_time = Column(Numeric) - num_segments = Column(Numeric) - arch_files = Column(Numeric) - row_date = Column(Numeric) - raw_project_code = Column(String(16)) - project_lock = Column(String(8)) - unlock_expire = Column(Numeric) - grant_access = Column(String(12)) - proprietary_duration = Column(Numeric) - warned = Column(Numeric) - project_id = Column(Numeric) - - def __repr__(self): - r"""Return the string representation of this class. - - :return: The string representation of self. - """ - repr_str_list = ["{c}("] - temp = ["{0}={{s.{0}}}".format(key) for key in vars(self) if not key.startswith("_")] - self_list = ", ".join(temp) - repr_str_list.append(self_list) - repr_str_list.append(")") - - return "".join(repr_str_list).format(c=self.__class__.__name__, s=self) - - -t_afl_safe = Table( - "afl_safe", - metadata, - Column("site_code", VARCHAR(8), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("root_directory", VARCHAR(128), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("mimetype", VARCHAR(80)), - Column("common_file_id", VARCHAR(64)), - Column("ngas_host", VARCHAR(64)), - schema="E2EMGR", -) - - -class Alia(Base): - __tablename__ = "alias" - __table_args__ = {"schema": "E2EMGR"} - - source_id = Column(VARCHAR(12), server_default=text("' '")) - jsource_id = Column(VARCHAR(12), nullable=False) - prog_code = Column(VARCHAR(8), server_default=text("' '")) - pk = Column(Integer, primary_key=True) - - -t_alltables_columns = Table( - "alltables_columns", - metadata, - Column("column_name", VARCHAR(32), nullable=False, index=True), - Column("table_name", VARCHAR(256), nullable=False), - Column("description", VARCHAR(128), nullable=False), - Column("unit", VARCHAR(16), nullable=False), - Column("ucd", VARCHAR(64), nullable=False), - Column("utype", VARCHAR(64), nullable=False), - Column("datatype", VARCHAR(32), nullable=False), - Column("varsize", NUMBER(asdecimal=False), nullable=False), - Column("primary", VARCHAR(16), nullable=False), - Column("indexed", VARCHAR(16), nullable=False), - Column("std", VARCHAR(16), nullable=False), - Column("catagory", VARCHAR(32), nullable=False), - Column("example", VARCHAR(128), nullable=False), - schema="E2EMGR", -) - - -t_antenna = Table( - "antenna", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("antenna_id", NUMBER(asdecimal=False), nullable=False), - Column("name", VARCHAR(12), nullable=False), - Column("station", VARCHAR(18), nullable=False), - Column("mount", VARCHAR(8), nullable=False), - Column("dish_diameter", NUMBER(asdecimal=False), nullable=False), - Column("antenna_type", VARCHAR(14), nullable=False), - Column("axis_off", NUMBER(asdecimal=False), nullable=False), - Column("frame", VARCHAR(12), nullable=False), - Index("antenna_idx", "project_code", "arch_file_id", "antenna_id"), - schema="E2EMGR", -) - - -t_archfileloc_ngas_migration = Table( - "archfileloc_ngas_migration", - metadata, - Column("site_code", VARCHAR(8), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("root_directory", VARCHAR(128), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("mimetype", VARCHAR(80)), - Column("common_file_id", VARCHAR(64)), - Column("ngas_host", VARCHAR(64)), - schema="E2EMGR", -) - - -t_archfilelocation = Table( - "archfilelocation", - metadata, - Column("site_code", VARCHAR(8), nullable=False, index=True), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("root_directory", VARCHAR(128), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False, index=True), - Column("mimetype", VARCHAR(80)), - Column("common_file_id", VARCHAR(64)), - Column("ngas_host", VARCHAR(64)), - schema="E2EMGR", -) - - -t_archfilelocationgbt = Table( - "archfilelocationgbt", - metadata, - Column("site_code", VARCHAR(8), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("root_directory", VARCHAR(128), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("mimetype", VARCHAR(80)), - Column("common_file_id", VARCHAR(64)), - Column("ngas_host", VARCHAR(64)), - schema="E2EMGR", -) - - -t_archive = Table( - "archive", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("segment", VARCHAR(4), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("arch_format", VARCHAR(8), nullable=False), - Column("data_type", VARCHAR(12), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("arch_file", VARCHAR(128), nullable=False, index=True), - Column("arch_file_date", NUMBER(asdecimal=False), nullable=False), - Column("catalog_date", NUMBER(asdecimal=False), nullable=False), - Column("file_size", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False, index=True), - Column("annex1_id", NUMBER(asdecimal=False), nullable=False), - Column("obs_bands", VARCHAR(24), nullable=False), - Column("project_id", NUMBER(19, 0, False), server_default=text("0")), - Column("sb_id", NUMBER(19, 0, False), server_default=text("0")), - Column("eb_id", NUMBER(19, 0, False), server_default=text("0")), - Column("datamsg", VARCHAR(128), server_default=text("'none'")), - Column("datalevel", NUMBER(8, 0, False), server_default=text("0")), - Column("sb_type", VARCHAR(32), server_default=text("'none'")), - Index("archive3_idx", "starttime", "stoptime"), - schema="E2EMGR", -) - - -t_archivegbt = Table( - "archivegbt", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("arch_format", VARCHAR(8), nullable=False), - Column("data_type", VARCHAR(12), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("arch_file_date", NUMBER(asdecimal=False), nullable=False), - Column("catalog_date", NUMBER(asdecimal=False), nullable=False), - Column("file_size", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("annex1_id", NUMBER(asdecimal=False), nullable=False), - Column("obs_bands", VARCHAR(16), nullable=False), - Column("project_id", NUMBER(19, 0, False), server_default=text("0")), - Column("sb_id", NUMBER(19, 0, False), server_default=text("0")), - Column( - "eb_id", - NUMBER(19, 0, False), - server_default=text( - """\ -0 -""" - ), - ), - Column("datamsg", VARCHAR(128), server_default=text("'none'")), - Column("datalevel", NUMBER(8, 0, False), server_default=text("0")), - Column("sb_type", VARCHAR(32), nullable=False, server_default=text("'none' ")), - schema="E2EMGR", -) - - -t_archivegbtold = Table( - "archivegbtold", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("arch_format", VARCHAR(8), nullable=False), - Column("data_type", VARCHAR(12), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("arch_file_date", NUMBER(asdecimal=False), nullable=False), - Column("catalog_date", NUMBER(asdecimal=False), nullable=False), - Column("file_size", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("annex1_id", NUMBER(asdecimal=False), nullable=False), - Column("obs_bands", VARCHAR(16), nullable=False), - Column("project_id", NUMBER(19, 0, False), server_default=text("0")), - Column("sb_id", NUMBER(19, 0, False), server_default=text("0")), - Column("eb_id", NUMBER(19, 0, False), server_default=text("0")), - Column("datamsg", VARCHAR(128), server_default=text("'none'")), - Column("datalevel", NUMBER(8, 0, False), server_default=text("0")), - Column( - "sb_type", - VARCHAR(32), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_archivesites = Table( - "archivesites", - metadata, - Column("site_code", VARCHAR(8), nullable=False, index=True), - Column("host", VARCHAR(24), nullable=False), - Column("root_directory", VARCHAR(64), nullable=False), - Column("ftp_directory", VARCHAR(64), nullable=False), - Column("site_name", VARCHAR(64), nullable=False), - schema="E2EMGR", -) - - -t_archvla = Table( - "archvla", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - schema="E2EMGR", -) - - -t_asa_columns = Table( - "asa_columns", - metadata, - Column("column_name", VARCHAR(32), index=True, server_default=text("'none'")), - Column("table_name", VARCHAR(32), server_default=text("'none'")), - Column("description", VARCHAR(64), server_default=text("'none'")), - Column("unit", VARCHAR(16), server_default=text("'none'")), - Column("ucd", VARCHAR(64), server_default=text("'none'")), - Column("utype", VARCHAR(64), server_default=text("'none'")), - Column("datatype", VARCHAR(32), server_default=text("'none'")), - Column("varsize", NUMBER(asdecimal=False), server_default=text("0")), - Column("primary", VARCHAR(16), server_default=text("'none'")), - Column("indexed", VARCHAR(16), server_default=text("'none'")), - Column("std", VARCHAR(16), server_default=text("'none'")), - Column("tooltip", VARCHAR(128), server_default=text("'none'")), - Column( - "examples", - VARCHAR(128), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_asa_project = Table( - "asa_project", - metadata, - Column("project_code", VARCHAR(64), server_default=text("'none'")), - Column("project_uid", VARCHAR(64), server_default=text("'none'")), - Column("proposal_uid", VARCHAR(64), server_default=text("'none'")), - Column("pi_name", VARCHAR(64), server_default=text("'none'")), - Column("pi_id", VARCHAR(64), server_default=text("'none'")), - Column("coi_name", VARCHAR(64), server_default=text("'none'")), - Column("title", VARCHAR(64), server_default=text("'none'")), - Column("type", VARCHAR(64), server_default=text("'none'")), - Column("associated_arc", VARCHAR(64), server_default=text("'none'")), - Column("proposal_cycle", VARCHAR(64), server_default=text("'none'")), - Column("proposal_abstract", VARCHAR(64), server_default=text("'none'")), - Column("proposed_start_date", VARCHAR(64), server_default=text("'none'")), - Column("proposed_end_date", VARCHAR(64), server_default=text("'none'")), - Column("first_obs_start", VARCHAR(64), server_default=text("'none'")), - Column("first_obs_end", VARCHAR(64), server_default=text("'none'")), - Column("last_obs_start", VARCHAR(64), server_default=text("'none'")), - Column("last_obs_end", VARCHAR(64), server_default=text("'none'")), - Column( - "arc_release", - VARCHAR(64), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_asa_projects = Table( - "asa_projects", - metadata, - Column("project_code", VARCHAR(64), server_default=text("'none'")), - Column("project_uid", VARCHAR(64), server_default=text("'none'")), - Column("proposal_uid", VARCHAR(64), server_default=text("'none'")), - Column("pi_name", VARCHAR(64), server_default=text("'none'")), - Column("pi_id", VARCHAR(64), server_default=text("'none'")), - Column("coi_name", VARCHAR(64), server_default=text("'none'")), - Column("title", VARCHAR(64), server_default=text("'none'")), - Column("type", VARCHAR(64), server_default=text("'none'")), - Column("associated_arc", VARCHAR(64), server_default=text("'none'")), - Column("proposal_cycle", VARCHAR(64), server_default=text("'none'")), - Column("proposal_abstract", VARCHAR(64), server_default=text("'none'")), - Column("proposed_start_date", VARCHAR(64), server_default=text("'none'")), - Column("proposed_end_date", VARCHAR(64), server_default=text("'none'")), - Column("first_obs_start", VARCHAR(64), server_default=text("'none'")), - Column("first_obs_end", VARCHAR(64), server_default=text("'none'")), - Column("last_obs_start", VARCHAR(64), server_default=text("'none'")), - Column("last_obs_end", VARCHAR(64), server_default=text("'none'")), - Column( - "arc_release", - VARCHAR(64), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_asa_science = Table( - "asa_science", - metadata, - Column("dataset_id", VARCHAR(64), server_default=text("'none'")), - Column("asdm_uid", VARCHAR(64), server_default=text("'none'")), - Column("field_uid", VARCHAR(64), server_default=text("'none'")), - Column("spectral_window_uid", VARCHAR(64), server_default=text("'none'")), - Column("project_uid", VARCHAR(64), server_default=text("'none'")), - Column("schedblock_uid", VARCHAR(64), server_default=text("'none'")), - Column("execblock_uid", VARCHAR(64), server_default=text("'none'")), - Column("ra", NUMBER(16, 0, False), server_default=text("0.0")), - Column("dec", NUMBER(16, 0, False), server_default=text("0.0")), - Column("ra_source", NUMBER(16, 0, False), server_default=text("0.0")), - Column("dec_source", NUMBER(16, 0, False), server_default=text("0.0")), - Column("cx", NUMBER(16, 0, False), server_default=text("0.0")), - Column("cy", NUMBER(16, 0, False), server_default=text("0.0")), - Column("cz", NUMBER(16, 0, False), server_default=text("0.0")), - Column("az_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("az_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("elevation_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("elevation_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_cd1_1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_cd1_2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_cd2_1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_cd2_2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_crpix1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_crpix2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_crval1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_crval2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("spatial_scale_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("spatial_scale_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("gal_longitude", NUMBER(16, 0, False), server_default=text("0.0")), - Column("gal_latitude", NUMBER(16, 0, False), server_default=text("0.0")), - Column("ecliptic_longitude", NUMBER(16, 0, False), server_default=text("0.0")), - Column("ecliptic_latitude", NUMBER(16, 0, False), server_default=text("0.0")), - Column("footprint", NUMBER(16, 0, False), server_default=text("0.0")), - Column("fov", NUMBER(16, 0, False), server_default=text("0.0")), - Column("bounding_box", NUMBER(16, 0, False), server_default=text("0.0")), - Column("source_name", VARCHAR(64), server_default=text("'none'")), - Column("source_is_in_simbad", VARCHAR(64), server_default=text("'none'")), - Column("source_class", VARCHAR(64), server_default=text("'none'")), - Column("source_redshift", NUMBER(16, 0, False), server_default=text("0.0")), - Column("source_alma_catalog_id", NUMBER(16, 0, False), server_default=text("0.0")), - Column("start_date", VARCHAR(64), server_default=text("'none'")), - Column("end_date", VARCHAR(64), server_default=text("'none'")), - Column("int_time", NUMBER(16, 0, False), server_default=text("0.0")), - Column("time_resolution", NUMBER(16, 0, False), server_default=text("0.0")), - Column("frequency", NUMBER(16, 0, False), server_default=text("0.0")), - Column("frequency_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("frequency_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("frequency_resolution", NUMBER(16, 0, False), server_default=text("0.0")), - Column("bandwidth", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_frequency", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_frequency_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_frequency_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_frequency_resolution", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_bandwidth", NUMBER(16, 0, False), server_default=text("0.0")), - Column("band", VARCHAR(64), server_default=text("'none'")), - Column("frequency_support", VARCHAR(128), server_default=text("'none'")), - Column("rest_frequency_support", VARCHAR(128), server_default=text("'none'")), - Column("velocity_resolution", NUMBER(16, 10, True), server_default=text("0.0")), - Column("resolving_power", NUMBER(16, 10, True), server_default=text("0.0")), - Column("rest_velocity_resolution", NUMBER(16, 10, True), server_default=text("0.0")), - Column("rest_resolving_power", NUMBER(16, 10, True), server_default=text("0.0")), - Column("channel_num", VARCHAR(32), server_default=text("'none'")), - Column("spectral_window_num", VARCHAR(32), server_default=text("'none'")), - Column("continuum_window_num", VARCHAR(32), server_default=text("'none'")), - Column("obs_unitset_id", VARCHAR(128), server_default=text("'none'")), - Column("science_goal_ouss_id", VARCHAR(128), server_default=text("'none'")), - Column("group_ouss_id", VARCHAR(128), server_default=text("'none'")), - Column("member_ouss_id", VARCHAR(128), server_default=text("'none'")), - Column("sensitivity", NUMBER(16, 0, False), server_default=text("0.0")), - Column("flux_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("flux_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("uv_coverage_param1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("uv_coverage_param2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("pol_num", NUMBER(16, 0, False), server_default=text("0")), - Column("pol_products", VARCHAR(128), server_default=text("'none'")), - Column("airmass", NUMBER(16, 0, False), server_default=text("0.0")), - Column("pwv", NUMBER(16, 0, False), server_default=text("0.0")), - Column("temperature", NUMBER(16, 0, False), server_default=text("0.0")), - Column("windspeed", NUMBER(16, 0, False), server_default=text("0.0")), - Column("winddirection", NUMBER(16, 0, False), server_default=text("0.0")), - Column("ant_num", NUMBER(16, 0, False), server_default=text("0")), - Column("ant_aca_num", NUMBER(16, 0, False), server_default=text("0")), - Column("ant_main_num", NUMBER(16, 0, False), server_default=text("0")), - Column("antennas", VARCHAR(128), server_default=text("'none'")), - Column("baseline_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("baseline_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("scan_num", NUMBER(6, 0, False), server_default=text("0")), - Column("project_code", VARCHAR(64), server_default=text("'none'")), - Column("schedblock_name", VARCHAR(64), server_default=text("'none'")), - Column("observation_category", VARCHAR(64), server_default=text("'none'")), - Column("scan_intent", VARCHAR(64), server_default=text("'none'")), - Column("access_format", VARCHAR(64), server_default=text("'none'")), - Column( - "processing_level", - NUMBER(6, 0, False), - server_default=text( - """\ -0 -""" - ), - ), - schema="E2EMGR", -) - - -t_calib_parm_pos = Table( - "calib_parm_pos", - metadata, - Column("jsource_id", VARCHAR(10), nullable=False), - Column("epoch", DateTime), - Column("rarad", NUMBER(12, 8, True), server_default=text("0")), - Column("decrad", NUMBER(12, 8, True), server_default=text("0")), - Column("raerr", NUMBER(10, 8, True), server_default=text("0")), - Column("decerr", NUMBER(10, 6, True), server_default=text("0")), - Column("telescope", VARCHAR(5), nullable=False), - Column("config", VARCHAR(5), server_default=text("' '")), - Column("obs_freq", Float, server_default=text("0")), - Column("freq_min", Float, server_default=text("0")), - Column("freq_max", Float, server_default=text("0")), - Column("uv_min", NUMBER(12, 6, True), server_default=text("0")), - Column("uv_max", NUMBER(12, 6, True), server_default=text("0")), - Column("flux", NUMBER(8, 4, True), server_default=text("0")), - Column("resolution", NUMBER(6, 4, True), server_default=text("0")), - Column("variability", NUMBER(6, 4, True), server_default=text("0")), - Column("cdvlba", CHAR(2), server_default=text("' '")), - Column("cd_vla", CHAR(2), server_default=text("' '")), - Column("entry_date", DateTime), - Column("parm_remarks", VARCHAR(64), server_default=text("' '")), - schema="E2EMGR", -) - - -class CalibSrcPo(Base): - __tablename__ = "calib_src_pos" - __table_args__ = {"schema": "E2EMGR"} - - remarks = Column(VARCHAR(200), nullable=False) - ssize = Column(NUMBER(10, 0, False), server_default=text("0")) - flux = Column(NUMBER(10, 6, True), server_default=text("0")) - mfreq = Column(NUMBER(asdecimal=False), server_default=text("0")) - ufreq = Column(NUMBER(asdecimal=False), server_default=text("0")) - lfreq = Column(NUMBER(asdecimal=False), server_default=text("0")) - distance = Column(NUMBER(asdecimal=False), server_default=text("0")) - ddec = Column(NUMBER(10, 6, True), server_default=text("0")) - dra = Column(NUMBER(10, 6, True), server_default=text("0")) - repoch = Column(DateTime) - parallax = Column(NUMBER(8, 6, True), server_default=text("0")) - decerr = Column(NUMBER(12, 8, True), server_default=text("0")) - raerr = Column(NUMBER(12, 8, True), server_default=text("0")) - decrad = Column(NUMBER(12, 8, True), server_default=text("0")) - rarad = Column(NUMBER(12, 8, True), server_default=text("0")) - epoch = Column(DateTime) - calcode = Column(CHAR(6), server_default=text("' '")) - prog_code = Column(VARCHAR(6), server_default=text("' '")) - dqualifier = Column(Integer, server_default=text("0")) - cqualifier = Column(Integer, server_default=text("0")) - uqualifier = Column(Integer, server_default=text("0")) - entrydate = Column(DateTime) - jsource_id = Column(VARCHAR(12), nullable=False) - pk = Column(Integer, primary_key=True) - - -t_config = Table( - "config", - metadata, - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - schema="E2EMGR", -) - - -t_datadesc = Table( - "datadesc", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("segment", VARCHAR(4), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("data_desc_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("sub_desc_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("if_band", VARCHAR(4), nullable=False), - Column("if_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("pol1", NUMBER(asdecimal=False), nullable=False), - Column("pol2", NUMBER(asdecimal=False), nullable=False), - Column("pol3", NUMBER(asdecimal=False), nullable=False), - Column("pol4", NUMBER(asdecimal=False), nullable=False), - Column("if_conv_chain", NUMBER(asdecimal=False), nullable=False), - Column("sub_chan_id", NUMBER(asdecimal=False), nullable=False), - Column("sub_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("sub_bandw", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol1", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol2", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol3", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol4", NUMBER(asdecimal=False), nullable=False), - Column("sub_net_sideband", NUMBER(asdecimal=False), nullable=False), - Column("sub_num_chans", NUMBER(asdecimal=False), nullable=False), - Column("corr_mode", VARCHAR(24)), - Column("if_chan", VARCHAR(8)), - Column( - "backend_id", - VARCHAR(24), - server_default=text( - """\ -'none' - """ - ), - ), - Column("receiver_id", VARCHAR(24), nullable=False, server_default=text("'none' ")), - Column("veldef", VARCHAR(24), server_default=text("'none'")), - Column("version", VARCHAR(16), server_default=text("'none'")), - Column("velocity", NUMBER(asdecimal=False), server_default=text("0.0")), - schema="E2EMGR", -) - - -t_datadescgbt = Table( - "datadescgbt", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("data_desc_id", NUMBER(asdecimal=False), nullable=False), - Column("sub_desc_id", NUMBER(asdecimal=False), nullable=False), - Column("if_band", VARCHAR(4), nullable=False), - Column("if_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("pol1", NUMBER(asdecimal=False), nullable=False), - Column("pol2", NUMBER(asdecimal=False), nullable=False), - Column("pol3", NUMBER(asdecimal=False), nullable=False), - Column("pol4", NUMBER(asdecimal=False), nullable=False), - Column("if_conv_chain", NUMBER(asdecimal=False), nullable=False), - Column("sub_chan_id", NUMBER(asdecimal=False), nullable=False), - Column("sub_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("sub_bandw", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol1", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol2", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol3", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol4", NUMBER(asdecimal=False), nullable=False), - Column("sub_net_sideband", NUMBER(asdecimal=False), nullable=False), - Column("sub_num_chans", NUMBER(asdecimal=False), nullable=False), - Column("corr_mode", VARCHAR(24), nullable=False), - Column("if_chan", VARCHAR(8), nullable=False), - Column("receiver_id", VARCHAR(24), server_default=text("'none'")), - Column("backend_id", VARCHAR(24), server_default=text("'none'")), - Column("velocity", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("veldef", VARCHAR(24), server_default=text("'none'")), - Column( - "version", - VARCHAR(16), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_dataproblems = Table( - "dataproblems", - metadata, - Column("error_code", VARCHAR(16), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("if_bands", VARCHAR(24), nullable=False), - Column("error_status", VARCHAR(12), nullable=False), - Column("description", VARCHAR(64), nullable=False), - Column("doc_link", VARCHAR(64), nullable=False), - Column("severity", NUMBER(asdecimal=False), nullable=False, server_default=text("0 ")), - Index("dataproblems1_idx", "starttime", "stoptime"), - schema="E2EMGR", -) - - -t_dataproblink = Table( - "dataproblink", - metadata, - Column("error_code", VARCHAR(16), nullable=False, index=True), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - schema="E2EMGR", -) - - -t_downloadlog = Table( - "downloadlog", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("download_date", DateTime, nullable=False, index=True), - Column("email_addr", VARCHAR(48), nullable=False, index=True), - Column("ip_addr", VARCHAR(24), nullable=False), - Column("status", VARCHAR(16), nullable=False), - Column("sources", VARCHAR(64), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False, index=True), - Column("out_file", VARCHAR(128), nullable=False), - Column("result", VARCHAR(32), nullable=False), - Column("file_size", NUMBER(asdecimal=False)), - Column("code", VARCHAR(12)), - schema="E2EMGR", -) - - -t_emailaddr = Table( - "emailaddr", - metadata, - Column("userlastname", VARCHAR(48), nullable=False), - Column("userinitials", VARCHAR(24)), - Column("emailaddr", VARCHAR(64)), - Index("emailaddr1_idx", "userlastname", "userinitials"), - schema="E2EMGR", -) - - -t_file_set_properties = Table( - "file_set_properties", - metadata, - Column("file_set_id", VARCHAR(128), server_default=text("'none'")), - Column("file_set_alias", VARCHAR(128), server_default=text("'none'")), - Column("file_set_category", VARCHAR(32), server_default=text("'none'")), - Column("category_key", VARCHAR(48), server_default=text("'none'")), - Column("starttime", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("stoptime", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("telescope", VARCHAR(32), server_default=text("'none'")), - Column("telescope_config", VARCHAR(48), server_default=text("'none'")), - Column("obs_bands", VARCHAR(48), server_default=text("'none'")), - Column("processing_history", VARCHAR(128), server_default=text("'none'")), - Column("collection", VARCHAR(48), server_default=text("'none'")), - Column("calib_level", NUMBER(asdecimal=False), server_default=text("0")), - Column( - "n_file_subsets", - NUMBER(asdecimal=False), - server_default=text( - """\ -0 - """ - ), - ), - Index("set_properties_indx", "file_set_id", "category_key"), - schema="E2EMGR", -) - - -class FirstImage(Base): - __tablename__ = "first_image" - __table_args__ = {"schema": "E2EMGR"} - - id = Column(VARCHAR(32), primary_key=True) - obs_id = Column(VARCHAR(32), server_default=text("null")) - archive_id = Column(VARCHAR(128), nullable=False) - htm_id = Column(NUMBER(14, 0, False), server_default=text("0")) - preview_id = Column(VARCHAR(128), nullable=False) - access_format = Column(VARCHAR(32), nullable=False) - access_estsize = Column(NUMBER(14, 0, False), server_default=text("0")) - dataproduct_type = Column(VARCHAR(16), server_default=text("null")) - dataproduct_subtype = Column(VARCHAR(32), server_default=text("null")) - calib_level = Column(NUMBER(6, 0, False), server_default=text("0")) - dataset_length = Column(NUMBER(14, 0, False), server_default=text("0")) - im_nsubarrays = Column(NUMBER(8, 0, False), server_default=text("1")) - im_naxes = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis1 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis2 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis3 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis4 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_pixtype = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes1 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes2 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes3 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes4 = Column(VARCHAR(16), server_default=text("null")) - im_ra1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_scale = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - obs_title = Column(VARCHAR(128), server_default=text("null")) - obs_creator_name = Column(VARCHAR(32), server_default=text("null")) - obs_collection = Column(VARCHAR(32), server_default=text("null")) - obs_creator_did = Column(VARCHAR(160), server_default=text("null")) - obs_publisher_did = Column(VARCHAR(160), server_default=text("null")) - obs_dataset_did = Column(VARCHAR(160), server_default=text("null")) - obs_release_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_type = Column(VARCHAR(16), server_default=text("null")) - facility_name = Column(VARCHAR(20), server_default=text("null")) - instrument_name = Column(VARCHAR(20), server_default=text("null")) - obs_bandpass = Column(VARCHAR(20), server_default=text("null")) - obs_datasource = Column(VARCHAR(20), server_default=text("null")) - proposal_id = Column(VARCHAR(20), server_default=text("null")) - target_name = Column(VARCHAR(20), server_default=text("null")) - target_class = Column(VARCHAR(20), server_default=text("null")) - s_ra = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_dec = Column(NUMBER(asdecimal=False), index=True, server_default=text("0.0")) - s_fov = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_region = Column(VARCHAR(128), server_default=text("null")) - s_calib_status = Column(VARCHAR(32), server_default=text("'none'")) - s_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_respower = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_exptime = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - o_ucd = Column(VARCHAR(20), server_default=text("null")) - o_unit = Column(VARCHAR(32), server_default=text("'none'")) - pol_states = Column(VARCHAR(20), server_default=text("null")) - project_code = Column(VARCHAR(24), server_default=text("null")) - obs_session = Column(VARCHAR(24), server_default=text("null")) - file_id = Column(VARCHAR(64), server_default=text("null")) - file_set_id = Column(VARCHAR(128), server_default=text("null")) - file_subset_id = Column(VARCHAR(128), server_default=text("null")) - dataset = Column(VARCHAR(128), server_default=text("null")) - image_file = Column(VARCHAR(128), server_default=text("null")) - obs_file_id = Column(VARCHAR(64), server_default=text("null")) - cal_file_id = Column(VARCHAR(64), server_default=text("null")) - root_dir = Column(VARCHAR(128), server_default=text("null")) - file_dir = Column( - VARCHAR(128), - server_default=text( - """\ -null -""" - ), - ) - - -t_firstcatalog = Table( - "firstcatalog", - metadata, - Column("rarad", NUMBER(asdecimal=False), nullable=False), - Column("decrad", NUMBER(asdecimal=False), nullable=False), - Column("warn", VARCHAR(2), nullable=False), - Column("pflux", NUMBER(asdecimal=False), nullable=False), - Column("flux", NUMBER(asdecimal=False), nullable=False), - Column("rms", NUMBER(asdecimal=False), nullable=False), - Column("majorax", NUMBER(asdecimal=False), nullable=False), - Column("minorax", NUMBER(asdecimal=False), nullable=False), - Column("posangle", NUMBER(asdecimal=False), nullable=False), - Column("fmajorax", NUMBER(asdecimal=False), nullable=False), - Column("fminorax", NUMBER(asdecimal=False), nullable=False), - Column("fposangle", NUMBER(asdecimal=False), nullable=False), - Column("field", VARCHAR(14), nullable=False), - Column("name", VARCHAR(16)), - schema="E2EMGR", -) - - -t_image = Table( - "image", - metadata, - Column("identity", VARCHAR(16), nullable=False, index=True), - Column("telescope", VARCHAR(12), nullable=False), - Column("teleconfig", VARCHAR(8), nullable=False), - Column("instrument", VARCHAR(24), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("projectcode", VARCHAR(16), nullable=False), - Column("fieldname", VARCHAR(24), nullable=False), - Column("naxes", NUMBER(asdecimal=False), nullable=False), - Column("imagemax", NUMBER(asdecimal=False), nullable=False), - Column("imagemin", NUMBER(asdecimal=False), nullable=False), - Column("imagesens", NUMBER(asdecimal=False), nullable=False), - Column("imagescale", NUMBER(asdecimal=False), nullable=False), - Column("imagezero", NUMBER(asdecimal=False), nullable=False), - Column("imageunits", VARCHAR(16), nullable=False), - Column("restoremaj", NUMBER(asdecimal=False), nullable=False), - Column("restoremin", NUMBER(asdecimal=False), nullable=False), - Column("restorepa", NUMBER(asdecimal=False), nullable=False), - Column("firsttime", NUMBER(asdecimal=False), nullable=False), - Column("midobstime", NUMBER(asdecimal=False), nullable=False), - Column("exposure", NUMBER(asdecimal=False), nullable=False), - Column("imagedate", NUMBER(asdecimal=False), nullable=False), - Column("coordframe", VARCHAR(16), nullable=False), - Column("projection", VARCHAR(16), nullable=False), - Column("equinox", NUMBER(asdecimal=False), nullable=False), - Column("region", VARCHAR(16), nullable=False), - Column("racenter", NUMBER(asdecimal=False), nullable=False), - Column("deccenter", NUMBER(asdecimal=False), nullable=False), - Column("ramin", NUMBER(asdecimal=False), nullable=False), - Column("ramax", NUMBER(asdecimal=False), nullable=False), - Column("decmin", NUMBER(asdecimal=False), nullable=False), - Column("decmax", NUMBER(asdecimal=False), nullable=False), - Column("rarefpix", NUMBER(asdecimal=False), nullable=False), - Column("raref", NUMBER(asdecimal=False), nullable=False), - Column("radelt", NUMBER(asdecimal=False), nullable=False), - Column("rapixels", NUMBER(asdecimal=False), nullable=False), - Column("decrefpix", NUMBER(asdecimal=False), nullable=False), - Column("decref", NUMBER(asdecimal=False), nullable=False), - Column("decdelt", NUMBER(asdecimal=False), nullable=False), - Column("decpixels", NUMBER(asdecimal=False), nullable=False), - Column("rotangle", NUMBER(asdecimal=False), nullable=False), - Column("obsband", VARCHAR(8), nullable=False), - Column("frequency", NUMBER(asdecimal=False), nullable=False), - Column("bandwd", NUMBER(asdecimal=False), nullable=False), - Column("nspect", NUMBER(asdecimal=False), nullable=False), - Column("reffreqpix", NUMBER(asdecimal=False), nullable=False), - Column("reffreq", NUMBER(asdecimal=False), nullable=False), - Column("freqincre", NUMBER(asdecimal=False), nullable=False), - Column("npolar", NUMBER(asdecimal=False), nullable=False), - Column("polpixels", VARCHAR(12), nullable=False), - Column("imagequal", VARCHAR(6), nullable=False), - Column("photoerr", NUMBER(asdecimal=False), nullable=False), - Column("raerr", NUMBER(asdecimal=False), nullable=False), - Column("decerr", NUMBER(asdecimal=False), nullable=False), - Column("specterr", NUMBER(asdecimal=False), nullable=False), - Column("imagefile", VARCHAR(128), nullable=False), - Column("imageformat", VARCHAR(24), nullable=False), - Column("rootdirectory", VARCHAR(128), nullable=False), - Column("refurl", VARCHAR(128), nullable=False), - Column("collection", VARCHAR(24)), - Column("filesize", NUMBER(asdecimal=False)), - Column("arch_file_id", NUMBER(asdecimal=False)), - Column("common_file_id", VARCHAR(80)), - Index("image1_idx", "racenter", "deccenter"), - schema="E2EMGR", -) - - -t_ingest_stats = Table( - "ingest_stats", - metadata, - Column("ingestion_date", VARCHAR(24), server_default=text("'none'")), - Column("ingestion_total", NUMBER(20, 0, False), server_default=text("0")), - Column("telescope", VARCHAR(12), server_default=text("'none'")), - Column("data_type", VARCHAR(24), server_default=text("'none'")), - Column("root_dir", VARCHAR(128), server_default=text("'none'")), - Column( - "ngas_host", - VARCHAR(64), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_logfiles = Table( - "logfiles", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("dynamic_tag", VARCHAR(16), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("sched_type", VARCHAR(16), nullable=False), - Column("site_code", VARCHAR(8), nullable=False), - Column("root_directory", VARCHAR(64), nullable=False), - Column("file_name", VARCHAR(64), nullable=False), - Column("mimetype", VARCHAR(80), nullable=False), - Column("obsfiles", VARCHAR(128), nullable=False), - schema="E2EMGR", -) - - -class NgasCache(Base): - __tablename__ = "ngas_cache" - __table_args__ = {"schema": "E2EMGR"} - - disk_id = Column(VARCHAR(128), primary_key=True, nullable=False) - file_id = Column(VARCHAR(64), primary_key=True, nullable=False) - file_version = Column(Integer, primary_key=True, nullable=False) - cache_time = Column(NUMBER(16, 6, True), nullable=False) - cache_delete = Column(Integer, nullable=False) - - -t_ngas_file_sets = Table( - "ngas_file_sets", - metadata, - Column("file_id", VARCHAR(64), nullable=False), - Column("file_version", NUMBER(12, 0, False), server_default=text("1")), - Column("file_set_id", VARCHAR(64), nullable=False), - Column("entity_type_name", VARCHAR(48), nullable=False), - Column("entity_id", VARCHAR(48), nullable=False), - Column("format", VARCHAR(48), server_default=text("'none'")), - Column("file_id_alias", VARCHAR(128), server_default=text("'none'")), - Column("native_ext", VARCHAR(24), server_default=text("'none'")), - Column("file_subset_id", VARCHAR(48), server_default=text("'none'")), - Index("ngas_file_sets_indx", "file_id", "file_version", "file_set_id"), - schema="E2EMGR", -) - - -class NgasMirroringBookkeeping(Base): - __tablename__ = "ngas_mirroring_bookkeeping" - __table_args__ = ( - Index("nmb_thost_status_shost_idx", "target_cluster", "target_host", "status", "source_host"), - Index("nmb_iter_status_idx", "iteration", "status"), - {"schema": "E2EMGR"}, - ) - - file_id = Column(VARCHAR(64), primary_key=True, nullable=False) - file_version = Column(NUMBER(22, 0, False), primary_key=True, nullable=False) - file_size = Column(NUMBER(20, 0, False)) - disk_id = Column(VARCHAR(128)) - host_id = Column(VARCHAR(32)) - format = Column(VARCHAR(32)) - status = Column(CHAR(8), nullable=False) - target_cluster = Column(VARCHAR(64)) - target_host = Column(VARCHAR(64)) - archive_command = Column(VARCHAR(118)) - source_host = Column(VARCHAR(64), nullable=False) - retrieve_command = Column(VARCHAR(118)) - ingestion_date = Column(VARCHAR(23)) - ingestion_time = Column(Float) - iteration = Column(NUMBER(22, 0, False), primary_key=True, nullable=False) - checksum = Column(VARCHAR(64), nullable=False) - staging_file = Column(VARCHAR(256)) - attempt = Column(NUMBER(4, 0, False)) - downloaded_bytes = Column(NUMBER(22, 0, False)) - - -class NgasMirroringHist(Base): - __tablename__ = "ngas_mirroring_hist" - __table_args__ = {"schema": "E2EMGR"} - - instance_id = Column(VARCHAR(32), nullable=False) - file_id = Column(VARCHAR(64), primary_key=True, nullable=False) - file_version = Column(Integer, primary_key=True, nullable=False) - ingestion_date = Column(VARCHAR(23), nullable=False) - srv_list_id = Column(Integer, nullable=False) - xml_file_info = Column(VARCHAR(2000), nullable=False) - status = Column(Integer, nullable=False) - message = Column(VARCHAR(2000)) - last_activity_time = Column(VARCHAR(23), nullable=False) - scheduling_time = Column(VARCHAR(23), nullable=False) - - -class NgasMirroringQueue(Base): - __tablename__ = "ngas_mirroring_queue" - __table_args__ = {"schema": "E2EMGR"} - - instance_id = Column(VARCHAR(32), nullable=False) - file_id = Column(VARCHAR(64), primary_key=True, nullable=False) - file_version = Column(Integer, primary_key=True, nullable=False) - ingestion_date = Column(VARCHAR(23), nullable=False) - srv_list_id = Column(Integer, nullable=False) - xml_file_info = Column(VARCHAR(2000), nullable=False) - status = Column(Integer, nullable=False) - message = Column(VARCHAR(2000)) - last_activity_time = Column(VARCHAR(23), nullable=False) - scheduling_time = Column(VARCHAR(23), nullable=False) - - -class NgasSrvList(Base): - __tablename__ = "ngas_srv_list" - __table_args__ = {"schema": "E2EMGR"} - - srv_list_id = Column(Integer, primary_key=True) - srv_list = Column(VARCHAR(255), nullable=False) - creation_date = Column(VARCHAR(23), nullable=False) - - -class Nvsscatalog(Base): - __tablename__ = "nvsscatalog" - __table_args__ = {"schema": "E2EMGR"} - - rarad = Column(NUMBER(asdecimal=False), primary_key=True, nullable=False) - decrad = Column(NUMBER(asdecimal=False), primary_key=True, nullable=False) - raerror = Column(NUMBER(asdecimal=False), nullable=False) - decerror = Column(NUMBER(asdecimal=False), nullable=False) - flux = Column(NUMBER(asdecimal=False), nullable=False) - fluxerror = Column(NUMBER(asdecimal=False), nullable=False) - majorsym = Column(VARCHAR(4), nullable=False) - majorax = Column(NUMBER(asdecimal=False), nullable=False) - majorerr = Column(NUMBER(asdecimal=False), nullable=False) - minorsym = Column(VARCHAR(4), nullable=False) - minorax = Column(NUMBER(asdecimal=False), nullable=False) - minorerr = Column(NUMBER(asdecimal=False), nullable=False) - posangle = Column(NUMBER(asdecimal=False), nullable=False) - paerror = Column(NUMBER(asdecimal=False), nullable=False) - rescode = Column(VARCHAR(4), nullable=False) - reserror = Column(NUMBER(asdecimal=False), nullable=False) - pflux = Column(NUMBER(asdecimal=False), nullable=False) - pfluxerror = Column(NUMBER(asdecimal=False), nullable=False) - pangle = Column(NUMBER(asdecimal=False), nullable=False) - pangleerror = Column(NUMBER(asdecimal=False), nullable=False) - field = Column(VARCHAR(10), nullable=False) - centerx = Column(NUMBER(asdecimal=False), nullable=False) - centery = Column(NUMBER(asdecimal=False), nullable=False) - name = Column(VARCHAR(10)) - - -t_observation = Table( - "observation", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("segment", VARCHAR(4), nullable=False), - Column("obs_type", VARCHAR(24), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("source_id", VARCHAR(24), nullable=False, index=True), - Column("source_type", VARCHAR(8), nullable=False), - Column("calib_type", VARCHAR(8), nullable=False), - Column("corr_mode", VARCHAR(16), nullable=False), - Column("ra2000", NUMBER(asdecimal=False), nullable=False), - Column("dec2000", NUMBER(asdecimal=False), nullable=False), - Column("frame", VARCHAR(20), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("data_desc_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("exposure", NUMBER(asdecimal=False), nullable=False), - Column("interval", NUMBER(asdecimal=False), nullable=False), - Column("uv_min", NUMBER(asdecimal=False), nullable=False), - Column("uv_max", NUMBER(asdecimal=False), nullable=False), - Column("sub_desc_id", NullType), - Column("elev_min", NUMBER(asdecimal=False), nullable=False), - Column("elev_max", NUMBER(asdecimal=False), nullable=False), - Column("n_ants", NUMBER(asdecimal=False)), - Column("ra_epoch", NUMBER(asdecimal=False)), - Column("dec_epoch", NUMBER(asdecimal=False)), - Column("bdf_file", VARCHAR(64)), - Column("config_desc_id", VARCHAR(48), server_default=text("'none'")), - Column("scan", NUMBER(19, 0, False), server_default=text("0")), - Column("subscan", NUMBER(19, 0, False), server_default=text("0")), - Column("scan_intent", VARCHAR(256), server_default=text("'none'")), - Column("procname", VARCHAR(24), server_default=text("'none'")), - Column("proctype", VARCHAR(24), server_default=text("'none'")), - Column("gbtobstype", VARCHAR(24), server_default=text("'none'")), - Column("msgflag", VARCHAR(128), server_default=text("'none'")), - Column("msglevel", NUMBER(8, 0, False), server_default=text("0")), - Index("observation4_idx", "starttime", "stoptime"), - Index("observation5_idx", "ra2000", "dec2000"), - schema="E2EMGR", -) - - -t_observationgbt = Table( - "observationgbt", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("obs_type", VARCHAR(24), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("source_id", VARCHAR(16), nullable=False), - Column("source_type", VARCHAR(8), nullable=False), - Column("calib_type", VARCHAR(8), nullable=False), - Column("corr_mode", VARCHAR(16), nullable=False), - Column("ra2000", NUMBER(asdecimal=False), nullable=False), - Column("dec2000", NUMBER(asdecimal=False), nullable=False), - Column("frame", VARCHAR(20), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("data_desc_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("exposure", NUMBER(asdecimal=False), nullable=False), - Column("interval", NUMBER(asdecimal=False), nullable=False), - Column("uv_min", NUMBER(asdecimal=False), nullable=False), - Column("uv_max", NUMBER(asdecimal=False), nullable=False), - Column("sub_desc_id", NullType), - Column("elev_min", NUMBER(asdecimal=False), nullable=False), - Column("elev_max", NUMBER(asdecimal=False), nullable=False), - Column("n_ants", NUMBER(asdecimal=False), nullable=False), - Column("ra_epoch", NUMBER(asdecimal=False), nullable=False), - Column("dec_epoch", NUMBER(asdecimal=False), nullable=False), - Column("bdf_file", VARCHAR(64), server_default=text("'none'")), - Column("config_desc_id", VARCHAR(48), server_default=text("'none'")), - Column("scan", NUMBER(19, 0, False), server_default=text("0")), - Column("subscan", NUMBER(19, 0, False), server_default=text("0")), - Column("scan_intent", VARCHAR(256), server_default=text("'none'")), - Column("procname", VARCHAR(24), server_default=text("'none'")), - Column("proctype", VARCHAR(24), server_default=text("'none'")), - Column("gbtobstype", VARCHAR(24), server_default=text("'none'")), - Column( - "msgflag", - VARCHAR(128), - server_default=text( - """\ -'none' -""" - ), - ), - Column("msglevel", NUMBER(8, 0, False), server_default=text("0")), - schema="E2EMGR", -) - - -t_obsscripts = Table( - "obsscripts", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("dynamic_tag", VARCHAR(16), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("sched_type", VARCHAR(16), nullable=False), - Column("site_code", VARCHAR(8), nullable=False), - Column("root_directory", VARCHAR(64), nullable=False), - Column("file_name", VARCHAR(64), nullable=False), - Column("mimetype", VARCHAR(80), nullable=False), - schema="E2EMGR", -) - - -t_obsset = Table( - "obsset", - metadata, - Column("dataproduct_type", VARCHAR(24), nullable=False), - Column("dataproduct_subtype", VARCHAR(24), nullable=False), - Column("calib_level", NUMBER(asdecimal=False), server_default=text("0")), - Column("target_name", VARCHAR(48), nullable=False), - Column("target_class", VARCHAR(24), nullable=False), - Column("obs_id", VARCHAR(64), nullable=False), - Column("obs_title", VARCHAR(24), nullable=False), - Column("obs_collection", VARCHAR(48), nullable=False), - Column("obs_creation_date", VARCHAR(24), nullable=False), - Column("obs_creator_name", VARCHAR(48), nullable=False), - Column("obs_creator_did", VARCHAR(48), nullable=False), - Column("obs_release_date", VARCHAR(24), nullable=False), - Column("obs_publisher_did", VARCHAR(64), nullable=False), - Column("publisher_id", VARCHAR(24), nullable=False), - Column("bib_reference", VARCHAR(24), nullable=False), - Column("data_rights", VARCHAR(24), nullable=False), - Column("access_url", VARCHAR(128), nullable=False), - Column("access_format", VARCHAR(24), nullable=False), - Column("access_estsize", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_ra", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_dec", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_fov", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_region", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_resolution", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_ucd", VARCHAR(48), nullable=False), - Column("s_unit", VARCHAR(24), nullable=False), - Column("s_resolution_min", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_resolution_max", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_calib_status", VARCHAR(48), nullable=False), - Column("s_stat_error", NUMBER(asdecimal=False), server_default=text("0")), - Column("t_min", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("t_max", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("t_exptime", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("t_resolution", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("t_calib_status", VARCHAR(48), nullable=False), - Column("t_stat_error", NUMBER(asdecimal=False), server_default=text("0")), - Column("em_ucd", VARCHAR(48), nullable=False), - Column("em_unit", VARCHAR(24), nullable=False), - Column("em_calib_status", VARCHAR(48), nullable=False), - Column("em_min", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("em_max", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("em_res_power", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("em_res_power_min", NUMBER(asdecimal=False), server_default=text("0")), - Column("em_res_power_max", NUMBER(asdecimal=False), server_default=text("0")), - Column("em_resolution", NUMBER(asdecimal=False), server_default=text("0")), - Column("em_stat_error", NUMBER(asdecimal=False), server_default=text("0")), - Column("o_ucd", VARCHAR(128), nullable=False), - Column("o_unit", VARCHAR(24), nullable=False), - Column("o_calib_status", VARCHAR(24), nullable=False), - Column("o_stat_error", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("pol_states", VARCHAR(24), nullable=False), - Column("facility_name", VARCHAR(48), nullable=False), - Column("instrument_name", VARCHAR(48), nullable=False), - Column("proposal_id", VARCHAR(48), nullable=False), - Column("project_code", VARCHAR(24), nullable=False), - Column("obs_session", VARCHAR(24), nullable=False), - Column("file_id", VARCHAR(64), nullable=False), - Column("file_set_id", VARCHAR(128), nullable=False), - Column("file_subset_id", VARCHAR(128), nullable=False), - Column("dataset", VARCHAR(128), nullable=False), - Column("image_file", VARCHAR(128), nullable=False), - Column( - "arch_file_id", - NUMBER(asdecimal=False), - server_default=text( - """\ -0 -""" - ), - ), - Index("obsset_indx", "file_set_id", "file_id", "arch_file_id"), - schema="E2EMGR", -) - - -t_obssummary = Table( - "obssummary", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("source_id", VARCHAR(24), nullable=False, index=True), - Column("if_band", VARCHAR(4), nullable=False), - Column("sub_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("exposure", NUMBER(asdecimal=False), nullable=False), - Column("sub_bandw", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("sub_num_chans", NUMBER(asdecimal=False), nullable=False), - Column("ra2000", NUMBER(asdecimal=False), nullable=False), - Column("dec2000", NUMBER(asdecimal=False), nullable=False), - Column("project_lock", VARCHAR(8), nullable=False), - Column("sub_pol1", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol2", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol3", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol4", NUMBER(asdecimal=False), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("corr_mode", VARCHAR(8), nullable=False), - Column("if_chan", VARCHAR(8), nullable=False), - Column("n_ants", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("sub_chan_id", NUMBER(asdecimal=False), nullable=False), - Column("n_images", NUMBER(asdecimal=False), nullable=False), - Column("obssummary_uid", VARCHAR(48), nullable=False, index=True), - Column("file_set_id", VARCHAR(64), nullable=False), - Column("radeg", NUMBER(asdecimal=False)), - Column("decdeg", NUMBER(asdecimal=False)), - Column("distance", NUMBER(asdecimal=False)), - Column("rms", NUMBER(asdecimal=False)), - Column("resol", NUMBER(asdecimal=False)), - Column("fov", NUMBER(asdecimal=False)), - Column("polar", VARCHAR(16)), - Index("obssummary2_idx", "ra2000", "dec2000"), - Index("obssummary4_idx", "starttime", "stoptime"), - Index("obssummary6_idx", "radeg", "decdeg"), - schema="E2EMGR", -) - - -t_obssummary_columns = Table( - "obssummary_columns", - metadata, - Column("column_name", VARCHAR(32), nullable=False, index=True), - Column("table_name", VARCHAR(32), nullable=False), - Column("description", VARCHAR(64), nullable=False), - Column("unit", VARCHAR(16), nullable=False), - Column("ucd", VARCHAR(64), nullable=False), - Column("utype", VARCHAR(64), nullable=False), - Column("datatype", VARCHAR(32), nullable=False), - Column("varsize", NUMBER(asdecimal=False), nullable=False), - Column("primary", VARCHAR(16), nullable=False), - Column("indexed", VARCHAR(16), nullable=False), - Column("std", VARCHAR(16), nullable=False), - schema="E2EMGR", -) - - -t_omsstnsched = Table( - "omsstnsched", - metadata, - Column("proposal", VARCHAR(5), nullable=False, index=True), - Column("segment", VARCHAR(2), nullable=False), - Column("staid", VARCHAR(5), nullable=False), - Column("start_time", DateTime, nullable=False), - Column("stop_time", DateTime, nullable=False), - Column("mjdstart", NUMBER(16, 8, True)), - Column("mjdstop", NUMBER(16, 8, True)), - Index("omsstnsched2_idx", "mjdstart", "mjdstop"), - schema="E2EMGR", -) - - -t_pidum = Table( - "pidum", - metadata, - Column("proposal", VARCHAR(16), nullable=False), - Column("pi_lastname", VARCHAR(48), nullable=False), - Column("pi_firstname", VARCHAR(48), nullable=False), - Column("pi_name", VARCHAR(64), nullable=False), - Column("peoplekey", NUMBER(asdecimal=False), nullable=False), - schema="E2EMGR", -) - - -t_pipequeue = Table( - "pipequeue", - metadata, - Column("project_code", VARCHAR(16), server_default=text("'none'")), - Column("arch_file_id", NUMBER(asdecimal=False), server_default=text("0")), - Column("arch_file", VARCHAR(128), server_default=text("'none'")), - Column("file_set_type", VARCHAR(16), server_default=text("'RAW'")), - Column("sb_type", VARCHAR(32), server_default=text("'none'")), - Column("queuedate", VARCHAR(23), server_default=text("'none'")), - Column( - "status", - VARCHAR(16), - server_default=text( - """\ -'none' -""" - ), - ), - Column("submitdate", VARCHAR(23), server_default=text("'none'")), - schema="E2EMGR", -) - - -t_pipequeuetemp = Table( - "pipequeuetemp", - metadata, - Column("project_code", VARCHAR(16), server_default=text("'none'")), - Column("arch_file_id", NUMBER(asdecimal=False), server_default=text("0")), - Column("arch_file", VARCHAR(128), server_default=text("'none'")), - Column("file_set_type", VARCHAR(16), server_default=text("'RAW'")), - Column("sb_type", VARCHAR(32), server_default=text("'none'")), - Column("queuedate", DateTime, server_default=text("sysdate")), - Column( - "status", - VARCHAR(16), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_project = Table( - "project", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("observer", VARCHAR(48), nullable=False, index=True), - Column("observer_id", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False, index=True), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(36), nullable=False), - Column("obs_bands", VARCHAR(24), nullable=False), - Column("total_obs_time", NUMBER(asdecimal=False), nullable=False), - Column("num_segments", NUMBER(asdecimal=False), nullable=False), - Column("arch_files", NUMBER(asdecimal=False), nullable=False), - Column("row_date", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False, index=True), - Column("project_lock", VARCHAR(8), nullable=False, index=True), - Column("unlock_expire", NUMBER(asdecimal=False), nullable=False), - Column("grant_access", VARCHAR(12), nullable=False), - Column("proprietary_duration", NUMBER(asdecimal=False), nullable=False), - Column("warned", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("project_id", NUMBER(asdecimal=False), server_default=text("0")), - Index("project2_idx", "starttime", "stoptime"), - schema="E2EMGR", -) - - -t_projectgbt = Table( - "projectgbt", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("observer_id", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(24), nullable=False), - Column("obs_bands", VARCHAR(24), nullable=False), - Column("total_obs_time", NUMBER(asdecimal=False), nullable=False), - Column("num_segments", NUMBER(asdecimal=False), nullable=False), - Column("arch_files", NUMBER(asdecimal=False), nullable=False), - Column("row_date", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("project_lock", VARCHAR(8), nullable=False), - Column("unlock_expire", NUMBER(asdecimal=False), nullable=False), - Column("grant_access", VARCHAR(12), nullable=False), - Column("proprietary_duration", NUMBER(asdecimal=False), nullable=False), - Column("warned", NUMBER(asdecimal=False), server_default=text("0.0")), - Column( - "project_id", - NUMBER(asdecimal=False), - server_default=text( - """\ -0 - """ - ), - ), - schema="E2EMGR", -) - - -t_projectgbtold = Table( - "projectgbtold", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("observer_id", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(24), nullable=False), - Column("obs_bands", VARCHAR(24), nullable=False), - Column("total_obs_time", NUMBER(asdecimal=False), nullable=False), - Column("num_segments", NUMBER(asdecimal=False), nullable=False), - Column("arch_files", NUMBER(asdecimal=False), nullable=False), - Column("row_date", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("project_lock", VARCHAR(8), nullable=False), - Column("unlock_expire", NUMBER(asdecimal=False), nullable=False), - Column("grant_access", VARCHAR(12), nullable=False), - Column("proprietary_duration", NUMBER(asdecimal=False), nullable=False), - Column("warned", NUMBER(asdecimal=False), server_default=text("0.0")), - Column( - "project_id", - NUMBER(asdecimal=False), - server_default=text( - """\ -0 - """ - ), - ), - schema="E2EMGR", -) - - -t_proposal = Table( - "proposal", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("pi_name", VARCHAR(48), nullable=False, index=True), - Column("pi_email", VARCHAR(64), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False, index=True), - schema="E2EMGR", -) - - -t_proprietary = Table( - "proprietary", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("observer", VARCHAR(24), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("keyword", VARCHAR(12), nullable=False), - Column("date_expires", NUMBER(asdecimal=False), nullable=False), - Column("entry_date", NUMBER(asdecimal=False), nullable=False), - Column("email_addr", VARCHAR(64), nullable=False), - Index("proprietary_idx", "project_code", "observer"), - schema="E2EMGR", -) - - -t_segment = Table( - "segment", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("observer", VARCHAR(36), nullable=False, index=True), - Column("observer_id", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(24), nullable=False), - Column("obs_bands", VARCHAR(16), nullable=False), - Column("total_obs_time", NUMBER(asdecimal=False), nullable=False), - Column("num_scans", NUMBER(asdecimal=False), nullable=False), - Column("arch_files", NUMBER(asdecimal=False), nullable=False), - Column("row_date", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False, index=True), - Column("project_lock", VARCHAR(8), nullable=False), - Column("unlock_expire", NUMBER(asdecimal=False), nullable=False), - Column("grant_access", VARCHAR(12), nullable=False), - Column("proprietary_duration", NUMBER(asdecimal=False), nullable=False), - Index("segment1_idx", "project_code", "segment"), - Index("segment2_idx", "starttime", "stoptime"), - schema="E2EMGR", -) - - -t_shiporders = Table( - "shiporders", - metadata, - Column("file_set_id", VARCHAR(96), nullable=False), - Column("order_id", NUMBER(asdecimal=False), nullable=False), - Column("user_id", NUMBER(asdecimal=False), nullable=False), - Column("emailaddr", VARCHAR(48), server_default=text("'none'")), - Column("submission_date", VARCHAR(48), server_default=text("'none'")), - Column( - "status", - VARCHAR(24), - server_default=text( - """\ -'none' -""" - ), - ), - Column( - "useros", - VARCHAR(24), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -class Siav2image(Base): - __tablename__ = "siav2image" - __table_args__ = {"schema": "E2EMGR"} - - id = Column(VARCHAR(32), primary_key=True) - obs_id = Column(VARCHAR(32), server_default=text("null")) - archive_id = Column(VARCHAR(128), nullable=False) - htm_id = Column(NUMBER(14, 0, False), server_default=text("0")) - preview_id = Column(VARCHAR(128), nullable=False) - access_format = Column(VARCHAR(32), nullable=False) - access_estsize = Column(NUMBER(14, 0, False), server_default=text("0")) - dataproduct_type = Column(VARCHAR(16), server_default=text("null")) - dataproduct_subtype = Column(VARCHAR(32), server_default=text("null")) - calib_level = Column(NUMBER(6, 0, False), server_default=text("0")) - dataset_length = Column(NUMBER(14, 0, False), server_default=text("0")) - im_nsubarrays = Column(NUMBER(8, 0, False), server_default=text("1")) - im_naxes = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis1 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis2 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis3 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis4 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_pixtype = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes1 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes2 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes3 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes4 = Column(VARCHAR(16), server_default=text("null")) - im_ra1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_scale = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - obs_title = Column(VARCHAR(128), server_default=text("null")) - obs_creator_name = Column(VARCHAR(32), server_default=text("null")) - obs_collection = Column(VARCHAR(32), server_default=text("null")) - obs_creator_did = Column(VARCHAR(160), server_default=text("null")) - obs_publisher_did = Column(VARCHAR(160), server_default=text("null")) - obs_dataset_did = Column(VARCHAR(160), server_default=text("null")) - obs_release_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_type = Column(VARCHAR(16), server_default=text("null")) - facility_name = Column(VARCHAR(20), server_default=text("null")) - instrument_name = Column(VARCHAR(20), server_default=text("null")) - obs_bandpass = Column(VARCHAR(20), server_default=text("null")) - obs_datasource = Column(VARCHAR(20), server_default=text("null")) - proposal_id = Column(VARCHAR(20), server_default=text("null")) - target_name = Column(VARCHAR(20), server_default=text("null")) - target_class = Column(VARCHAR(20), server_default=text("null")) - s_ra = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_dec = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_fov = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_region = Column(VARCHAR(128), server_default=text("null")) - s_calib_status = Column(VARCHAR(32), server_default=text("'none'")) - s_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_respower = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_exptime = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - o_ucd = Column(VARCHAR(20), server_default=text("null")) - o_unit = Column(VARCHAR(32), server_default=text("'none'")) - pol_states = Column(VARCHAR(20), server_default=text("null")) - project_code = Column(VARCHAR(24), server_default=text("null")) - obs_session = Column(VARCHAR(24), server_default=text("null")) - file_id = Column(VARCHAR(64), server_default=text("null")) - file_set_id = Column(VARCHAR(128), server_default=text("null")) - file_subset_id = Column(VARCHAR(128), server_default=text("null")) - dataset = Column(VARCHAR(128), server_default=text("null")) - image_file = Column(VARCHAR(128), server_default=text("null")) - obs_file_id = Column(NUMBER(asdecimal=False), server_default=text("0")) - cal_file_id = Column(NUMBER(asdecimal=False), server_default=text("0")) - root_dir = Column(VARCHAR(128), server_default=text("null")) - file_dir = Column( - VARCHAR(128), - server_default=text( - """\ -null -""" - ), - ) - - -t_subarray = Table( - "subarray", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4)), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("antenna_id", NUMBER(asdecimal=False), nullable=False), - Index("subarray_idx", "project_code", "starttime", "stoptime", "subarray_id"), - schema="E2EMGR", -) - - -t_sumlist = Table( - "sumlist", - metadata, - Column("programid", VARCHAR(8), nullable=False, index=True), - Column("sourcename", VARCHAR(16), nullable=False, index=True), - Column("qualifier", VARCHAR(2), nullable=False), - Column("observerid", NUMBER(asdecimal=False), nullable=False), - Column("observername", VARCHAR(20), nullable=False), - Column("centerofbw1", NUMBER(asdecimal=False), nullable=False), - Column("centerofbw2", NUMBER(asdecimal=False), nullable=False), - Column("centerofbw3", NUMBER(asdecimal=False), nullable=False), - Column("centerofbw4", NUMBER(asdecimal=False), nullable=False), - Column("bandwidth1", NUMBER(asdecimal=False), nullable=False), - Column("bandwidth2", NUMBER(asdecimal=False), nullable=False), - Column("bandwidth3", NUMBER(asdecimal=False), nullable=False), - Column("bandwidth4", NUMBER(asdecimal=False), nullable=False), - Column("netsideband1", VARCHAR(2), nullable=False), - Column("netsideband2", VARCHAR(2), nullable=False), - Column("netsideband3", VARCHAR(2), nullable=False), - Column("netsideband4", VARCHAR(2), nullable=False), - Column("obsmode", VARCHAR(3), nullable=False), - Column("calcode", VARCHAR(3), nullable=False), - Column("correlator", VARCHAR(4), nullable=False), - Column("planetary", VARCHAR(2), nullable=False), - Column("subarrayid", VARCHAR(2), nullable=False), - Column("epoch", VARCHAR(5), nullable=False), - Column("ra1950", NUMBER(asdecimal=False), nullable=False), - Column("dec1950", NUMBER(asdecimal=False), nullable=False), - Column("ra2000", NUMBER(asdecimal=False), nullable=False), - Column("dec2000", NUMBER(asdecimal=False), nullable=False), - Column("mjad", DateTime, nullable=False, index=True), - Column("antennae", NUMBER(asdecimal=False), nullable=False), - Column("starttimelst", NUMBER(asdecimal=False), nullable=False), - Column("starttimeiat", NUMBER(asdecimal=False), nullable=False), - Column("stoptimelst", NUMBER(asdecimal=False), nullable=False), - Column("stoptimeiat", NUMBER(asdecimal=False), nullable=False), - Column("timeonsource", NUMBER(asdecimal=False), nullable=False), - Column("arrayconfig", VARCHAR(6), nullable=False), - Column("numchan1", NUMBER(asdecimal=False), nullable=False), - Column("numchan2", NUMBER(asdecimal=False), nullable=False), - Column("numchan3", NUMBER(asdecimal=False), nullable=False), - Column("numchan4", NUMBER(asdecimal=False), nullable=False), - Column("inttime", NUMBER(asdecimal=False), nullable=False), - Column("velocity1", NUMBER(asdecimal=False), nullable=False), - Column("velocity2", NUMBER(asdecimal=False), nullable=False), - Column("velocity3", NUMBER(asdecimal=False), nullable=False), - Column("velocity4", NUMBER(asdecimal=False), nullable=False), - Column("restfreq1", NUMBER(asdecimal=False), nullable=False), - Column("restfreq2", NUMBER(asdecimal=False), nullable=False), - Column("restfreq3", NUMBER(asdecimal=False), nullable=False), - Column("restfreq4", NUMBER(asdecimal=False), nullable=False), - Column("velsyscode", VARCHAR(10), nullable=False), - Column("apoptions", VARCHAR(2), nullable=False), - Column("dataselect1", NUMBER(asdecimal=False), nullable=False), - Column("dataselect2", NUMBER(asdecimal=False), nullable=False), - Column("dataselect3", NUMBER(asdecimal=False), nullable=False), - Column("dataselect4", NUMBER(asdecimal=False), nullable=False), - Column("chansep1", NUMBER(asdecimal=False), nullable=False), - Column("chansep2", NUMBER(asdecimal=False), nullable=False), - Column("chansep3", NUMBER(asdecimal=False), nullable=False), - Column("chansep4", NUMBER(asdecimal=False), nullable=False), - Column("oldtapenum", VARCHAR(8), nullable=False), - Column("newtapenum", VARCHAR(8), nullable=False), - Column("filenumber", NUMBER(asdecimal=False), nullable=False), - Index("sumlist4_idx", "starttimeiat", "stoptimeiat"), - Index("sumlist5_idx", "newtapenum", "filenumber"), - Index("sumlist3_idx", "ra2000", "dec2000"), - schema="E2EMGR", -) - - -t_validity_chk = Table( - "validity_chk", - metadata, - Column("arch_file_id", NUMBER(asdecimal=False), server_default=text("0")), - Column("file_type", VARCHAR(16), server_default=text("'none'")), - Column("last_checked", DateTime, server_default=text("sysdate")), - Column( - "status", - VARCHAR(16), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -class VlapipeImage(Base): - __tablename__ = "vlapipe_image" - __table_args__ = {"schema": "E2EMGR"} - - id = Column(VARCHAR(32), primary_key=True) - obs_id = Column(VARCHAR(32), server_default=text("null")) - archive_id = Column(VARCHAR(128), nullable=False) - htm_id = Column(NUMBER(14, 0, False), server_default=text("0")) - preview_id = Column(VARCHAR(128), nullable=False) - access_format = Column(VARCHAR(32), nullable=False) - access_estsize = Column(NUMBER(14, 0, False), server_default=text("0")) - dataproduct_type = Column(VARCHAR(16), server_default=text("null")) - dataproduct_subtype = Column(VARCHAR(32), server_default=text("null")) - calib_level = Column(NUMBER(6, 0, False), server_default=text("0")) - dataset_length = Column(NUMBER(14, 0, False), server_default=text("0")) - im_nsubarrays = Column(NUMBER(8, 0, False), server_default=text("1")) - im_naxes = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis1 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis2 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis3 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis4 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_pixtype = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes1 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes2 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes3 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes4 = Column(VARCHAR(16), server_default=text("null")) - im_ra1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_scale = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - obs_title = Column(VARCHAR(128), server_default=text("null")) - obs_creator_name = Column(VARCHAR(32), server_default=text("null")) - obs_collection = Column(VARCHAR(32), server_default=text("null")) - obs_creator_did = Column(VARCHAR(160), server_default=text("null")) - obs_publisher_did = Column(VARCHAR(160), server_default=text("null")) - obs_dataset_did = Column(VARCHAR(160), server_default=text("null")) - obs_release_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_type = Column(VARCHAR(16), server_default=text("null")) - facility_name = Column(VARCHAR(20), server_default=text("null")) - instrument_name = Column(VARCHAR(20), server_default=text("null")) - obs_bandpass = Column(VARCHAR(20), server_default=text("null")) - obs_datasource = Column(VARCHAR(20), server_default=text("null")) - proposal_id = Column(VARCHAR(20), server_default=text("null")) - target_name = Column(VARCHAR(20), server_default=text("null")) - target_class = Column(VARCHAR(20), server_default=text("null")) - s_ra = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_dec = Column(NUMBER(asdecimal=False), index=True, server_default=text("0.0")) - s_fov = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_region = Column(VARCHAR(128), server_default=text("null")) - s_calib_status = Column(VARCHAR(32), server_default=text("'none'")) - s_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_respower = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_exptime = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - o_ucd = Column(VARCHAR(20), server_default=text("null")) - o_unit = Column(VARCHAR(32), server_default=text("'none'")) - pol_states = Column(VARCHAR(20), server_default=text("null")) - project_code = Column(VARCHAR(24), server_default=text("null")) - obs_session = Column(VARCHAR(24), server_default=text("null")) - file_id = Column(VARCHAR(64), server_default=text("null")) - file_set_id = Column(VARCHAR(128), server_default=text("null")) - file_subset_id = Column(VARCHAR(128), server_default=text("null")) - dataset = Column(VARCHAR(128), server_default=text("null")) - image_file = Column(VARCHAR(128), server_default=text("null")) - obs_file_id = Column(VARCHAR(64), server_default=text("null")) - cal_file_id = Column(VARCHAR(64), server_default=text("null")) - root_dir = Column(VARCHAR(128), server_default=text("null")) - file_dir = Column( - VARCHAR(128), - server_default=text( - """\ -null -""" - ), - ) - - -t_weather = Table( - "weather", - metadata, - Column("telescope", VARCHAR(8), nullable=False, index=True), - Column("timestamp", NUMBER(12, 6, True), nullable=False, index=True, comment="MJD (decimal)"), - Column("pressure", NUMBER(7, 2, True), nullable=False, comment="millibars"), - Column("temp", NUMBER(7, 2, True), nullable=False, comment="degrees C"), - Column("dewtemp", NUMBER(7, 2, True), nullable=False, comment="degrees C"), - Column("windspeed", NUMBER(6, 2, True), nullable=False, comment="m/sec"), - Column("winddir", NUMBER(6, 1, True), nullable=False, comment="degrees from North"), - schema="E2EMGR", -) - - -class Wensscatalog(Base): - __tablename__ = "wensscatalog" - __table_args__ = {"schema": "E2EMGR"} - - wensscode = Column(VARCHAR(3), nullable=False) - name = Column(VARCHAR(13), primary_key=True, nullable=False) - raradb = Column(NUMBER(asdecimal=False), nullable=False) - decradb = Column(NUMBER(asdecimal=False), nullable=False) - raradj = Column(NUMBER(asdecimal=False), primary_key=True, nullable=False) - decradj = Column(NUMBER(asdecimal=False), primary_key=True, nullable=False) - srctype = Column(VARCHAR(1), nullable=False) - warn = Column(VARCHAR(1), nullable=False) - pflux = Column(NUMBER(asdecimal=False), nullable=False) - flux = Column(NUMBER(asdecimal=False), nullable=False) - majorax = Column(NUMBER(asdecimal=False), nullable=False) - minorax = Column(NUMBER(asdecimal=False), nullable=False) - posangle = Column(NUMBER(asdecimal=False), nullable=False) - rms = Column(NUMBER(asdecimal=False), nullable=False) - field = Column(VARCHAR(9), nullable=False) - survey = Column(VARCHAR(10), nullable=False) - rarad = Column(NUMBER(asdecimal=False)) - decrad = Column(NUMBER(asdecimal=False)) diff --git a/apps/cli/executables/pexable/ingest/ingest/schema/logs.py b/apps/cli/executables/pexable/ingest/ingest/schema/logs.py deleted file mode 100644 index b5703d35452ff9b039192feb908493ac98d1b8ad..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/schema/logs.py +++ /dev/null @@ -1,43 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import pendulum - -from . import create_session -from .model import t_logs as logs - -session = create_session("SDM") - - -def since(time): - query = logs.select().where(logs.c.timestamp > time).order_by("timestamp") - return [dict(r) for r in session.execute(query)] - - -def for_request(request_id): - query = ( - logs.select().where(logs.c.properties["requestId"].astext == str(request_id)).order_by("timestamp").limit(100) - ) - return list(dict(r) for r in session.execute(query)) - - -if __name__ == "__main__": - print("since:") - print(since(pendulum.now().subtract(hours=1))) - print() - print("for 13099859:") - print(for_request(13099859)) diff --git a/apps/cli/executables/pexable/ingest/ingest/schema/model.py b/apps/cli/executables/pexable/ingest/ingest/schema/model.py deleted file mode 100644 index 27e08c393dea7db822edea631704a42e2653f27c..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/schema/model.py +++ /dev/null @@ -1,1271 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - JSON, - BigInteger, - Boolean, - CheckConstraint, - Column, - Date, - DateTime, - Float, - ForeignKey, - ForeignKeyConstraint, - Integer, - Numeric, - String, - Table, - Text, - UniqueConstraint, - text, -) -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import backref, relationship - -Base = declarative_base() -metadata = Base.metadata - - -class Account(Base): - __tablename__ = "account" - __table_args__ = (UniqueConstraint("provider", "provider_principal"),) - - account_id = Column(String, primary_key=True) - request_handler_id = Column(Numeric) - version = Column(Numeric, nullable=False, server_default=text("1")) - password_digest = Column(String) - firstname = Column(String, nullable=False) - lastname = Column(String, nullable=False) - initials = Column(String) - creationtimestamp = Column(String) - modificationtimestamp = Column(String) - preferredarc = Column(String) - email = Column(String) - executive = Column(String, nullable=False, server_default=text("'na'::character varying")) - aliases = Column(String) - inst_no = Column(Numeric, nullable=False, server_default=text("1")) - provider = Column(String) - provider_principal = Column(String) - - role = relationship("Role", secondary="account_role") - - -t_account_role = Table( - "account_role", - metadata, - Column("role_no", ForeignKey("role.role_no"), nullable=False), - Column("account_id", ForeignKey("account.account_id"), nullable=False), -) - - -class AlmaOusType(Base): - __tablename__ = "alma_ous_types" - - ous_type = Column(String, primary_key=True) - description = Column(String) - - -t_alma_ous_view = Table( - "alma_ous_view", - metadata, - Column("project_code", String), - Column("sous", String), - Column("gous", String), - Column("mous", String), - Column("schedblock_name", String), -) - - -class AlmaOus(Base): - __tablename__ = "alma_ouses" - - alma_ous_id = Column(String, primary_key=True) - parent_ous_id = Column(ForeignKey("alma_ouses.alma_ous_id")) - project_code = Column(ForeignKey("projects.project_code")) - ous_type = Column(ForeignKey("alma_ous_types.ous_type"), nullable=False) - schedblock_name = Column(String) - - alma_ous_type = relationship("AlmaOusType") - parent_ous = relationship( - "AlmaOus", remote_side=[alma_ous_id], backref=backref("children_ouses", cascade="all, delete-orphan") - ) - calibrations = relationship("Calibration") - execution_blocks = relationship("ExecutionBlock") - project = relationship("Project") - - -class AlmaSourceDatum(Base): - __tablename__ = "alma_source_data" - - alma_ous_id = Column(String, primary_key=True, nullable=False) - field_name = Column(String, primary_key=True, nullable=False) - ra = Column(Float(53)) - dec = Column(Float(53)) - integration_time = Column(Float(53)) - angular_resolution = Column(Float(53)) - largest_angular_scale = Column(Float(53)) - science_field = Column(Boolean, server_default=text("false")) - - spectral_windows = relationship( - "AlmaSpwDatum", - secondary="alma_spw_sources", - back_populates="sources", - primaryjoin="and_(AlmaSourceDatum.alma_ous_id == alma_spw_sources.c.alma_ous_id, AlmaSourceDatum.field_name == foreign(alma_spw_sources.c.field_name))", - secondaryjoin="and_(AlmaSpwDatum.alma_ous_id == foreign(alma_spw_sources.c.alma_ous_id), AlmaSpwDatum.spw_name == foreign(alma_spw_sources.c.spw_name))", - ) - - def __repr__(self): - return "<AlmaSourceDatum#{alma_ous_id} {field_name} {ra} {dec} {integration_time} {angular_resolution} {largest_angular_scale}>".format( - **self.__dict__ - ) - - -class AlmaSpwDatum(Base): - __tablename__ = "alma_spw_data" - - alma_ous_id = Column(String, primary_key=True, nullable=False) - spw_name = Column(String, primary_key=True, nullable=False) - min_frequency = Column(Float(53)) - max_frequency = Column(Float(53)) - bandwidth = Column(Float(53)) - num_channels = Column(Integer) - spectral_resolution = Column(Float(53)) - - sources = relationship( - "AlmaSourceDatum", - secondary="alma_spw_sources", - back_populates="spectral_windows", - primaryjoin="and_(AlmaSpwDatum.alma_ous_id == foreign(alma_spw_sources.c.alma_ous_id), AlmaSpwDatum.spw_name == foreign(alma_spw_sources.c.spw_name))", - secondaryjoin="and_(AlmaSourceDatum.alma_ous_id == alma_spw_sources.c.alma_ous_id, AlmaSourceDatum.field_name == foreign(alma_spw_sources.c.field_name))", - ) - - def __repr__(self): - return "<AlmaSpwDatum#{alma_ous_id} {spw_name} {min_frequency} {max_frequency} {bandwidth} {num_channels} {spectral_resolution}>".format( - **self.__dict__ - ) - - -t_alma_spw_sources = Table( - "alma_spw_sources", - metadata, - Column("alma_ous_id", String, primary_key=True, nullable=False), - Column("spw_name", String, primary_key=True, nullable=False), - Column("field_name", String, primary_key=True, nullable=False), - ForeignKeyConstraint( - ["alma_ous_id", "field_name"], ["alma_source_data.alma_ous_id", "alma_source_data.field_name"] - ), - ForeignKeyConstraint(["alma_ous_id", "spw_name"], ["alma_spw_data.alma_ous_id", "alma_spw_data.spw_name"]), -) - - -t_alma_project_codes = Table("alma_project_codes", metadata, Column("code", String), Column("uid", String)) - - -class AlmaReingestionQueue(Base): - __tablename__ = "alma_reingestion_queue" - - asdm_uid = Column(String, primary_key=True) - observation_finished = Column(DateTime(True), nullable=False) - last_updated = Column(DateTime(True), nullable=False, server_default=text("now()")) - state = Column(String, nullable=False, server_default=text("'WAITING'::character varying")) - - -# class AlmaSourceDatum(Base): -# __tablename__ = 'alma_source_data' -# -# alma_ous_id = Column(String, primary_key=True, nullable=False) -# field_name = Column(String, primary_key=True, nullable=False) -# ra = Column(Float(53)) -# dec = Column(Float(53)) -# integration_time = Column(Float(53)) -# angular_resolution = Column(Float(53)) -# largest_angular_scale = Column(Float(53)) -# -# alma_ouss = relationship('AlmaSpwDatum', secondary='alma_spw_sources') - - -# class AlmaSpwDatum(Base): -# __tablename__ = 'alma_spw_data' -# -# alma_ous_id = Column(String, primary_key=True, nullable=False) -# spw_number = Column(Integer, primary_key=True, nullable=False) -# min_frequency = Column(Float(53)) -# max_frequency = Column(Float(53)) -# bandwidth = Column(Float(53)) -# num_channels = Column(Integer) -# spectral_resolution = Column(Float(53)) - - -# t_alma_spw_sources = Table( -# 'alma_spw_sources', metadata, -# Column('alma_ous_id', String, primary_key=True, nullable=False), -# Column('spw_number', Integer, primary_key=True, nullable=False), -# Column('field_name', String, primary_key=True, nullable=False), -# ForeignKeyConstraint(['alma_ous_id', 'field_name'], ['alma_source_data.alma_ous_id', 'alma_source_data.field_name']), -# ForeignKeyConstraint(['alma_ous_id', 'spw_number'], ['alma_spw_data.alma_ous_id', 'alma_spw_data.spw_number']) -# ) - - -class AncillaryProduct(Base): - __tablename__ = "ancillary_products" - - ancillary_product_locator = Column(String, primary_key=True) - ancillary_product_type = Column(String, nullable=False) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id"), nullable=False) - product_group_id = Column(ForeignKey("product_groups.product_group_id")) - science_product_locator = Column(ForeignKey("science_products.science_product_locator")) - - filegroup = relationship("Filegroup") - product_group = relationship("ProductGroup") - science_product = relationship("ScienceProduct", backref=backref("ancillary_products")) - - @property - def locator(self): - return self.ancillary_product_locator - - @property - def subdirectory(self): - return "" - - -class Archive(Base): - __tablename__ = "archive" - - id = Column(Numeric, primary_key=True) - name = Column(String(10), nullable=False) - - -class ArchiveLog(Base): - __tablename__ = "archive_log" - __table_args__ = (UniqueConstraint("request_id", "dataset_name"),) - - log_id = Column(Numeric, primary_key=True, server_default=text("nextval('log_sequence'::regclass)")) - ip = Column(String) - host_name = Column(String) - account_id = Column(Numeric) - country = Column(String) - local_host_name = Column(String) - user_agent = Column(String) - start_date = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP")) - program = Column(String, nullable=False) - version = Column(String) - resource_name = Column(String) - query = Column(String) - size_lines = Column(Numeric) - size_bytes_wire = Column(Numeric) - size_bytes_uncompressed = Column(Numeric) - duration = Column(Numeric) - medium = Column(String) - user_category = Column(Numeric) - pi_request = Column(String(1)) - member_state = Column(String(1)) - eso_user = Column(String(1)) - error_code = Column(Numeric) - error_string = Column(String) - file_id = Column(String) - archive_class = Column(String) - service_type = Column(String) - dataset_name = Column(String) - request_id = Column(Numeric) - archive_id = Column(ForeignKey("archive.id")) - - archive = relationship("Archive") - - -class Author(Base): - __tablename__ = "authors" - - author_id = Column(Integer, primary_key=True, server_default=text("nextval('authors_author_id_seq'::regclass)")) - project_code = Column(ForeignKey("projects.project_code", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - username = Column(String, nullable=False) - firstname = Column(String, nullable=False) - lastname = Column(String, nullable=False) - pst_person_id = Column(String) - is_pi = Column(Boolean, nullable=False) - - project = relationship("Project") - - def __repr__(self): - return "<Author#{author_id} {username} '{firstname} {lastname}'>".format(**self.__dict__) - - -class CalibrationStatusValue(Base): - __tablename__ = "calibration_status_values" - - status = Column(String, primary_key=True) - description = Column(String, nullable=False) - - -class Calibration(Base): - __tablename__ = "calibrations" - - calibration_id = Column( - Integer, primary_key=True, server_default=text("nextval('calibrations_calibration_id_seq'::regclass)") - ) - alma_ous_id = Column(ForeignKey("alma_ouses.alma_ous_id")) - project_code = Column(ForeignKey("projects.project_code"), nullable=False) - execution_block_id = Column(ForeignKey("execution_blocks.execution_block_id")) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id"), nullable=False) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), unique=True) - - alma_ous = relationship("AlmaOus") - execution_block = relationship("ExecutionBlock") - filegroup = relationship("Filegroup") - project = relationship("Project") - science_product = relationship("ScienceProduct", uselist=False) - - def __repr__(self): - return ( - "<Calibration#{calibration_id} {execution_block_id} '{alma_ous_id} {filegroup_id} {project_code}'>".format( - **self.__dict__ - ) - ) - - -class VLASSCalibration(Calibration): - __tablename__ = "VLASS_calibrations" - - calibration_id = Column(ForeignKey("calibrations.calibration_id"), primary_key=True) - - -class Catalog(Base): - __tablename__ = "catalogs" - - catalog_id = Column(Integer, primary_key=True, server_default=text("nextval('catalogs_catalog_id_seq'::regclass)")) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), nullable=False) - - science_product = relationship("ScienceProduct") - - -class VlassCatalog(Catalog): - __tablename__ = "vlass_catalogs" - - catalog_id = Column(ForeignKey("catalogs.catalog_id"), primary_key=True) - tile = Column(String) - type = Column(String) - - -class Configuration(Base): - __tablename__ = "configurations" - - configuration_id = Column( - Integer, primary_key=True, server_default=text("nextval('configurations_configuration_id_seq'::regclass)") - ) - configuration = Column(Integer, nullable=False) - execution_block_id = Column( - ForeignKey("execution_blocks.execution_block_id", ondelete="CASCADE", onupdate="CASCADE"), - nullable=False, - index=True, - ) - - execution_block = relationship("ExecutionBlock") - - def __repr__(self): - return "<Configuration#{configuration_id}>".format(**self.__dict__) - - -class CollectionNameValue(Base): - __tablename__ = "collection_name_values" - - name = Column(String, primary_key=True) - description = Column(String) - - -class DataDescription(Base): - __tablename__ = "data_descriptions" - - data_description_id = Column( - Integer, primary_key=True, server_default=text("nextval('data_descriptions_data_description_id_seq'::regclass)") - ) - bandwidth = Column(Float(53), nullable=False) - frequency = Column(Float(53), nullable=False) - polarization_id = Column(ForeignKey("polarizations.polarization_id"), nullable=False) - configuration_id = Column( - ForeignKey("configurations.configuration_id", ondelete="CASCADE", onupdate="CASCADE"), - nullable=False, - index=True, - ) - - configuration = relationship("Configuration") - polarization = relationship("Polarization") - subscans = relationship("Subscan", secondary="subscan_data_descriptions") - - def __repr__(self): - return "<DataDescription#{data_description_id} Freq={frequency} BW={bandwidth}>".format(**self.__dict__) - - -class Databasechangelog(Base): - __tablename__ = "databasechangelog" - - id = Column(String(63), primary_key=True, nullable=False) - author = Column(String(63), primary_key=True, nullable=False) - filename = Column(String(200), primary_key=True, nullable=False) - dateexecuted = Column(DateTime(True), nullable=False) - orderexecuted = Column(Integer, nullable=False) - exectype = Column(String(10), nullable=False) - md5sum = Column(String(35)) - description = Column(String(255)) - comments = Column(String(255)) - tag = Column(String(255)) - liquibase = Column(String(20)) - contexts = Column(String(255)) - labels = Column(String(255)) - deployment_id = Column(String(10)) - - -class Databasechangeloglock(Base): - __tablename__ = "databasechangeloglock" - - id = Column(Integer, primary_key=True) - locked = Column(Boolean, nullable=False) - lockgranted = Column(DateTime(True)) - lockedby = Column(String(255)) - - -class Event(Base): - __tablename__ = "events" - - id = Column(Integer, primary_key=True, server_default=text("nextval('events_id_seq'::regclass)")) - application = Column(String, nullable=False) - user = Column(String) - request = Column(String) - message = Column(String, nullable=False) - log_data = Column(JSON) - version = Column(Float(53), nullable=False) - timestamp = Column(DateTime(True), nullable=False) - - def __repr__(self): - return "<Event#{id} app={application} user={user} request={request} timestamp={timestamp}>".format( - **self.__dict__ - ) - - -t_execblock_start_stop = Table( - "execblock_start_stop", - metadata, - Column("execution_block_id", Integer), - Column("starttime", Float(53)), - Column("endtime", Float(53)), -) - - -class ExecutionBlock(Base): - __tablename__ = "execution_blocks" - __table_args__ = ( - CheckConstraint( - "(((telescope)::text = 'EVLA'::text) AND (ngas_fileset_id IS NOT NULL)) OR ((telescope)::text <> 'EVLA'::text)" - ), - ) - - execution_block_id = Column( - Integer, primary_key=True, server_default=text("nextval('execution_blocks_execution_block_id_seq'::regclass)") - ) - ost_exec_block_id = Column(Integer) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - calibration_level = Column(String, nullable=False) - telescope = Column(String, nullable=False) - configuration = Column(String) - scheduling_block_id = Column(Integer) - ngas_fileset_id = Column(String) - project_code = Column(ForeignKey("projects.project_code", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - starttime = Column(Float(53)) - endtime = Column(Float(53)) - calibration_status = Column( - ForeignKey("calibration_status_values.status"), - nullable=False, - server_default=text("'Unknown'::character varying"), - ) - scheduling_block_type = Column(String) - band_code = Column(String) - ingestion_complete = Column(Boolean, nullable=False, server_default=text("false")) - segment = Column(String) - alma_ous_id = Column(ForeignKey("alma_ouses.alma_ous_id")) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), unique=True) - - alma_ous = relationship("AlmaOus") - calibration_status_value = relationship("CalibrationStatusValue") - filegroup = relationship("Filegroup") - project = relationship("Project") - science_product = relationship("ScienceProduct", uselist=False) - scans = relationship("Scan", cascade="all, delete-orphan") - calibrations = relationship("Calibration") - type = Column(String) - - __mapper_args__ = {"polymorphic_identity": "execblock", "polymorphic_on": type} - - def __repr__(self): - return "<ExecutionBlock#{execution_block_id} project={project_code} start={starttime} end={endtime}>".format( - **self.__dict__ - ) - - -class RealfastExecutionBlock(ExecutionBlock): - __tablename__ = "realfast_execution_blocks" - - execution_block_id = Column(ForeignKey("execution_blocks.execution_block_id"), primary_key=True) - transient_ra = Column(String) - transient_ra_error = Column(Float(53)) - transient_dec = Column(String) - transient_dec_error = Column(Float(53)) - transient_snr = Column(Float(53)) - transient_dm = Column(Float(53)) - transient_dm_error = Column(Float(53)) - preaverage_time = Column(Float(53)) - rfpipe_version = Column(String) - prefs_id = Column(String) - rf_qa_label = Column(String) - rf_qa_zero_fraction = Column(Float(53)) - rf_qa_visibility_noise = Column(Float(53)) - rf_qa_image_noise = Column(Float(53)) - portal_candidate_ids = Column(String) - - __mapper_args__ = dict( - polymorphic_identity="realfast", inherit_condition=(execution_block_id == ExecutionBlock.execution_block_id) - ) - - def __repr__(self): - return "<RealfastExecutionBlock#{execution_block_id} project={project_code} start={starttime} end={endtime}>".format( - **self.__dict__ - ) - - -class ExternalProductSystem(Base): - __tablename__ = "external_product_systems" - - name = Column(String, primary_key=True) - - def __repr__(self): - return "<ExternalProductSystem#{name}>".format(**self.__dict__) - - -class FailedIngestion(Base): - __tablename__ = "failed_ingestions" - - filename = Column(String(), primary_key=True) - telescope = Column(String()) - last_attempted = Column(DateTime(True)) - category = Column(String()) - failure_reason = Column(String()) - resolution = Column(String()) - state = Column(String()) - - -class Filegroup(Base): - __tablename__ = "filegroups" - __table_args__ = ( - CheckConstraint( - "(CASE WHEN (project_code IS NOT NULL) THEN 1 ELSE 0 END + CASE WHEN (parent_filegroup_id IS NOT NULL) THEN 1 ELSE 0 END) = 1" - ), - ) - - filegroup_id = Column( - Integer, primary_key=True, server_default=text("nextval('filegroups_filegroup_id_seq'::regclass)") - ) - project_code = Column(ForeignKey("projects.project_code", ondelete="CASCADE", onupdate="CASCADE")) - parent_filegroup_id = Column(ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE")) - datasize = Column(BigInteger) - type = Column(String) - - parent_filegroup = relationship( - "Filegroup", remote_side=[filegroup_id], backref=backref("children_filegroups", cascade="all, delete-orphan") - ) - project = relationship("Project") - - execution_blocks = relationship("ExecutionBlock", cascade="all, delete-orphan") - files = relationship("File", cascade="all, delete-orphan") - scans = relationship("Scan") - - @property - def all_files(self): - """ - :return: all the files under this filegroup, recursively. - - Beware performance issues here! - """ - # this is a gross and probably expensive albeit beautiful way to write this query - return self.files + [file for subgroup in self.children_filegroups for file in subgroup.all_files] - - def __repr__(self): - return "<Filegroup#{filegroup_id} project={project_code}>".format(**self.__dict__) - - -class File(Base): - __tablename__ = "files" - - file_id = Column(Integer, primary_key=True, server_default=text("nextval('files_file_id_seq'::regclass)")) - file_path = Column(String) - ngas_id = Column(String) - filegroup = Column( - ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False, index=True - ) - filename = Column(String, nullable=False) - filesize = Column(BigInteger, nullable=False) - format = Column(String, nullable=False) - type = Column(String, nullable=False) - checksum = Column(String) - checksum_type = Column(String) - ingestion_time = Column(DateTime(True)) - ngas_cluster = Column(String) - ngas_location = Column(String) - preview_storage_path = Column(String) - - filegroup1 = relationship("Filegroup") - images = relationship("Image", cascade="all, delete-orphan") - subscans = relationship("Subscan") - - def __repr__(self): - return "<File#{file_id} {file_path}/{filename} ngas_id={ngas_id}>".format(**self.__dict__) - - -class ImageProduct(Base): - __tablename__ = "image_products" - - image_product_id = Column( - Integer, primary_key=True, server_default=text("nextval('image_products_image_product_id_seq'::regclass)") - ) - project_code = Column(ForeignKey("projects.project_code"), nullable=False) - configurations = Column(String(255)) - collection_name = Column(String(255)) - calibration_level = Column(Integer, server_default=text("2")) - product_file_id = Column( - ForeignKey("files.file_id", ondelete="CASCADE", onupdate="CASCADE"), ForeignKey("files.file_id"), nullable=False - ) - tags = Column(String(255)) - image_set_filegroup = Column(ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE")) - - filegroup = relationship("Filegroup") - product_file = relationship("File", primaryjoin="ImageProduct.product_file_id == File.file_id") - product_file1 = relationship("File", primaryjoin="ImageProduct.product_file_id == File.file_id") - project = relationship("Project") - - -class Image(Base): - __tablename__ = "images" - - image_id = Column(Integer, primary_key=True, server_default=text("nextval('images_image_id_seq'::regclass)")) - file_id = Column(ForeignKey("files.file_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - target_name = Column(String, nullable=False) - telescope = Column(String, nullable=False) - thumbnail = Column(String) - spatial_resolution = Column(Float(53), nullable=False) - image_field_of_view = Column(Float(53), nullable=False) - max_intensity = Column(Float(53), nullable=False) - min_intensity = Column(Float(53), nullable=False) - rms_noise = Column(Float(53), nullable=False) - polarization_id = Column(ForeignKey("polarizations.polarization_id"), nullable=False) - ra = Column(String(255), nullable=False) - dec = Column(String(255), nullable=False) - min_frequency = Column(Float(53), nullable=False) - max_frequency = Column(Float(53), nullable=False) - ra_element_count = Column(Integer, nullable=False) - dec_element_count = Column(Integer, nullable=False) - starttime = Column(Float(53)) - endtime = Column(Float(53)) - exposure_time = Column(Float(53)) - rest_frequency = Column(Float(53)) - image_units = Column(String(255)) - spatial_region = Column(Text) - beam_axis_ratio = Column(Float(53)) - band_code = Column(String) - ra_pixel_size = Column(Float(53), nullable=False) - dec_pixel_size = Column(Float(53), nullable=False) - tags = Column(String) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), unique=True) - collection_name = Column(String) - configurations = Column(String) - calibration_level = Column(Integer) - - file = relationship("File") - polarization = relationship("Polarization") - science_product = relationship("ScienceProduct", uselist=False) - - def __repr__(self): - return "<Image#{image_id} target={target_name} telescope={telescope}>".format(**self.__dict__) - - -class VlassImage(Image): - __tablename__ = "vlass_images" - - image_id = Column(ForeignKey("images.image_id"), primary_key=True) - epoch = Column(ForeignKey("vlass_epochs.epoch")) - tile = Column(String) - type = Column(ForeignKey("vlass_image_types.type")) - - vlass_epoch = relationship("VlassEpoch") - vlass_image_type = relationship("VlassImageType") - - -class Intent(Base): - __tablename__ = "intents" - - intent_name = Column(String, primary_key=True) - - subscans = relationship("Subscan", secondary="subscan_intents") - - def __repr__(self): - return "<Intent {0}>".format(self.intent_name) - - -t_logs = Table( - "logs", - metadata, - Column("filename", String), - Column("class", String), - Column("method", String), - Column("line", Integer), - Column("arguments", String), - Column("timestamp", DateTime(True)), - Column("formatted_message", String), - Column("logger_name", String), - Column("level", String), - Column("thread_name", String), - Column("reference_mask", Integer), - Column("properties", JSON), - Column("stacktrace", Text), - Column("request_id", Integer), -) - - -class Polarization(Base): - __tablename__ = "polarizations" - - polarization_id = Column(Integer, primary_key=True) - name = Column(String, nullable=False) - description = Column(String, nullable=False) - - def __repr__(self): - return "<Polarization {0}>".format(self.name) - - -class ProductGroup(Base): - __tablename__ = "product_groups" - - product_group_id = Column( - Integer, primary_key=True, server_default=text("nextval('product_groups_product_group_id_seq'::regclass)") - ) - product_group_type = Column(String, nullable=False) - alma_ous_id = Column(ForeignKey("alma_ouses.alma_ous_id")) - program_id = Column(ForeignKey("programs.program_id")) - parent_product_group_id = Column(ForeignKey("product_groups.product_group_id")) - - ALMA_ous = relationship("AlmaOus") - parent_product_group = relationship("ProductGroup", remote_side=[product_group_id]) - program = relationship("Program") - science_products = relationship("ScienceProduct", secondary="science_products_product_groups") - - -class Program(Base): - __tablename__ = "programs" - - program_id = Column(String, primary_key=True) - project_code = Column(ForeignKey("projects.project_code"), nullable=False) - program_type = Column(String, nullable=False) - parent_program_id = Column(ForeignKey("programs.program_id")) - - parent_program = relationship("Program", remote_side=[program_id]) - project = relationship("Project") - - -class Project(Base): - __tablename__ = "projects" - - project_code = Column(String, primary_key=True) - legacy_id = Column(String) - total_observation_time = Column(Float(53)) - opt_project_id = Column(Integer) - title = Column(String) - abstract = Column(Text) - proprietary_expiration = Column(DateTime) - last_addition = Column(Date) - starttime = Column(Float(53)) - endtime = Column(Float(53)) - proprietary_duration = Column(Float(53)) - - science_products = relationship("ScienceProduct", secondary="science_products_projects") - authors = relationship("Author") - execution_blocks = relationship("ExecutionBlock") - file_groups = relationship("Filegroup") - alma_ouses = relationship("AlmaOus", backref="projects") - - def __repr__(self): - return '<Project#{project_code} "{title}" start={starttime} end={endtime}>'.format(**self.__dict__) - - -class Receiver(Base): - __tablename__ = "receivers" - - receiver_id = Column( - Integer, primary_key=True, server_default=text("nextval('receivers_receiver_id_seq'::regclass)") - ) - description = Column(String, nullable=False) - - def __repr__(self): - return "<Receiver {0}>".format(self.receiver_id) - - -class ReingestionState(Base): - __tablename__ = "reingestion_states" - - state = Column(String, primary_key=True) - - -class RhCommand(Base): - __tablename__ = "rh_commands" - - command_id = Column(Numeric, primary_key=True) - name = Column(String, nullable=False, unique=True) - arguments = Column(String) - description = Column(String) - host = Column(String) - script = Column(String, nullable=False) - staging_area = Column(String) - execution_level = Column(String, nullable=False) - - -class RhDataEntity(Base): - __tablename__ = "rh_data_entities" - __table_args__ = (UniqueConstraint("data_entity_name", "request_id"),) - - data_entity_id = Column(Numeric, primary_key=True) - data_entity_name = Column(String, nullable=False) - request_id = Column(ForeignKey("rh_requests.request_id"), nullable=False, index=True) - state = Column(String, nullable=False) - meta_data_uri = Column(String) - - request = relationship("RhRequest") - - -class RhFile(Base): - __tablename__ = "rh_files" - __table_args__ = ( - CheckConstraint( - "((request_id IS NOT NULL) AND (data_entity_id IS NULL)) OR ((request_id IS NULL) AND (data_entity_id IS NOT NULL))" - ), - ) - - file_id = Column(Numeric, primary_key=True) - request_id = Column(ForeignKey("rh_requests.request_id"), index=True) - data_entity_id = Column(ForeignKey("rh_data_entities.data_entity_id"), index=True) - file_key = Column(String, nullable=False, index=True) - namespace = Column(String, nullable=False) - file_name = Column(String, nullable=False) - file_type = Column(String) - file_uri = Column(String, nullable=False) - file_size = Column(Numeric, nullable=False) - rank = Column(Numeric) - permission = Column(String) - medium_id = Column(Numeric) - - data_entity = relationship("RhDataEntity") - request = relationship("RhRequest") - - -class RhOperatorRequest(Base): - __tablename__ = "rh_operator_requests" - - request_id = Column(Numeric, primary_key=True) - creation_date = Column(DateTime, nullable=False) - priority = Column(String, nullable=False) - resolved_flag = Column(String(1), nullable=False) - action_id = Column(Numeric) - request_description = Column(String) - - -class RhProcess(Base): - __tablename__ = "rh_processes" - __table_args__ = ( - CheckConstraint( - "((request_id IS NOT NULL) AND (data_entity_id IS NULL)) OR ((request_id IS NULL) AND (data_entity_id IS NOT NULL))" - ), - ) - - process_id = Column(Numeric, primary_key=True) - state = Column(String, nullable=False) - command_id = Column(ForeignKey("rh_commands.command_id"), nullable=False) - job_id = Column(String) - delivery_method = Column(String) - arguments = Column(String) - file_id = Column(ForeignKey("rh_files.file_id")) - request_id = Column(ForeignKey("rh_requests.request_id")) - data_entity_id = Column(ForeignKey("rh_data_entities.data_entity_id")) - process_type = Column(String, nullable=False) - - command = relationship("RhCommand") - data_entity = relationship("RhDataEntity") - file = relationship("RhFile") - request = relationship("RhRequest") - - -class RhRequestParameter(Base): - __tablename__ = "rh_request_parameters" - - request_id = Column(ForeignKey("rh_requests.request_id"), primary_key=True, nullable=False) - pname = Column(String, primary_key=True, nullable=False) - pvalue = Column(String) - - request = relationship("RhRequest") - - -class RhRequest(Base): - __tablename__ = "rh_requests" - - request_id = Column(Numeric, primary_key=True) - account_id = Column(Numeric, nullable=False) - request_state = Column(String, nullable=False) - creation_date = Column(DateTime, nullable=False) - request_description = Column(String) - delivery_method_type = Column(String) - delivery_media_type = Column(String) - delivery_media_address = Column(String) - completion_date = Column(DateTime) - priority_code = Column(Numeric, nullable=False) - ds_file_size = Column(Numeric) - aux_file_size = Column(Numeric) - total_files_number = Column(Numeric) - total_processes_number = Column(Numeric) - notification_email = Column(String) - archive_id = Column(ForeignKey("archive.id")) - - archive = relationship("Archive") - - -t_rh_requests_mediums = Table( - "rh_requests_mediums", - metadata, - Column("request_id", ForeignKey("rh_requests.request_id"), primary_key=True, nullable=False), - Column("medium_id", ForeignKey("rh_site_delivery_medium.medium_id"), primary_key=True, nullable=False), -) - - -class RhSiteDeliveryMedium(Base): - __tablename__ = "rh_site_delivery_medium" - - medium_id = Column(Numeric, primary_key=True) - active = Column(String(1), nullable=False) - media_type = Column(String, nullable=False) - host_name = Column(String, nullable=False) - device = Column(String, nullable=False) - capacity = Column(Float, nullable=False) - request_id = Column(Numeric) - state = Column(String, nullable=False) - last_mod = Column(DateTime, server_default=text("'2018-04-18 15:21:15.783814'::timestamp without time zone")) - status_message = Column(String, nullable=False) - - requests = relationship("RhRequest", secondary="rh_requests_mediums") - - -class Role(Base): - __tablename__ = "role" - __table_args__ = (UniqueConstraint("application", "name"),) - - role_no = Column(Numeric, primary_key=True) - version = Column(Numeric, nullable=False) - application = Column(String, nullable=False) - name = Column(String, nullable=False) - parent_role = Column(ForeignKey("role.role_no")) - - parent = relationship("Role", remote_side=[role_no]) - - -t_rsl_eb_cal_map = Table("rsl_eb_cal_map", metadata, Column("eb_locator", String), Column("cal_locator", String)) - - -class Scan(Base): - __tablename__ = "scans" - - scan_id = Column(Integer, primary_key=True, server_default=text("nextval('scans_scan_id_seq'::regclass)")) - ost_scan_id = Column(Integer) - execution_block_id = Column( - ForeignKey("execution_blocks.execution_block_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False - ) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - max_bandwidth = Column(Float(53), nullable=False) - min_bandwidth = Column(Float(53), nullable=False) - polarization_code = Column(Integer, nullable=False) - max_frequency = Column(Float(53), nullable=False) - min_frequency = Column(Float(53), nullable=False) - filename = Column(String) - - execution_block = relationship("ExecutionBlock") - filegroup = relationship("Filegroup") - subscans = relationship("Subscan", cascade="all, delete-orphan") - - def __repr__(self): - return "<Scan#{0}>".format(self.scan_id) - - -class ScienceProductGroupType(Base): - __tablename__ = "science_product_group_types" - - science_product_group_type = Column(String, primary_key=True) - description = Column(String) - - -class ScienceProductType(Base): - __tablename__ = "science_product_types" - - science_product_type = Column(String, primary_key=True) - description = Column(String) - - -class ScienceProduct(Base): - __tablename__ = "science_products" - - science_product_locator = Column(String, primary_key=True) - science_product_type = Column(ForeignKey("science_product_types.science_product_type"), nullable=False) - metadata_ingestion_date = Column(DateTime, nullable=False) - metadata_ingestion_version = Column(String, nullable=False) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id"), nullable=False) - external_name = Column(String) - external_system = Column(ForeignKey("external_product_systems.name")) - collection = Column(ForeignKey("collection_name_values.name")) - - external_product_system = relationship("ExternalProductSystem") - filegroup = relationship("Filegroup") - science_product_type1 = relationship("ScienceProductType") - collection_name = relationship("CollectionNameValue") - - execution_block = relationship("ExecutionBlock", uselist=False, back_populates="science_product") - project = relationship("Project", uselist=False, secondary="science_products_projects") - - @property - def locator(self): - return self.science_product_locator - - @property - def subdirectory(self): - if self.science_product_type == "Execution Block": - return self.execution_block.ngas_fileset_id - else: - return self.external_name - - def __repr__(self): - return f"<ScienceProduct#{self.science_product_locator} type={self.science_product_type}>" - - -class ScienceProductsProductGroup(Base): - __tablename__ = "science_products_product_groups" - - science_product_locator = Column( - ForeignKey("science_products.science_product_locator"), primary_key=True, nullable=False - ) - product_group_id = Column(ForeignKey("product_groups.product_group_id"), primary_key=True, nullable=False) - - product_group = relationship("ProductGroup") - science_product = relationship("ScienceProduct") - - -t_science_products_projects = Table( - "science_products_projects", - metadata, - Column( - "science_product_locator", - ForeignKey("science_products.science_product_locator"), - primary_key=True, - nullable=False, - ), - Column("project_code", ForeignKey("projects.project_code"), primary_key=True, nullable=False), -) - - -t_source_3c48 = Table( - "source_3c48", - metadata, - Column("project_code", String), - Column("execution_block_id", Integer), - Column("ost_scan_id", Integer), - Column("starttime", DateTime(True)), - Column("ngas_id", String), - Column("source", Text), - Column("receiver_band", Text), -) - - -t_subscan_data_descriptions = Table( - "subscan_data_descriptions", - metadata, - Column("subscan_id", ForeignKey("subscans.subscan_id"), primary_key=True, nullable=False), - Column( - "data_description_id", - ForeignKey("data_descriptions.data_description_id"), - primary_key=True, - nullable=False, - index=True, - ), -) - - -t_subscan_intents = Table( - "subscan_intents", - metadata, - Column("intent_name", ForeignKey("intents.intent_name"), primary_key=True, nullable=False), - Column( - "subscan_id", - ForeignKey("subscans.subscan_id", ondelete="CASCADE", onupdate="CASCADE"), - primary_key=True, - nullable=False, - ), -) - - -class Subscan(Base): - __tablename__ = "subscans" - - subscan_id = Column(Integer, primary_key=True, server_default=text("nextval('subscans_subscan_id_seq'::regclass)")) - scan_id = Column(ForeignKey("scans.scan_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - file_id = Column(ForeignKey("files.file_id", ondelete="CASCADE", onupdate="CASCADE"), index=True) - ost_subscan_id = Column(Integer) - obstype = Column(String, nullable=False) - starttime = Column(Float(53), nullable=False) - endtime = Column(Float(53), nullable=False) - sourcename = Column(String, nullable=False) - sourcetype = Column(String, nullable=False) - ra = Column(Float(53), nullable=False) - dec = Column(Float(53), nullable=False) - exposure_time = Column(Float(53), nullable=False) - integration_time = Column(Float(53), nullable=False) - receiver_id = Column(ForeignKey("receivers.receiver_id"), nullable=False) - backend = Column(String, nullable=False) - intent = Column(String) - configuration_id = Column( - ForeignKey("configurations.configuration_id", ondelete="CASCADE", onupdate="CASCADE"), - nullable=False, - index=True, - ) - - configuration = relationship("Configuration") - file = relationship("File") - receiver = relationship("Receiver") - scan = relationship("Scan") - data_descriptions = relationship("DataDescription", secondary="subscan_data_descriptions") - intents = relationship("Intent", secondary="subscan_intents") - - def __repr__(self): - return "<Subscan#{subscan_id} {obstype} start={starttime} end={endtime} ra={ra} dec={dec} backend={backend} intent={intent}>".format( - **self.__dict__ - ) - - -t_total_file_sizes = Table( - "total_file_sizes", - metadata, - Column("filegroup_id", Integer), - Column("parent_filegroup_id", Integer), - Column("filesize", Numeric), -) - - -class VlassCalibrationType(Base): - __tablename__ = "vlass_calibration_types" - - type = Column(String, primary_key=True) - description = Column(String) - - -t_vlass_calibrations = Table( - "vlass_calibrations", - metadata, - Column("calibration_id", ForeignKey("calibrations.calibration_id"), primary_key=True), - Column("type", ForeignKey("vlass_calibration_types.type")), -) - - -class VlassEpoch(Base): - __tablename__ = "vlass_epochs" - - epoch = Column(String, primary_key=True) - description = Column(String) - - execution_blocks = relationship("ExecutionBlock", secondary="vlass_execution_blocks") - - -class VlassExecutionBlockTile(Base): - __tablename__ = "vlass_execution_block_tiles" - - execution_block_id = Column( - ForeignKey("vlass_execution_blocks.execution_block_id"), primary_key=True, nullable=False - ) - tile = Column(String, primary_key=True, nullable=False) - - execution_block = relationship("VLASSExecutionBlock") - - -class VLASSExecutionBlock(ExecutionBlock): - __tablename__ = "vlass_execution_blocks" - - __mapper_args__ = {"polymorphic_identity": "vlass"} - - execution_block_id = Column(ForeignKey("execution_blocks.execution_block_id"), primary_key=True) - epoch = Column(ForeignKey("vlass_epochs.epoch")) - - execution_block = relationship("ExecutionBlock") - vlass_epoch = relationship("VlassEpoch") - - -class VlassImageType(Base): - __tablename__ = "vlass_image_types" - - type = Column(String, primary_key=True) - description = Column(String) - - -class VlbaReingestionQueue(Base): - __tablename__ = "vlba_reingestion_queue" - - filename = Column(String, primary_key=True) - observation_finished = Column(DateTime(True), nullable=False) - last_updated = Column(DateTime(True), nullable=False, server_default=text("now()")) - state = Column( - ForeignKey("reingestion_states.state"), nullable=False, server_default=text("'WAITING'::character varying") - ) - - reingestion_state = relationship("ReingestionState") - - -class ProblemSeverityList(Base): - __tablename__ = "problem_severity_list" - - severity = Column(Integer, primary_key=True) - description = Column(String) - - -class ProblemType(Base): - __tablename__ = "problem_types" - - problem_type_id = Column( - Integer, primary_key=True, server_default=text("nextval('problem_types_problem_type_id_seq'::regclass)") - ) - description = Column(String) - - -class ScienceProductComment(Base): - __tablename__ = "science_product_comments" - - comment_id = Column( - Integer, primary_key=True, server_default=text("nextval('science_product_comments_comment_id_seq'::regclass)") - ) - problem_type_id = Column(ForeignKey("problem_types.problem_type_id"), nullable=False) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), nullable=False) - severity = Column(ForeignKey("problem_severity_list.severity"), nullable=False) - comment = Column(String) - doc_link = Column(String) - - problem_type = relationship("ProblemType") - science_product = relationship("ScienceProduct") - problem_severity_list = relationship("ProblemSeverityList") diff --git a/apps/cli/executables/pexable/ingest/ingest/schema/ngasmodel.py b/apps/cli/executables/pexable/ingest/ingest/schema/ngasmodel.py deleted file mode 100644 index 8918557294b6af7b2846079662a9c24f3e676744..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/schema/ngasmodel.py +++ /dev/null @@ -1,67 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import Column, ForeignKey, Integer, String -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship - -Base = declarative_base() -metadata = Base.metadata - - -class NGASHost(Base): - __tablename__ = "ngas_hosts" - host_id = Column("host_id", String, primary_key=True) - domain = Column("domain", String) - port = Column("srv_port", Integer) - cluster_name = Column("cluster_name", String) - disks = relationship("NGASDisk", backref="host") - - @property - def server(self): - return f"{self.host_id}.{self.domain}" - - def __repr__(self): - return f"<NGASHost {self.host_id}.{self.domain}:{self.port}>" - - -class NGASDisk(Base): - __tablename__ = "ngas_disks" - disk_id = Column("disk_id", String, primary_key=True) - mounted = Column("mounted", Integer) - host_id = Column("host_id", ForeignKey("ngas_hosts.host_id")) - files = relationship("NGASFile", backref="disk") - - def __repr__(self): - return f"<NGASDisk#{self.disk_id} mounted={self.mounted}>" - - -class NGASFile(Base): - __tablename__ = "ngas_files" - file_id = Column("file_id", String, primary_key=True) - file_name = Column("file_name", String) - ingestion_date = Column("ingestion_date", String) - file_size = Column("file_size", Integer) - version = Column("file_version", Integer, primary_key=True) - disk_id = Column("disk_id", ForeignKey("ngas_disks.disk_id")) - checksum = Column("checksum", String) - checksum_plugin = Column("checksum_plugin", String) - format = Column("format", String) - - def __repr__(self): - return f"<NGASFile#{self.file_id} name={self.file_name} size={self.file_size} version={self.version}>" diff --git a/apps/cli/executables/pexable/ingest/ingest/schema/optmodel.py b/apps/cli/executables/pexable/ingest/ingest/schema/optmodel.py deleted file mode 100644 index a6575718cdc21a48e1b14f3afb1a8e2db27e1ca6..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/schema/optmodel.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - Boolean, - Column, - DateTime, - Float, - ForeignKey, - Index, - Integer, - String, - Text, - text, -) -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship - -Base = declarative_base() -metadata = Base.metadata - - -class Coauthor(Base): - __tablename__ = "coauthors" - __table_args__ = (Index("coauthors_idx_project_id_idx", "idx", "project_id"),) - - project_id = Column(ForeignKey("project.id"), primary_key=True, nullable=False, index=True) - projectauthor_id = Column(ForeignKey("projectauthor.id"), nullable=False, unique=True) - idx = Column(Integer, primary_key=True, nullable=False) - - project = relationship("Project") - projectauthor = relationship("Projectauthor", uselist=False) - - -class Project(Base): - __tablename__ = "project" - - id = Column(Integer, primary_key=True, server_default=text("nextval('project_id_seq'::regclass)")) - rowversion = Column(Integer, nullable=False) - projectcode = Column(String, nullable=False, unique=True) - title = Column(String) - proposalcode = Column(String, nullable=False) - createdon = Column(DateTime) - createdby = Column(Integer) - lastupdatedon = Column(DateTime) - lastupdatedby = Column(Integer) - comments = Column(Text) - projecttype = Column(String) - test = Column(Boolean, server_default=text("false")) - telescope = Column(String) - refereemedian = Column(Float(53)) - has_submitted_sb = Column(Boolean, nullable=False, server_default=text("false")) - is_complete = Column(Boolean, nullable=False, server_default=text("false")) - hoursallocated = Column(Float(53), nullable=False) - hoursusedsuccess = Column(Float(53), nullable=False) - hoursusedfailure = Column(Float(53), nullable=False) - pi = Column(ForeignKey("projectauthor.id"), index=True) - contactauthor = Column(ForeignKey("projectauthor.id"), index=True) - - projectauthor = relationship("Projectauthor", primaryjoin="Project.contactauthor == Projectauthor.id") - projectauthor1 = relationship("Projectauthor", primaryjoin="Project.pi == Projectauthor.id") - - -class Projectauthor(Base): - __tablename__ = "projectauthor" - - id = Column(Integer, primary_key=True, server_default=text("nextval('projectauthor_id_seq'::regclass)")) - rowversion = Column(Integer, nullable=False) - globalid = Column(Integer, nullable=False) - presentonproposal = Column(Boolean, nullable=False, server_default=text("false")) - receivesemail = Column(Boolean, nullable=False, server_default=text("true")) diff --git a/apps/cli/executables/pexable/ingest/ingest/schema/pstmodel.py b/apps/cli/executables/pexable/ingest/ingest/schema/pstmodel.py deleted file mode 100644 index 5a732ee45c452fcc620b671b9ece82d56295593c..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/schema/pstmodel.py +++ /dev/null @@ -1,2197 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - BigInteger, - Column, - Date, - DateTime, - Float, - ForeignKey, - Index, - Integer, - SmallInteger, - String, - Table, - Text, - text, -) -from sqlalchemy.dialects.mysql.types import BIT, MEDIUMBLOB -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship - -Base = declarative_base() -metadata = Base.metadata - - -class AbstractBug(Base): - __tablename__ = "AbstractBug" - - bug_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - id = Column(Integer, nullable=False) - status = Column(String(255), nullable=False) - statusNumber = Column(Integer, nullable=False, index=True) - type = Column(String(255), nullable=False) - typeNumber = Column(Integer, nullable=False, index=True) - issueDate = Column(Date, index=True) - completeDate = Column(Date, index=True) - author = Column(String(255)) - location = Column(String(255)) - description = Column(String) - resolution = Column(String) - versionNumber = Column(String(255)) - osName = Column(String(255)) - email = Column(String) - - -class GBTVEGASSpectrometer(Base): - __tablename__ = "GBT_VEGAS_Spectrometer" - - id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - mode = Column(Integer, nullable=False) - bandwidth = Column(Float(asdecimal=True), nullable=False) - restFrequencies = Column(String(255), nullable=False) - spectralResolution = Column(Float(asdecimal=True), nullable=False) - integrationTime = Column(Float(asdecimal=True), nullable=False) - dataRate = Column(Float(asdecimal=True), nullable=False) - vegas_id = Column(ForeignKey("GBT_VEGAS_14A.Id", ondelete="CASCADE"), index=True) - - vegas = relationship("GBTVEGAS14A") - - -class GBTVegasPulsar(Base): - __tablename__ = "GBT_Vegas_Pulsar" - - Id = Column(BigInteger, primary_key=True) - COMMENTS = Column(String(512)) - BAND_WIDTH = Column(String(128)) - BAND_WIDTH_UNIT = Column(String(255)) - OBSERVING_MODE = Column(String(128)) - POLAR_CROSS_PROD = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - Dedispersion = Column(String(255)) - BITS = Column(String(255)) - - -class NormalizedScienceType(Base): - __tablename__ = "NormalizedScienceTypes" - - id = Column(Integer, primary_key=True) - cycle_id = Column(Integer, nullable=False) - science_type = Column(Text, nullable=False) - normalized = Column(Integer, nullable=False) - - -class RESOURCE(Base): - __tablename__ = "RESOURCES" - - resource_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - RESOURCE_GROUP = Column(Text) - RESOURCE_NAME = Column(Text) - PROPOSAL_ID = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - TELESCOPE = Column(String(255), nullable=False) - DISPLAY_POSITION = Column(Float(asdecimal=True), nullable=False) - - proposal = relationship("Proposal") - - -class GMVARESOURCE(RESOURCE): - __tablename__ = "GMVA_RESOURCE" - - Id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), primary_key=True, index=True) - FRONT_END = Column(String(255)) - BACK_END = Column(String(255)) - VLBA = Column(BIT(1), nullable=False) - EUROPEAN = Column(BIT(1), nullable=False) - BREWSTER = Column(BIT(1), nullable=False) - FORT_DAVIS = Column(BIT(1), nullable=False) - KITT_PEAK = Column(BIT(1), nullable=False) - LOS_ALAMOS = Column(BIT(1), nullable=False) - MAUNA_KEA = Column(BIT(1), nullable=False) - NORTH_LIBERTY = Column(BIT(1), nullable=False) - OWENS_VALLEY = Column(BIT(1), nullable=False) - PIE_TOWN = Column(BIT(1), nullable=False) - EFFELSBERG = Column(BIT(1), nullable=False) - PLATEAU_DE_BURE = Column(BIT(1), nullable=False) - PICO_VELETA = Column(BIT(1), nullable=False) - ONSALA = Column(BIT(1), nullable=False) - METSAHOVI = Column(BIT(1), nullable=False) - YEBES = Column(BIT(1), nullable=False) - OTHER_STATIONS = Column(String(255)) - FULL_POLAR = Column(BIT(1), nullable=False) - AVERAGING_TIME = Column(String(255)) - SPECTRAL_POINTS = Column(String(255)) - MULTI_CORR_PASS = Column(String(255)) - MARK4_CONVERSION = Column(BIT(1), nullable=False) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - SAMPLING_LEVEL = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - BITS = Column(String(255), nullable=False) - POLAR_CROSS_PROD = Column(String(255)) - AGG_BIT_RATE = Column(String(255)) - NO_OF_FIELDS = Column(Integer) - Wideband_Observing_System = Column(BIT(1), nullable=False) - Observing_System = Column(String(255), nullable=False) - GREEN_BANK = Column(BIT(1), nullable=False) - - -class GBTRESOURCE(RESOURCE): - __tablename__ = "GBT_RESOURCE" - - Id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), primary_key=True, index=True) - FRONT_END = Column(String(255)) - BACK_END = Column(String(255)) - RECEIVER_OTHER = Column(String(255)) - - -class GBTGuppi(GBTRESOURCE): - __tablename__ = "GBT_Guppi" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - BAND_WIDTH = Column(String(128)) - BAND_WIDTH_UNIT = Column(String(128)) - OBSERVING_MODE = Column(String(128)) - POLAR_CROSS_PROD = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - Dedispersion = Column(String(255)) - Bits = Column(String(255), server_default=text("'1'")) - - -class GBTBACKENDBREAKTHROUGHLISTEN(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_BREAKTHROUGH_LISTEN" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(String(512)) - - -class GBTBACKENDPROCESSORPULSAR(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_PROCESSOR_PULSAR" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - POLAR_CROSS_PROD = Column(String(255)) - PHASE_BINS = Column(String(255)) - - -class GBTZpectrometer(GBTRESOURCE): - __tablename__ = "GBT_Zpectrometer" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - PI_PRE_APPROVAL = Column(BIT(1)) - - -class GBTVEGAS14A(GBTRESOURCE): - __tablename__ = "GBT_VEGAS_14A" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - observing_type = Column(String(255)) - number_beams = Column(Integer) - - -class GBTBACKENDRADAR(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_RADAR" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - PI_PRE_APPROVAL = Column(BIT(1)) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - Bits = Column(String(255), server_default=text("'1'")) - - -class GBTSPECTROSPIGOT(GBTRESOURCE): - __tablename__ = "GBT_SPECTRO_SPIGOT" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - POLAR_CROSS_PRODUCT = Column(String(255)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - - -class GBTBACKENDCGSR2(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_CGSR2" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - PI_PRE_APPROVAL = Column(BIT(1)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - - -class GBTBACKENDPROCESSORLINE(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_PROCESSOR_LINE" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - POLAR_CROSS_PROD = Column(String(255)) - - -class GBTBACKENDGASP(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_GASP" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - PI_PRE_APPROVAL = Column(BIT(1)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - - -class GBTBACKENDBCPM(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_BCPM" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - - -class GBTSPECTOMETERLINE(GBTRESOURCE): - __tablename__ = "GBT_SPECTOMETER_LINE" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - SAMPLING_LEVEL = Column(String(255)) - BEAMS = Column(String(255)) - POLAR_CROSS_PRODUCT = Column(String(255)) - - -class GBTVEGA(GBTRESOURCE): - __tablename__ = "GBT_VEGAS" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - CROSS_POLARIZATION = Column(BIT(1)) - BEAMS = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - Resolution = Column(String(255)) - MinimumInterval = Column(String(255)) - - -class GBTBACKENDJPLRADAR(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_JPL_RADAR" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - PI_PRE_APPROVAL = Column(BIT(1)) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - BITS = Column(String(255)) - - -class GBTBACKENDDIGITAL(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_DIGITAL" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - Bits = Column(String(255), server_default=text("'1'")) - - -class GBTMUSTANG(GBTRESOURCE): - __tablename__ = "GBT_MUSTANG" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - Array = Column(String(255)) - - -class GBTBACKENDOTHER(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_OTHER" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SPECIAL_BACKEND = Column(String(255)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - COMMENTS = Column(Text) - - -class GBTBACKENDCALTECHCONTINUUM(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_CALTECH_CONTINUUM" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - - -class VLBARESOURCE(RESOURCE): - __tablename__ = "VLBA_RESOURCE" - - Id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), primary_key=True, index=True) - FRONT_END = Column(String(255)) - BACK_END = Column(String(255)) - VLBA = Column(BIT(1), nullable=False) - HSA = Column(BIT(1), nullable=False) - BREWSTER = Column(BIT(1), nullable=False) - FORT_DAVIS = Column(BIT(1), nullable=False) - HANCOCK = Column(BIT(1), nullable=False) - KITT_PEAK = Column(BIT(1), nullable=False) - LOS_ALAMOS = Column(BIT(1), nullable=False) - MAUNA_KEA = Column(BIT(1), nullable=False) - NORTH_LIBERTY = Column(BIT(1), nullable=False) - OWENS_VALLEY = Column(BIT(1), nullable=False) - PIE_TOWN = Column(BIT(1), nullable=False) - ST_CROIX = Column(BIT(1), nullable=False) - GBT = Column(BIT(1), nullable=False, index=True) - ARECIBO = Column(BIT(1), nullable=False) - EFFELSBERG = Column(BIT(1), nullable=False) - VLA_Y1 = Column(BIT(1), nullable=False, index=True) - VLA_Y27 = Column(BIT(1), nullable=False, index=True) - GEODETIC = Column(String(255)) - FULL_POLAR = Column(BIT(1), nullable=False) - PULSAR_GATE = Column(BIT(1), nullable=False) - MULTIPLE_FIELDS = Column(String(255)) - AVERAGING_TIME = Column(String(255)) - SPECTRAL_POINTS = Column(String(255)) - MULTI_CORR_PASS = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - SAMPLING_LEVEL = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - BITS = Column(String(255), nullable=False) - POLAR_CROSS_PROD = Column(String(255)) - AGG_BIT_RATE = Column(String(255)) - NO_OF_FIELDS = Column(Integer, server_default=text("'0'")) - Wideband_Observing_System = Column(BIT(1), nullable=False) - Observing_Mode = Column(String(255), server_default=text("'Standard'")) - RSROComments = Column(String) - Observing_System = Column(String(255), server_default=text("'Legacy System'")) - MARK4_CONVERSION = Column(BIT(1)) - shared_risk = Column(BIT(1), nullable=False) - - -class VLARESOURCE(RESOURCE): - __tablename__ = "VLA_RESOURCE" - - Id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), primary_key=True, index=True) - FRONT_END = Column(String(255)) - BACK_END = Column(String(255)) - CONFIGURATION = Column(String(255)) - - -class VLABACKENDGENERAL13A(VLARESOURCE): - __tablename__ = "VLA_BACKEND_GENERAL13A" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - OBSERVING_CHOICE = Column(String(255), nullable=False) - FILE_CONTENTS = Column(MEDIUMBLOB) - REST_FREQUENCIES = Column(String) - - -class VLABACKENDSRO13A(VLARESOURCE): - __tablename__ = "VLA_BACKEND_SRO13A" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SRO_CATALOG_ID = Column(String(255), nullable=False) - SRO_RESOURCE_NAME = Column(String(255), nullable=False) - SRO_RESOURCE_ID = Column(String(255), nullable=False) - - -class VLABACKENDOSRODUAL(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSRODUAL" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDSINGLE(VLARESOURCE): - __tablename__ = "VLA_BACKEND_SINGLE" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - SKY_FREQUENCY = Column(Text) - SKY_UNIT = Column(String(255)) - REST_FREQUENCY_TYPE = Column(String(255)) - - -class VLABACKENDECSO(VLARESOURCE): - __tablename__ = "VLA_BACKEND_ECSO" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - - -class VLABACKENDOSRO2(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSRO2" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(Text) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDOSROFULL(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSROFULL" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDHIGH(VLARESOURCE): - __tablename__ = "VLA_BACKEND_HIGH" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SPECTRAL_RESOL = Column(Text) - SPECTRAL_RESOL_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(Text) - TIME_RESOLUTION_UNIT = Column(String(255)) - - -class VLABACKENDOSROSINGLE(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSROSINGLE" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDOSRO1(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSRO1" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(Text) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDRSRO13A(VLARESOURCE): - __tablename__ = "VLA_BACKEND_RSRO13A" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - DESCRIPTION = Column(String(255), nullable=False) - - -class VLABACKENDMULTI(VLARESOURCE): - __tablename__ = "VLA_BACKEND_MULTI" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(Text) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - CHANNEL_COUNT = Column(Integer) - - -class VLABACKENDRSRO(VLARESOURCE): - __tablename__ = "VLA_BACKEND_RSRO" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - - -class VLABACKENDSTAFF13A(VLARESOURCE): - __tablename__ = "VLA_BACKEND_STAFF13A" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - DESCRIPTION = Column(String(255), nullable=False) - - -class VLABACKENDOTHER(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OTHER" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SPECIAL_BACK_END = Column(String(255)) - - -class VLABACKENDWIDEBAND(VLARESOURCE): - __tablename__ = "VLA_BACKEND_WIDEBAND" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - BASEBAND_CENTERS = Column(String(255), nullable=False) - POLARIZATION_PRODUCTS = Column(String(255), nullable=False) - DUMP_TIME = Column(String(255), nullable=False) - DATA_RATE = Column(String(255), nullable=False) - BASEBANDS = Column(String(255), nullable=False) - SHARED_RISK = Column(BIT(1), nullable=False) - DATA_RATE_JUSTIFICATION = Column(String(255)) - - -class TechJustification(Base): - __tablename__ = "TechJustification" - - id = Column(Integer, primary_key=True) - proposal_id = Column(Integer, nullable=False, unique=True) - arrayconfig = Column(Text) - daynight = Column(Text) - receivers = Column(Text) - correlator = Column(Text) - sensitivity = Column(Text) - integrationTime = Column(Text) - dumpTime = Column(Text) - imaging = Column(Text) - rfi = Column(Text) - stations = Column(Text) - weather = Column(Text) - dates = Column(Text) - minlength = Column(Text) - phaseref = Column(Text) - polarization = Column(Text) - hsa = Column(Text) - resource = Column(Text) - mapping = Column(Text) - overhead = Column(Text) - novel = Column(Text) - pulsar = Column(Text) - other = Column(Text) - mosaic = Column(Text) - bitrate = Column(Text) - joint = Column(Text) - total_correlator_output_data_size = Column(Text) - - -class TechJustificationFile(Base): - __tablename__ = "TechJustificationFile" - - id = Column(Integer, primary_key=True) - techjust_id = Column(Integer, nullable=False) - filename = Column(Text, nullable=False) - filetype = Column(Text, nullable=False) - filesize = Column(Integer, nullable=False) - file = Column(MEDIUMBLOB) - - -class ValidConfiguration(Base): - __tablename__ = "ValidConfigurations" - - id = Column(Integer, primary_key=True) - cycle_id = Column(Integer, nullable=False) - configuration = Column(Text, nullable=False) - - -class Addres(Base): - __tablename__ = "address" - - address_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - defaultAddress = Column(BIT(1)) - addressDescription = Column(String(255)) - street1 = Column(String(255)) - street2 = Column(String(255)) - street3 = Column(String(255)) - street4 = Column(String(255)) - city = Column(String(255)) - postalCode = Column(String(255)) - region = Column(String(255)) - addressState_id = Column(ForeignKey("addressState.addressState_id"), index=True) - addressCountry_id = Column(ForeignKey("addressCountry.addressCountry_id"), index=True) - person_id = Column(ForeignKey("person.person_id"), index=True) - organization_id = Column(ForeignKey("organization.organization_id"), index=True) - updatedOn = Column(DateTime) - updatedBy = Column(Integer) - - addressCountry = relationship("AddressCountry") - addressState = relationship("AddressState") - organization = relationship("Organization") - person = relationship("Person") - - -class AddressCountry(Base): - __tablename__ = "addressCountry" - - addressCountry_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - addressCountry = Column(String(255), nullable=False) - alpha_2 = Column(String(2)) - alpha_3 = Column(String(3)) - idd_isd = Column(String(25)) - status = Column(String(25)) - - -t_addressCountry_bck = Table( - "addressCountry_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class AddressState(Base): - __tablename__ = "addressState" - - addressState_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - stateName = Column(String(255), nullable=False) - state = Column(String(255)) - - -t_addressState_bck = Table( - "addressState_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class AddressType(Base): - __tablename__ = "addressType" - - addressType_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - addressType = Column(String(255), nullable=False) - - addresss = relationship("Addres", secondary="address_addressType") - - -t_addressType_bck = Table( - "addressType_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_address_addressType = Table( - "address_addressType", - metadata, - Column("address_id", ForeignKey("address.address_id"), primary_key=True, nullable=False, index=True), - Column("addressType_id", ForeignKey("addressType.addressType_id"), primary_key=True, nullable=False, index=True), -) - - -t_address_bck = Table( - "address_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class Author(Base): - __tablename__ = "author" - - author_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - AFFILIATION = Column(String(255)) - DOMESTIC = Column(BIT(1)) - NEW_USER = Column(BIT(1)) - EMAIL = Column(String(255), nullable=False) - ADDRESS = Column(String(255)) - FIRST_NAME = Column(String(255)) - LAST_NAME = Column(String(255)) - PROFESSIONAL_STATUS = Column(String(255)) - THESIS_OBSERVING = Column(BIT(1), nullable=False) - GRADUATION_YEAR = Column(String(255)) - TELEPHONE = Column(String(255)) - OLDAUTHOR_ID = Column(String(255), nullable=False) - DISPLAY_POSITION = Column(Integer, nullable=False) - STORAGE_ORDER = Column(Integer, nullable=False) - OTHER_AWARDS = Column(Text) - SUPPORT_REQUESTER = Column(BIT(1), nullable=False) - SUPPORTED = Column(BIT(1), nullable=False) - BUDGET = Column(Float(asdecimal=True)) - ASSIGNMENT = Column(Text) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - user_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), index=True) - dissertationPlan_id = Column(ForeignKey("dissertationPlan.dissertationPlan_id"), index=True) - person_id = Column(BigInteger, nullable=False) - country_id = Column(ForeignKey("addressCountry.addressCountry_id"), index=True) - state_id = Column(ForeignKey("addressState.addressState_id"), index=True) - organization_id = Column(ForeignKey("organization.organization_id"), index=True) - - country = relationship("AddressCountry") - dissertationPlan = relationship("DissertationPlan") - organization = relationship("Organization") - proposal = relationship("Proposal", primaryjoin="Author.proposal_id == Proposal.proposal_id", lazy="subquery") - state = relationship("AddressState") - user = relationship("UserAuthentication", lazy="subquery") - - -t_author_bck = Table( - "author_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class Bug(Base): - __tablename__ = "bug" - - bug_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - id = Column(Integer, nullable=False) - status = Column(String(255), nullable=False) - statusNumber = Column(Integer, nullable=False, index=True) - type = Column(String(255), nullable=False) - typeNumber = Column(Integer, nullable=False, index=True) - issueDate = Column(Date, index=True) - completeDate = Column(Date, index=True) - author = Column(String(255)) - location = Column(String(255)) - description = Column(Text) - resolution = Column(Text) - versionNumber = Column(String(255)) - osName = Column(String(255)) - email = Column(String(255)) - - -class CasaRegionSetup(Base): - __tablename__ = "casaRegionSetup" - - regionSetup_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - region = Column(String(128), nullable=False, index=True) - userName = Column(String(128), nullable=False, index=True) - firstName = Column(String(128), nullable=False) - lastName = Column(String(128), nullable=False) - email = Column(Text, nullable=False) - user_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), index=True) - - user = relationship("UserAuthentication") - - -class CasaUserSetup(Base): - __tablename__ = "casaUserSetup" - - userSetup_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - role_id = Column(ForeignKey("role.role_id"), nullable=False, index=True) - user_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), nullable=False, index=True) - region_id = Column(ForeignKey("casaRegionSetup.regionSetup_id"), nullable=False, index=True) - region = Column(String(128), nullable=False, index=True) - userName = Column(String(128), nullable=False, index=True) - firstName = Column(String(128), nullable=False) - lastName = Column(String(128), nullable=False) - email = Column(Text, nullable=False) - - region1 = relationship("CasaRegionSetup") - role = relationship("Role") - user = relationship("UserAuthentication") - - -class CasaBug(Base): - __tablename__ = "casa_bug" - - bug_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - id = Column(Integer, nullable=False) - status = Column(String(255), nullable=False) - statusNumber = Column(Integer, nullable=False, index=True) - type = Column(String(255), nullable=False) - typeNumber = Column(Integer, nullable=False, index=True) - issueDate = Column(Date, index=True) - completeDate = Column(Date, index=True) - author = Column(String(255)) - location = Column(String(255)) - description = Column(Text) - resolution = Column(Text) - versionNumber = Column(String(255)) - osName = Column(String(255)) - email = Column(String(255)) - region_id = Column(ForeignKey("casaRegionSetup.regionSetup_id"), index=True) - regionName = Column(String(255)) - uss_id = Column(ForeignKey("casaUserSetup.userSetup_id"), index=True) - username = Column(String(255)) - - region = relationship("CasaRegionSetup") - uss = relationship("CasaUserSetup") - - -class Casalog(Base): - __tablename__ = "casalog" - - casalog_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - date = Column(DateTime, nullable=False, index=True) - pagename = Column(String(50), nullable=False) - module = Column(String(20), nullable=False) - action = Column(String(24)) - ipaddress = Column(String(128)) - username = Column(String(255), nullable=False, index=True) - - -class DissertationPlan(Base): - __tablename__ = "dissertationPlan" - - dissertationPlan_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - FILE_NAME = Column(String(255), nullable=False) - FILE_ID = Column(String(255), nullable=False) - BYTE_SIZE = Column(Integer) - PAGE_COUNT = Column(Integer) - LAST_DATE = Column(DateTime) - CONTENT_TYPE = Column(String(255), nullable=False) - FILE_TYPE = Column(String(255)) - FILE_CONTENTS = Column(MEDIUMBLOB) - PERSON_ID = Column(ForeignKey("person.person_id"), unique=True) - USER_ID = Column(ForeignKey("userAuthentication.userAuthentication_id"), unique=True) - - person = relationship("Person") - userAuthentication = relationship("UserAuthentication") - - -class Email(Base): - __tablename__ = "email" - - email_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - emailType = Column(String(255)) - email = Column(String(255), nullable=False) - defaultEmail = Column(BIT(1), nullable=False) - person_id = Column(ForeignKey("person.person_id"), index=True) - organization_id = Column(ForeignKey("organization.organization_id"), index=True) - - organization = relationship("Organization") - person = relationship("Person") - - -t_email_bck = Table( - "email_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class EntryStatu(Base): - __tablename__ = "entryStatus" - - entryStatus_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - entryStatus = Column(String(255), nullable=False) - - -t_entryStatus_bck = Table( - "entryStatus_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_fix_15A_codes = Table( - "fix_15A_codes", - metadata, - Column("proposal_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("prop_id", String(255), nullable=False), - Column("new_id", String(320), nullable=False, server_default=text("''")), - Column("pi_name", String(511)), - Column("email", String(255), nullable=False), - Column("deadline_date", DateTime), -) - - -class JustificationFile(Base): - __tablename__ = "justificationFile" - - justificationFile_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - JUSTIFICATION_FILE_NAME = Column(String(255), nullable=False) - JUSTIFICATION_FILE_ID = Column(String(255), nullable=False) - JUSTIFICATION_BYTE_SIZE = Column(Integer) - JUSTIFICATION_PAGE_COUNT = Column(Integer) - JUST_STORAGE_DATE = Column(DateTime) - CONTENT_TYPE = Column(String(255), nullable=False) - JUSTIFICATION_FILE_TYPE = Column(String(255)) - FILE_CONTENTS = Column(MEDIUMBLOB) - - -t_justification_bck = Table( - "justification_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class ObservingType(Base): - __tablename__ = "observingType" - - observingType_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - proposal_id = Column(ForeignKey("proposal.proposal_id"), index=True) - display_position = Column(Integer) - observingType = Column(String(255), nullable=False) - - proposal = relationship("Proposal") - - -t_observingType_bck = Table( - "observingType_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class Organization(Base): - __tablename__ = "organization" - - organization_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - formalName = Column(String(255), nullable=False) - shortName = Column(String(255)) - mailingName = Column(String(255)) - departmentName = Column(String(255)) - url = Column(String(255)) - contactPerson1 = Column(String(255)) - contactPerson2 = Column(String(255)) - parentId = Column(Integer) - updatedOn = Column(DateTime) - updatedBy = Column(Integer) - entryStatus = Column(ForeignKey("entryStatus.entryStatus_id"), index=True) - - entryStatu = relationship("EntryStatu") - persons = relationship("Person", secondary="person_organization") - - -class OrganizationType(Base): - __tablename__ = "organizationType" - - organizationType_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - organizationType = Column(String(255), nullable=False) - - organizations = relationship("Organization", secondary="organization_organizationType") - - -t_organizationType_bck = Table( - "organizationType_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_organization_bck = Table( - "organization_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_organization_organizationType = Table( - "organization_organizationType", - metadata, - Column("organization_id", ForeignKey("organization.organization_id"), primary_key=True, nullable=False, index=True), - Column( - "organizationType_id", - ForeignKey("organizationType.organizationType_id"), - primary_key=True, - nullable=False, - index=True, - ), -) - - -class Pagelog(Base): - __tablename__ = "pagelog" - - pagelog_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - date = Column(DateTime, nullable=False, index=True) - pagename = Column(String(50), nullable=False) - module = Column(String(20), nullable=False) - action = Column(String(255)) - recordable = Column(BIT(1)) - username = Column(String(255), nullable=False, index=True) - sessionid = Column(Text) - proposalid = Column(String(128)) - ipAddress = Column(String(255)) - - -class Permissionset(Base): - __tablename__ = "permissionset" - - permissionset_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - home_view = Column(BIT(1), nullable=False) - home_full = Column(BIT(1), nullable=False) - proposalModule_view = Column(BIT(1), nullable=False) - proposalModule_full = Column(BIT(1), nullable=False) - myproposals_view = Column(BIT(1), nullable=False) - myproposals_full = Column(BIT(1), nullable=False) - proposalList_view = Column(BIT(1), nullable=False) - proposalList_full = Column(BIT(1), nullable=False) - settingsModule_view = Column(BIT(1), nullable=False) - settingsModule_full = Column(BIT(1), nullable=False) - myprofile_view = Column(BIT(1), nullable=False) - myprofile_full = Column(BIT(1), nullable=False) - roleList_view = Column(BIT(1), nullable=False) - roleList_full = Column(BIT(1), nullable=False) - profileList_view = Column(BIT(1), nullable=False) - profileList_full = Column(BIT(1), nullable=False) - organizationList_view = Column(BIT(1), nullable=False) - organizationList_full = Column(BIT(1), nullable=False) - bug_view = Column(BIT(1), nullable=False) - bug_full = Column(BIT(1), nullable=False) - analyticsModule_view = Column(BIT(1), nullable=False) - analyticsModule_full = Column(BIT(1), nullable=False) - a_proposal_view = Column(BIT(1), nullable=False) - a_proposal_full = Column(BIT(1), nullable=False) - a_casa_view = Column(BIT(1), nullable=False) - a_casa_full = Column(BIT(1), nullable=False) - casaModule_view = Column(BIT(1), nullable=False) - casaModule_full = Column(BIT(1), nullable=False) - casaHome_view = Column(BIT(1), nullable=False) - casaHome_full = Column(BIT(1), nullable=False) - casa_bugs_view = Column(BIT(1), nullable=False) - casa_bugs_full = Column(BIT(1), nullable=False) - casa_setup_view = Column(BIT(1), nullable=False) - casa_setup_full = Column(BIT(1), nullable=False) - pscAccess = Column(BIT(1), nullable=False) - reviewCategory_view = Column(BIT(1), nullable=False) - reviewCategory_full = Column(BIT(1), nullable=False) - available_authors_view = Column(BIT(1), nullable=False) - available_authors_full = Column(BIT(1), nullable=False) - available_organizations_view = Column(BIT(1), nullable=False) - available_organizations_full = Column(BIT(1), nullable=False) - profilesModule_view = Column(BIT(1), nullable=False) - profilesModule_full = Column(BIT(1), nullable=False) - adminModule_view = Column(BIT(1), nullable=False) - adminModule_full = Column(BIT(1), nullable=False) - groupList_view = Column(BIT(1), nullable=False) - groupList_full = Column(BIT(1), nullable=False) - reviewsModule_view = Column(BIT(1), nullable=False) - reviewsModule_full = Column(BIT(1), nullable=False) - myreviews_view = Column(BIT(1), nullable=False) - myreviews_full = Column(BIT(1), nullable=False) - refereeSetup_view = Column(BIT(1), nullable=False) - refereeSetup_full = Column(BIT(1), nullable=False) - mergeAccounts = Column(BIT(1), nullable=False) - editRefereeComments = Column(BIT(1), nullable=False) - observationsModule_view = Column(BIT(1), nullable=False) - observationsModule_full = Column(BIT(1), nullable=False) - helpdeskModule_view = Column(BIT(1), nullable=False) - helpdeskModule_full = Column(BIT(1), nullable=False) - reviewCycles_view = Column(BIT(1), nullable=False) - reviewCycles_full = Column(BIT(1), nullable=False) - tech_review_panel_view = Column(BIT(1), nullable=False) - tech_review_panel_full = Column(BIT(1), nullable=False) - scientific_review_panel_view = Column(BIT(1), nullable=False) - scientific_review_panel_full = Column(BIT(1), nullable=False) - reviewsSetup_view = Column(BIT(1), nullable=False) - reviewsSetup_full = Column(BIT(1), nullable=False) - technical_review_categorySetup_view = Column(BIT(1), nullable=False) - technical_review_categorySetup_full = Column(BIT(1), nullable=False) - scientific_review_categorySetup_view = Column(BIT(1), nullable=False) - scientific_review_categorySetup_full = Column(BIT(1), nullable=False) - technical_refereeSetup_view = Column(BIT(1), nullable=False) - technical_refereeSetup_full = Column(BIT(1), nullable=False) - scientific_refereeSetup_view = Column(BIT(1), nullable=False) - scientific_refereeSetup_full = Column(BIT(1), nullable=False) - reviews_summary_view = Column(BIT(1), nullable=False) - reviews_summary_full = Column(BIT(1), nullable=False) - panel_reviews_view = Column(BIT(1), nullable=False) - panel_reviews_full = Column(BIT(1), nullable=False) - tac_reviews_view = Column(BIT(1), nullable=False) - tac_reviews_full = Column(BIT(1), nullable=False) - tac_members_view = Column(BIT(1), nullable=False) - tac_members_full = Column(BIT(1), nullable=False) - tac_panel_view = Column(BIT(1), nullable=False) - tac_panel_full = Column(BIT(1), nullable=False) - dataProcessingModule_view = Column(BIT(1), nullable=False) - dataProcessingModule_full = Column(BIT(1), nullable=False) - - -t_permissionset_bck = Table( - "permissionset_bck", - metadata, - Column("permissionset_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("objectversion", Integer, nullable=False, server_default=text("'0'")), - Column("home_view", BIT(1), nullable=False), - Column("home_full", BIT(1), nullable=False), - Column("proposalModule_view", BIT(1), nullable=False), - Column("proposalModule_full", BIT(1), nullable=False), - Column("myproposals_view", BIT(1), nullable=False), - Column("myproposals_full", BIT(1), nullable=False), - Column("proposalList_view", BIT(1), nullable=False), - Column("proposalList_full", BIT(1), nullable=False), - Column("settingsModule_view", BIT(1), nullable=False), - Column("settingsModule_full", BIT(1), nullable=False), - Column("myprofile_view", BIT(1), nullable=False), - Column("myprofile_full", BIT(1), nullable=False), - Column("roleList_view", BIT(1), nullable=False), - Column("roleList_full", BIT(1), nullable=False), - Column("profileList_view", BIT(1), nullable=False), - Column("profileList_full", BIT(1), nullable=False), - Column("organizationList_view", BIT(1), nullable=False), - Column("organizationList_full", BIT(1), nullable=False), - Column("bug_view", BIT(1), nullable=False), - Column("bug_full", BIT(1), nullable=False), - Column("analyticsModule_view", BIT(1), nullable=False), - Column("analyticsModule_full", BIT(1), nullable=False), - Column("a_summary_view", BIT(1), nullable=False), - Column("a_summary_full", BIT(1), nullable=False), -) - - -class Person(Base): - __tablename__ = "person" - __table_args__ = (Index("person_i2", "firstName", "lastName"),) - - person_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - prefix = Column(ForeignKey("personPrefix.personPrefix_id"), index=True) - firstName = Column(String(255)) - middleName = Column(String(255)) - lastName = Column(String(255)) - preferredName = Column(String(255)) - suffix = Column(ForeignKey("personSuffix.personSuffix_id"), index=True) - aipsNumber = Column(SmallInteger) - gender = Column(String(255)) - url = Column(String(255)) - unknownAffiliationName = Column(String(255)) - unknownAffiliationCountry = Column(ForeignKey("addressCountry.addressCountry_id"), index=True) - personContactLevel_id = Column(ForeignKey("personContactLevel.personContactLevel_id"), index=True) - entryStatus = Column(ForeignKey("entryStatus.entryStatus_id"), index=True) - defaultOrganization_id = Column(ForeignKey("organization.organization_id"), index=True) - personAuthentication_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), index=True) - personSpouse_id = Column(ForeignKey("personSpouse.personSpouse_id"), index=True) - outOfDateReporterId = Column(Integer) - updatedOn = Column(DateTime) - updatedBy = Column(Integer) - graduationYear = Column(SmallInteger) - timezone = Column(String(255)) - lastLogin = Column(DateTime) - lastObservation = Column(DateTime) - incomplete = Column(BIT(1)) - affiliation = Column(Text) - enabled = Column(BIT(1), nullable=False, index=True) - gender_for_metrics = Column(String(255)) - - defaultOrganization = relationship("Organization") - entryStatu = relationship("EntryStatu") - personAuthentication = relationship("UserAuthentication") - personContactLevel = relationship("PersonContactLevel") - personSpouse = relationship("PersonSpouse") - personPrefix = relationship("PersonPrefix") - personSuffix = relationship("PersonSuffix") - addressCountry = relationship("AddressCountry") - reviewCategorys = relationship("ReviewCategory", secondary="person_reviewCategory") - - -class PersonContactLevel(Base): - __tablename__ = "personContactLevel" - - personContactLevel_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personContactLevel = Column(String(255), nullable=False) - - -t_personContactLevel_bck = Table( - "personContactLevel_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class PersonGroup(Base): - __tablename__ = "personGroup" - - personGroup_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personGroupType = Column(SmallInteger, nullable=False) - personGroupName = Column(String(255), nullable=False) - personGroupDescription = Column(String(255), nullable=False) - - persons = relationship("Person", secondary="person_personGroup") - - -t_personGroup_bck = Table( - "personGroup_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class PersonNote(Base): - __tablename__ = "personNote" - - userNote_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personNoteText = Column(String(255), nullable=False) - updatedOn = Column(DateTime) - updatedBy = Column(Integer) - person_id = Column(ForeignKey("person.person_id"), index=True) - - person = relationship("Person") - - -t_personNote_bck = Table( - "personNote_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class PersonPrefix(Base): - __tablename__ = "personPrefix" - - personPrefix_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personPrefix = Column(String(255), nullable=False, unique=True) - - -t_personPrefix_bck = Table( - "personPrefix_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class PersonSpouse(Base): - __tablename__ = "personSpouse" - - personSpouse_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - prefix = Column(ForeignKey("personPrefix.personPrefix_id"), index=True) - firstName = Column(String(255)) - middleName = Column(String(255)) - lastName = Column(String(255)) - preferredName = Column(String(255)) - suffix = Column(ForeignKey("personSuffix.personSuffix_id"), index=True) - gender = Column(String(1)) - - personPrefix = relationship("PersonPrefix") - personSuffix = relationship("PersonSuffix") - - -class PersonSuffix(Base): - __tablename__ = "personSuffix" - - personSuffix_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personSuffix = Column(String(255), nullable=False, unique=True) - - -t_personSuffix_bck = Table( - "personSuffix_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class PersonType(Base): - __tablename__ = "personType" - - personType_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personType = Column(String(255), nullable=False) - educationType = Column(BIT(1), nullable=False) - - persons = relationship("Person", secondary="person_personType") - - -t_personType_bck = Table( - "personType_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -t_person_bck = Table( - "person_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -t_person_organization = Table( - "person_organization", - metadata, - Column("organization_id", ForeignKey("organization.organization_id"), primary_key=True, nullable=False, index=True), - Column("person_id", ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True), -) - - -t_person_personGroup = Table( - "person_personGroup", - metadata, - Column("person_id", ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True), - Column( - "personGroup_id", - ForeignKey("personGroup.personGroup_id", ondelete="CASCADE"), - primary_key=True, - nullable=False, - index=True, - ), -) - - -t_person_personType = Table( - "person_personType", - metadata, - Column("person_id", ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True), - Column("personType_id", ForeignKey("personType.personType_id"), primary_key=True, nullable=False, index=True), -) - - -t_person_reviewCategory = Table( - "person_reviewCategory", - metadata, - Column("person_id", ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True), - Column( - "reviewCategory_id", - ForeignKey("reviewCategory.reviewCategory_id"), - primary_key=True, - nullable=False, - index=True, - ), -) - - -class Phone(Base): - __tablename__ = "phone" - - phone_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - phoneType = Column(String(255)) - phone = Column(String(255), nullable=False) - defaultPhone = Column(BIT(1), nullable=False) - fax = Column(BIT(1), nullable=False) - person_id = Column(ForeignKey("person.person_id"), index=True) - organization_id = Column(ForeignKey("organization.organization_id"), index=True) - - organization = relationship("Organization") - person = relationship("Person") - - -t_phone_bck = Table( - "phone_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class Proposal(Base): - __tablename__ = "proposal" - - proposal_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - ABSTRACT = Column(Text) - CREATED_DATE = Column(DateTime, nullable=False) - PROP_ID = Column(String(255), nullable=False, unique=True) - LEGACY_ID = Column(String(255, "latin1_general_cs")) - PRESENT = Column(String(255)) - PROPOSAL_TYPE = Column(String(255)) - JOINT_PROPOSAL_TYPE = Column(String(255)) - RAPID_RESPONSE_TYPE = Column(String(255)) - STAFF_SUPPORT = Column(String(255)) - STATUS = Column(String(255)) - PLAN_SUBMITTED = Column(String(255)) - MODIFIED_DATE = Column(DateTime, nullable=False) - SUBMITTED_DATE = Column(DateTime) - DEADLINE_DATE = Column(DateTime) - TITLE = Column(Text) - PROCESSED = Column(BIT(1), nullable=False) - RELATED_PROPOSALS = Column(Text) - PREV_PROP_IDS = Column(Text) - LOCK_USER_ID = Column(String(255)) - LOCK_MILLIS = Column(BigInteger) - LOCK_USER_INFO = Column(String(255)) - OBSERVING_TYPE_OTHER = Column(String(255)) - OLD_CONTACT = Column(String(255)) - OLD_PI = Column(String(255)) - OLD_EDITOR = Column(String(255)) - justificationFile_id = Column(ForeignKey("justificationFile.justificationFile_id"), index=True) - editor_id = Column(ForeignKey("author.author_id"), index=True) - contact_id = Column(ForeignKey("author.author_id"), index=True) - principal_investigator_id = Column(ForeignKey("author.author_id"), index=True) - comments = Column(Text) - category1_id = Column(ForeignKey("reviewCategory.reviewCategory_id"), index=True) - category2_id = Column(ForeignKey("reviewCategory.reviewCategory_id"), index=True) - TELESCOPE = Column(String(255), nullable=False) - category3_id = Column(ForeignKey("reviewCategory.reviewCategory_id"), index=True) - displayTechnicalReviews = Column(BIT(1)) - reviewersConflict = Column(BIT(1)) - technicalCategory_id = Column(ForeignKey("technical_review_category.tech_reviewCategory_id"), index=True) - scienceCategory = Column(String(255)) - public = Column(BIT(1), nullable=False) - allocated_hours = Column(Float(asdecimal=True), server_default=text("'0'")) - disposition_letter = Column(MEDIUMBLOB) - trigger_criteria = Column(String) - techJustification_id = Column(Integer) - uses_GBT = Column(BIT(1), nullable=False) - uses_VLA = Column(BIT(1), nullable=False) - allocated_hours_a = Column(Float(asdecimal=True), server_default=text("'0'")) - allocated_hours_b = Column(Float(asdecimal=True), server_default=text("'0'")) - allocated_hours_c = Column(Float(asdecimal=True), server_default=text("'0'")) - sponsor = Column(String(255)) - hst_orbits_requested = Column(String(255)) - external = Column(BIT(1), nullable=False) - total_time = Column(Float(asdecimal=True), server_default=text("'0'")) - external_proposal_id = Column(String(255)) - swift_ksecs = Column(String(255)) - chandra_ksecs = Column(String(255)) - - category1 = relationship("ReviewCategory", primaryjoin="Proposal.category1_id == ReviewCategory.reviewCategory_id") - category2 = relationship("ReviewCategory", primaryjoin="Proposal.category2_id == ReviewCategory.reviewCategory_id") - category3 = relationship("ReviewCategory", primaryjoin="Proposal.category3_id == ReviewCategory.reviewCategory_id") - contact = relationship("Author", primaryjoin="Proposal.contact_id == Author.author_id") - editor = relationship("Author", primaryjoin="Proposal.editor_id == Author.author_id") - justificationFile = relationship("JustificationFile") - principal_investigator = relationship( - "Author", primaryjoin="Proposal.principal_investigator_id == Author.author_id" - ) - technicalCategory = relationship("TechnicalReviewCategory") - - -t_proposal_15A_bck = Table( - "proposal_15A_bck", - metadata, - Column("proposal_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("objectversion", Integer, nullable=False), - Column("ABSTRACT", Text), - Column("CREATED_DATE", DateTime, nullable=False), - Column("PROP_ID", String(255), nullable=False), - Column("LEGACY_ID", String(255, "latin1_general_cs")), - Column("PRESENT", String(255)), - Column("PROPOSAL_TYPE", String(255)), - Column("JOINT_PROPOSAL_TYPE", String(255)), - Column("RAPID_RESPONSE_TYPE", String(255)), - Column("STAFF_SUPPORT", String(255)), - Column("STATUS", String(255)), - Column("PLAN_SUBMITTED", String(255)), - Column("MODIFIED_DATE", DateTime, nullable=False), - Column("SUBMITTED_DATE", DateTime), - Column("DEADLINE_DATE", DateTime), - Column("TITLE", Text), - Column("PROCESSED", BIT(1), nullable=False), - Column("RELATED_PROPOSALS", Text), - Column("PREV_PROP_IDS", Text), - Column("LOCK_USER_ID", String(255)), - Column("LOCK_MILLIS", BigInteger), - Column("LOCK_USER_INFO", String(255)), - Column("OBSERVING_TYPE_OTHER", String(255)), - Column("OLD_CONTACT", String(255)), - Column("OLD_PI", String(255)), - Column("OLD_EDITOR", String(255)), - Column("justificationFile_id", BigInteger), - Column("editor_id", BigInteger), - Column("contact_id", BigInteger), - Column("principal_investigator_id", BigInteger), - Column("comments", Text), - Column("category1_id", BigInteger), - Column("category2_id", BigInteger), - Column("TELESCOPE", String(255), nullable=False), - Column("category3_id", BigInteger), - Column("displayTechnicalReviews", BIT(1)), - Column("reviewersConflict", BIT(1)), - Column("technicalCategory_id", BigInteger), - Column("scienceCategory", String(255)), - Column("public", BIT(1), nullable=False), - Column("allocated_hours", Float(asdecimal=True), server_default=text("'0'")), - Column("disposition_letter", MEDIUMBLOB), - Column("trigger_criteria", String), - Column("techJustification_id", Integer), - Column("uses_GBT", BIT(1), nullable=False), - Column("uses_VLA", BIT(1), nullable=False), - Column("allocated_hours_a", Float(asdecimal=True), server_default=text("'0'")), - Column("allocated_hours_b", Float(asdecimal=True), server_default=text("'0'")), - Column("allocated_hours_c", Float(asdecimal=True), server_default=text("'0'")), - Column("sponsor", String(255)), - Column("hst_orbits_requested", String(255)), -) - - -t_proposal_bck = Table( - "proposal_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class ProposalNormalizedScore(Base): - __tablename__ = "proposal_normalized_scores" - - normalized_scores_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - scientificCategory = Column(String(255), nullable=False) - avgNormalizedScore = Column(Float(asdecimal=True), nullable=False) - normalizedScoreStdev = Column(Float(asdecimal=True), nullable=False) - srpScores = Column(Float(asdecimal=True), nullable=False) - complete = Column(BIT(1), nullable=False) - finalized = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - review_cycle = relationship("ReviewCycle") - - -t_proposal_normalized_scores_backup = Table( - "proposal_normalized_scores_backup", - metadata, - Column("normalized_scores_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("objectversion", Integer, nullable=False), - Column("review_cycle_id", BigInteger, nullable=False), - Column("proposal_id", BigInteger, nullable=False), - Column("scientificCategory", String(255), nullable=False), - Column("avgNormalizedScore", Float(asdecimal=True), nullable=False), - Column("normalizedScoreStdev", Float(asdecimal=True), nullable=False), - Column("srpScores", Float(asdecimal=True), nullable=False), - Column("complete", BIT(1), nullable=False), - Column("finalized", BIT(1), nullable=False), -) - - -t_proposal_public_bit_allocated_hours_backup = Table( - "proposal_public_bit_allocated_hours_backup", - metadata, - Column("proposal_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("public", BIT(1), nullable=False), - Column("allocated_hours", Float(asdecimal=True), server_default=text("'0'")), -) - - -class ProposalReview(Base): - __tablename__ = "proposal_reviews" - - review_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - complete = Column(BIT(1), nullable=False) - chair = Column(BIT(1), nullable=False) - conflict = Column(BIT(1), nullable=False) - reasons = Column(String) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), nullable=False, index=True) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - saved = Column(BIT(1), nullable=False) - close = Column(BIT(1), nullable=False) - reviewsComplete = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - referee = relationship("Referee") - review_cycle = relationship("ReviewCycle") - - -class ScientificReview(ProposalReview): - __tablename__ = "scientific_reviews" - - review_id = Column(ForeignKey("proposal_reviews.review_id", ondelete="CASCADE"), primary_key=True, index=True) - scientificCategory = Column(String(255), nullable=False) - pctRecommendTime = Column(Float(asdecimal=True)) - score = Column(Float(asdecimal=True), server_default=text("'0'")) - comments = Column(String) - normalizedScore = Column(Float(asdecimal=True), nullable=False, server_default=text("'0'")) - - -class TechnicalReview(ProposalReview): - __tablename__ = "technical_reviews" - - review_id = Column(ForeignKey("proposal_reviews.review_id", ondelete="CASCADE"), primary_key=True, index=True) - commentsForAuthors = Column(String) - commentsForTAC = Column(String) - - -class ProposalTacReview(Base): - __tablename__ = "proposal_tac_reviews" - - tac_review_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - totalTimeRequested = Column(Float(asdecimal=True), nullable=False) - totalTimeAllocated = Column(Float(asdecimal=True), nullable=False) - schedulingPriority = Column(String(255), nullable=False) - complete = Column(BIT(1), nullable=False) - finalized = Column(BIT(1), nullable=False) - normalizedSRPScore = Column(Float(asdecimal=True), nullable=False, server_default=text("'0'")) - reviewPostponed = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - review_cycle = relationship("ReviewCycle") - - -# class RefereeComment(Base): -# __tablename__ = 'refereeComments' -# -# refereeComments_id = Column(BigInteger, primary_key=True) -# objectversion = Column(Integer, nullable=False) -# person_id = Column(ForeignKey('person.person_id'), index=True) -# comments = Column(Text) -# pctRecommendTime = Column(String(255)) -# rating = Column(String(255)) -# commentsToPSC = Column(Text) -# complete = Column(BIT(1), nullable=False) -# -# person = relationship('Person') -# -# -# class RefereeComment(Base): -# __tablename__ = 'referee_comment' -# -# proposal_id = Column(ForeignKey('proposal.proposal_id'), primary_key=True, nullable=False, index=True) -# commentid = Column(ForeignKey('refereeComments.refereeComments_id'), nullable=False, index=True) -# userid = Column(ForeignKey('userAuthentication.userAuthentication_id'), primary_key=True, nullable=False, index=True) -# -# parent = relationship('RefereeComment', remote_side=[proposal_id, userid]) -# proposal = relationship('Proposal') -# userAuthentication = relationship('UserAuthentication') - - -class Referee(Base): - __tablename__ = "referees" - - referee_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - person_id = Column(ForeignKey("person.person_id"), nullable=False, index=True) - user_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), nullable=False, index=True) - active = Column(BIT(1), nullable=False) - acceptReviews = Column(BIT(1), nullable=False) - type = Column(Integer, nullable=False) - - person = relationship("Person") - user = relationship("UserAuthentication") - - -t_resource_bck = Table( - "resource_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), - Column("class", String(255), nullable=False), -) - - -class ReviewCategory(Base): - __tablename__ = "reviewCategory" - - reviewCategory_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - telescope = Column(String(255), nullable=False) - code = Column(String(128), nullable=False, index=True) - description = Column(Text) - - -class ReviewCycle(Base): - __tablename__ = "review_cycles" - - review_cycle_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - title = Column(String(255), nullable=False) - proposal_deadline = Column(Date, nullable=False) - review_deadline = Column(Date, nullable=False) - status = Column(String(255), nullable=False) - code = Column(String(3), nullable=False, server_default=text("'xxx'")) - - -class Role(Base): - __tablename__ = "role" - - role_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - name = Column(String(128), nullable=False, index=True) - description = Column(Text) - permissionset_id = Column(ForeignKey("permissionset.permissionset_id"), nullable=False, index=True) - - permissionset = relationship("Permissionset") - - -class ScientificCategory(Base): - __tablename__ = "scientificCategory" - - scientificCategory_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - proposal_id = Column(ForeignKey("proposal.proposal_id"), index=True) - display_position = Column(Integer) - scientificCategory = Column(String(255), nullable=False) - - proposal = relationship("Proposal") - - -class ScientificReviewPanel(Base): - __tablename__ = "scientific_review_panel" - - sr_panel_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), nullable=False, index=True) - chair = Column(BIT(1), nullable=False) - scientificCategory = Column(String(255), nullable=False) - - referee = relationship("Referee") - review_cycle = relationship("ReviewCycle") - - -t_scientific_reviews_backup = Table( - "scientific_reviews_backup", - metadata, - Column("review_id", BigInteger, nullable=False), - Column("scientificCategory", String(255), nullable=False), - Column("pctRecommendTime", Float(asdecimal=True)), - Column("score", Float(asdecimal=True), server_default=text("'0'")), - Column("comments", String), - Column("normalizedScore", Float(asdecimal=True), nullable=False, server_default=text("'0'")), -) - - -t_scientific_type = Table( - "scientific_type", - metadata, - Column("code", String(16), index=True), - Column("name", String(50), index=True), - Column("abbreviation", String(3)), - Column("description", String(255)), - Column("legacy", Integer), -) - - -class SearchPreference(Base): - __tablename__ = "searchPreferences" - - preference_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - username = Column(String(128), nullable=False) - pagename = Column(Text, nullable=False) - listname = Column(String(255)) - value = Column(String(255)) - - -class Session(Base): - __tablename__ = "session" - - session_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - SESSION_NAME = Column(Text) - SESSION_TIME = Column(Float(asdecimal=True)) - REPEATS = Column(Integer) - SEPARATION = Column(String(255)) - INTERVAL_TIME = Column(Integer) - CONSTRAINT_FIELD = Column(Text) - COMMENTS = Column(Text) - MINIMUM_LST = Column(Text) - MAXIMUM_LST = Column(Text) - ELEVATION_MINIMUM = Column(Text) - SESSION_TIME_CALCULATED = Column(BIT(1), nullable=False) - DISPLAY_POSITION = Column(Integer, nullable=False) - PROPOSAL_ID = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - MODIFIED_SESSION = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - - -class ModifiedSession(Session): - __tablename__ = "ModifiedSession" - - session_id = Column(ForeignKey("session.session_id"), primary_key=True, index=True) - CREATED_DATE = Column(DateTime, nullable=False) - REQUESTED_SESSION_TIME = Column(Float(asdecimal=True)) - REQUESTED_REPEATS = Column(Integer) - schedulingPriority = Column(String(255), server_default=text("''")) - ALLOCATED_SESSION_TIME = Column(Float(asdecimal=True), server_default=text("'0'")) - ALLOCATED_REPEATS = Column(Integer, server_default=text("'0'")) - START_LST = Column(String) - STOP_LST = Column(String) - - -class SessionPair(Base): - __tablename__ = "sessionPair" - - sessionPair_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - PAIR_IDENTIFIER = Column(String(255)) - FIGURE_OF_MERIT = Column(Text) - FIGURE_UNITS = Column(String(255)) - PAIR_TIME = Column(Float(asdecimal=True)) - PAIR_TIME_UNIT = Column(String(255)) - CONSTRAINT_FIELD = Column(Text) - DISPLAY_POSITION = Column(Integer, nullable=False) - RESOURCE_GROUP = Column(String(255)) - SOURCE_GROUP = Column(String(255)) - SESSION_ID = Column(ForeignKey("session.session_id", ondelete="CASCADE"), nullable=False, index=True) - SUB_ARRAY = Column(Integer, nullable=False) - SUB_ARRAY_COUNT = Column(Integer, nullable=False) - SUB_ARRAY_GROUP = Column(String(255), nullable=False) - - session = relationship("Session") - - -t_sessionPair_bck = Table( - "sessionPair_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class SessionResource(Base): - __tablename__ = "sessionResource" - - sessionResource_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - sessionPair_id = Column(ForeignKey("sessionPair.sessionPair_id", ondelete="CASCADE"), nullable=False, index=True) - resource_id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), nullable=False, index=True) - display_position = Column(Integer, nullable=False) - SESSION_ID = Column(ForeignKey("session.session_id", ondelete="CASCADE"), nullable=False, index=True) - - session = relationship("Session") - resource = relationship("RESOURCE") - sessionPair = relationship("SessionPair") - - -t_sessionResource_bck = Table( - "sessionResource_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class SessionSource(Base): - __tablename__ = "sessionSource" - - sessionSource_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - sessionPair_id = Column(ForeignKey("sessionPair.sessionPair_id", ondelete="CASCADE"), nullable=False, index=True) - source_id = Column(ForeignKey("source.source_id", ondelete="CASCADE"), nullable=False, index=True) - display_position = Column(Integer, nullable=False) - SESSION_ID = Column(ForeignKey("session.session_id", ondelete="CASCADE"), nullable=False, index=True) - - session = relationship("Session") - sessionPair = relationship("SessionPair") - source = relationship("Source") - - -t_sessionSource_bck = Table( - "sessionSource_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_session_bck = Table( - "session_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class Source(Base): - __tablename__ = "source" - - source_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - display_position = Column(Float(asdecimal=True), nullable=False, index=True) - source_group = Column(Text) - target_name = Column(Text) - coordinate = Column(String(255)) - right_ascension = Column(Text) - declination = Column(Text) - right_ascension_range = Column(Text) - declination_range = Column(Text) - velocity_type = Column(String(255), nullable=False) - velocity_redshift = Column(Text, nullable=False) - convention = Column(String(255), nullable=False, server_default=text("'Radio'")) - coordinate_system = Column(String(255), nullable=False, server_default=text("'Equatorial'")) - referenceFrame = Column(String(255), nullable=False, server_default=text("'LSRK'")) - calibrator = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - - -t_source_bck = Table( - "source_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class SrpComment(Base): - __tablename__ = "srp_comments" - - srp_comments_id = Column(BigInteger, primary_key=True) - person_id = Column(ForeignKey("person.person_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), index=True) - commentsForAuthors = Column(String) - commentsForTAC = Column(String) - byPSTAdmin = Column(BIT(1), nullable=False) - lastUpdated = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP")) - - person = relationship("Person") - referee = relationship("Referee") - - -class SrpCommentsMap(Base): - __tablename__ = "srp_comments_map" - - normalized_scores_id = Column( - ForeignKey("proposal_normalized_scores.normalized_scores_id"), primary_key=True, nullable=False, index=True - ) - srp_comments_id = Column(ForeignKey("srp_comments.srp_comments_id"), nullable=False, index=True) - person_id = Column(ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True) - - normalized_scores = relationship("ProposalNormalizedScore") - person = relationship("Person") - srp_comments = relationship("SrpComment") - - -t_srp_comments_tmp = Table( - "srp_comments_tmp", - metadata, - Column("srp_comments_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("person_id", BigInteger, nullable=False), - Column("referee_id", BigInteger), - Column("commentsForAuthors", String), - Column("commentsForTAC", String), - Column("byPSTAdmin", BIT(1), nullable=False), - Column("lastUpdated", DateTime), -) - - -class StudentSupport(Base): - __tablename__ = "studentSupport" - - studentSupport_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - travel = Column(Text) - hardware = Column(Text) - miscellaneous_budget = Column(Float(asdecimal=True)) - applied = Column(BIT(1), nullable=False) - propId = Column(String(255), nullable=False) - proposal_id = Column(ForeignKey("proposal.proposal_id", ondelete="CASCADE"), unique=True) - sos_pi_id = Column(ForeignKey("author.author_id"), index=True) - - proposal = relationship("Proposal") - sos_pi = relationship("Author") - - -t_studentSupport_bck = Table( - "studentSupport_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class TacComment(Base): - __tablename__ = "tac_comments" - - tac_comments_id = Column(BigInteger, primary_key=True) - person_id = Column(ForeignKey("person.person_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), index=True) - commentsForAuthors = Column(String) - commentsForTAC = Column(String) - byPSTAdmin = Column(BIT(1), nullable=False) - - person = relationship("Person") - referee = relationship("Referee") - - -class TacCommentsMap(Base): - __tablename__ = "tac_comments_map" - - tac_review_id = Column( - ForeignKey("proposal_tac_reviews.tac_review_id"), primary_key=True, nullable=False, index=True - ) - tac_comments_id = Column(ForeignKey("tac_comments.tac_comments_id"), nullable=False, index=True) - person_id = Column(ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True) - - person = relationship("Person") - tac_comments = relationship("TacComment") - tac_review = relationship("ProposalTacReview") - - -class TacPanel(Base): - __tablename__ = "tac_panel" - - tac_panel_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), nullable=False, index=True) - chair = Column(BIT(1), nullable=False) - - referee = relationship("Referee") - review_cycle = relationship("ReviewCycle") - - -class TechnicalReviewCategory(Base): - __tablename__ = "technical_review_category" - - tech_reviewCategory_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - name = Column(String, nullable=False) - code = Column(String(128), nullable=False, index=True) - description = Column(String) - telescope = Column(String(255), nullable=False) - - -class TechnicalReviewPanel(Base): - __tablename__ = "technical_review_panel" - - tr_panel_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), nullable=False, index=True) - technical_category_id = Column( - ForeignKey("technical_review_category.tech_reviewCategory_id"), nullable=False, index=True - ) - telescope = Column(String(255), nullable=False) - - referee = relationship("Referee") - review_cycle = relationship("ReviewCycle") - technical_category = relationship("TechnicalReviewCategory") - - -class Uisetting(Base): - __tablename__ = "uisetting" - - uisetting_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - FLYOVER_HELP = Column(BIT(1), nullable=False) - TELESCOPE = Column(String(255)) - EXPIRATION_RECOVERY = Column(String(255)) - EDITOR_ROLE = Column(String(255)) - PROPOSALS_PER_PAGE = Column(Integer) - CLIENT_SIDE_CHANGE_INDICATOR = Column(String(255)) - - -t_uisettings_bck = Table( - "uisettings_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -t_url_bck = Table( - "url_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class UserAuthentication(Base): - __tablename__ = "userAuthentication" - - userAuthentication_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - role_id = Column(ForeignKey("role.role_id"), nullable=False, index=True) - permissionset_id = Column(ForeignKey("permissionset.permissionset_id"), nullable=False, index=True) - uisetting_id = Column(ForeignKey("uisetting.uisetting_id"), index=True) - personName = Column(String(128), nullable=False, unique=True) - password = Column(String(255), nullable=False) - displayName = Column(String(255), nullable=False) - authenticationToken = Column(String(255)) - changePassword = Column(BIT(1), nullable=False) - rememberLogin = Column(BIT(1)) - defaultAccount_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), index=True) - - defaultAccount = relationship("UserAuthentication", remote_side=[userAuthentication_id]) - permissionset = relationship("Permissionset") - role = relationship("Role") - uisetting = relationship("Uisetting") - - -t_userAuthentication_bck = Table( - "userAuthentication_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) diff --git a/apps/cli/executables/pexable/ingest/ingest/schema/vlassmodel.py b/apps/cli/executables/pexable/ingest/ingest/schema/vlassmodel.py deleted file mode 100644 index 48233b84fc21e2a79f8ff0b04ec6121a68ba1717..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/schema/vlassmodel.py +++ /dev/null @@ -1,525 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - BigInteger, - Boolean, - Column, - DateTime, - Float, - ForeignKey, - Integer, - SmallInteger, - String, - Table, - Text, - text, -) -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship - -Base = declarative_base() -metadata = Base.metadata - - -t_calibration_product_minitile = Table( - "calibration_product_minitile", - metadata, - Column( - "calibration_product_id", - ForeignKey("calibration_product.calibration_product_id"), - primary_key=True, - nullable=False, - ), - Column("minitile_id", ForeignKey("minitile.id"), primary_key=True, nullable=False), -) - - -class Calibrator(Base): - __tablename__ = "calibrator" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - sct_id = Column(BigInteger) - sct_catalog_id = Column(BigInteger) - type = Column(Integer) - - schedblocks = relationship("Schedblock", secondary="fluxcal_schedblock") - minitiles = relationship("Minitile", secondary="minitile_calibrator") - schedblocks1 = relationship("Schedblock", secondary="phasecal_schedblock") - schedblocks2 = relationship("Schedblock", secondary="polcal_schedblock") - - -class CalibratorFlux(Base): - __tablename__ = "calibrator_flux" - - id = Column(Integer, primary_key=True) - frequency = Column(Float(53)) - obs_date = Column(DateTime) - flux = Column(Float(53)) - sp_idx = Column(Float(53)) - calibrator_id = Column(ForeignKey("calibrator.id")) - uv_min = Column(Float(53)) - uv_max = Column(Float(53)) - - calibrator = relationship("Calibrator") - - -class CalibratorPol(Base): - __tablename__ = "calibrator_pol" - - id = Column(Integer, primary_key=True) - fraction = Column(Float(53)) - pos_angle = Column(Float(53)) - rm = Column(Float(53)) - ref_freq = Column(Float(53)) - calibrator_id = Column(ForeignKey("calibrator.id")) - - calibrator = relationship("Calibrator") - - -class ConfigurationFile(Base): - __tablename__ = "configuration_file" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - content_type = Column(String(255)) - contents = Column(Text) - jobspec_id = Column(ForeignKey("jobspec.id"), index=True) - - jobspec = relationship("Jobspec") - - -class ConfigurationFileTemplate(Base): - __tablename__ = "configuration_file_template" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - content_type = Column(String(255)) - contents = Column(Text) - doc = Column(Text) - workflow_id = Column(ForeignKey("workflow.id")) - - workflow = relationship("Workflow") - - -t_databasechangelog = Table( - "databasechangelog", - metadata, - Column("id", String(255), nullable=False), - Column("author", String(255), nullable=False), - Column("filename", String(255), nullable=False), - Column("dateexecuted", DateTime, nullable=False), - Column("orderexecuted", Integer, nullable=False), - Column("exectype", String(10), nullable=False), - Column("md5sum", String(35)), - Column("description", String(255)), - Column("comments", String(255)), - Column("tag", String(255)), - Column("liquibase", String(20)), - Column("contexts", String(255)), - Column("labels", String(255)), - Column("deployment_id", String(10)), -) - - -class Databasechangeloglock(Base): - __tablename__ = "databasechangeloglock" - - id = Column(Integer, primary_key=True) - locked = Column(Boolean, nullable=False) - lockgranted = Column(DateTime) - lockedby = Column(String(255)) - - -t_fluxcal_schedblock = Table( - "fluxcal_schedblock", - metadata, - Column("schedblock_id", ForeignKey("schedblock.schedblock_id"), primary_key=True, nullable=False), - Column("calibrator_id", ForeignKey("calibrator.id"), primary_key=True, nullable=False), -) - - -class InputProductVersion(Base): - __tablename__ = "input_product_versions" - - id = Column(Integer, primary_key=True) - product_version_id = Column(ForeignKey("product_version.id")) - jobspec_id = Column(ForeignKey("jobspec.id")) - - jobspec = relationship("Jobspec") - product_version = relationship("ProductVersion") - product_versions = relationship("ProductVersion", secondary="inputs_to_product_versions") - - -t_inputs_to_product_versions = Table( - "inputs_to_product_versions", - metadata, - Column("intputs_id", ForeignKey("input_product_versions.id"), primary_key=True, nullable=False), - Column("product_version_id", ForeignKey("product_version.id"), primary_key=True, nullable=False, index=True), -) - - -class Job(Base): - __tablename__ = "job" - - id = Column(Integer, primary_key=True) - start_timestamp = Column(DateTime) - end_timestamp = Column(DateTime) - status = Column(Integer) - json_results = Column(Text) - qa_analyst = Column(String(255)) - notes = Column(Text) - jobspec_id = Column(ForeignKey("jobspec.id"), nullable=False, index=True) - name = Column(String(255)) - archival_job_id = Column(ForeignKey("job.id"), index=True) - arch_status = Column(Integer) - - archival_job = relationship("Job", remote_side=[id]) - jobspec = relationship("Jobspec") - - -class JobTaskTemplate(Base): - __tablename__ = "job_task_template" - - id = Column(Integer, primary_key=True) - order_num = Column(SmallInteger) - name = Column(String(255)) - command_template = Column(String(255)) - doc = Column(Text) - workflow_id = Column(ForeignKey("workflow.id")) - - workflow = relationship("Workflow") - - -class Jobspec(Base): - __tablename__ = "jobspec" - - id = Column(Integer, primary_key=True) - json = Column(Text) - creation_date = Column(DateTime) - next_id = Column(ForeignKey("jobspec.id"), index=True) - queue_id = Column(ForeignKey("queue.id"), index=True) - name = Column(String(255)) - enqueued = Column(Boolean) - sdm_id = Column(String(255)) - - next = relationship("Jobspec", remote_side=[id]) - queue = relationship("Queue", primaryjoin="Jobspec.queue_id == Queue.id") - product_versions = relationship("ProductVersion", secondary="jobspec_to_product_version") - - -t_jobspec_to_product_version = Table( - "jobspec_to_product_version", - metadata, - Column("product_version_id", ForeignKey("product_version.id"), primary_key=True, nullable=False, index=True), - Column("jobspec_id", ForeignKey("jobspec.id"), primary_key=True, nullable=False), -) - - -class Jobtask(Base): - __tablename__ = "jobtask" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - start_timestamp = Column(DateTime) - end_timestamp = Column(DateTime) - status = Column(Integer) - json_results = Column(Text) - is_final = Column(Boolean) - job_id = Column(ForeignKey("job.id"), index=True) - pbs_job_id = Column(String(255)) - - job = relationship("Job") - - -class JsonConfiguration(Base): - __tablename__ = "json_configuration" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - json = Column(Text) - product_type_id = Column(ForeignKey("product_type.id")) - product_version_id = Column(ForeignKey("product_version.id")) - product_id = Column(ForeignKey("product.id")) - - product = relationship("Product") - product_type = relationship("ProductType") - product_version = relationship("ProductVersion") - - -class Minitile(Base): - __tablename__ = "minitile" - - id = Column(Integer, primary_key=True, server_default=text("nextval('minitile_id_seq'::regclass)")) - name = Column(String(255)) - epoch = Column(Integer) - tier = Column(Integer) - ra_min = Column(Float(53)) - dec_min = Column(Float(53)) - ra_max = Column(Float(53)) - dec_max = Column(Float(53)) - area = Column(Float(53)) - factor = Column(Float(53)) - first_epoch_half = Column(Boolean) - custom_1 = Column(String(255)) - custom_2 = Column(String(255)) - custom_3 = Column(String(255)) - custom_4 = Column(String(255)) - custom_5 = Column(String(255)) - definitions = Column(Text) - - schedblocks = relationship("Schedblock", secondary="schedblock_minitile") - - -t_minitile_calibrator = Table( - "minitile_calibrator", - metadata, - Column("minitile_id", ForeignKey("minitile.id"), primary_key=True, nullable=False), - Column("calibrator_id", ForeignKey("calibrator.id"), primary_key=True, nullable=False), -) - - -t_phasecal_schedblock = Table( - "phasecal_schedblock", - metadata, - Column("schedblock_id", ForeignKey("schedblock.schedblock_id"), primary_key=True, nullable=False), - Column("calibrator_id", ForeignKey("calibrator.id"), primary_key=True, nullable=False), -) - - -t_polcal_schedblock = Table( - "polcal_schedblock", - metadata, - Column("schedblock_id", ForeignKey("schedblock.schedblock_id"), primary_key=True, nullable=False), - Column("calibrator_id", ForeignKey("calibrator.id"), primary_key=True, nullable=False), -) - - -class Prerequisite(Base): - __tablename__ = "prerequisite" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - ready = Column(Boolean) - product_id = Column(ForeignKey("product.id"), nullable=False, index=True) - req_product_id = Column(ForeignKey("product.id")) - - product = relationship("Product", primaryjoin="Prerequisite.product_id == Product.id") - req_product = relationship("Product", primaryjoin="Prerequisite.req_product_id == Product.id") - - -class PrerequisiteArchiveid(Base): - __tablename__ = "prerequisite_archiveids" - - prerequisite_id = Column(ForeignKey("prerequisite.id"), primary_key=True, nullable=False) - archive_id = Column(String(255), nullable=False) - name = Column(String(255), primary_key=True, nullable=False) - - prerequisite = relationship("Prerequisite") - - -class Product(Base): - __tablename__ = "product" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - category = Column(Integer) - epoch = Column(Integer) - notes = Column(Text) - product_type_id = Column(ForeignKey("product_type.id"), nullable=False) - completed = Column(Boolean) - status = Column(Integer, nullable=False, server_default=text("0")) - - product_type = relationship("ProductType") - tags = relationship("Tag", secondary="product_tag") - - -class CalibrationProduct(Product): - __tablename__ = "calibration_product" - - calibration_product_id = Column(ForeignKey("product.id"), primary_key=True) - - minitiles = relationship("Minitile", secondary="calibration_product_minitile") - - -# -# NOTE: -# slqacodegen created a much more complete model of the database, but that -# model included somewhat-circular references among the foreign keys for -# image_product and it's sub-tables. This configuration was causing -# issues using the model within SqlAlchemy for metadata lookups in the -# service layer (ingestion_metadata.py). -# -# To postpone this particular part of refactoring the VLASS system, I have -# deleted image_product and all associated tables, as they weren't required -# for the current use-case. -# -# - JLS 08/29/2019 -# - - -class Schedblock(Product): - __tablename__ = "schedblock" - - schedblock_id = Column(ForeignKey("product.id"), primary_key=True) - name = Column(String(255)) - opt_id = Column(BigInteger) - flux_position = Column(Integer) - lst_start = Column(Float) - lst_end = Column(Float) - submitted = Column(Boolean) - - -t_product_tag = Table( - "product_tag", - metadata, - Column("product_id", ForeignKey("product.id"), primary_key=True, nullable=False), - Column("tag_id", ForeignKey("tag.id"), primary_key=True, nullable=False), -) - - -class ProductType(Base): - __tablename__ = "product_type" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - event_type = Column(String(255)) - - -class ProductVersion(Base): - __tablename__ = "product_version" - - id = Column(Integer, primary_key=True) - number = Column(Integer) - notes = Column(Text) - product_id = Column(ForeignKey("product.id")) - status = Column(Integer) - - product = relationship("Product") - - -class ProductVersionArchiveid(Base): - __tablename__ = "product_version_archiveids" - - product_version_id = Column(ForeignKey("product_version.id"), primary_key=True, nullable=False) - archive_id = Column(String(255), nullable=False) - name = Column(String(255), primary_key=True, nullable=False) - - product_version = relationship("ProductVersion") - - -class Queue(Base): - __tablename__ = "queue" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - workflow_id = Column(ForeignKey("workflow.id")) - head_jobspec_id = Column(ForeignKey("jobspec.id")) - tail_jobspec_id = Column(ForeignKey("jobspec.id")) - submit = Column(Boolean) - project_code = Column(String(255)) - create_job = Column(Boolean) - auto_qa = Column(Boolean, server_default=text("false")) - - head_jobspec = relationship("Jobspec", primaryjoin="Queue.head_jobspec_id == Jobspec.id") - tail_jobspec = relationship("Jobspec", primaryjoin="Queue.tail_jobspec_id == Jobspec.id") - workflow = relationship("Workflow") - - -t_rawdata = Table( - "rawdata", - metadata, - Column("opt_id", BigInteger), - Column("sdm_id", String(255)), - Column("schedblock_id", ForeignKey("schedblock.schedblock_id")), - Column("rawdata_id", ForeignKey("product.id"), nullable=False), -) - - -class Scan(Base): - __tablename__ = "scan" - - id = Column(Integer, primary_key=True) - start_source_id = Column(ForeignKey("source.id")) - end_source_id = Column(ForeignKey("source.id")) - num_phase_centers = Column(Integer) - minitile_id = Column(ForeignKey("minitile.id")) - - end_source = relationship("Source", primaryjoin="Scan.end_source_id == Source.id") - minitile = relationship("Minitile") - start_source = relationship("Source", primaryjoin="Scan.start_source_id == Source.id") - - -t_schedblock_minitile = Table( - "schedblock_minitile", - metadata, - Column("schedblock_id", ForeignKey("schedblock.schedblock_id"), primary_key=True, nullable=False), - Column("minitile_id", ForeignKey("minitile.id"), primary_key=True, nullable=False), -) - - -class Setting(Base): - __tablename__ = "settings" - - id = Column(String(1), primary_key=True, server_default=text("'X'::bpchar")) - allow_job_deletion = Column(Boolean, server_default=text("false")) - allow_product_deletion = Column(Boolean, server_default=text("false")) - - -class Source(Base): - __tablename__ = "source" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - sct_catalog_id = Column(BigInteger) - sct_id = Column(BigInteger) - ra = Column(Float(53)) - decl = Column(Float(53)) - - -class Tag(Base): - __tablename__ = "tag" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - - -class Workflow(Base): - __tablename__ = "workflow" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - host = Column(String(255)) - port = Column(Integer) - json = Column(Text) - enqueue = Column(Boolean) - product_type_id = Column(ForeignKey("product_type.id")) - arch_workflow_id = Column(ForeignKey("workflow.id")) - - arch_workflow = relationship("Workflow", remote_side=[id]) - product_type = relationship("ProductType") - - -class WorkflowProjectCode(Base): - __tablename__ = "workflow_project_codes" - - project_code_id = Column(ForeignKey("workflow.id"), primary_key=True, nullable=False) - project_code = Column(String(255), primary_key=True, nullable=False) - - project_code1 = relationship("Workflow") diff --git a/apps/cli/executables/pexable/ingest/ingest/weblog_thumbs/__init__.py b/apps/cli/executables/pexable/ingest/ingest/weblog_thumbs/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/weblog_thumbs/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/ingest/ingest/weblog_thumbs/thumbnail_finder.py b/apps/cli/executables/pexable/ingest/ingest/weblog_thumbs/thumbnail_finder.py deleted file mode 100644 index 3a7eab70957a495175f0a7ea2736c8a91fc794bb..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/weblog_thumbs/thumbnail_finder.py +++ /dev/null @@ -1,144 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import argparse as ap -import logging -import logging.handlers -import os -import sys - -from .. import version -from ..pymygdala import LogHandler -from .weblogUtil import Weblog - -# Global logger access: -logger = logging.getLogger("thumbnail_cheater") -logger.setLevel(logging.WARN) - -# -# using the old quicklook weblog raiding, expand it to do AUDI continuum & cubes too. -# -# The thumbnails don't exactly match their filename, so we might need to modify the name somewhat -# (undo the +/- -> underscore transformation, remove the .sky portion) to mesh with the manifest -# building utility -# -# -# - -_DESCRIPTION = """Cheating Thumbnail Utility, version {}:\n\tFinds, unpacks, and searches a weblog for thumbnail \n\t -images. Searchings in stage7 (quicklook mode) or stages 10 and 12 (audi mode) \n\t -for images approximating that of the provided file.""" - - -def _make_parser(): - r"""Build a command line and/or argument parser""" - - result = ap.ArgumentParser(description=_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter) - result.add_argument( - "-P", "--profile", action="store", default="", help="profile name to use, e.g. test, production" - ) - result.add_argument("-v", "--verbose", action="store_true", help="Provide more log feedback.") - result.add_argument("-q", "--quicklook", action="store_true", help="Search using quicklook assumptions (stage7)") - result.add_argument("-a", "--audi", action="store_true", help="Search using audi assumptions (stages 10 and 12)") - result.add_argument("filename", type=str, action="store", help="name of the science product of interest") - return result - - -def weblog_raid(): - parser = _make_parser() - arguments = parser.parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == arguments.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != arguments.profile: - os.environ["CAPO_PROFILE"] = arguments.profile - - # integrate the logs with pymygdala's logging system - handler = LogHandler(profile=os.environ["CAPO_PROFILE"], application="thumbnail_cheater") - - if arguments.verbose: - handler.setLevel(logging.DEBUG) - logger.setLevel(logging.DEBUG) - logger.debug("Enabling more complete feedback.") - else: - handler.setLevel(logging.WARN) - - logger.addHandler(handler) - - # A last check: pick a mode - if (not arguments.audi) and (not arguments.quicklook): - logger.error("Only two choices: audi or quicklook. Pick one.") - exit(-5) - - # Get the contents of our working directory (ingestion's staging area) - contents = os.listdir(path=os.getcwd()) - logger.debug(f"Searching for a weblog within: {contents}") - - # and find the weblog file among the list (stolen from persistimages): provides the index in contents - weblog_candidates = [place for place, name in enumerate(contents) if "weblog" in name] - - # We expect a single file to match the pattern: - if len(weblog_candidates) != 1: - # So throw an exception when that's not the case. - logger.error("Cannot isolate the weblog, exiting.") - exit(-3) - - weblog_path = os.getcwd() - weblog_filename = contents[weblog_candidates[0]] - weblog = Weblog(weblog_path, weblog_filename) - - logger.debug(f"hunting in the weblog ({weblog_filename}) for a companion to: {arguments.filename}") - - if arguments.quicklook: - thumbnail = weblog.find_quicklook_thumbnail_for(arguments.filename) - else: - if "cube" in arguments.filename: - thumbnail = weblog.find_cube_thumbnail_for(arguments.filename) - else: - thumbnail = weblog.find_continuum_thumbnail_for(arguments.filename) - - if thumbnail is None: - if "tt1" in arguments.filename: - logger.debug(f"Didn't find a thumbnail for {arguments.filename}, as expected") - exit(0) - else: - logger.error(f"Failed to find expected thumbnail for {arguments.filename}") - exit(-13) - - logger.debug(f"Discovered {thumbnail} for {arguments.filename}.") - - # - # So, now we have the thumbnail, but we need a variant on it's name copied out into - # the working directory. (dump the s10_0 sky iter1.image etc). - # - # the thumbnail matching algorithm will need to handle the +/- -> _ that's less easy - # from this direction. - # - desired_thumbnail = os.path.basename(thumbnail) - desired_thumbnail = desired_thumbnail.replace(".s12_0", "") - desired_thumbnail = desired_thumbnail.replace(".s10_0", "") - desired_thumbnail = desired_thumbnail.replace(".sky", "") - # AUDI images drop the .iter1.image bit, but vlass qls don't. - if not arguments.quicklook: - desired_thumbnail = desired_thumbnail.replace(".iter1.image", "") - - logger.debug(f"Copying the thumbnail to {desired_thumbnail}") - os.link(thumbnail, desired_thumbnail) diff --git a/apps/cli/executables/pexable/ingest/ingest/weblog_thumbs/weblogUtil.py b/apps/cli/executables/pexable/ingest/ingest/weblog_thumbs/weblogUtil.py deleted file mode 100644 index 4190dc1e4cf924fce10f9613e065c5420331a59e..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/ingest/weblog_thumbs/weblogUtil.py +++ /dev/null @@ -1,169 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import glob -import logging -import os -import tarfile - -LOG = logging.getLogger("thumbnail_cheater") - - -class Weblog: - """A class to encapsulate the extraction of data from the initial page - of a CASA Pipeline weblog. Uses BeautifulSoup for the processing. - - Given the path to a file & it's name: extract & scrape the basic information - from the index.html file. - - Initially: required the construction of a full path to the index file file as a string: - mylog = new Weblog("/export/home/earth/image_scratch/pipeline-20180222T184022/html/index.html") - - Then use the methods to extract the relevant information from the file. - """ - - # ------------------------------------------------------------------------- - # Internal Use Methods - # ------------------------------------------------------------------------- - - def __init__(self, path_to_file, filename): - """Open the weblog's index.html file and perform parse the document.""" - self.indexFilePath = self.find_index_file(path_to_file, filename) - # self.thumbnailImages = self.collect_potential_quicklook_thumbnails(self.indexFilePath) - - def find_index_file(self, products_dir, weblog_file_name): - weblog_tar_file = tarfile.open(os.path.join(products_dir, weblog_file_name)) - weblog_tar_file.extractall(path=products_dir) - weblog_index_html = glob.glob(products_dir + "/pipeline-*/html/index.html") - return weblog_index_html[0] - - # ------------------------------------------------------------------- - # Mixed, probably mostly internal. - # ------------------------------------------------------------------- - - def collect_potential_quicklook_thumbnails(self, imageFilePath): - """ - Retrieve the list of thumnbnail images from the appropriate stage for quicklook imaging: - :param imageFilePath: path to the weblog - :return: list of thumbnail images - """ - return glob.glob(os.path.dirname(imageFilePath) + "/stage7/thumbs/*.sky.png", recursive=True) - - def collect_potential_continuum_thumbnails(self, imageFilePath): - """ - Retrieve the list of thumnbnail images in the weblog stage for continuum imaging: - :param imageFilePath: path to the weblog - :return: list of thumbnail images - """ - return glob.glob(os.path.dirname(imageFilePath) + "/stage10/thumbs/*.sky.png", recursive=True) - - def collect_potential_cube_thumbnails(self, imageFilePath): - """ - Retrieve the list of thumnbnail images in the weblog's cube imaging stage - :param imageFilePath: path to the weblog - :return: list of thumbnail images - """ - return glob.glob(os.path.dirname(imageFilePath) + "/stage12/*.sky.png", recursive=True) - - # -------------------------------------------------------------------- - # External Methods - # -------------------------------------------------------------------- - - def find_quicklook_thumbnail_for(self, filename): - """ - Get the thumbnail image from the weblog for the specified filename - :param filename: FITS image to search for thumbnail - :return: thumbnail image path in the weblog - """ - - thumbnailImages = self.collect_potential_quicklook_thumbnails(self.indexFilePath) - - for thumbnailImage in thumbnailImages: - # logger.info('Checking if {} is a thumbnail for {}'.format(os.path.basename(thumbnailImage), filename.replace('-', '_').replace('+', '_').replace('fits', 'sky.png'))) - if os.path.basename(thumbnailImage) == filename.replace("-", "_").replace("+", "_").replace( - "fits", "sky.png" - ): - return thumbnailImage - - LOG.error("No thumbnail found for image: {}".format(filename)) - return None - - def find_continuum_thumbnail_for(self, filename): - """ - Get the thumbnail image from the weblog for the specified filename - :param filename: FITS image to search for thumbnail - :return: thumbnail image path in the weblog - """ - - thumbnailImages = self.collect_potential_continuum_thumbnails(self.indexFilePath) - - # Three generic replacements: - expected_thumb = filename.replace("-", "_").replace("+", "_").replace("fits", "sky.png") - - # And one based upon the filename (because there are two variants in what comes out of the - # continuum imaging step: - if "tt" in expected_thumb: - expected_thumb = expected_thumb.replace("I.tt", "I.iter1.image.tt") - else: - expected_thumb = expected_thumb.replace("I.pbcor", "I.iter1.image.pbcor") - - LOG.debug(f"Searching for a file named: {expected_thumb}") - - for thumbnailImage in thumbnailImages: - - currentThumb = os.path.basename(thumbnailImage) - # there's an extra portion stuffed in the beginning of the name, it's best handled here: - comparisonThumb = currentThumb.replace(".s10_0", "") - LOG.debug(f"\tcomparing to: {currentThumb}({comparisonThumb})") - - if comparisonThumb == expected_thumb: - return thumbnailImage - - LOG.error("No thumbnail found for image: {}".format(filename)) - return None - - def find_cube_thumbnail_for(self, filename): - """ - Get the thumbnail image from the weblog for the specified filename. There are several - transformations we need to make in order to match the relevant file. - - :param filename: FITS image to search for thumbnail - :return: full path to the (unaltered) thumbnail image for copying. - """ - - thumbnailImages = self.collect_potential_cube_thumbnails(self.indexFilePath) - # The thumbnail images in the weblog don't exactly match the resultant files. - # So, let's meet them halfway: - expected_thumb = ( - filename.replace("-", "_") - .replace("+", "_") - .replace("fits", "sky.png") - .replace("I.pbcor", "I.iter1.image.pbcor") - ) - LOG.debug(f"Searching for a file named: {expected_thumb}") - - for thumbnailImage in thumbnailImages: - currentThumb = os.path.basename(thumbnailImage) - # there's an extra portion stuffed in the beginning of the name, it's best handled here: - comparisonThumb = currentThumb.replace(".s12_0", "") - LOG.debug(f"\tcomparing to: {currentThumb}({comparisonThumb})") - - if comparisonThumb == expected_thumb: - return thumbnailImage - - LOG.error("No thumbnail found for image: {}".format(filename)) - return None diff --git a/apps/cli/executables/pexable/ingest/notebooks/find_missing_files.ipynb b/apps/cli/executables/pexable/ingest/notebooks/find_missing_files.ipynb deleted file mode 100644 index f208a570fa0fb7b6dc12362a464fff6522898241..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/notebooks/find_missing_files.ipynb +++ /dev/null @@ -1,221 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Figuring out Joins with pandas and sqlalchemy\n", - "\n", - "A significant performance issue we have is that, while there are ~8000 files in NGAS we need to check, checking them individually takes forever. So we need to pull out all the files first, and then do a big query against NGAS, and match things up. Doing this is going to require a massive join, which made me think I should try pandas, and this is me trying it." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "import pandas\n", - "import pyat.schema\n", - "from pyat.schema.model import ScienceProduct, AncillaryProduct, Filegroup, File\n", - "from pyat.schema.ngasmodel import NGASFile\n", - "import tqdm\n", - "\n", - "def groups_of(df, n):\n", - " \"\"\"Return sub-dataframes for every N rows in the data frame.\"\"\"\n", - " next_chunk, remainder = df.head(n), df.tail(-n)\n", - " while not next_chunk.empty:\n", - " yield next_chunk\n", - " next_chunk, remainder = remainder.head(n), remainder.tail(-n)" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "session = pyat.schema.create_session('SDM')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The next query is fairly intense, because I need to recursively find all the file groups under a product in order to get all their files. We'll need to do something similar to take care of ancillary products in a bit." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [ - { - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mMemoryError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m<ipython-input-3-76997686e89d>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[0mjoin\u001b[0m \u001b[0mrgroups\u001b[0m \u001b[0mon\u001b[0m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfilegroup_id\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrgroups\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtop_fg\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 12\u001b[0m join files f on f.filegroup = rgroups.child_fg\"\"\"\n\u001b[1;32m---> 13\u001b[1;33m \u001b[0mspl_files\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpandas\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread_sql\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mquery\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msession\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbind\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 14\u001b[0m \u001b[0mspl_files\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 15\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mc:\\users\\jplank\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\io\\sql.py\u001b[0m in \u001b[0;36mread_sql\u001b[1;34m(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)\u001b[0m\n\u001b[0;32m 436\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 437\u001b[0m \u001b[0mparse_dates\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mparse_dates\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 438\u001b[1;33m \u001b[0mchunksize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mchunksize\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 439\u001b[0m )\n\u001b[0;32m 440\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mc:\\users\\jplank\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\io\\sql.py\u001b[0m in \u001b[0;36mread_query\u001b[1;34m(self, sql, index_col, coerce_float, parse_dates, params, chunksize)\u001b[0m\n\u001b[0;32m 1235\u001b[0m \u001b[0mindex_col\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mindex_col\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1236\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1237\u001b[1;33m \u001b[0mparse_dates\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mparse_dates\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1238\u001b[0m )\n\u001b[0;32m 1239\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mframe\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mc:\\users\\jplank\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\io\\sql.py\u001b[0m in \u001b[0;36m_wrap_result\u001b[1;34m(data, columns, index_col, coerce_float, parse_dates)\u001b[0m\n\u001b[0;32m 122\u001b[0m \u001b[1;34m\"\"\"Wrap result set of query in a DataFrame.\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 123\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 124\u001b[1;33m \u001b[0mframe\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfrom_records\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 125\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 126\u001b[0m \u001b[0mframe\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_parse_date_columns\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mparse_dates\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mc:\\users\\jplank\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36mfrom_records\u001b[1;34m(cls, data, index, exclude, columns, coerce_float, nrows)\u001b[0m\n\u001b[0;32m 1634\u001b[0m \u001b[0marr_columns\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1635\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1636\u001b[1;33m \u001b[0marrays\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0marr_columns\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mto_arrays\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1637\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1638\u001b[0m \u001b[0marr_columns\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mensure_index\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marr_columns\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mc:\\users\\jplank\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\core\\internals\\construction.py\u001b[0m in \u001b[0;36mto_arrays\u001b[1;34m(data, columns, coerce_float, dtype)\u001b[0m\n\u001b[0;32m 482\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 483\u001b[0m \u001b[1;31m# last ditch effort\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 484\u001b[1;33m \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mtuple\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 485\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0m_list_to_arrays\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 486\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mc:\\users\\jplank\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\pandas\\core\\internals\\construction.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 482\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 483\u001b[0m \u001b[1;31m# last ditch effort\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 484\u001b[1;33m \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mtuple\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 485\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0m_list_to_arrays\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 486\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mMemoryError\u001b[0m: " - ], - "ename": "MemoryError", - "evalue": "", - "output_type": "error" - } - ], - "source": [ - "query = \"\"\"with recursive\n", - " rgroups as (\n", - " select sp.filegroup_id as top_fg, sp.filegroup_id as child_fg\n", - " from science_products sp\n", - " -- where sp.science_product_locator = 'uid://evla/execblock/5a2e125e-8043-4354-b7a1-0dcc9b018019'\n", - " union all\n", - " select rgroups.top_fg as top_fg, fg.filegroup_id\n", - " from rgroups\n", - " join filegroups fg on rgroups.child_fg = fg.parent_filegroup_id)\n", - "select sp.science_product_locator, f.ngas_id, f.ngas_cluster, f.ngas_location from science_products sp\n", - "join rgroups on sp.filegroup_id = rgroups.top_fg\n", - "join files f on f.filegroup = rgroups.child_fg\"\"\"\n", - "spl_files = pandas.read_sql(query, session.bind)\n", - "spl_files" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we have all the SPLs and their NGAS IDs in a Pandas table, so we can join that against the table we get out from NGAS. But now we need to get that table out from NGAS. First, we need to select only the files that have `ngas_cluster` of `DSOC`, and then we need to turn that column into an argument to the SQL, so that we only get things that might match." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "dsoc_files = spl_files.query('ngas_cluster==\"DSOC\"')\n", - "dsoc_files" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can select all the NGAS IDs and start to build the query." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "ngas = pyat.schema.create_session('NGAS')" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "#ngas_ids = pandas.read_sql(ngas.query(NGASFile.file_id).filter(NGASFile.file_id.in_(dsoc_files.ngas_id.values)).statement, ngas.bind)\n", - "ngas_ids = pandas.read_sql(ngas.query(NGASFile.file_id).statement, ngas.connection())\n", - "ngas_ids['present'] = True\n", - "ngas_ids" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "joined = ngas_ids.set_index('file_id').join(dsoc_files.set_index('ngas_id'), how='right')\n", - "joined" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "missing = joined[joined.present.isna()]\n", - "missing" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "for spl, missing in missing.groupby('science_product_locator'):\n", - " print(f'{spl} missing {len(missing)} files')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/apps/cli/executables/pexable/ingest/notebooks/find_project_products.ipynb b/apps/cli/executables/pexable/ingest/notebooks/find_project_products.ipynb deleted file mode 100644 index 7b421c2bfb3821c2ba2bafc16ca61dad0b1379d1..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/notebooks/find_project_products.ipynb +++ /dev/null @@ -1,274 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas\n", - "from tqdm.auto import tqdm\n", - "import pyat.schema\n", - "from pyat.schema.model import Project, ScienceProduct, AncillaryProduct, File\n", - "\n", - "tqdm.pandas()\n", - "session = pyat.schema.create_session('SDM')" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "<Project#14A-346 \"A Deep, High-Resolution JVLA Study of the Sgr A Complex\" start=56794.23685474537 end=56803.49623726852>" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "project = session.query(Project).filter(Project.project_code == '14A-346').one()\n", - "project" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>locator</th>\n", - " <th>ngas_id</th>\n", - " <th>ngas_cluster</th>\n", - " <th>ngas_location</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>uid://evla/execblock/27a8542c-8293-4c68-a0d0-4...</td>\n", - " <td>uid___evla_sdm_X1400304811516.sdm</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>uid://evla/execblock/27a8542c-8293-4c68-a0d0-4...</td>\n", - " <td>uid___evla_sdm_X1400304811503.sdm</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>uid://evla/execblock/27a8542c-8293-4c68-a0d0-4...</td>\n", - " <td>uid___evla_sdm_X1400304811504.sdm</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>uid://evla/execblock/27a8542c-8293-4c68-a0d0-4...</td>\n", - " <td>uid___evla_sdm_X1400304811505.sdm</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>uid://evla/execblock/27a8542c-8293-4c68-a0d0-4...</td>\n", - " <td>uid___evla_sdm_X1400304811506.sdm</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>141</th>\n", - " <td>uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a...</td>\n", - " <td>uid____evla_bdf_1401103281456.bdf</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " <tr>\n", - " <th>142</th>\n", - " <td>uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a...</td>\n", - " <td>uid____evla_bdf_1401103730258.bdf</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " <tr>\n", - " <th>143</th>\n", - " <td>uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a...</td>\n", - " <td>uid____evla_bdf_1401104179008.bdf</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " <tr>\n", - " <th>144</th>\n", - " <td>uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a...</td>\n", - " <td>uid____evla_bdf_1401104318605.bdf</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " <tr>\n", - " <th>145</th>\n", - " <td>uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a...</td>\n", - " <td>uid____evla_bdf_1401104736504.bdf</td>\n", - " <td>DSOC</td>\n", - " <td>DSOC</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>146 rows × 4 columns</p>\n", - "</div>" - ], - "text/plain": [ - " locator \\\n", - "0 uid://evla/execblock/27a8542c-8293-4c68-a0d0-4... \n", - "1 uid://evla/execblock/27a8542c-8293-4c68-a0d0-4... \n", - "2 uid://evla/execblock/27a8542c-8293-4c68-a0d0-4... \n", - "3 uid://evla/execblock/27a8542c-8293-4c68-a0d0-4... \n", - "4 uid://evla/execblock/27a8542c-8293-4c68-a0d0-4... \n", - ".. ... \n", - "141 uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a... \n", - "142 uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a... \n", - "143 uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a... \n", - "144 uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a... \n", - "145 uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a... \n", - "\n", - " ngas_id ngas_cluster ngas_location \n", - "0 uid___evla_sdm_X1400304811516.sdm DSOC DSOC \n", - "1 uid___evla_sdm_X1400304811503.sdm DSOC DSOC \n", - "2 uid___evla_sdm_X1400304811504.sdm DSOC DSOC \n", - "3 uid___evla_sdm_X1400304811505.sdm DSOC DSOC \n", - "4 uid___evla_sdm_X1400304811506.sdm DSOC DSOC \n", - ".. ... ... ... \n", - "141 uid____evla_bdf_1401103281456.bdf DSOC DSOC \n", - "142 uid____evla_bdf_1401103730258.bdf DSOC DSOC \n", - "143 uid____evla_bdf_1401104179008.bdf DSOC DSOC \n", - "144 uid____evla_bdf_1401104318605.bdf DSOC DSOC \n", - "145 uid____evla_bdf_1401104736504.bdf DSOC DSOC \n", - "\n", - "[146 rows x 4 columns]" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "files = []\n", - "for sp in project.science_products:\n", - " files.extend((sp.locator, f.ngas_id, f.ngas_cluster, f.ngas_location) for f in sp.filegroup.all_files)\n", - " for ap in sp.ancillary_products:\n", - " files.extend((ap.locator, f.ngas_id, f.ngas_cluster, f.ngas_location) for f in ap.filegroup.all_files)\n", - "files = pandas.DataFrame(files, columns=['locator', 'ngas_id', 'ngas_cluster', 'ngas_location'])\n", - "files" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'uid://evla/execblock/27a8542c-8293-4c68-a0d0-41416521de86': Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,\n", - " 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,\n", - " 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,\n", - " 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,\n", - " 68, 69, 70, 71, 72],\n", - " dtype='int64'),\n", - " 'uid://evla/execblock/f6f897eb-c716-4acf-a8f1-a19471c06ce4': Int64Index([ 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,\n", - " 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,\n", - " 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,\n", - " 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,\n", - " 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137,\n", - " 138, 139, 140, 141, 142, 143, 144, 145],\n", - " dtype='int64')}" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "files.groupby('locator').groups" - ] - }, - { - "cell_type": "code", - "execution_count": 54, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['bar']" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "t = pandas.DataFrame([('foo', True),('bar',False),('baz',True)], columns=['name','present'])\n", - "list(t[t.present==False].name)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/apps/cli/executables/pexable/ingest/notebooks/missing_ebs.ipynb b/apps/cli/executables/pexable/ingest/notebooks/missing_ebs.ipynb deleted file mode 100644 index 97b3ebf88297e1664f42678779560c9937be39b2..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/notebooks/missing_ebs.ipynb +++ /dev/null @@ -1,904 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "import pandas\n", - "import numpy\n", - "import pyat.schema\n", - "from pyat.schema.model import ScienceProduct, AncillaryProduct, Filegroup, File\n", - "from pyat.schema.ngasmodel import NGASFile\n", - "import tqdm\n", - "import cx_Oracle\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [], - "source": [ - "#First, I need to get the EVLA ebs that are in the legacy archive.\n", - "legacy = pyat.schema.create_session('LEGACY')\n", - "query =\"\"\"select ARCHFILELOCATION.ARCH_FILE, ARCHIVE.ARCH_FILE AS ngas_id, PROJECT_CODE \n", - "from ARCHIVE inner join ARCHFILELOCATION on ARCHIVE.ARCH_FILE = ARCHFILELOCATION.ARCH_FILE\n", - "where TELESCOPE='EVLA'\"\"\"\n", - "legacy_result = pandas.read_sql(query, legacy.bind)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>arch_file</th>\n", - " <th>ngas_id</th>\n", - " <th>project_code</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>09A-106.sb3347506.eb3569223.55619.69491549768</td>\n", - " <td>09A-106.sb3347506.eb3569223.55619.69491549768</td>\n", - " <td>09A-106</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>09A-106.sb3352622.eb3591699.55625.67939193287</td>\n", - " <td>09A-106.sb3352622.eb3591699.55625.67939193287</td>\n", - " <td>09A-106</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>09A-106.sb3362167.eb3592502.55632.66018666667</td>\n", - " <td>09A-106.sb3362167.eb3592502.55632.66018666667</td>\n", - " <td>09A-106</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>09A-106.sb3684616.eb3709112.55639.641143518515</td>\n", - " <td>09A-106.sb3684616.eb3709112.55639.641143518515</td>\n", - " <td>09A-106</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>09A-106.sb3861088.eb3867871.55653.602983530094</td>\n", - " <td>09A-106.sb3861088.eb3867871.55653.602983530094</td>\n", - " <td>09A-106</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>97665</th>\n", - " <td>sysstartK_001.56870.000027395836</td>\n", - " <td>sysstartK_001.56870.000027395836</td>\n", - " <td>Operations</td>\n", - " </tr>\n", - " <tr>\n", - " <th>97666</th>\n", - " <td>sysstartK_001.56874.75462980324</td>\n", - " <td>sysstartK_001.56874.75462980324</td>\n", - " <td>Operations</td>\n", - " </tr>\n", - " <tr>\n", - " <th>97667</th>\n", - " <td>sysstartK_001.56881.80496854166</td>\n", - " <td>sysstartK_001.56881.80496854166</td>\n", - " <td>Operations</td>\n", - " </tr>\n", - " <tr>\n", - " <th>97668</th>\n", - " <td>sysstartK_001.56890.0215975</td>\n", - " <td>sysstartK_001.56890.0215975</td>\n", - " <td>Operations</td>\n", - " </tr>\n", - " <tr>\n", - " <th>97669</th>\n", - " <td>sysstartK_001.56896.97181207176</td>\n", - " <td>sysstartK_001.56896.97181207176</td>\n", - " <td>Operations</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>97670 rows × 3 columns</p>\n", - "</div>" - ], - "text/plain": [ - " arch_file \\\n", - "0 09A-106.sb3347506.eb3569223.55619.69491549768 \n", - "1 09A-106.sb3352622.eb3591699.55625.67939193287 \n", - "2 09A-106.sb3362167.eb3592502.55632.66018666667 \n", - "3 09A-106.sb3684616.eb3709112.55639.641143518515 \n", - "4 09A-106.sb3861088.eb3867871.55653.602983530094 \n", - "... ... \n", - "97665 sysstartK_001.56870.000027395836 \n", - "97666 sysstartK_001.56874.75462980324 \n", - "97667 sysstartK_001.56881.80496854166 \n", - "97668 sysstartK_001.56890.0215975 \n", - "97669 sysstartK_001.56896.97181207176 \n", - "\n", - " ngas_id project_code \n", - "0 09A-106.sb3347506.eb3569223.55619.69491549768 09A-106 \n", - "1 09A-106.sb3352622.eb3591699.55625.67939193287 09A-106 \n", - "2 09A-106.sb3362167.eb3592502.55632.66018666667 09A-106 \n", - "3 09A-106.sb3684616.eb3709112.55639.641143518515 09A-106 \n", - "4 09A-106.sb3861088.eb3867871.55653.602983530094 09A-106 \n", - "... ... ... \n", - "97665 sysstartK_001.56870.000027395836 Operations \n", - "97666 sysstartK_001.56874.75462980324 Operations \n", - "97667 sysstartK_001.56881.80496854166 Operations \n", - "97668 sysstartK_001.56890.0215975 Operations \n", - "97669 sysstartK_001.56896.97181207176 Operations \n", - "\n", - "[97670 rows x 3 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "legacy_result" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "#next, I need the ebs in the new archive\n", - "session = pyat.schema.create_session('SDM', profile='nmprod')\n", - "query = \"\"\"select execution_blocks.execution_block_id, execution_blocks.project_code, execution_blocks.ngas_fileset_id \n", - "from execution_blocks\n", - " where telescope='EVLA' \"\"\"\n", - "spl_files = pandas.read_sql(query, session.bind)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "pycharm": { - "is_executing": false - }, - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>execution_block_id</th>\n", - " <th>project_code</th>\n", - " <th>ngas_fileset_id</th>\n", - " <th>present</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>132133</td>\n", - " <td>Operations</td>\n", - " <td>sysstartKa.58626.88931716435</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>132164</td>\n", - " <td>Operations</td>\n", - " <td>X_osro_001.58626.89927145833</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>140754</td>\n", - " <td>Operations</td>\n", - " <td>delay_NX_000.58779.85314850694</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>140779</td>\n", - " <td>Operations</td>\n", - " <td>sysstartQ.58779.96363196759</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>140789</td>\n", - " <td>Operations</td>\n", - " <td>sysstartX_000.58781.0298977662</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>87791</th>\n", - " <td>140612</td>\n", - " <td>TPUL0001</td>\n", - " <td>phasing_X_4GHz.q34.58778.90662894676</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>87792</th>\n", - " <td>132012</td>\n", - " <td>Operations</td>\n", - " <td>19A-393_TEST_B2319.58626.80279469908</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>87793</th>\n", - " <td>140635</td>\n", - " <td>Operations</td>\n", - " <td>sysstartL.58778.95344793981</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>87794</th>\n", - " <td>140639</td>\n", - " <td>Operations</td>\n", - " <td>sysstartS.58778.9574991088</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>87795</th>\n", - " <td>140650</td>\n", - " <td>Operations</td>\n", - " <td>sysstartKa.58778.972608125</td>\n", - " <td>True</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>87796 rows × 4 columns</p>\n", - "</div>" - ], - "text/plain": [ - " execution_block_id project_code ngas_fileset_id \\\n", - "0 132133 Operations sysstartKa.58626.88931716435 \n", - "1 132164 Operations X_osro_001.58626.89927145833 \n", - "2 140754 Operations delay_NX_000.58779.85314850694 \n", - "3 140779 Operations sysstartQ.58779.96363196759 \n", - "4 140789 Operations sysstartX_000.58781.0298977662 \n", - "... ... ... ... \n", - "87791 140612 TPUL0001 phasing_X_4GHz.q34.58778.90662894676 \n", - "87792 132012 Operations 19A-393_TEST_B2319.58626.80279469908 \n", - "87793 140635 Operations sysstartL.58778.95344793981 \n", - "87794 140639 Operations sysstartS.58778.9574991088 \n", - "87795 140650 Operations sysstartKa.58778.972608125 \n", - "\n", - " present \n", - "0 True \n", - "1 True \n", - "2 True \n", - "3 True \n", - "4 True \n", - "... ... \n", - "87791 True \n", - "87792 True \n", - "87793 True \n", - "87794 True \n", - "87795 True \n", - "\n", - "[87796 rows x 4 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spl_files['present'] = True\n", - "spl_files" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "pycharm": { - "is_executing": false - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>arch_file</th>\n", - " <th>project_code_legacy</th>\n", - " <th>execution_block_id</th>\n", - " <th>project_code</th>\n", - " <th>present</th>\n", - " </tr>\n", - " <tr>\n", - " <th>ngas_id</th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>09A-106.sb3347506.eb3569223.55619.69491549768</th>\n", - " <td>09A-106.sb3347506.eb3569223.55619.69491549768</td>\n", - " <td>09A-106</td>\n", - " <td>58594.0</td>\n", - " <td>09A-106</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>09A-106.sb3352622.eb3591699.55625.67939193287</th>\n", - " <td>09A-106.sb3352622.eb3591699.55625.67939193287</td>\n", - " <td>09A-106</td>\n", - " <td>57805.0</td>\n", - " <td>09A-106</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>09A-106.sb3362167.eb3592502.55632.66018666667</th>\n", - " <td>09A-106.sb3362167.eb3592502.55632.66018666667</td>\n", - " <td>09A-106</td>\n", - " <td>57806.0</td>\n", - " <td>09A-106</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>09A-106.sb3684616.eb3709112.55639.641143518515</th>\n", - " <td>09A-106.sb3684616.eb3709112.55639.641143518515</td>\n", - " <td>09A-106</td>\n", - " <td>57807.0</td>\n", - " <td>09A-106</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>09A-106.sb3861088.eb3867871.55653.602983530094</th>\n", - " <td>09A-106.sb3861088.eb3867871.55653.602983530094</td>\n", - " <td>09A-106</td>\n", - " <td>57145.0</td>\n", - " <td>09A-106</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>sysstartK_001.56870.000027395836</th>\n", - " <td>sysstartK_001.56870.000027395836</td>\n", - " <td>Operations</td>\n", - " <td>27244.0</td>\n", - " <td>Operations</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>sysstartK_001.56874.75462980324</th>\n", - " <td>sysstartK_001.56874.75462980324</td>\n", - " <td>Operations</td>\n", - " <td>27245.0</td>\n", - " <td>Operations</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>sysstartK_001.56881.80496854166</th>\n", - " <td>sysstartK_001.56881.80496854166</td>\n", - " <td>Operations</td>\n", - " <td>27246.0</td>\n", - " <td>Operations</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>sysstartK_001.56890.0215975</th>\n", - " <td>sysstartK_001.56890.0215975</td>\n", - " <td>Operations</td>\n", - " <td>27247.0</td>\n", - " <td>Operations</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>sysstartK_001.56896.97181207176</th>\n", - " <td>sysstartK_001.56896.97181207176</td>\n", - " <td>Operations</td>\n", - " <td>27248.0</td>\n", - " <td>Operations</td>\n", - " <td>True</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>97670 rows × 5 columns</p>\n", - "</div>" - ], - "text/plain": [ - " arch_file \\\n", - "ngas_id \n", - "09A-106.sb3347506.eb3569223.55619.69491549768 09A-106.sb3347506.eb3569223.55619.69491549768 \n", - "09A-106.sb3352622.eb3591699.55625.67939193287 09A-106.sb3352622.eb3591699.55625.67939193287 \n", - "09A-106.sb3362167.eb3592502.55632.66018666667 09A-106.sb3362167.eb3592502.55632.66018666667 \n", - "09A-106.sb3684616.eb3709112.55639.641143518515 09A-106.sb3684616.eb3709112.55639.641143518515 \n", - "09A-106.sb3861088.eb3867871.55653.602983530094 09A-106.sb3861088.eb3867871.55653.602983530094 \n", - "... ... \n", - "sysstartK_001.56870.000027395836 sysstartK_001.56870.000027395836 \n", - "sysstartK_001.56874.75462980324 sysstartK_001.56874.75462980324 \n", - "sysstartK_001.56881.80496854166 sysstartK_001.56881.80496854166 \n", - "sysstartK_001.56890.0215975 sysstartK_001.56890.0215975 \n", - "sysstartK_001.56896.97181207176 sysstartK_001.56896.97181207176 \n", - "\n", - " project_code_legacy \\\n", - "ngas_id \n", - "09A-106.sb3347506.eb3569223.55619.69491549768 09A-106 \n", - "09A-106.sb3352622.eb3591699.55625.67939193287 09A-106 \n", - "09A-106.sb3362167.eb3592502.55632.66018666667 09A-106 \n", - "09A-106.sb3684616.eb3709112.55639.641143518515 09A-106 \n", - "09A-106.sb3861088.eb3867871.55653.602983530094 09A-106 \n", - "... ... \n", - "sysstartK_001.56870.000027395836 Operations \n", - "sysstartK_001.56874.75462980324 Operations \n", - "sysstartK_001.56881.80496854166 Operations \n", - "sysstartK_001.56890.0215975 Operations \n", - "sysstartK_001.56896.97181207176 Operations \n", - "\n", - " execution_block_id \\\n", - "ngas_id \n", - "09A-106.sb3347506.eb3569223.55619.69491549768 58594.0 \n", - "09A-106.sb3352622.eb3591699.55625.67939193287 57805.0 \n", - "09A-106.sb3362167.eb3592502.55632.66018666667 57806.0 \n", - "09A-106.sb3684616.eb3709112.55639.641143518515 57807.0 \n", - "09A-106.sb3861088.eb3867871.55653.602983530094 57145.0 \n", - "... ... \n", - "sysstartK_001.56870.000027395836 27244.0 \n", - "sysstartK_001.56874.75462980324 27245.0 \n", - "sysstartK_001.56881.80496854166 27246.0 \n", - "sysstartK_001.56890.0215975 27247.0 \n", - "sysstartK_001.56896.97181207176 27248.0 \n", - "\n", - " project_code present \n", - "ngas_id \n", - "09A-106.sb3347506.eb3569223.55619.69491549768 09A-106 True \n", - "09A-106.sb3352622.eb3591699.55625.67939193287 09A-106 True \n", - "09A-106.sb3362167.eb3592502.55632.66018666667 09A-106 True \n", - "09A-106.sb3684616.eb3709112.55639.641143518515 09A-106 True \n", - "09A-106.sb3861088.eb3867871.55653.602983530094 09A-106 True \n", - "... ... ... \n", - "sysstartK_001.56870.000027395836 Operations True \n", - "sysstartK_001.56874.75462980324 Operations True \n", - "sysstartK_001.56881.80496854166 Operations True \n", - "sysstartK_001.56890.0215975 Operations True \n", - "sysstartK_001.56896.97181207176 Operations True \n", - "\n", - "[97670 rows x 5 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#now, compare the two:\n", - "combined = legacy_result.set_index('ngas_id').join(spl_files.set_index('ngas_fileset_id'), on='ngas_id', how='left', lsuffix='_legacy')\n", - "combined" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['BM479.sb35568863.eb35574175.58348.80606886574',\n", - " 'C_baseband.55131.65250361111', 'C_baseband.55132.839772604166',\n", - " ..., '14A-007_20140315_1394888122236',\n", - " '14A-007_20140422_1398171325552', '14A-007_20140430_1398855322758'],\n", - " dtype=object)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "missing = combined[combined.present!=True]\n", - "missing[['arch_file','project_code', 'project_code_legacy']]\n", - "missing[\"arch_file\"].unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>project_code</th>\n", - " <th>project_code_legacy</th>\n", - " </tr>\n", - " <tr>\n", - " <th>ngas_id</th>\n", - " <th></th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>BM479.sb35568863.eb35574175.58348.80606886574</th>\n", - " <td>NaN</td>\n", - " <td>BM479</td>\n", - " </tr>\n", - " <tr>\n", - " <th>C_baseband.55131.65250361111</th>\n", - " <td>NaN</td>\n", - " <td>C_baseband</td>\n", - " </tr>\n", - " <tr>\n", - " <th>C_quad1_002.57994.82833423611</th>\n", - " <td>NaN</td>\n", - " <td>Operations</td>\n", - " </tr>\n", - " <tr>\n", - " <th>CrsroXrsro_3C84_001.55692.92237219907</th>\n", - " <td>NaN</td>\n", - " <td>TRSR0001</td>\n", - " </tr>\n", - " <tr>\n", - " <th>L_realfast_B.58101.78498135417</th>\n", - " <td>NaN</td>\n", - " <td>158_2</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>22_1.sb30475501.eb30476883.57688.66450266204</th>\n", - " <td>NaN</td>\n", - " <td>22_1</td>\n", - " </tr>\n", - " <tr>\n", - " <th>14A-000_20140228_1393862124523</th>\n", - " <td>NaN</td>\n", - " <td>14A-000</td>\n", - " </tr>\n", - " <tr>\n", - " <th>14A-002_20140222_1393068920209</th>\n", - " <td>NaN</td>\n", - " <td>14A-002</td>\n", - " </tr>\n", - " <tr>\n", - " <th>14A-003_20140625_1404241354555</th>\n", - " <td>NaN</td>\n", - " <td>14A-003</td>\n", - " </tr>\n", - " <tr>\n", - " <th>14A-007_20140315_1394888122236</th>\n", - " <td>NaN</td>\n", - " <td>14A-007</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>808 rows × 2 columns</p>\n", - "</div>" - ], - "text/plain": [ - " project_code project_code_legacy\n", - "ngas_id \n", - "BM479.sb35568863.eb35574175.58348.80606886574 NaN BM479\n", - "C_baseband.55131.65250361111 NaN C_baseband\n", - "C_quad1_002.57994.82833423611 NaN Operations\n", - "CrsroXrsro_3C84_001.55692.92237219907 NaN TRSR0001\n", - "L_realfast_B.58101.78498135417 NaN 158_2\n", - "... ... ...\n", - "22_1.sb30475501.eb30476883.57688.66450266204 NaN 22_1\n", - "14A-000_20140228_1393862124523 NaN 14A-000\n", - "14A-002_20140222_1393068920209 NaN 14A-002\n", - "14A-003_20140625_1404241354555 NaN 14A-003\n", - "14A-007_20140315_1394888122236 NaN 14A-007\n", - "\n", - "[808 rows x 2 columns]" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#missing.columns = ['project_code','is_present']\n", - "#this does not create exactly the right file; the header row will need modified.\n", - "missing[['project_code', 'project_code_legacy']].drop_duplicates().to_csv('missing_ngas_filesets_EVLA.csv')\n", - "missing[['project_code', 'project_code_legacy']].drop_duplicates()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "c:\\users\\jplank\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\ipykernel_launcher.py:1: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " \"\"\"Entry point for launching an IPython kernel.\n" - ] - }, - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>filecount</th>\n", - " </tr>\n", - " <tr>\n", - " <th>project_code_legacy</th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>10C-133</th>\n", - " <td>4</td>\n", - " </tr>\n", - " <tr>\n", - " <th>11A-226</th>\n", - " <td>2</td>\n", - " </tr>\n", - " <tr>\n", - " <th>11B-050</th>\n", - " <td>7</td>\n", - " </tr>\n", - " <tr>\n", - " <th>12A-176</th>\n", - " <td>2</td>\n", - " </tr>\n", - " <tr>\n", - " <th>12B-068</th>\n", - " <td>1</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>not_in_PDS</th>\n", - " <td>5</td>\n", - " </tr>\n", - " <tr>\n", - " <th>saturntest</th>\n", - " <td>1</td>\n", - " </tr>\n", - " <tr>\n", - " <th>saturntest2</th>\n", - " <td>1</td>\n", - " </tr>\n", - " <tr>\n", - " <th>saturntest_000</th>\n", - " <td>1</td>\n", - " </tr>\n", - " <tr>\n", - " <th>widarbase04-08</th>\n", - " <td>1</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>808 rows × 1 columns</p>\n", - "</div>" - ], - "text/plain": [ - " filecount\n", - "project_code_legacy \n", - "10C-133 4\n", - "11A-226 2\n", - "11B-050 7\n", - "12A-176 2\n", - "12B-068 1\n", - "... ...\n", - "not_in_PDS 5\n", - "saturntest 1\n", - "saturntest2 1\n", - "saturntest_000 1\n", - "widarbase04-08 1\n", - "\n", - "[808 rows x 1 columns]" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "missing['filecount'] = 1\n", - "missing[['project_code_legacy', 'filecount']].groupby('project_code_legacy').count()" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "12.75110064502918" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "legacy_count = legacy_result.size\n", - "missing_count = missing.size\n", - "missing_percent = (missing_count/legacy_count) * 100\n", - "missing_percent" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - }, - "pycharm": { - "stem_cell": { - "cell_type": "raw", - "metadata": { - "collapsed": false - }, - "source": [] - } - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/apps/cli/executables/pexable/ingest/notebooks/missing_ebs_VLBA.ipynb b/apps/cli/executables/pexable/ingest/notebooks/missing_ebs_VLBA.ipynb deleted file mode 100644 index 920b39a02340c3ef35f36398abeef7b3eb2ed6f3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/notebooks/missing_ebs_VLBA.ipynb +++ /dev/null @@ -1,1078 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [], - "source": [ - "import pandas\n", - "import numpy\n", - "import pyat.schema\n", - "from pyat.schema.model import ScienceProduct, AncillaryProduct, Filegroup, File\n", - "from pyat.schema.ngasmodel import NGASFile\n", - "import tqdm\n", - "import cx_Oracle\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "First, I need to get the EVLA ebs that are in the legacy archive.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [], - "source": [ - "legacy = pyat.schema.create_session('LEGACY')\n", - "query =\"\"\"select ARCHFILELOCATION.ARCH_FILE, ARCHIVE.ARCH_FILE AS ngas_id, PROJECT_CODE \n", - "from ARCHIVE inner join ARCHFILELOCATION on ARCHIVE.ARCH_FILE = ARCHFILELOCATION.ARCH_FILE\n", - "where TELESCOPE='VLBA'\"\"\"\n", - "legacy_result = pandas.read_sql(query, legacy.bind)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "pycharm": { - "is_executing": true - }, - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>arch_file</th>\n", - " <th>ngas_id</th>\n", - " <th>project_code</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255...</td>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC21_0_120831T16255...</td>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC21_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC22_0_120831T16255...</td>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC22_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC23_0_120831T16255...</td>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC23_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC24_0_120831T16255...</td>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC24_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>395565</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T15104...</td>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " </tr>\n", - " <tr>\n", - " <th>395566</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T15104...</td>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " </tr>\n", - " <tr>\n", - " <th>395567</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T15104...</td>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " </tr>\n", - " <tr>\n", - " <th>395568</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T15104...</td>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " </tr>\n", - " <tr>\n", - " <th>395569</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T15104...</td>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>395570 rows × 3 columns</p>\n", - "</div>" - ], - "text/plain": [ - " arch_file \\\n", - "0 VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255... \n", - "1 VLBA_BD161EV_bd161ev_BIN0_SRC21_0_120831T16255... \n", - "2 VLBA_BD161EV_bd161ev_BIN0_SRC22_0_120831T16255... \n", - "3 VLBA_BD161EV_bd161ev_BIN0_SRC23_0_120831T16255... \n", - "4 VLBA_BD161EV_bd161ev_BIN0_SRC24_0_120831T16255... \n", - "... ... \n", - "395565 VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T15104... \n", - "395566 VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T15104... \n", - "395567 VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T15104... \n", - "395568 VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T15104... \n", - "395569 VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T15104... \n", - "\n", - " ngas_id project_code \n", - "0 VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255... BD0161 \n", - "1 VLBA_BD161EV_bd161ev_BIN0_SRC21_0_120831T16255... BD0161 \n", - "2 VLBA_BD161EV_bd161ev_BIN0_SRC22_0_120831T16255... BD0161 \n", - "3 VLBA_BD161EV_bd161ev_BIN0_SRC23_0_120831T16255... BD0161 \n", - "4 VLBA_BD161EV_bd161ev_BIN0_SRC24_0_120831T16255... BD0161 \n", - "... ... ... \n", - "395565 VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T15104... DQ2008 \n", - "395566 VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T15104... DQ2008 \n", - "395567 VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T15104... DQ2008 \n", - "395568 VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T15104... DQ2008 \n", - "395569 VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T15104... DQ2008 \n", - "\n", - "[395570 rows x 3 columns]" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "legacy_result" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [], - "source": [ - "#next, I need the ebs in the new archive\n", - "session = pyat.schema.create_session('SDM', profile='nmprod')\n", - "query = \"\"\"select execution_blocks.execution_block_id, execution_blocks.project_code, files.ngas_id from execution_blocks\n", - "inner join scans on scans.execution_block_id = execution_blocks.execution_block_id\n", - "inner join subscans on subscans.scan_id= scans.scan_id\n", - "inner join files on files.file_id = subscans.file_id\n", - " where telescope='VLBA' \"\"\"\n", - "spl_files = pandas.read_sql(query, session.bind)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "pycharm": { - "is_executing": true - }, - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>execution_block_id</th>\n", - " <th>project_code</th>\n", - " <th>ngas_id</th>\n", - " <th>present</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>111500</td>\n", - " <td>BD215</td>\n", - " <td>VLBA_BD215F4_bd215f4_BIN0_SRC00_1_181126T15503...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>108013</td>\n", - " <td>RV131</td>\n", - " <td>VLBA_RV131_rv131_BIN0_SRC0_0_181019T143850.idi...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>108013</td>\n", - " <td>RV131</td>\n", - " <td>VLBA_RV131_rv131_BIN0_SRC0_0_181019T143850.idi...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>108013</td>\n", - " <td>RV131</td>\n", - " <td>VLBA_RV131_rv131_BIN0_SRC0_0_181019T143850.idi...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>108013</td>\n", - " <td>RV131</td>\n", - " <td>VLBA_RV131_rv131_BIN0_SRC0_0_181019T143850.idi...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>8710119</th>\n", - " <td>148437</td>\n", - " <td>BD215</td>\n", - " <td>VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>8710120</th>\n", - " <td>148437</td>\n", - " <td>BD215</td>\n", - " <td>VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>8710121</th>\n", - " <td>148437</td>\n", - " <td>BD215</td>\n", - " <td>VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>8710122</th>\n", - " <td>148437</td>\n", - " <td>BD215</td>\n", - " <td>VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>8710123</th>\n", - " <td>148437</td>\n", - " <td>BD215</td>\n", - " <td>VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1...</td>\n", - " <td>True</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>8710124 rows × 4 columns</p>\n", - "</div>" - ], - "text/plain": [ - " execution_block_id project_code \\\n", - "0 111500 BD215 \n", - "1 108013 RV131 \n", - "2 108013 RV131 \n", - "3 108013 RV131 \n", - "4 108013 RV131 \n", - "... ... ... \n", - "8710119 148437 BD215 \n", - "8710120 148437 BD215 \n", - "8710121 148437 BD215 \n", - "8710122 148437 BD215 \n", - "8710123 148437 BD215 \n", - "\n", - " ngas_id present \n", - "0 VLBA_BD215F4_bd215f4_BIN0_SRC00_1_181126T15503... True \n", - "1 VLBA_RV131_rv131_BIN0_SRC0_0_181019T143850.idi... True \n", - "2 VLBA_RV131_rv131_BIN0_SRC0_0_181019T143850.idi... True \n", - "3 VLBA_RV131_rv131_BIN0_SRC0_0_181019T143850.idi... True \n", - "4 VLBA_RV131_rv131_BIN0_SRC0_0_181019T143850.idi... True \n", - "... ... ... \n", - "8710119 VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1... True \n", - "8710120 VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1... True \n", - "8710121 VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1... True \n", - "8710122 VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1... True \n", - "8710123 VLBA_BD215D4_bd215d4recor_BIN0_SRC0_1_200429T1... True \n", - "\n", - "[8710124 rows x 4 columns]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "spl_files['present'] = True\n", - "spl_files" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>arch_file</th>\n", - " <th>project_code_legacy</th>\n", - " <th>execution_block_id</th>\n", - " <th>project_code</th>\n", - " <th>present</th>\n", - " </tr>\n", - " <tr>\n", - " <th>ngas_id</th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558.idifits</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " <td>126942.0</td>\n", - " <td>BD161</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558.idifits</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " <td>126942.0</td>\n", - " <td>BD161</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558.idifits</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " <td>126942.0</td>\n", - " <td>BD161</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558.idifits</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " <td>126942.0</td>\n", - " <td>BD161</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558.idifits</th>\n", - " <td>VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255...</td>\n", - " <td>BD0161</td>\n", - " <td>126942.0</td>\n", - " <td>BD161</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T151040.idifits</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " <td>147110.0</td>\n", - " <td>DQ2008</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T151040.idifits</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " <td>147110.0</td>\n", - " <td>DQ2008</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T151040.idifits</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " <td>147110.0</td>\n", - " <td>DQ2008</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T151040.idifits</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " <td>147110.0</td>\n", - " <td>DQ2008</td>\n", - " <td>True</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T151040.idifits</th>\n", - " <td>VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T15104...</td>\n", - " <td>DQ2008</td>\n", - " <td>147110.0</td>\n", - " <td>DQ2008</td>\n", - " <td>True</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>12243992 rows × 5 columns</p>\n", - "</div>" - ], - "text/plain": [ - " arch_file \\\n", - "ngas_id \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255... \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255... \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255... \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255... \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T16255... \n", - "... ... \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T151040... VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T15104... \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T151040... VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T15104... \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T151040... VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T15104... \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T151040... VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T15104... \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T151040... VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T15104... \n", - "\n", - " project_code_legacy \\\n", - "ngas_id \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD0161 \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD0161 \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD0161 \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD0161 \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD0161 \n", - "... ... \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T151040... DQ2008 \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T151040... DQ2008 \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T151040... DQ2008 \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T151040... DQ2008 \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T151040... DQ2008 \n", - "\n", - " execution_block_id \\\n", - "ngas_id \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... 126942.0 \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... 126942.0 \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... 126942.0 \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... 126942.0 \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... 126942.0 \n", - "... ... \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T151040... 147110.0 \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T151040... 147110.0 \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T151040... 147110.0 \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T151040... 147110.0 \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T151040... 147110.0 \n", - "\n", - " project_code present \n", - "ngas_id \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD161 True \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD161 True \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD161 True \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD161 True \n", - "VLBA_BD161EV_bd161ev_BIN0_SRC20_0_120831T162558... BD161 True \n", - "... ... ... \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_06_200304T151040... DQ2008 True \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_07_200304T151040... DQ2008 True \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_08_200304T151040... DQ2008 True \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_09_200304T151040... DQ2008 True \n", - "VLBA_DQ2008B_dq2008b_BIN0_SRC0_10_200304T151040... DQ2008 True \n", - "\n", - "[12243992 rows x 5 columns]" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#now, compare the two:\n", - "combined = legacy_result.set_index('ngas_id').join(spl_files.set_index('ngas_id'), on='ngas_id', how='left', lsuffix='_legacy')\n", - "combined" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['GMVA_c041aPart1.uvfits', 'GMVA_c041aPart2.uvfits',\n", - " 'GMVA_c041aPart3.uvfits', ...,\n", - " 'VLBA_UG003W_ug003wrecor_BIN0_SRC0_0_200430T144230.mark4.tar.gz',\n", - " 'VLBA_UH003A_uh003a_BIN0_SRC0_0_180507T195629.mark4.tar.gz',\n", - " 'VLBA_UH003B_uh003b_BIN0_SRC0_0_180515T142206.mark4.tar.gz'],\n", - " dtype=object)" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "missing = combined[combined.present!=True]\n", - "missing[['arch_file','project_code', 'project_code_legacy']]\n", - "missing[\"arch_file\"].unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>project_code</th>\n", - " <th>project_code_legacy</th>\n", - " </tr>\n", - " <tr>\n", - " <th>ngas_id</th>\n", - " <th></th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>GMVA_c041aPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C041A</td>\n", - " </tr>\n", - " <tr>\n", - " <th>GMVA_c041bPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C041B</td>\n", - " </tr>\n", - " <tr>\n", - " <th>GMVA_c042aPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C042A</td>\n", - " </tr>\n", - " <tr>\n", - " <th>GMVA_c052aPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C052A</td>\n", - " </tr>\n", - " <tr>\n", - " <th>GMVA_c052bPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C052B</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BP245P_bp245p_BIN0_SRC0_0_200302T232704.idifits</th>\n", - " <td>NaN</td>\n", - " <td>BP0245</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BP246A_bp246arecor_BIN0_SRC0_0_200226T221424.idifits</th>\n", - " <td>NaN</td>\n", - " <td>BP0246</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BR095_FPOL2IF0.5MHZ128CH_4.6601GHZ03.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>BR0095</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_DQ2020_dq2020_BIN0_SRC0_01_200602T151219.idifits</th>\n", - " <td>NaN</td>\n", - " <td>DQ2020</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_DQ2022_dq2022_BIN0_SRC0_00_200615T153638.idifits</th>\n", - " <td>NaN</td>\n", - " <td>DQ2022</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>2955 rows × 2 columns</p>\n", - "</div>" - ], - "text/plain": [ - " project_code \\\n", - "ngas_id \n", - "GMVA_c041aPart1.uvfits NaN \n", - "GMVA_c041bPart1.uvfits NaN \n", - "GMVA_c042aPart1.uvfits NaN \n", - "GMVA_c052aPart1.uvfits NaN \n", - "GMVA_c052bPart1.uvfits NaN \n", - "... ... \n", - "VLBA_BP245P_bp245p_BIN0_SRC0_0_200302T232704.id... NaN \n", - "VLBA_BP246A_bp246arecor_BIN0_SRC0_0_200226T2214... NaN \n", - "VLBA_BR095_FPOL2IF0.5MHZ128CH_4.6601GHZ03.uvfits NaN \n", - "VLBA_DQ2020_dq2020_BIN0_SRC0_01_200602T151219.i... NaN \n", - "VLBA_DQ2022_dq2022_BIN0_SRC0_00_200615T153638.i... NaN \n", - "\n", - " project_code_legacy \n", - "ngas_id \n", - "GMVA_c041aPart1.uvfits C041A \n", - "GMVA_c041bPart1.uvfits C041B \n", - "GMVA_c042aPart1.uvfits C042A \n", - "GMVA_c052aPart1.uvfits C052A \n", - "GMVA_c052bPart1.uvfits C052B \n", - "... ... \n", - "VLBA_BP245P_bp245p_BIN0_SRC0_0_200302T232704.id... BP0245 \n", - "VLBA_BP246A_bp246arecor_BIN0_SRC0_0_200226T2214... BP0246 \n", - "VLBA_BR095_FPOL2IF0.5MHZ128CH_4.6601GHZ03.uvfits BR0095 \n", - "VLBA_DQ2020_dq2020_BIN0_SRC0_01_200602T151219.i... DQ2020 \n", - "VLBA_DQ2022_dq2022_BIN0_SRC0_00_200615T153638.i... DQ2022 \n", - "\n", - "[2955 rows x 2 columns]" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drop_mk_4 = missing[['project_code', 'project_code_legacy']].drop_duplicates()\n", - "mk_4 = drop_mk_4.filter(like='.mark4.tar.gz', axis=0)\n", - "drop_mk_4 = drop_mk_4[~drop_mk_4.index.isin(mk_4.index)]\n", - "drop_mk_4" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>project_code</th>\n", - " <th>project_code_legacy</th>\n", - " </tr>\n", - " <tr>\n", - " <th>ngas_id</th>\n", - " <th></th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>GMVA_c041aPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C041A</td>\n", - " </tr>\n", - " <tr>\n", - " <th>GMVA_c041bPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C041B</td>\n", - " </tr>\n", - " <tr>\n", - " <th>GMVA_c042aPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C042A</td>\n", - " </tr>\n", - " <tr>\n", - " <th>GMVA_c052aPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C052A</td>\n", - " </tr>\n", - " <tr>\n", - " <th>GMVA_c052bPart1.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>C052B</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BP245P_bp245p_BIN0_SRC0_0_200302T232704.idifits</th>\n", - " <td>NaN</td>\n", - " <td>BP0245</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BP246A_bp246arecor_BIN0_SRC0_0_200226T221424.idifits</th>\n", - " <td>NaN</td>\n", - " <td>BP0246</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_BR095_FPOL2IF0.5MHZ128CH_4.6601GHZ03.uvfits</th>\n", - " <td>NaN</td>\n", - " <td>BR0095</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_DQ2020_dq2020_BIN0_SRC0_01_200602T151219.idifits</th>\n", - " <td>NaN</td>\n", - " <td>DQ2020</td>\n", - " </tr>\n", - " <tr>\n", - " <th>VLBA_DQ2022_dq2022_BIN0_SRC0_00_200615T153638.idifits</th>\n", - " <td>NaN</td>\n", - " <td>DQ2022</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>2955 rows × 2 columns</p>\n", - "</div>" - ], - "text/plain": [ - " project_code \\\n", - "ngas_id \n", - "GMVA_c041aPart1.uvfits NaN \n", - "GMVA_c041bPart1.uvfits NaN \n", - "GMVA_c042aPart1.uvfits NaN \n", - "GMVA_c052aPart1.uvfits NaN \n", - "GMVA_c052bPart1.uvfits NaN \n", - "... ... \n", - "VLBA_BP245P_bp245p_BIN0_SRC0_0_200302T232704.id... NaN \n", - "VLBA_BP246A_bp246arecor_BIN0_SRC0_0_200226T2214... NaN \n", - "VLBA_BR095_FPOL2IF0.5MHZ128CH_4.6601GHZ03.uvfits NaN \n", - "VLBA_DQ2020_dq2020_BIN0_SRC0_01_200602T151219.i... NaN \n", - "VLBA_DQ2022_dq2022_BIN0_SRC0_00_200615T153638.i... NaN \n", - "\n", - " project_code_legacy \n", - "ngas_id \n", - "GMVA_c041aPart1.uvfits C041A \n", - "GMVA_c041bPart1.uvfits C041B \n", - "GMVA_c042aPart1.uvfits C042A \n", - "GMVA_c052aPart1.uvfits C052A \n", - "GMVA_c052bPart1.uvfits C052B \n", - "... ... \n", - "VLBA_BP245P_bp245p_BIN0_SRC0_0_200302T232704.id... BP0245 \n", - "VLBA_BP246A_bp246arecor_BIN0_SRC0_0_200226T2214... BP0246 \n", - "VLBA_BR095_FPOL2IF0.5MHZ128CH_4.6601GHZ03.uvfits BR0095 \n", - "VLBA_DQ2020_dq2020_BIN0_SRC0_01_200602T151219.i... DQ2020 \n", - "VLBA_DQ2022_dq2022_BIN0_SRC0_00_200615T153638.i... DQ2022 \n", - "\n", - "[2955 rows x 2 columns]" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#missing.columns = ['project_code','is_present']\n", - "drop_mk_4.to_csv('missing_ngas_files_VLBA.csv')\n", - "drop_mk_4" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>filecount</th>\n", - " </tr>\n", - " <tr>\n", - " <th>project_code_legacy</th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>AB0108</th>\n", - " <td>49</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AD0592</th>\n", - " <td>3</td>\n", - " </tr>\n", - " <tr>\n", - " <th>AP0296</th>\n", - " <td>2</td>\n", - " </tr>\n", - " <tr>\n", - " <th>BA0007</th>\n", - " <td>20</td>\n", - " </tr>\n", - " <tr>\n", - " <th>BA0008</th>\n", - " <td>3261</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ZT0004</th>\n", - " <td>1</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ZU0001</th>\n", - " <td>4</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ZU0002</th>\n", - " <td>1</td>\n", - " </tr>\n", - " <tr>\n", - " <th>gl035a</th>\n", - " <td>2</td>\n", - " </tr>\n", - " <tr>\n", - " <th>no_good</th>\n", - " <td>5</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>3882 rows × 1 columns</p>\n", - "</div>" - ], - "text/plain": [ - " filecount\n", - "project_code_legacy \n", - "AB0108 49\n", - "AD0592 3\n", - "AP0296 2\n", - "BA0007 20\n", - "BA0008 3261\n", - "... ...\n", - "ZT0004 1\n", - "ZU0001 4\n", - "ZU0002 1\n", - "gl035a 2\n", - "no_good 5\n", - "\n", - "[3882 rows x 1 columns]" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "#missing['filecount'] = 1\n", - "missing[['project_code_legacy', 'filecount']].groupby('project_code_legacy').count()" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "pycharm": { - "is_executing": true - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.9872135249778754" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "legacy_count = legacy_result.drop_duplicates().size\n", - "missing_count = missing[['project_code', 'project_code_legacy']].drop_duplicates().size\n", - "missing_percent = (missing_count/legacy_count) * 100\n", - "missing_percent" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - }, - "pycharm": { - "stem_cell": { - "cell_type": "raw", - "metadata": { - "collapsed": false - }, - "source": [] - } - } - }, - "nbformat": 4, - "nbformat_minor": 1 -} diff --git a/apps/cli/executables/pexable/ingest/notebooks/reconciliation.ipynb b/apps/cli/executables/pexable/ingest/notebooks/reconciliation.ipynb deleted file mode 100644 index c4e3ebf44d620cfa86858a87e24fe28ccca6ecda..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/notebooks/reconciliation.ipynb +++ /dev/null @@ -1,679 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas\n", - "from pandas import DataFrame\n", - "from tqdm.auto import tqdm\n", - "import pyat.schema\n", - "from pyat.schema.model import Project, ScienceProduct, AncillaryProduct, File\n", - "from pyat.schema.legacy_model import *\n", - "from pyat.schema.ngasmodel import NGASFile\n", - "from sqlalchemy.sql import *" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "tqdm.pandas()\n", - "session = pyat.schema.create_session('SDM', profile='local')\n", - "ngas = pyat.schema.create_session('NGAS', profile='local')\n", - "legacy = pyat.schema.create_session('LEGACY', profile='local')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>ngas_id</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>ngastest_Source_13_1.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>ngastest_Source_14_2.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>ngastest_Source_15_3.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>ngastest_Source_16_4.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>ngastest_Source_1.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2963462</th>\n", - " <td>uid___X1_X2_X1224623858320.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2963463</th>\n", - " <td>uid___X1_X2_X1224623858321.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2963464</th>\n", - " <td>uid___X1_X2_X1224623858322.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2963465</th>\n", - " <td>uid___X1_X2_X1224623858323.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2963466</th>\n", - " <td>uid___X1_X2_X1224623858324.sdm</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>2963467 rows × 1 columns</p>\n", - "</div>" - ], - "text/plain": [ - " ngas_id\n", - "0 ngastest_Source_13_1.sdm\n", - "1 ngastest_Source_14_2.sdm\n", - "2 ngastest_Source_15_3.sdm\n", - "3 ngastest_Source_16_4.sdm\n", - "4 ngastest_Source_1.sdm\n", - "... ...\n", - "2963462 uid___X1_X2_X1224623858320.sdm\n", - "2963463 uid___X1_X2_X1224623858321.sdm\n", - "2963464 uid___X1_X2_X1224623858322.sdm\n", - "2963465 uid___X1_X2_X1224623858323.sdm\n", - "2963466 uid___X1_X2_X1224623858324.sdm\n", - "\n", - "[2963467 rows x 1 columns]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ngas_sdms = pandas.read_sql(\"select distinct file_id as ngas_id from ngas_files where format = 'application/x-sdm' AND file_id = 'uid___X1_X2_X1224623858320.sdm' order by file_id\", ngas.connection())\n", - "query = select([NGASFile.file_id.label('ngas_id')]).where(NGASFile.format == 'application/x-sdm').order_by(NGASFile.file_id)\n", - "result = pandas.read_sql(query, ngas.connection())\n", - "result" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>ngas_id</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>uid___A002_X2b8998_X192.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>1</th>\n", - " <td>uid___A002_X2b8998_X2bf.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>2</th>\n", - " <td>uid___A002_X2b8998_X65.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>3</th>\n", - " <td>uid___A002_X2b8bb6_X1.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4</th>\n", - " <td>uid___A002_X2b8bb7_X1.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4749058</th>\n", - " <td>uid___evla_sdm_X1583372543642.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4749059</th>\n", - " <td>uid___evla_sdm_X1583372543643.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4749060</th>\n", - " <td>uid___evla_sdm_X1583372543644.sdm</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4749061</th>\n", - " <td>uid___evla_sdm_X1583372543645.bin</td>\n", - " </tr>\n", - " <tr>\n", - " <th>4749062</th>\n", - " <td>uid___evla_sdm_X1583372543646.sdm</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>4749063 rows × 1 columns</p>\n", - "</div>" - ], - "text/plain": [ - " ngas_id\n", - "0 uid___A002_X2b8998_X192.sdm\n", - "1 uid___A002_X2b8998_X2bf.sdm\n", - "2 uid___A002_X2b8998_X65.sdm\n", - "3 uid___A002_X2b8bb6_X1.sdm\n", - "4 uid___A002_X2b8bb7_X1.sdm\n", - "... ...\n", - "4749058 uid___evla_sdm_X1583372543642.sdm\n", - "4749059 uid___evla_sdm_X1583372543643.sdm\n", - "4749060 uid___evla_sdm_X1583372543644.sdm\n", - "4749061 uid___evla_sdm_X1583372543645.bin\n", - "4749062 uid___evla_sdm_X1583372543646.sdm\n", - "\n", - "[4749063 rows x 1 columns]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "archive_sdms = pandas.read_sql(\"select ngas_id from files where format = 'sdm' order by ngas_id\", session.connection())\n", - "archive_sdms" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>present</th>\n", - " </tr>\n", - " <tr>\n", - " <th>ngas_id</th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>ngastest_Source_1.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ngastest_Source_13_1.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ngastest_Source_14_2.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ngastest_Source_15_3.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ngastest_Source_16_4.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid___evla_sdm_aocngas-11sdmtest.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid___evla_sdm_aocngas-12sdmtest.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid___evla_sdm_aocngas-9sdmtest.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid___evla_sdm_test091002SW.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid__evla_sdm_X1260824882273.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>2745728 rows × 1 columns</p>\n", - "</div>" - ], - "text/plain": [ - " present\n", - "ngas_id \n", - "ngastest_Source_1.sdm NaN\n", - "ngastest_Source_13_1.sdm NaN\n", - "ngastest_Source_14_2.sdm NaN\n", - "ngastest_Source_15_3.sdm NaN\n", - "ngastest_Source_16_4.sdm NaN\n", - "... ...\n", - "uid___evla_sdm_aocngas-11sdmtest.sdm NaN\n", - "uid___evla_sdm_aocngas-12sdmtest.sdm NaN\n", - "uid___evla_sdm_aocngas-9sdmtest.sdm NaN\n", - "uid___evla_sdm_test091002SW.sdm NaN\n", - "uid__evla_sdm_X1260824882273.sdm NaN\n", - "\n", - "[2745728 rows x 1 columns]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "archive_sdms['present'] = True\n", - "result = ngas_sdms.set_index('ngas_id').join(archive_sdms.set_index('ngas_id'))\n", - "result" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>present</th>\n", - " </tr>\n", - " <tr>\n", - " <th>ngas_id</th>\n", - " <th></th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>ngastest_Source_1.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ngastest_Source_13_1.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ngastest_Source_14_2.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ngastest_Source_15_3.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>ngastest_Source_16_4.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>...</th>\n", - " <td>...</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid___evla_sdm_aocngas-11sdmtest.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid___evla_sdm_aocngas-12sdmtest.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid___evla_sdm_aocngas-9sdmtest.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid___evla_sdm_test091002SW.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " <tr>\n", - " <th>uid__evla_sdm_X1260824882273.sdm</th>\n", - " <td>NaN</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "<p>53178 rows × 1 columns</p>\n", - "</div>" - ], - "text/plain": [ - " present\n", - "ngas_id \n", - "ngastest_Source_1.sdm NaN\n", - "ngastest_Source_13_1.sdm NaN\n", - "ngastest_Source_14_2.sdm NaN\n", - "ngastest_Source_15_3.sdm NaN\n", - "ngastest_Source_16_4.sdm NaN\n", - "... ...\n", - "uid___evla_sdm_aocngas-11sdmtest.sdm NaN\n", - "uid___evla_sdm_aocngas-12sdmtest.sdm NaN\n", - "uid___evla_sdm_aocngas-9sdmtest.sdm NaN\n", - "uid___evla_sdm_test091002SW.sdm NaN\n", - "uid__evla_sdm_X1260824882273.sdm NaN\n", - "\n", - "[53178 rows x 1 columns]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "missing = result[result.present.isna()]\n", - "missing" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from sqlalchemy.sql import *\n", - "from pyat.schema.legacy_model import *\n", - "from pyat.datafinder.util import groups_of" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "matching missing SDMs with legacy archive metadata\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3072fc7b64d1416d9c7e9258c8a4b5f0", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(FloatProgress(value=0.0, max=1.0), HTML(value='')))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n" - ] - }, - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>file_id</th>\n", - " <th>project_code</th>\n", - " <th>sb_id</th>\n", - " <th>eb_id</th>\n", - " <th>filename</th>\n", - " <th>file_set_id</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>uid___X1_X2_X1224284503144.sdm</td>\n", - " <td>Csdmtest_019</td>\n", - " <td>0</td>\n", - " <td>0</td>\n", - " <td>ASDM.xml</td>\n", - " <td>Csdmtest_019.54756.95949090278</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " file_id project_code sb_id eb_id filename \\\n", - "0 uid___X1_X2_X1224284503144.sdm Csdmtest_019 0 0 ASDM.xml \n", - "\n", - " file_set_id \n", - "0 Csdmtest_019.54756.95949090278 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import math\n", - "count = 1000\n", - "legacy = pyat.schema.create_session('LEGACY', profile='local')\n", - "matching = DataFrame([], columns=['file_id', 'project_code', 'sb_id', 'eb_id', 'filename'])\n", - "print('matching missing SDMs with legacy archive metadata')\n", - "for group in tqdm(groups_of(missing, count), total=math.ceil(len(missing)/count)):\n", - " matching = matching.append(pandas.read_sql(\n", - " select([t_ngas_file_sets.c.file_id.distinct(), \n", - " t_ngas_file_sets.c.file_set_id,\n", - " t_archive.c.project_code, \n", - " t_archive.c.sb_id, \n", - " t_archive.c.eb_id,\n", - " case([(t_ngas_file_sets.c.file_id.like('%.sdm'), func.replace(t_ngas_file_sets.c.entity_type_name, 'Table', '') + '.xml'),\n", - " (t_ngas_file_sets.c.file_id.like('%.bin'), func.replace(t_ngas_file_sets.c.entity_type_name, 'Table', '') + '.bin'),\n", - " (t_ngas_file_sets.c.file_id.like('%.bdf'), func.replace(t_ngas_file_sets.c.file_id, '.bdf', ''))]).label('filename')])\n", - " .where(and_(t_archive.c.arch_file == t_ngas_file_sets.c.file_set_id,\n", - " t_ngas_file_sets.c.file_id.in_(group.index)))\n", - " .order_by(t_ngas_file_sets.c.file_id),\n", - " legacy.connection()))\n", - "matching" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "<div>\n", - "<style scoped>\n", - " .dataframe tbody tr th:only-of-type {\n", - " vertical-align: middle;\n", - " }\n", - "\n", - " .dataframe tbody tr th {\n", - " vertical-align: top;\n", - " }\n", - "\n", - " .dataframe thead th {\n", - " text-align: right;\n", - " }\n", - "</style>\n", - "<table border=\"1\" class=\"dataframe\">\n", - " <thead>\n", - " <tr style=\"text-align: right;\">\n", - " <th></th>\n", - " <th>file_id</th>\n", - " <th>project_code</th>\n", - " <th>sb_id</th>\n", - " <th>eb_id</th>\n", - " <th>filename</th>\n", - " <th>file_set_id</th>\n", - " </tr>\n", - " </thead>\n", - " <tbody>\n", - " <tr>\n", - " <th>0</th>\n", - " <td>uid___X1_X2_X1224284503144.sdm</td>\n", - " <td>Csdmtest_019</td>\n", - " <td>0</td>\n", - " <td>0</td>\n", - " <td>ASDM.xml</td>\n", - " <td>Csdmtest_019.54756.95949090278</td>\n", - " </tr>\n", - " </tbody>\n", - "</table>\n", - "</div>" - ], - "text/plain": [ - " file_id project_code sb_id eb_id filename \\\n", - "0 uid___X1_X2_X1224284503144.sdm Csdmtest_019 0 0 ASDM.xml \n", - "\n", - " file_set_id \n", - "0 Csdmtest_019.54756.95949090278 " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "res = list(matching.groupby('file_id'))[0]\n", - "res[1]\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.8" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/apps/cli/executables/pexable/ingest/pyat/README.txt b/apps/cli/executables/pexable/ingest/pyat/README.txt deleted file mode 100644 index 5d79ec804b4df2d07a05f9a18910e96f1cb6d42f..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/README.txt +++ /dev/null @@ -1,10 +0,0 @@ -# PyAT: The Python Archive Tools - -This is a collection of tools for internal use by the AAT-PPI system, as -well as libraries and commands for debugging and remote job control. It consists -of the following pieces: - - - *pymygdala*: archive messaging - - *wf*: triggering workflows - - *epilogue*: messaging at the conclusion of job executions by qsub - - *mrclean*: workflow cleanup diff --git a/apps/cli/executables/pexable/ingest/pyat/__init__.py b/apps/cli/executables/pexable/ingest/pyat/__init__.py deleted file mode 100644 index 616502ed39d0b6fbe146d80d4b9c361adc59bdf3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/__init__.py +++ /dev/null @@ -1,125 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- -""" -This is the pyat package, one of the core modules for the NRAO archive workflow system - -Authors: Daniel K Lyons <dlyons@nrao.edu> - Rick Lively <rlively@nrao.edu> - James Sheckar <jsheckar@nrao.edu> - Richard Falardeau <rfalarde@nrao.edu> -""" -import logging -import os -import sys -from os import path -from pathlib import Path - -import pycapo -from pyat._version import ___version___ as version - -LOG_MESSAGE_FORMATTER = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") -_CAPO_PROPERTIES_ROOT = "/home/casa/capo" - - -def get_console_logger(application_name, level=logging.INFO): - r""" - A function to build a console logger for the caller - :param application_name: the callers name - :param level: the log level to set, defaulting to INFO if not set - :return: a console logger - """ - console_log = logging.getLogger(application_name) - console_log.setLevel(level) - stdout_handler = logging.StreamHandler(sys.stdout) - stdout_handler.setLevel(level) - stdout_handler.setFormatter(LOG_MESSAGE_FORMATTER) - console_log.addHandler(stdout_handler) - return console_log - - -_LOG = get_console_logger(__name__, logging.DEBUG) - - -def profile_file_in_path(profile, properties_path): - """ - Check if the profile name provided is a valid name for a capo property file, by checking - to see if a <profile>.properties file can be found in the path provided - :param profile: the profile name we want to look for - :param properties_path: a path to a directory where we expect to find capo property files - :return: true if the profile given has a corresponding <profile>.properties file in the - path provided. - """ - valid_profile = False - profile_names = [ - prop.split(".properties")[0] for prop in os.listdir(properties_path) if prop.endswith(".properties") - ] - if profile in profile_names: - valid_profile = True - return valid_profile - - -def get_my_capo_config(**kwargs): - r""" - A function to return a CapoConfig for the profile either passed in, found in the environment - or derived from the location we've installed pyat. We do a rudamentary test of the profile - against a series of known capo properties directories (CAPO_PATH, /home/casa/capo, or - $HOME/.capo) and print a warning if the profile is not found as a valid properties file in any - of those location. This is solely to augment the cryptic exception messages that might be - thrown when trying to access a capo key from a file that doesn't exist. - :param kwargs: may or may not contain a 'profile' - :return: a CapoConfig object for the profile derived from the kwargs, env, or deployment - location - """ - if "profile" in kwargs and kwargs["profile"]: - profile = kwargs["profile"] - elif "CAPO_PROFILE" in os.environ: - profile = os.environ["CAPO_PROFILE"] - else: - # try to synthesize a profile from our installation root - # if you don't set the profile and end up here, but you're running locally... this might - # result in a profile of "<your virtualenv>", it's best to actually set it. - path_breakdown = os.path.abspath(sys.argv[0]).split(os.path.sep) - # CV sticks an extra subdirectory into the installation - if path_breakdown[-3] == "current": - profile = path_breakdown[-4] - else: - profile = path_breakdown[-3] - - # We should have a profile at this point, but it might not be valid (if the user didn't provide - # one), so now we'll try checking to see if that profile matchies a <profile>.properties file - # in one of our known properties directories. We'll check for a CAPO_PATH, then, - # /home/casa/capo, then $HOME/.capo, and, if all that fails, we'll print a warning to the - # console to augment any exception that might be thrown by trying to access a property from a - # properties files that doesn't exist. - profile_exists = False - if "CAPO_PATH" in os.environ: - profile_exists = profile_file_in_path(profile, os.environ["CAPO_PATH"]) - elif path.exists(_CAPO_PROPERTIES_ROOT): - profile_exists = profile_file_in_path(profile, _CAPO_PROPERTIES_ROOT) - elif path.exists(str(Path.home()) + "/.capo"): - profile_exists = profile_file_in_path(profile, str(Path.home()) + "/.capo") - - if not profile_exists: - _LOG.error( - f'The capo profile "{profile}" does not appear to match any known profile ' - f"names. This might result in unexpected behavior if the application attempts " - f"to access a property from a file that does not exist." - ) - - return pycapo.CapoConfig(profile=profile) diff --git a/apps/cli/executables/pexable/ingest/pyat/_version.py b/apps/cli/executables/pexable/ingest/pyat/_version.py deleted file mode 100644 index 35695644d1854e426eb3cd3370ad72888ebac44d..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "3.9.4" diff --git a/apps/cli/executables/pexable/ingest/pyat/events/__init__.py b/apps/cli/executables/pexable/ingest/pyat/events/__init__.py deleted file mode 100644 index 0138c89d2f1bac2b7e75c499f5d9e81bec65ae62..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/events/__init__.py +++ /dev/null @@ -1,18 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -from pyat.events.events import * diff --git a/apps/cli/executables/pexable/ingest/pyat/events/events.py b/apps/cli/executables/pexable/ingest/pyat/events/events.py deleted file mode 100644 index 2207b39aabc0c67591cb84f443814135ac245360..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/events/events.py +++ /dev/null @@ -1,117 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import datetime -import json -import os - -import pika -from pycapo import CapoConfig - -EVENTS_EXCHANGE = "archive.events" - -"""" -A simple API for sending an archive event from Python. -""" - -# Local variables -_connection, _channel = None, None - - -def broadcast(message, **kwargs): - """ - Broadcasts a message to the archive event system. - - Keyword arguments for the message: - - :param: application: the application sending the message (defaults to 'python') - :param: user: the user sending the event (defaults to the currently logged in user) - :param: request: the request this event is in reference to, if applicable - :param: message: the message itself (will override the formal parameter) - :param: logData: a dictionary of additional fields to include in the event - :param: timestamp: the current timestamp - :param: version: version of the event system to use ('1.0' is the only value at the time of writing) - - Keyword arguments for the AMQP connection. These do not need to be specified: - - :param: hostname: the hostname to connect to - :param: port: the port to connect to - :param: connection_attempts: the number of connection attempts to try - :param: socket_timeout: the time to wait for a socket to connect - :param: retry_delay: the time to wait between retrying the connection - :param: username: the username to connect to as - :param: password: the password to use when connecting - - :return: None - """ - # first, connect - _ensure_connected(**kwargs) - - # second, send the event - _send(_format_message(message, **kwargs), **kwargs) - - -def _ensure_connected(**kwargs): - global _connection, _channel - if not _connection: - config = CapoConfig(profile=kwargs.get("profile", None)).settings("edu.nrao.archive.configuration.AmqpServer") - connection_parameters = pika.ConnectionParameters( - host=kwargs.get("hostname", config.hostname), - port=int(kwargs.get("port", config.port)), - connection_attempts=kwargs.get("connection_attempts", 5), - socket_timeout=kwargs.get("socket_timeout", 5000), - retry_delay=kwargs.get("retry_delay", 500), - credentials=pika.PlainCredentials( - username=kwargs.get("username", config.username), password=kwargs.get("password", config.password) - ), - ) - _connection = pika.BlockingConnection(connection_parameters) - _channel = _connection.channel() - _channel.exchange_declare("archive.events", exchange_type="topic", durable=True, auto_delete=False) - - -def _format_message(message, **kwargs): - default_message = { - "application": "python", - "user": "nobody", - "request": None, - "message": message, - "logData": {}, - "timestamp": _datetime_to_dict(), - "version": "1.0", - } - - fields = ["application", "user", "request", "message", "logData", "timestamp", "version"] - - return {k: kwargs.get(k, default_message[k]) for k in fields} - - -def _send(message, **kwargs): - _channel.basic_publish( - exchange=EVENTS_EXCHANGE, - routing_key=kwargs.get("routing_key", "{}.event".format(message["application"])), - body=json.dumps(message), - ) - - -def _datetime_to_dict(): - # Turn 'now' in UTC into the date format events expect to speak. - d, t = dict(), dict() - now = datetime.datetime.utcnow() - d["year"], d["month"], d["day"] = now.year, now.month, now.day - t["hour"], t["minute"], t["second"], t["nano"] = now.hour, now.minute, now.second, now.microsecond * 1000 - return {"date": d, "time": t} diff --git a/apps/cli/executables/pexable/ingest/pyat/legacy/import_by_dir.py b/apps/cli/executables/pexable/ingest/pyat/legacy/import_by_dir.py deleted file mode 100644 index 26e98ea54dbe4517d53913b4aa3c137ec63c7075..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/legacy/import_by_dir.py +++ /dev/null @@ -1,55 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import sys -from os import listdir -from os.path import exists, isfile, join - -import import_xml_file - -# get a list of xml files in the given directory: -directory = sys.argv[1] -print(directory) -files = [] -preexisting_count = 0 - -for filename in listdir(directory): - if not filename.endswith(".xml"): - continue - if exists(filename + ".log"): - preexisting_count = preexisting_count + 1 - continue - fullname = join(directory, filename) - files.append(filename) - -print("files found: ", len(files)) -print("preexisting: ", preexisting_count) - -# process each file: -current = 1 -problems = [] -for f in files: - print("proccesing {} of {}: {}".format(current, len(files), f)) - - result = import_xml_file.parseFile(directory + "/" + f, f + ".log") - if result != 0: - problems.append(f) - - current = current + 1 - -print("{} problems found:".format(len(problems))) -print(problems) diff --git a/apps/cli/executables/pexable/ingest/pyat/legacy/import_xml_file.py b/apps/cli/executables/pexable/ingest/pyat/legacy/import_xml_file.py deleted file mode 100644 index ba67144649e0cf0af24c6eb262c00c30eff40210..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/legacy/import_xml_file.py +++ /dev/null @@ -1,343 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import datetime -import os -import sys - -import psycopg2 -from lxml import etree -from pycapo import CapoConfig - -profile = os.environ["CAPO_PROFILE"] - - -def getElement(root, element): - return root.find(".//{http://www.w3schools.com/VLAarchive}" + element) - - -def getElementList(root, element): - return root.findall(".//{http://www.w3schools.com/VLAarchive}" + element) - - -def connect(profile): - """Connect to the PostgreSQL database server""" - conn = None - try: - - config = CapoConfig(profile=profile) - user = config["metadataDatabase.jdbcUsername"] - password = config["metadataDatabase.jdbcPassword"] - url = config["metadataDatabase.jdbcUrl"] - archiveurl = url.replace("jdbc:", "").replace("://", "://" + user + ":" + password + "@") - - # connect to the PostgreSQL server - print("Connecting to " + archiveurl) - conn = psycopg2.connect(archiveurl) - - return conn - - except (Exception, psycopg2.DatabaseError) as error: - print(error) - - -def parseFile(file_name, log_file): - # set up the log file: - log = open(log_file, "w") - - # open and parse the file: - try: - input_file = open(file_name, "r") - tree = etree.parse(input_file) - except: - print("Could not parse file {}!".format(file_name)) - log.write("could not parse file {}!".format(file_name)) - return 1 - - # connect to the DB: - try: - conn = connect(profile) - cur = conn.cursor() - cur.execute("SELECT version()") - db_version = cur.fetchone() - except: - print("Could not connect to the database!") - log.write("could not connect to the database!") - return 1 - - # collect the values we need from the xml: - root = tree.getroot() - - project = {} - project["project_code"] = getElement(root, "observing_program_Id").text - project["configuration"] = getElement(root, "configuration").text - project["starttime"] = getElement(root, "start_time").text - project["endtime"] = getElement(root, "end_time").text - project["prop_expiration"] = 0 - project["prop_duration"] = 365 - - log.write(str(project)) - - if project["project_code"] is None: - print("No project code found: exiting.") - log.write("no project code found.") - return 1 - - # create the project, if necessary - cur.execute("SELECT starttime, endtime from projects where project_code=%s", [project["project_code"]]) - existing_project = cur.fetchone() - if existing_project is not None: - # update the project, if necessary - project["starttime"] = existing_project[0] - project["endtime"] = existing_project[1] - log.write("Project {} exists.".format(project["project_code"])) - else: - # create the project - log.write("Creating Project:") - log.write( - "project code: %s, legacy_id: %s, title: %s, abstract: %s, start_time: %s, end_time: %s" - % ( - project["project_code"], - project["project_code"], - "null", - "null", - project["starttime"], - project["endtime"], - ) - ) - cur.execute( - "INSERT INTO projects (project_code, legacy_id, starttime, endtime) VALUES (%s, %s, %s, %s);", - [project["project_code"], project["project_code"], project["starttime"], project["endtime"]], - ) - author = {} - author["name"] = getElement(root, "observer_name").text - name = author["name"].split(" ", 1) - - # create the author, if necessary - cur.execute("SELECT firstname, lastname from authors where project_code=%s", [project["project_code"]]) - existing_authors = cur.fetchone() - if existing_authors is not None: - # authors already exist - log.write("Project %s has author %s %s." % (project["project_code"], existing_authors[0], existing_authors[1])) - else: - # create the author - log.write("Creating Author %s:" % (author["name"])) - cur.execute( - "INSERT INTO authors (project_code, username, firstname, lastname, is_pi) VALUES (%s, %s, %s, %s, %s);", - [project["project_code"], "unknown", name[0], name[1], True], - ) - - eb = {} - eb["configuration"] = getElement(root, "configuration").text - band_list = getElementList(root, "band") - bands = "" - for e in band_list: - if e.text is not None: - bands = bands + e.text + " " - - eb["band_code"] = bands - - filesize = os.stat(file_name[:-4] + ".exp").st_size - - # assume for now that all entries in a file belong to the same new EB: - cur.execute( - "insert into filegroups (project_code, type, datasize) values (%s, %s, %s) returning filegroup_id;", - (project["project_code"], "execution_block", filesize), - ) - filegroup_id = cur.fetchone()[0] - - # there is one .exp file per .xml file: - filename = file_name.split("/")[-1][:-4] + ".exp" - cur.execute( - "insert into files (filegroup, filename, filesize, format, type, ngas_location, ngas_cluster, ngas_id)" - " values(%s, %s, %s, %s, %s, %s, %s, %s)", - (filegroup_id, filename, filesize, "exp", "raw", "DSOC", "DSOC", filename), - ) - - cur.execute( - "insert into science_products (science_product_locator, science_product_type, metadata_ingestion_date, metadata_ingestion_version, filegroup_id, external_name) " - "values ('uid://VLA/execblock/'||gen_random_uuid(), %s, %s, %s, %s, %s) returning science_product_locator;", - ("Execution Block", datetime.datetime.now(), 1, filegroup_id, filename), - ) - spl = cur.fetchone()[0] - - log.write("creating science_products_projects entry:") - cur.execute( - "insert into science_products_projects (science_product_locator, project_code) values(%s, %s)", - (spl, project["project_code"]), - ) - - log.write( - "Creating EB: {}, {}, {}, {}, {}, {}, {}, {}".format( - filegroup_id, - 0, - "VLA", - project["project_code"], - "DO Not Calibrate", - eb["band_code"], - eb["configuration"], - True, - ) - ) - cur.execute( - "insert into execution_blocks (science_product_locator, filegroup_id, calibration_level, telescope, project_code" - ", calibration_status, band_code, configuration, ingestion_complete) " - "values (%s, %s, 0, 'VLA', %s, 'Do Not Calibrate', %s, %s, True) returning execution_block_id;", - (spl, filegroup_id, project["project_code"], eb["band_code"], eb["configuration"]), - ) - eb_id = cur.fetchone()[0] - - scan = {} - - subscans = getElementList(root, "scan") - log.write("found %s scans".format(len(subscans))) - for e in subscans: - # create one scan entry and a subscan entry for each record: - cur.execute( - "insert into scans (execution_block_id, filegroup_id, max_bandwidth, min_bandwidth, polarization_code, max_frequency, min_frequency) " - "values (%s, %s, %s, %s, %s, %s, %s) returning scan_id;", - (eb_id, filegroup_id, 0, 0, 0, 0, 0), - ) - scan_id = cur.fetchone()[0] - - scan_max_freq = 0.0 - scan_min_freq = sys.float_info.max - scan_max_bw = 0.0 - scan_min_bw = sys.float_info.max - scan_pol_code = 0 - eb_start = sys.float_info.max - eb_end = 0.0 - - subscan = {} - subscan["starttime"] = getElement(e, "start_time").text - subscan["endtime"] = getElement(e, "end_time").text - subscan["ra"] = getElement(e, "right_ascension_J2000").text - subscan["dec"] = getElement(e, "declination_J2000").text - subscan["sourcename"] = getElement(e, "source_name").text - subscan["sourcetype"] = "NO IDEA" - subscan["obstype"] = "" - subscan["exposure_time"] = 0.0 - subscan["integration_time"] = getElement(e, "integration_time").text - subscan["receiver_id"] = 0 - subscan["backend"] = "none" - - if subscan["sourcename"] is None or len(subscan["sourcename"]) <= 0: - subscan["sourcename"] = "Unknown" - - # polarizations are annoying and fiddly. - # create a configuration for the subscan, and create a data_description linked to the configuration for each polarization - # in the XML - log.write("creating configuration") - cur.execute( - "insert into configurations (configuration, execution_block_id) values (%s, %s) returning configuration_id", - (0, eb_id), - ) - config_id = cur.fetchone() - - spectral_windows = getElementList(e, "spectral_window") - for sw in spectral_windows: - window = {} - window["frequency"] = getElement(sw, "center_frequency").text - window["bandwidth"] = getElement(sw, "bandwidth").text - window["channels"] = getElement(sw, "number_of_channels").text - window["polarization"] = getElement(sw, "polarizations").text - polarization_id = 0 - if "LL" in window["polarization"]: - polarization_id += 16 - if "LR" in window["polarization"]: - polarization_id += 32 - if "RL" in window["polarization"]: - polarization_id += 64 - if "RR" in window["polarization"]: - polarization_id += 128 - - # set some scan aggregate values: - scan_max_freq = max(scan_max_freq, float(window["frequency"])) - scan_min_freq = min(scan_min_freq, float(window["frequency"])) - scan_max_bw = max(scan_max_bw, float(window["bandwidth"])) - scan_min_bw = min(scan_min_bw, float(window["bandwidth"])) - scan_pol_code = scan_pol_code | polarization_id # bitwise or - - log.write(str(window)) - cur.execute( - "insert into data_descriptions (bandwidth, frequency, polarization_id, configuration_id) values (%s, %s, %s, %s)", - (window["bandwidth"], window["frequency"], polarization_id, config_id), - ) - # end for spectral windows - - log.write(str(subscan)) - cur.execute( - "insert into subscans (scan_id, obstype, starttime, endtime, sourcename, sourcetype, ra, dec, exposure_time" - ", integration_time, receiver_id, backend, configuration_id)" - "values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);", - ( - scan_id, - subscan["obstype"], - subscan["starttime"], - subscan["endtime"], - subscan["sourcename"], - subscan["sourcetype"], - subscan["ra"], - subscan["dec"], - subscan["exposure_time"], - subscan["integration_time"], - subscan["receiver_id"], - subscan["backend"], - config_id, - ), - ) - - # set some project aggregate values: - project["starttime"] = min(float(project["starttime"]), float(subscan["starttime"])) - project["endtime"] = max(float(project["endtime"]), float(subscan["endtime"])) - eb_start = min(eb_start, float(subscan["starttime"])) - eb_end = max(eb_end, float(subscan["endtime"])) - - if scan_min_bw == sys.float_info.max: - scan_min_bw = 0 - if scan_min_freq == sys.float_info.max: - scan_min_freq = 0 - - cur.execute( - "update scans set max_bandwidth=%s, min_bandwidth=%s, max_frequency=%s, min_frequency=%s, polarization_code=%s where scan_id=%s", - (scan_max_bw, scan_min_bw, scan_max_freq, scan_min_freq, scan_pol_code, scan_id), - ) - - # end for subscans - if eb_start == sys.float_info.max: - eb_start = 0 - - # update the eb with aggregated values: - cur.execute( - "update execution_blocks set starttime=%s, endtime=%s where execution_block_id=%s", (eb_start, eb_end, eb_id) - ) - - # update the project with aggregate values: - cur.execute( - "update projects set starttime=%s, endtime=%s, proprietary_expiration=mjd_to_timestamp(%s), last_addition = mjd_to_timestamp(%s), proprietary_duration=%s where project_code = %s", - ( - project["starttime"], - project["endtime"], - float(project["endtime"]) + 365.0, - project["endtime"], - 365, - project["project_code"], - ), - ) - - cur.execute("commit;") - return 0 diff --git a/apps/cli/executables/pexable/ingest/pyat/mark4_import/__init__.py b/apps/cli/executables/pexable/ingest/pyat/mark4_import/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/mark4_import/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/ingest/pyat/mark4_import/audit.py b/apps/cli/executables/pexable/ingest/pyat/mark4_import/audit.py deleted file mode 100644 index 301c07d6fa6f13f50fd57b421936e113ee074988..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/mark4_import/audit.py +++ /dev/null @@ -1,121 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import argparse as ap -import datetime -import logging -import sys - -import pandas as pd -from pyat import version -from pyat.schema import create_engine, create_session -from pyat.schema.model import Filegroup -from pycapo import CapoConfig -from sqlalchemy import create_engine -from sqlalchemy.orm import ( - sessionmaker, # an Engine, which the Session will use for connection -) - -_NOW = datetime.datetime.utcnow() -_LOCATION = "DSOC" -_FILE_TYPE = "MARK4" -_MAX_ROWS_TO_IMPORT = 2 - -_LOG = logging.getLogger("audit") -_LOG.setLevel(logging.INFO) -ch = logging.StreamHandler(sys.stdout) -formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") -ch.setFormatter(formatter) -ch.setLevel(logging.DEBUG) -_LOG.addHandler(ch) -_DESCRIPTION = """VLBA Audit version {}.""" - - -def audit_vlba(): - """ - Find matching idifits / mark4 pairs in the legacy archive. Create a mark4 file entry in the - new archive and attach it to the same filegroup as the idifits file. - :return: - """ - - args = _make_parser().parse_args() - - ngas_session = create_session("NGAS", profile=args.profile) - ngas_engine = create_engine("NGAS", profile=args.profile) - - ngas_vlba_files = pd.read_sql( - """ - select f.file_id filename - from ngas_files f - where f.file_id like 'VLBA%%' - and f.file_id not like '%%difx.log' - and f.file_id not like '%%mark4%%' - """, - ngas_engine, - ) - - ngas_session.close() - _LOG.info(f"{len(ngas_vlba_files)} VLBA files in NGAS") - - # legacy_engine = create_engine('LEGACY', profile=args.profile) - # legacy_session = create_session('LEGACY', profile=args.profile) - # legacy_vlba_files = pd.read_sql(""" - # select arch_file filename - # from archive - # where arch_file like 'VLBA%%' - # """, - # legacy_engine) - # - # legacy_session.close() - # - # _LOG.info(f"{len(legacy_vlba_files)} VLBA files in legacy archive") - - archive_engine = create_engine("SDM", profile=args.profile) - archive_session = create_session("SDM", profile=args.profile) - - archive_vlba_files = pd.read_sql( - """ - select filename - from files - where filename like 'VLBA%%' - """, - archive_engine, - ) - - archive_session.close() - - _LOG.info(f"{len(archive_vlba_files)} VLBA files in new archive") - - # file_merge = legacy_vlba_files.merge(ngas_vlba_files, indicator=True, how='outer') - # file_merge = legacy_vlba_files.merge(ngas_vlba_files, indicator=True, how='outer') - file_merge = ngas_vlba_files.merge(archive_vlba_files, indicator=True, how="outer") - diff = file_merge[file_merge["_merge"] == "left_only"] - - _LOG.info(f"{len(diff)} unmatching entries") - _LOG.info(diff["filename"].head(25)) - - -def _make_parser(): - r"""Build a command line parser for this app: this is external to MrBooks and/or CapoSettings because both need it, - and Sphinx will want a look at ot to build docs.""" - result = ap.ArgumentParser(description=_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter) - result.add_argument("-P", "--profile", action="store", help="profile name to use, e.g. test, production") - return result - - -if __name__ == "__main__": - audit_vlba() diff --git a/apps/cli/executables/pexable/ingest/pyat/mark4_import/commands.py b/apps/cli/executables/pexable/ingest/pyat/mark4_import/commands.py deleted file mode 100644 index 21d5e3ed5a529cb2b2bb51826bac5a8ddecdef19..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/mark4_import/commands.py +++ /dev/null @@ -1,185 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import argparse as ap -import datetime -import logging -import sys - -import pandas as pd -from pyat import version -from pyat.schema.model import Filegroup -from pycapo import CapoConfig -from sqlalchemy import create_engine -from sqlalchemy.orm import ( - sessionmaker, # an Engine, which the Session will use for connection -) - -_NOW = datetime.datetime.utcnow() -_LOCATION = "DSOC" -_FILE_TYPE = "MARK4" -_MAX_ROWS_TO_IMPORT = 2 - -_LOG = logging.getLogger("mark4_import") -_LOG.setLevel(logging.INFO) -ch = logging.StreamHandler(sys.stdout) -formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") -ch.setFormatter(formatter) -ch.setLevel(logging.DEBUG) -_LOG.addHandler(ch) -_DESCRIPTION = """Mark4 import version {}.""" - - -def mark4_import(): - """ - Find matching idifits / mark4 pairs in the legacy archive. Create a mark4 file entry in the - new archive and attach it to the same filegroup as the idifits file. - :return: - """ - args = _make_parser().parse_args() - nconf = CapoConfig(profile=args.profile).settings("ngasDatabase") - aconf = CapoConfig(profile=args.profile).settings("metadataDatabase") - - ngas_engine = create_engine( - nconf.jdbcUrl.lstrip("jdbc:").replace("://", f"://{nconf.jdbcUsername}:{nconf.jdbcPassword}@") - ) - archive_engine = create_engine( - aconf.jdbcUrl.lstrip("jdbc:").replace("://", f"://{aconf.jdbcUsername}:{aconf.jdbcPassword}@") - ) - - ngasSession = sessionmaker(bind=ngas_engine) # create a Session - archiveSession = sessionmaker(bind=archive_engine) # create a Session - - session = ngasSession() - - # Construct list of matching mark4 and idifits files in NGAS database - mark4_matches = pd.read_sql( - """ - select nf1.file_id file_path, - nf1.file_id ngas_id, - nf1.file_id filename, - nf1.file_size filesize, - nf2.file_id idifits - from ngas_files nf1 - inner join ngas_files nf2 - on reverse(regexp_replace(reverse(nf1.file_name), '.*?_(.*)', '')) = - reverse(regexp_replace(reverse(nf2.file_name), '.*?_(.*)', '')) - where nf1.file_name like '%%mark4.tar.gz' - and nf2.file_name like '%%.idifits'""", - ngas_engine, - ) - - session.close() - _LOG.info(f"{len(mark4_matches)} MARK4 files in NGAS with matching IDIFITS file") - - session = archiveSession() - - # Construct list of IDIFITS files in archive database with no matching MARK4 file - idifits_matches = pd.read_sql( - """ - select f1.filename idifits, - f1.filegroup filegroup - from files f1 - where f1.format = 'IDIFITS' - and not exists ( - select 1 - from files f2 - where f2.format = 'MARK4' - and reverse(regexp_replace(reverse(f2.filename), '.*?_(.*)', '')) = - reverse(regexp_replace(reverse(f1.filename), '.*?_(.*)', '')) - ) - """, - archive_engine, - ) - - _LOG.info(f"{len(idifits_matches)} unmatched IDIFITS files in archive") - - file_merge = mark4_matches.merge(idifits_matches) - _LOG.info(f"{len(file_merge)} merged entries") - - if len(file_merge) == 0: - _LOG.info(f"No mark4 files found to be imported") - session.close() - exit(0) - - # Add in constant columns not in database - file_merge["type"] = _FILE_TYPE - file_merge["format"] = _FILE_TYPE - file_merge["checksum"] = None - file_merge["checksum_type"] = None - file_merge["ingestion_time"] = _NOW - file_merge["preview_storage_path"] = None - file_merge["ngas_location"] = _LOCATION - file_merge["ngas_cluster"] = _LOCATION - - # Prepare data for insert into database - mark4_data = file_merge[ - [ - "file_path", - "ngas_id", - "filegroup", - "filename", - "filesize", - "format", - "type", - "checksum", - "checksum_type", - "ingestion_time", - "preview_storage_path", - "ngas_location", - "ngas_cluster", - ] - ] - # Limit on number of rows to insert - for debugging - # mark4_data = mark4_data.head(_MAX_ROWS_TO_IMPORT) - - # Append rows to file table in archive database - mark4_data.to_sql("files", con=archive_engine, index=False, if_exists="append") - - # Update filesize in filegroup containing new mark4 files - update_file_sizes(mark4_data, session) - session.close() - - -def update_file_sizes(mark4_data, session): - """ - Update file size for parent filegroup - :param mark4_data: dataframe containing the merged data - :param session: - :return: - """ - for row in range(len(mark4_data)): - mark4_row = mark4_data.iloc[row] - filegroup = session.query(Filegroup).filter(Filegroup.filegroup_id == int(mark4_row["filegroup"])).one_or_none() - if filegroup is not None: - filegroup.datasize = filegroup.datasize + int(mark4_row["filesize"]) - session.add(filegroup) - else: - _LOG.warning(f"Filegroup not found for id {mark4_row['filegroup']}") - session.commit() - - -def _make_parser(): - r"""Build a command line parser for this app: this is external to MrBooks and/or CapoSettings because both need it, - and Sphinx will want a look at ot to build docs.""" - result = ap.ArgumentParser(description=_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter) - result.add_argument("-P", "--profile", action="store", help="profile name to use, e.g. test, production") - return result - - -if __name__ == "__main__": - mark4_import() diff --git a/apps/cli/executables/pexable/ingest/pyat/qa_results/__init__.py b/apps/cli/executables/pexable/ingest/pyat/qa_results/__init__.py deleted file mode 100644 index 07b0b19ff42d64f1a398b9ae87703f092cd7a4dd..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/qa_results/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -r""" - A nice, clean command-line interface for the Data Analysts to - notify the newArchive of the PASS/FAIL status of CIPL run - results. - - On a PASS: send an ArchiveEvent signifying that we - should run the calibration ingestion workflow - - On a FAIL: send an ArchiveEvent signifying that the - data is no good, and should be marked as - DoNotCalibrate - - - In either case, the script needs to identify a fileSetId from the - subdirectory name in the QA2 directory (this is used by Amygdala to - uniquely identify the observation). - -""" diff --git a/apps/cli/executables/pexable/ingest/pyat/qa_results/commands.py b/apps/cli/executables/pexable/ingest/pyat/qa_results/commands.py deleted file mode 100644 index 08e0067e8505e0ed64d6789101ef282555ba0f3c..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/qa_results/commands.py +++ /dev/null @@ -1,292 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -from __future__ import print_function - -import argparse as ap -import getpass -import os -import sys -import xml.etree.ElementTree as ET -from pathlib import Path - -from pyat import version -from pyat.pymygdala import RPCEvent -from pycapo import CapoConfig - -# Help Messages -_PASS_DESCRIPTION = """AAT/PPI QA Pass {}: The calibration jobs listed are considered acceptable. This tool initiates - the ingestion of calibration products for the indicated directories and updates the list of calibrations for the - associated execution blocks.""" - -_FAIL_DESCRIPTION = """AAT/PPI QA Fail {}: This tool marks the execution blocks related to the indicated directories -as not appropriate for automated calibration, and initiates a clean up procedure to remove the directories from the QA -area. """ - -# Pipeline Processing Request -PPR = "PPR" -PPR_FILENAME = PPR + ".xml" - - -def _make_parser(status): - r"""Build a command line parser for this app: this is external to MrClean and/or CapoSettings because both need - it, and Sphinx will want a look at ot to build docs.""" - - if status == "PASS": - _DESCRIPTION = _PASS_DESCRIPTION - else: - _DESCRIPTION = _FAIL_DESCRIPTION - - result = ap.ArgumentParser(description=_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter) - result.add_argument( - "-P", "--profile", action="store", default="", help="profile name to use, e.g. test, production" - ) - result.add_argument( - "-f", - "--fileSetId", - action="store", - default="", - help="provide a fileSetId for the directory instead of searching for it", - ) - # For capturing DA comments, eventually. - # result.add_argument('-c', '--comment', type=str, action='store', default='No Comment Provided', help='Comment on the EB.') - result.add_argument("-e", "--email", type=str, action="store", default="", help="Email for completion notification") - result.add_argument( - "directoryName", - type=str, - action="store", - nargs="+", - help="name of the qa2 subdirectory to which the status applies", - ) - return result - - -def rawdata_check(path): - # TODO: Integrate this with both searches - # If we arrived here, then we need another route: - # - # the rawdata is stored in a directory named for - # fileSetId - raw_path = Path(path) - fileList = list(raw_path.glob("**/*")) - if 1 < len(fileList): - # This lists: [fsid, ASDMBinary] if successful - fileSetId = fileList[0].name.replace("/", "") # make sure no trailing slash - return fileSetId - - -def qa_search(path, subdir): - r"""Seach the /qa2/ subdirectory for the listed directory and extract the fileSetId from the - name of the flagversions file. return an empty string if this search fails""" - fileSetId = "" - - # Where we're looking - qaPath = Path(path + "/" + subdir + "/products/") - - # There's quite a bit of junk in the directory, and we only need the one tgz file - # so screen out the rest of them - # - # Loosened the glob to allow non NN[ABCD]-NNN.sb... identifiers through - fileList = list(qaPath.glob("**/*.ms.flagversions.tgz")) - if 0 < len(fileList): - flagTableFile = fileList[0].name - fileSetId = flagTableFile.split(".ms")[0] - return fileSetId - - # - # If we arrived here, then we need another route: - # - # the rawdata is stored in a directory named for - # fileSetId - raw_path = Path(path + "/" + subdir + "/rawdata/") - fileList = list(raw_path.glob("**/")) - if 1 < len(fileList): - # This lists: [rawdata, fsid, ASDMBinary] if successful - fileSetId = fileList[1].name.replace("/", "") # make sure no trailing slash - return fileSetId - - # - # Ok, now things are getting weird. - # - return fileSetId - - -def spool_search(path, subdir): - r"""Search the /spool/ for the desired directory, check for - a rawdata subdirectory and parse the PPR to discover the fileSetId. - return an empty string if you can't acquire the fileSetId""" - fileSetId = "" - - # If we're here, it's because there's nothing useful in the qa2 - # directory, which has most of the data in it.... - # - - # Try the rawdata directory again - # - # - # the rawdata is stored in a directory named for - # fileSetId - raw_path = Path(path + "/" + subdir + "/rawdata/") - fileList = list(raw_path.glob("**/")) - if 1 < len(fileList): - # This lists: [rawdata, fsid, ASDMBinary] if successful - fileSetId = fileList[1].name.replace("/", "") # make sure no trailing slash - return fileSetId - - # No luck with the raw data directory here in spool... - # - # So that leaves us with one last thing to try: PPR.xml - - pprFile = path + "/" + subdir + "/working/" + PPR_FILENAME - try: - fileTree = ET.parse(pprFile) - # - # Now walk the structure of the PPR file down to the piece we need - # - procRequests = fileTree.find("ProcessingRequests") - procReq = procRequests.find("ProcessingRequest") - dataSet = procReq.find("DataSet") - sdmElement = dataSet.find("SdmIdentifier").text - if sdmElement is not None: - fileSetId = sdmElement - return fileSetId - - except ET.ParseError as pe: - print("Error parsing PPR file.") - except StopIteration as si: - print("No SdmIdentifier in the PPR file.") - except FileNotFoundError as fnf: - print("No PPR file found.") - - # We haven't managed to find the fileSetId: indicate that - return "" - - -def qa_list(status): - r"""From the given directory(s) find the fileSetId(s) required for either workflow or database update - purposes (either from some filenames in the directory, or potentially parsing the PPR if that is deemed - necessary).""" - # Get the command line arguments - args = _make_parser(status).parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - capo = CapoConfig() - - qaDirectory = capo.getstring("edu.nrao.archive.workflow.config.CiplWorkflowSettings.qaDirectory") - spoolDirectory = capo.getstring("edu.nrao.archive.workflow.config.CiplWorkflowSettings.spoolDirectory") - - # - # So, the fileSetId is both in the name of a secondary tar file in the QA directory, - # and in the casa PPR file (which lives in spoolDirectory/$subDirName/working/) - # The former is by far the easier to deal with. - # - # A QA products directory has the following tgz files - # - # 13B-326.sb29065738.eb29113188.56764.86226100694.ms.flagversions.tgz - # unknown.session_1.caltables.tgz - # weblog.tgz - # - # The first of which is the fileSetId, so for each directory we were given, - # parse the fileSetId and send an event for each. - # - for resultsDirectory in args.directoryName: - # consistency: we'll place the /s - resultsDirectory = resultsDirectory.replace("/", "") - - # If we haven't been provided with the fileSetId, go find it - if "" == args.fileSetId: - fileSetId = qa_search(qaDirectory, resultsDirectory) - if "" == fileSetId: - fileSetId = spool_search(spoolDirectory, resultsDirectory) - if "" == fileSetId: - print("Failed to obtain a fileSetId for directory " + resultsDirectory) - return - else: - fileSetId = args.fileSetId - - # We've got the information we need, go ahead and send the event - print("Sending " + status + " for " + resultsDirectory + " (" + fileSetId + ")") - qa_single(fileSetId, resultsDirectory, status, args.email) - - -def qa_single(fileset_id, results_directory, status, notify_email): - r"""Takes two strings: fileSetId (parsed from a file in the directory we're interested in) - and status (Pass or Fail), and builds string to execute to create the appropriate event - for updating the database and/or launching a workflow.""" - - # A little parsing work: The project code is the first part of the fileSetId - project_code = fileset_id.split(".")[0] - - # We'll want to know who sent the message: - analyst_name = getpass.getuser() - - # now prep the event, use an RPC event to get data back from the system: - broadcaster = RPCEvent(profile=os.environ["CAPO_PROFILE"], exchange="archive.events", application="qa-script") - - event_data = { - "user": analyst_name, - "message": "{}={}".format(fileset_id, status), - "logData": { - "projectCode": project_code, - "status": status, - "type": "calibration", - "fileset_id": fileset_id, - "markedDirectory": results_directory, - }, - } - - if "" != notify_email: - event_data["logData"]["email"] = notify_email - - broadcaster.send(event_data) - - # Now get the reply: (uncomment when that part is done) - ingestion_data = broadcaster.get_reply() - - directory = None - log_id = None - - if "working_directory" in ingestion_data: - directory = ingestion_data["working_directory"] - - if "logging_id" in ingestion_data: - log_id = ingestion_data["logging_id"] - - if "PASS" == status: - workflow_name = "Calibration Ingestion" - else: - workflow_name = "Qa Cleanup" - - print("{} ({}) is running in {}".format(workflow_name, log_id, directory)) - - return - - -def qa_pass(): - qa_list("PASS") - - -def qa_fail(): - qa_list("FAIL") diff --git a/apps/cli/executables/pexable/ingest/pyat/vlba_grabber/__init__.py b/apps/cli/executables/pexable/ingest/pyat/vlba_grabber/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/vlba_grabber/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/ingest/pyat/vlba_grabber/ngas_retriever.py b/apps/cli/executables/pexable/ingest/pyat/vlba_grabber/ngas_retriever.py deleted file mode 100644 index 257975f99681cf13f0627385b525ae5ab33326ea..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/vlba_grabber/ngas_retriever.py +++ /dev/null @@ -1,194 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" - A simple, low level, ngas retriever with verification. - - Given a file, and a location, interact with NGAS to find the server, and initiate a direct copy from NGAS - and verify that the transfer was completed appropriately. - -""" -import argparse as ap -import logging -import logging.handlers -import os -import sys - -import requests -from bs4 import BeautifulSoup -from pyat import version -from pyat.pymygdala import LogHandler -from pycapo import CapoConfig - -# Constants: Might want to become CAPO properties. -_NGAS_MASTER_NODE = "aocngas-master" -_NGAS_PORT = 7777 - -_DESCRIPTION = """AAT/PPI uitility for low-level NGAS interactions. Version {} - This tool interacts with the NGAS HTTP interface to facilitate the transfer of a file to disk.""" - -# set up logging: -logger = logging.getLogger("ngas_retriever") -logger.setLevel(logging.DEBUG) - - -def _make_parser(): - r"""Build a command line and/or argument parser""" - - result = ap.ArgumentParser(description=_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter) - result.add_argument( - "-P", "--profile", action="store", default="", help="profile name to use, e.g. test, production" - ) - result.add_argument( - "-d", - "--destination", - type=str, - action="store", - default="", - help="Location to place the file (default is current working directory)", - ) - # result.add_argument('-e', '--email', type=str, action='store', default='', help='Email for completion notification') - result.add_argument("filename", type=str, action="store", help="NGAS file id to retrieve.") - return result - - -# A typical response we need to extract information from: -# -# <?xml version="1.0" encoding="UTF-8"?> -# <!DOCTYPE NgamsStatus SYSTEM "http://aocngas-master.aoc.nrao.edu:7777/RETRIEVE?internal=ngamsStatus.dtd"> -# <NgamsStatus> -# <Status CompletionTime="2018-10-24T11:27:24.637" Date="2018-10-24T11:27:24.629" HostId="aocngas-master" Message="Successfully handled command STATUS" RequestId="4150" RequestTime="2018-10-24T11:27:24.623" State="ONLINE" Status="SUCCESS" SubState="IDLE" Version="v4.2.2-ALMA/2013-12-101T16:00:00"/> -# <DiskStatus Archive="NRAO-ARCHIVE" AvailableMb="83" BytesStored="1091949384027" Checksum="" Completed="1" CompletionDate="2010-08-02T09:17:17.368" DiskId="3c790665f4f353cb2ae19faaa85ea754" HostId="aocngas-4" InstallationDate="2009-12-04T13:23:21.957" LastCheck="" LogicalName="NRAO-ARCH-M-000184" Manufacturer="Western Digital" MountPoint="/NGAS/volumes/Volume01" Mounted="1" NumberOfFiles="33445" SlotId="Volume01" TotalDiskWriteTime="19938" Type="raid1_part2"> -# <FileStatus AccessDate="" Checksum="711574960" ChecksumPlugIn="ngamsGenCrc32" Compression="" CreationDate="2010-02-11T10:35:02.000" FileId="uid___evla_sdm_X1265909221067.sdm" FileName="data/2010-02-11/1/uid___evla_sdm_X1265909221067.sdm" FileSize="395" FileStatus="00000000" FileVersion="1" Format="application/x-sdm" Group="" Ignore="0" IngestionDate="2010-02-11T10:35:02.032" ModificationDate="" Owner="" Permissions="" Tag="" UncompressedFileSize="395"/> -# </DiskStatus> -# </NgamsStatus> - - -def perform_preliminary_lookup(filename): - - ## Eventually, we'll want the master node & ports as CAPO properties: config = CapoConfig() - - status_url = "http://{}.aoc.nrao.edu:{}/STATUS?file_id={}".format(_NGAS_MASTER_NODE, _NGAS_PORT, filename) - - status_info = requests.get(status_url) - - if requests.codes.ok == status_info.status_code: - - # read and parse out the HostId, FileSize (maybe FileStatus?) - xml_content = status_info.text - response_handle = BeautifulSoup(xml_content, "lxml-xml") - # print(xml_content) - - disk_handle = response_handle.NgamsStatus.DiskStatus - hostname = disk_handle.get("HostId") - - file_handle = response_handle.find("FileStatus") - - file_status = file_handle.get("FileStatus") - file_size = file_handle.get("FileSize") - - return hostname, file_size - - logger.error(f"Got code {status_info.status_code} from NGAS, cannot proceed.") - - # If something went wrong, indicate that by the return value - return None, None - - -def retrieve_file(filename, server, destination, file_size): - # - # This is a pure 'yank and put', no renaming or anything fancy. - # - - retrieve_url = "http://{}.aoc.nrao.edu:{}/RETRIEVE".format(server, _NGAS_PORT) - - # The details of the retrieval request - parameters = { - "file_id": filename, - "processing": "ngamsDirectCopyDppi", - "processingPars": "outfile=" + destination + "/" + filename, - } - - copy_response = requests.get(retrieve_url, params=parameters) - - if requests.codes.ok == copy_response.status_code: - - # xml_content = copy_response.text - # response_handle = BeautifulSoup(xml_content, "lxml-xml") - - logger.info("Success!") - - # Unfortunately, the return from the direct copy call doesn't provide us much: - # - # {'Server': 'NGAMS/v4.2.2-ALMA/2013-12-101T16:00:00', 'Date': 'Wed, 24 Oct 2018 21:44:43 GMT', 'Expires': 'Wed, 24 Oct 2018 21:44:43 GMT', 'Content-type': 'application/x-bdf', 'Content-length': '74', 'Content-disposition': 'attachment; filename=""', 'Accept-Ranges': 'bytes'} - # /NGAS/volumes/Volume32/data/2018-10-23/1/uid____evla_bdf_1540297250925.bdf - else: - logger.error(f"Direct Copy Call failed with code: {copy_response.status_code}") - - xml_content = copy_response.text - response_handle = BeautifulSoup(xml_content, "lxml-xml") - - status_handle = response_handle.NgamsStatus.Status - error_message = status_handle.get("Message") - logger.error(f"Error details: {error_message}") - - logger.info(f"{filename} retrieval complete.") - - -def ngas_retriever(): - """The heart of the retrieval process""" - - parser = _make_parser() - - arguments = parser.parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == arguments.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != arguments.profile: - os.environ["CAPO_PROFILE"] = arguments.profile - - # integrate the logs with pymygdala's logging system - handler = LogHandler(profile=arguments.profile, application="aoc_ngas_retriever") - handler.setLevel(logging.DEBUG) - logger.addHandler(handler) - - if "" == arguments.destination: - delivery_location = os.getcwd() - else: - delivery_location = arguments.destination - - if delivery_location.endswith("/"): - # remove any trailing / for consistency: - delivery_location = delivery_location[:-1] - - server, file_size = perform_preliminary_lookup(arguments.filename) - - # If we don't have the info we need, exit with an error: - if (None == server) or (None == file_size): - exit(-10) - - logger.info(f"We want to get {arguments.filename} from {server}, and we expect {file_size} bytes") - - retrieve_file(arguments.filename, server, delivery_location, file_size) - - -if __name__ == "__main__": - ngas_retriever() diff --git a/apps/cli/executables/pexable/ingest/pyat/wf/__init__.py b/apps/cli/executables/pexable/ingest/pyat/wf/__init__.py deleted file mode 100644 index 6f635dec681b77ed7663be362a05ee5261a5c3cc..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/wf/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -r""" wf: utility for running workflows -""" -from pyat.wf.commands import WorkflowTracker, wf diff --git a/apps/cli/executables/pexable/ingest/pyat/wf/commands.py b/apps/cli/executables/pexable/ingest/pyat/wf/commands.py deleted file mode 100644 index ff70d5a9dab3635cf5f117ab2378068fc5f2e1d6..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/wf/commands.py +++ /dev/null @@ -1,537 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from __future__ import print_function - -import argparse as ap -import json -import logging -import os -import sys -import time - -import pika -from pyat import version -from pyat.pymygdala import LogHandler, RPCEvent -from pycapo import CapoConfig - -_DESCRIPTION = """AAT/PPI workflow launcher, version {}. Launch a workflow from -the command line.""" - - -def _make_parser(): - r"""Build a command line parser for this app: this is external to MrClean and/or CapoSettings because both need - it, and Sphinx will want a look at ot to build docs.""" - result = ap.ArgumentParser(description=_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter) - result.add_argument("-P", "--profile", action="store", help="profile name to use, e.g. test, production") - result.add_argument( - "-e", - "--exchange", - action="store", - default="archive.workflow-commands", - help="exchange to send to (you probably want the default)", - ) - result.add_argument( - "-s", - "--processingsite", - action="store", - default="DSOC", - choices=["NAASC", "DSOC"], - help="site where processing should occur (either DSOC or NAASC)", - ) - result.add_argument( - "-p", - "--property", - action="append", - default=[], - help="provide a KEY=VALUE pair to be passed to the workflow; can be used multiple times", - ) - result.add_argument( - "workflow", - action="store", - help="name of the workflow to initiate; e.g. runDownloadWorkflow, runSdmIngestionWorkflow", - ) - return result - - -def wf(**kwargs): - # parse out the command line args here and decide what to do - args = _make_parser().parse_args(**kwargs) - - connection = connect_to_amqp(args.profile) - channel = connection.channel() - - # make the exchange we need - channel.exchange_declare(args.exchange, "topic", durable=True) - - # process the properties passed in - properties = dict(arg.split("=") for arg in args.property) - - # if it's in there, fileSetIds needs some special care. - if "fileSetIds" in properties: - # The script needs to pass an array in the json. This drop spare square brackets - # and split according to commas to create a list which is then decoded properly - middleman = properties["fileSetIds"] - # replace any square braces in the input - idList = middleman.replace("[", "").replace("]", "").split(",") - # make fileSetIds a list of strings, not a string with a list - properties["fileSetIds"] = idList - - # if it's in there, the bdf list needs some special care. - if "bdfs" in properties: - # The script needs to pass an array in the json. This drop spare square brackets - # and split according to commas to create a list which is then decoded properly - middleman = properties["bdfs"] - # replace any square braces in the input - idList = middleman.replace("[", "").replace("]", "").split(",") - # make fileSetIds a list of strings, not a string with a list - properties["bdfs"] = idList - - # The sets of imaging parameters need to be a JsonArray, so we have work to do: - if "optimizedImagingParameters" in properties: - cube_list = [] - json_parameters = json.loads(properties["optimizedImagingParameters"]) - - # create a list of cubes, which will get interpreted correctly: - for cube in json_parameters: - cube_list.append(cube) - - # replace the old string we were passed with the new value - properties["optimizedImagingParameters"] = cube_list - - # build the message - message = { - "eventName": args.workflow, - "type": "edu.nrao.archive.workflow.messaging.commands.StartWorkflow", - "additionalPaths": [], - "metadata": properties, - } - - # dispatch it - channel.basic_publish( - exchange=args.exchange, routing_key=args.processingsite.lower() + ".start", body=json.dumps(message) - ) - - -def connect_to_amqp(profile): - # load up Capo - capo = CapoConfig(profile=profile) - - # get AMQP settings - hostname = capo.getstring("edu.nrao.archive.configuration.AmqpServer.hostname") - username = capo.getstring("edu.nrao.archive.configuration.AmqpServer.username") - password = capo.getstring("edu.nrao.archive.configuration.AmqpServer.password") - - # connect - connection = pika.BlockingConnection( - pika.ConnectionParameters(hostname, credentials=pika.PlainCredentials(username, password)) - ) - return connection - - -# -# Helper class for tracking a workflow: -# -class WorkflowTracker: - """An encapsulation of using an RPCEvent object to generate an ID - and receive the working directory and loggingId for a workflow - launched via wf. - - Usage: - my_tracker = new WorkflowTracker(current_profile) - uid_value = my_tracker.prepareWorkflowTracking("runMyWorkflow", <optional email address for completion>) - - # create a wf call as usual, but include another key in the metadata: - wf_arguments += " -p cliCorrId=" + uid_value - # send the wf command - - - my_tracker.waitForReply() - - wd_name = my_tracker.getWorkingDirectory() - lid = my_tracker.getLoggingId() - - print("Yadda, yadda, {} yadda {}".format(wd_name,lid)) - - - """ - - def __init__(self, profile): - self._rpc = RPCEvent(profile=profile, exchange="archive.events", application="commandline") - - self._work_dir_name = None - self._log_id = None - - def close(self): - self._rpc.close() - - def prepareWorkflowTracking(self, workflow_name, email=None): - - # Create the event: Versions with and without an email. - if email is None: - event = { - "message": "Tracking Request for" + workflow_name, - "request": "monitor", - "logData": {"workflowId": workflow_name}, - } - else: - event = { - "message": "Tracking Request for " + workflow_name, - "request": "monitor", - "logData": {"workflowId": workflow_name, "email": email}, - } - - tracking_key = self._rpc.send(event) - return tracking_key - - def waitForReply(self): - # Now, wait for the initial processing and populate our variables - # This will block until the direct reply arrives. - answer = self._rpc.get_reply() - - if "working_directory" in answer: - self._work_dir_name = answer["working_directory"] - - if "logging_id" in answer: - self._log_id = answer["logging_id"] - - def getWorkingDirectory(self): - return self._work_dir_name - - def getLoggingId(self): - return self._log_id - - -# -# Specific WF usages -# - - -# CIPL CLI -_RUN_CIPL_DESCRIPTION = """AAT/PPI Calibration Launcher, version {}: This tool initiates the standard CASA Calibration -Pipeline on the indicated execution blocks. Note: This tool ignores the ciplRunState Capo property. It will always - start the requested calibrations.""" - - -def _make_cipl_parser(): - r"""Command-line CIPL Launch Parser""" - result = ap.ArgumentParser( - description=_RUN_CIPL_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument("-P", "--profile", action="store", default="", help="profile name to use, e.g. nmtest, mnprod") - result.add_argument("-C", "--casa", action="store", default="", help="Path to Casa package to use") - result.add_argument( - "fileSetIds", type=str, action="store", nargs="+", help="File Set Identifiers to be run through CIPL" - ) - return result - - -def launch_calibrations(): - r"""Take given fileSetId(s) and launch the CIPL workflow for each""" - - # parse our arguments, get profile and list of Ids - args = _make_cipl_parser().parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # - # Command line we want is: - # - # wf -P [test|nmprod] -p workflowName=CiplCalibration -p fileSetIds=arg runCiplCalibrationWorkflow - # or - # wf -P [nmtest|nmprod] -p workflowName=CiplCalibration -p casaHome=arg -p fileSetIds=arg runCiplCalibrationWorkflow - # - # The pieces of the string - clBase = "-p workflowName=CiplCalibration -p processingSite=DSOC -P " # profile here - clFSIDPiece = " -p fileSetIds=" # fileSetId here - clTrackPiece = " -p cliCorrId=" # tracking UID here - if "" != args.casa: - clCasaPiece = " -p casaHome=" + args.casa - # insert the casa parameter here, since it is fixed for all fileSetIds - clFSIDPiece = clCasaPiece + clFSIDPiece - - clFinish = " runCiplCalibrationWorkflow" - - # create a tracking object for these workflows: - ranger = WorkflowTracker(os.environ["CAPO_PROFILE"]) - - # - # Loop over the provided fileSetIds and send a command for each, - # waiting for the previous one to report back information before - # starting the next. - # - for id in args.fileSetIds: - - # CIPL itself send emails at start & finish, so it'd be redundant here - this_uid = ranger.prepareWorkflowTracking("runCiplCalibrationWorkflow") - - wfArgs = clBase + os.environ["CAPO_PROFILE"] + clFSIDPiece + id + clTrackPiece + this_uid + clFinish - wf(args=wfArgs.split(" ")) - - # Wait for information from this workflow before we proceed: - ranger.waitForReply() - - print("CIPL ({}) for {} running in: {}".format(ranger.getLoggingId(), id, ranger.getWorkingDirectory())) - - -# CIPL Reprocess CLI -_RUN_CIPL_REPRO_DESCRIPTION = """AAT/PPI Calibration Reprocessing, version {}: This tool initiates a re-run of the CASA -calibration pipeline on the desired directories. The data are placed in the Spool for the processing and returned to the -QA area upon successful completion.""" - - -def _make_cipl_reprocess_parser(): - r"""Parser""" - result = ap.ArgumentParser( - description=_RUN_CIPL_REPRO_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument( - "-P", "--profile", action="store", default="", help="profile name to use, e.g. test, production" - ) - result.add_argument("-C", "--casa", action="store", default="", help="Path to Casa package to use") - result.add_argument( - "-m", "--main", action="store_true", help="Work in the main spool directory, not the cipl subdirectory" - ) - result.add_argument( - "directoriesOfInterest", - type=str, - action="store", - nargs="+", - help="Name of the directories to be re-run through CIPL", - ) - return result - - -def launch_recalibrations(): - """From a (list of) directory(s) launch the CIPL Reprocessing workflow for each""" - - # parse our arguments, get profile and list of Ids - args = _make_cipl_reprocess_parser().parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # - # Command line we want is: - # (processingSite for message routing) - # - # wf -P [nmtest|nmprod] -p workflowName=CiplReprocess -p processingSite=DSOC -p targetDirectory=arg runCiplReprocessingWorkflow - # - # The pieces of the string - clBase = "-p workflowName=CiplReprocess -p processingSite=DSOC -P " # profile here - clArgPiece = " -p targetDirectory=" # fileSetId here - if "" != args.casa: - clCasaPiece = " -p casaHome=" + args.casa - # insert the casa parameter here, since it is fixed for all fileSetIds - clArgPiece = clCasaPiece + clArgPiece - clArg2Piece = " -p useMainDirectory=true" - clFinish = " runCiplReprocessingWorkflow" - # clFinish = " runTestWorkflow" - # - # Loop over the provided directories and send a command for each: - # - for id in args.directoriesOfInterest: - # add the extra -p call if we're using the super-directory - if args.main: - totalCommand = clBase + os.environ["CAPO_PROFILE"] + clArgPiece + id + clArg2Piece + clFinish - else: - totalCommand = clBase + os.environ["CAPO_PROFILE"] + clArgPiece + id + clFinish - wf(args=totalCommand.split(" ")) - time.sleep(0.25) # 1/4 second deplay between workflow launches for saftey - - -# SDM reingestion CLI -_RUN_SDM_REINGEST_DESCRIPTION = """AAT/PPI SDM Re-ingestion, version {}: This tool initiates a download of the requested -Science Data Models, following which the files are re-parsed for an update of the Archive metadata database.""" - - -def _make_sdm_reingest_parser(): - result = ap.ArgumentParser( - description=_RUN_SDM_REINGEST_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument("-P", "--profile", action="store", help="profile name to use, e.g. test, production") - result.add_argument( - "fileSetId", type=str, action="store", nargs="+", help="Name of the fileset whose SDM is to be reingested" - ) - return result - - -def launch_reingest(): - """Given a fileset ID, pull the (presumably altered by QA) SDM and re-run ingestion""" - - # TODO once this is working: - # - accept a list of fileset IDs - # - accept a telescope name - - args = _make_sdm_reingest_parser().parse_args() - - # command line: - # Test cases: - # 1. no SDM source directory supplied - # -- should ultimately fail if data not present under archive-ingestion.SDMPath - # wf -P [test|nmprod] -p workflowName=Reingestion -p telescope=EVLA \ - # -p dataSetId=<FSID> runSdmReingestWorkflow - # example: wf -P test -p workflowName=Reingestion -p telescope=EVLA \ - # -p dataSetId=3_4.sb31082669.eb31333837.57311.64081266204 \ - # -p fileSetIds=[3_4.sb31082669.eb31333837.57311.64081266204] \ - # runSdmReingestWorkflow - # 2. user provides SDM source directory - # wf -P [test|nmprod] -p workflowName=Reingestion -p telescope=EVLA -p dataSetId=<FSID> \ - # -p SDMPath=</path/to/SDM> runSdmIngestionWorkflow - # example: wf -P test -p workflowName=Reingestion -p telescope=EVLA \ - # -p dataSetId=3_4.sb31082669.eb31333837.57311.64081266204 \ - # -p fileSetIds=[3_4.sb31082669.eb31333837.57311.64081266204] \ - # -p SDMPath=/lustre/aoc/cluster/pipeline/test/spool/3_4_2015_10_16_T21_58_09.207/rawdata \ - # runSdmReingestWorkflow - - reArg0 = "-p dataSetId=" - reArg1 = "-p fileSetIds=[" - reArg2 = "] -p workflowName=Reingestion " - reArg3 = "-p telescope=EVLA" - reLast = " runSdmReingestWorkflow" - command_line = "-P " + args.profile + reArg0 + args.fileSetId + reArg2 - if len(args) < 5: - # the usual ingestion case: grab SDM from standard archive location - command_line += reArg3 - else: - # manual or auto re-ingest: grab SDM from user-supplied location0 - # (use case: SDM was corrupt and fixed manually, now needs to be reingested) - reArg4 = " -p SDMPath=" + args.sdmSubdir - command_line = ( - "-P " + args.profile + reArg0 + args.fileSetId + reArg1 + args.fileSetId + reArg2 + reArg3 + reArg4 - ) - command_line += reLast - - LOG = logging.getLogger(__name__) - handler = LogHandler(profile="test", application="test-app", level=logging.DEBUG) - LOG.addHandler(handler) - # OG.debug("Using this command line: {}" %command_line) - # in case that syntax is wrong: - LOG.debug("Using command line '%s'" % command_line) - - wf(args=command_line.split(" ")) - - -# RestoreToCache Workflow CLI -_RUN_RESTORE_DESCRIPTION = """AAT/PPI Restore to Cache, version {}: This tool takes a FileSetId, and the name of a -calibration products tar file. It will then initiate a CASA Restore Workflow. The resultant Calibrated Measurement Set -is placed into the Cache as defined by the Capo settings provided.""" - - -def _make_r2c_parser(): - r"""Command-line CIPL Launch Parser""" - result = ap.ArgumentParser( - description=_RUN_RESTORE_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument("-P", "--profile", action="store", default="", help="profile name to use, e.g. nmtest, mnprod") - result.add_argument("-C", "--casa", action="store", default="", help="Path to Casa package to use") - result.add_argument( - "-E", "--email", action="store", default=None, help="Optional email address for a completion message" - ) - # Placeholder, workflow can't do this yet. - # result.add_argument('-D', '--destination', action='store', default='', help='Override location for CMS delivery') - result.add_argument("fileSetId", type=str, action="store", help="File Set Identifier to be Restored") - result.add_argument("calFile", type=str, action="store", help="Calibration File to use in the Restore") - return result - - -def launch_restore_to_cache(): - r"""Take given fileSetId(s) and launch the CIPL workflow for each""" - - # parse our arguments, get profile and list of Ids - args = _make_r2c_parser().parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # Obtain the Project Code from the fileSetId value (careful of VLASSA.B format) - fsid = args.fileSetId - if fsid.startswith("VLASS"): - components = fsid.split(".") - projectCode = components[0] + "." + components[1] # Grab the first two substrings - else: - projectCode = fsid.split(".")[0] # Only up to the first . - - # Send an event to initiate workflow monitoring: - my_tracker = WorkflowTracker(args.profile) - monitor_key = my_tracker.prepareWorkflowTracking("runRestoreWorkflow", email=args.email) - - # Launch the workflow - launch_restore(args, projectCode, monitor_key) - - # Now wait for information: - my_tracker.waitForReply() - - print("Restore ({}) running in: {}".format(my_tracker.getLoggingId(), my_tracker.getWorkingDirectory())) - - -def launch_restore(args, project_code, tracking_key): - # - # An Example Command Line from workflow testing: - # - # wf -p processingSite=DSOC -p workflowName=RestoreWorkflow -p telescope=EVLA - # -p calFile=16A-439_2016_10_09_T14_48_37.675.tar - # -p fileSetIds=16A-439.sb32267588.eb32942323.57670.592283148144 - # -p projectCodeOrDataType=16A-439 - # -p deliveryFormat=CMS runRestoreWorkflow - # - # Build the wf command line, starting with all the fixed pieces: - arguments = "-P " + os.environ["CAPO_PROFILE"] - # get the exchange from our requested profile (since we might be sending this to the non-default manager) - configuration = CapoConfig(profile=os.environ["CAPO_PROFILE"]) - arguments += " -e " + configuration.get( - "edu.nrao.archive.workflow.config.WorkflowManagerSettings.workflowCommandsExchangeName" - ) - # Required Parameters - arguments += " -p workflowName=RestoreWorkflow -p processingSite=DSOC -p deliveryFormat=CMS -p telescope=EVLA" - arguments += " -p fileSetIds=" + args.fileSetId - arguments += " -p calFile=" + args.calFile - arguments += " -p projectCodeOrDataType=" + project_code - arguments += " -p cliCorrId=" + tracking_key - # The Optional Parameters: - if "" != args.casa: - arguments += " -p casaHome=" + args.casa - # Option not available yet, so don't display or use it - # if '' != args.destination: - # arguments += " -p deliveryDirectory=" + args.destination - # The Finale - arguments += " runRestoreWorkflow" - # Build our command line and execute: - wf(args=arguments.split(" ")) - # Talk to the user, these CLIs are bad on feedback - print("Restoring a CMS of {} to the cache using calibration {}.\n".format(args.fileSetId, args.calFile)) diff --git a/apps/cli/executables/pexable/ingest/pyat/wf/ingest_wf_interfaces.py b/apps/cli/executables/pexable/ingest/pyat/wf/ingest_wf_interfaces.py deleted file mode 100644 index 895728d0d587dcd9eadcc2e6b37b80641c536836..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/wf/ingest_wf_interfaces.py +++ /dev/null @@ -1,630 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -# With the expansion of the number of command line tools built within the wf/commands.py file, it's getting a bit -# difficult to find what you need. This file contains the various CLI interfaces to the ingestion-focused workflows. -# -import argparse as ap -import logging -import os -import sys -import time -from pathlib import Path - -from pyat import version -from pyat.wf import WorkflowTracker, wf -from pyat.wf.ous_wf_interfaces import ( - lookup_eb_uid, - lookup_project_code, - lookup_single_locator, -) -from pycapo import CapoConfig - - -# Ingestion Workflow CLIs -def _make_ingestion_parser(ingestion_description, major_arg): - r"""Shared Command-line Ingestion Launch Parser""" - result = ap.ArgumentParser( - description=ingestion_description.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument("-P", "--profile", action="store", default="", help="profile name to use, e.g. nmtest, mnprod") - result.add_argument("-p", "--path", action="store", default="", help="Path to data (overrides CAPO setting)") - result.add_argument("fileInfo", type=str, action="store", nargs="+", help=major_arg) - return result - - -def launch_sdm_ingestion(): - r"""CLI for SDM Ingestion Workflow""" - sdm_description = """Manual SDM Ingestion, version {}: Initiates an SDM Ingestion workflow for each listed execution - block.""" - sdm_argument = "FileSet Identifiers(s) to ingest" - parser = _make_ingestion_parser(sdm_description, sdm_argument) - args = parser.parse_args() - - # Automatic Profile Determination: - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # - # Command line we want is: - # - # wf -P [test|nmprod] -p workflowName=SdmIngestion -p dataSetId=arg runSdmIngestionWorkflow - # or - # wf -P [nmtest|nmprod] -p workflowName=SdmIngestion -p SDMPath=arg -p datasetId=arg runSdmIngestionWorkflow - # - # The pieces of the string - clBase = "-p workflowName=SdmIngestion -p processingSite=DSOC -P " # profile here - clArgPiece = " -p datasetId=" # fileSetId here - if "" != args.path: - clPathPiece = " -p SDMPath=" + args.path - # insert the casa parameter here, since it is fixed for all fileSetIds - clArgPiece = clPathPiece + clArgPiece - - clFinish = " runSdmIngestionWorkflow" - - # - # Loop over the provided fileSetIds and send a command for each: - # - for id in args.fileInfo: - wfArgs = clBase + os.environ["CAPO_PROFILE"] + clArgPiece + id + clFinish - # print("wf "+wfArgs) - wf(args=wfArgs.split(" ")) - time.sleep(0.25) # 1/4 second delay between workflow launches for saftey - - -def launch_bdf_ingestion(): - r"""CLI for BDF Ingestion Workflow""" - bdf_description = """Manual BDF Ingestion, version {}: Launches a BDF ingestion workflow for the listed files.""" - bdf_argument = "BDF File(s) to Ingest" - parser = _make_ingestion_parser(bdf_description, bdf_argument) - args = parser.parse_args() - - # Automatic Profile Determination: - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # - # Command line we want is: - # - # wf -P [test|nmprod] -p workflowName=SdmIngestion -p bdfs=[list from arg] runBdfIngestionWorkflow - # or - # wf -P [nmtest|nmprod] -p workflowName=SdmIngestion -p SDMPath=arg -p bdfs=[list from arg] runBdfIngestionWorkflow - # - # The pieces of the string - clBase = "-p workflowName=BdfIngestion -p processingSite=DSOC -P " # profile here - clArgPiece = " -p bdfs=" # fileSetId here - if "" != args.path: - clPathPiece = " -p BDFPath=" + args.path - # insert the casa parameter here, since it is fixed for all fileSetIds - clArgPiece = clPathPiece + clArgPiece - - clFinish = " runBdfIngestionWorkflow" - - # We need to massage the list of filenames into a string without spaces - temp_string = str(args.fileInfo) - bdf_string = temp_string.replace(" ", "") - - # Put it all together (all files in one command: - wf_arguments = clBase + os.environ["CAPO_PROFILE"] + clArgPiece + bdf_string + clFinish - # print("wf "+wf_arguments) - wf(args=wf_arguments.split(" ")) - - -def launch_idifits_ingestion(): - r"""CLI for VLBA IDI Fits file ingestion""" - idi_description = """Manual VLBA IDI FITS Ingestion, version {}: Initiates an ingestion workflow for each idi fits - file in the named directory.""" - idi_argument = "Folder named for the project & segment to process (all contained IDIFITS files will be ingested)" - parser = _make_ingestion_parser(idi_description, idi_argument) - args = parser.parse_args() - - # Automatic Profile Determination: - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # We need our full path, so check for the -p override, or extract it from CAPO - settings = CapoConfig(profile=os.environ["CAPO_PROFILE"]) - path_base_string = settings.getstring("archive-ingestion.VLBAPath") - if "" != args.path: - path_base_string = args.path - - base_ingestion = Path(path_base_string) - - # A couple checks: - if not base_ingestion.exists(): - logging.error(f"Base ingestion path {path_base_string} doesn't exist!") - exit(-1) - if not base_ingestion.is_dir() or not base_ingestion.is_absolute(): - logging.error(f"Base ingestion path is inappropriate: {path_base_string}") - exit(-1) - - # - # So, for each directory we're given, we need to: - # - # 1) extract the legacy ID to provide the workflow - # 2) obtain a listing of the fits files, and launch a workflow to ingest each one. - # - for directory_name in args.fileInfo: - # The directories are named in a pattern, which makes my life easier: - # (ProjectCode)(Segment).(CorrelatorPass) - # The project code (what we call LegacyId) follows AA111 - # The segment follows A[0-9]* - # directory_components = directory_name.split(".") - # legacy id is the first 5 characters of the first piece, which is guaranteed to exist from split() - # legacy_id = directory_components[0][:5] - # print(f"The Legacy id for {directory_name} is {legacy_id}.") - - # - # Now get the filenames: - # - ingestion_path = base_ingestion / directory_name - - files = ingestion_path.glob("*.idifits") - for file in files: - print(f"\tLaunching workflow to ingest: {file.name} from {str(ingestion_path)}") - - # - # The files have names in the format: - # VLBA_DQ840_dq840_BIN0_SRC0_02_181016T191428.idifits* - # - # VLBA_[PC][Segment]_....... - # We can use this to extract the project code on a per-file basis. - # This is safer for a bulk-ingestion of legacy data. - name_components = file.name.split("_") - - if 3 >= len(name_components): - # if we don't have the requisite number of pieces, then skip it! - print(f"Error! File {file.name} has only {len(name_components)} subsections.") - continue - - legacy_id = name_components[1][:5] - # print(f"Legacy id for {file.name} is {legacy_id}.") - - # - # Command line we want to emulate: - # - # wf -P nmtest - # -p ingestionPath=/home/e2earchive/hold/difx/BD215G3.bd215g3.cata - # -p subDirOrFileName=VLBA_BD215G3_bd215g3_BIN0_SRC1_0_181001T142116.idifitsVLBA_BD215G3_bd215g3_BIN0_SRC1_0_181001T142116.idifits - # -p projectCode=BD215 -p ingestionType=vlba -p workflowName=VlbaIngestion runVlbaIngestionWorkflow - # - # The pieces of the string - cl_base = "-p workflowName=VlbaIngestion -p ingestionType=vlba -s DSOC -P " # profile here - cl_arg_piece = " -p subDirOrFileName=" + file.name - cl_path_piece = " -p ingestionPath=" + str(ingestion_path) - cl_code_piece = " -p projectCode=" + legacy_id - cl_finish = " runVlbaIngestionWorkflow" - - total_command = ( - cl_base + os.environ["CAPO_PROFILE"] + cl_arg_piece + cl_path_piece + cl_code_piece + cl_finish - ) - # print(f"\tFor WF: {total_command}") - - wf(args=total_command.split(" ")) - time.sleep(1.25) # Wait a bit between workflow launches - - print(f"Finished with {directory_name}.\n") - - -# -# Image ingestion is a slightly different beast: You point to a directory, and we collect the FITS files -# and bundle the ancillary files into a tar bundle for ingestion. -# -# For image reingestion, you assume the directory already has just the FITS files and the tar bundle. -# -def _make_image_ingestion_parser(ingestion_description): - r"""Shared Command-line Ingestion Launch Parser""" - result = ap.ArgumentParser( - description=ingestion_description.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument("-P", "--profile", action="store", default="", help="profile name to use, e.g. nmtest, mnprod") - result.add_argument("projectCode", action="store", type=str, help="Project for these Images") - result.add_argument( - "imageSetLoc", - action="store", - type=str, - nargs="+", - help="Directory from which to draw FITS images & ancillary file(s)", - ) - return result - - -def launch_image_ingestion(): - r"""CLI for the Image Ingestion Workflow""" - image_description = """Manual Image Ingestion, version {}: Initiates an image ingestion workflow - for each listed location (note, all sets ingested with a single command will - share the same project)""" - parser = _make_image_ingestion_parser(image_description) - args = parser.parse_args() - - # Automatic Profile Determination: - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # - # Command line we want is: - # - # wf -P [test|nmprod] -p workflowName=SdmIngestion -p dataSetId=arg runSdmIngestionWorkflow - # or - # wf -P [nmtest|nmprod] -p workflowName=SdmIngestion -p SDMPath=arg -p datasetId=arg runSdmIngestionWorkflow - # - # The pieces of the string - clBase = "-p workflowName=QuicklookImageIngestion -p processingSite=DSOC -p ingestionType=vlass_quicklook -P " # profile here - clProjectPiece = " -p projectCode=" + args.projectCode - clArgPath = " -p ingestionPath=" - clArgPiece = " -p subDirOrFileName=" - clFinish = " runQuicklookIngestionWorkflow" - - # - # Loop over the provided directories and send a command for each: - # - for id in args.imageSetLoc: - id_as_path = Path(id) - subdirectory = str(id_as_path.name) - ingest_path = str(id_as_path.parent) - wfArgs = ( - clBase - + os.environ["CAPO_PROFILE"] - + clProjectPiece - + clArgPath - + ingest_path - + clArgPiece - + subdirectory - + clFinish - ) - # print("wf "+wfArgs) - wf(args=wfArgs.split(" ")) - time.sleep(0.25) # 1/4 second delay between workflow launches for saftey - - -def launch_image_reingestion(): - r"""CLI for the Image Ingestion Workflow""" - image_description = """Manual Image Metadat Reingestion, version {}: provided the location of an image set - (Fits files + tar) this workflow deletes the existing metadata & rebuilds the entries. A full cycle - reingestion workflow is possible, but not yet necessary. """ - parser = _make_image_ingestion_parser(image_description) - args = parser.parse_args() - - # Automatic Profile Determination: - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # - # Command line we want is: - # - # wf -P [test|nmprod] -p workflowName=SdmIngestion -p dataSetId=arg runSdmIngestionWorkflow - # or - # wf -P [nmtest|nmprod] -p workflowName=SdmIngestion -p SDMPath=arg -p datasetId=arg runSdmIngestionWorkflow - # - # The pieces of the string - clBase = "-p workflowName=ImageReingestion -p processingSite=DSOC -P " # profile here - clProjectPiece = " -p projectCode=" + args.projectCode - clArgPiece = " -p sourceDirectory=" - clFinish = " runImageReingestionWorkflow" - - # - # Loop over the provided directories and send a command for each: - # - for id in args.imageSetLoc: - wfArgs = clBase + os.environ["CAPO_PROFILE"] + clProjectPiece + clArgPiece + id + clFinish - # print("wf "+wfArgs) - wf(args=wfArgs.split(" ")) - time.sleep(0.25) # 1/4 second delay between workflow launches for saftey - - -_WORKFLOW_NAME = "AoiIngestionWorkflow" - -_RUN_AOI_DESCRIPTION = """AAT/PPI ALMA Optimized Image Ingestion, version {}: This tool initiates AOI for the supplied - fileSetId(s). Upon successful processing, the request state is changed to PENDINGQA, and the user is notified - that the request awaits QA. When the data have passed QA, the data are delivered, request state is changed to - COMPLETE and the user sent a download link. """ - - -def find_mous_id(path_to_data): - r"""Somewhere in the path will be the external name, - either just below the top-level directory (if no request ID) - or underneath top-level-dir/request_id/. - """ - - external_name = None - filename = None - rawdata_dir = None - for base, dirs, files in os.walk(path_to_data): - for dir in dirs: - # A directory name corresponding to the mousId will have underscores rather than - # colon & slashes - if str(dir).endswith("rawdata"): - rawdata_dir = dir - break - - if rawdata_dir is not None: - for base, dirs, files in os.walk(path_to_data): - # the ASA_OUS_ID will be hidden in the name of a data file; - # it -won't- be a directory name - for file in files: - if str(file).startswith("member."): - filename = str(file) - break - - if filename is not None: - parts = filename.split(".") - external_name = parts[1] - break - - if external_name is not None: - break - - if external_name is not None: - # translate to OUS ID format - mousId = external_name.replace("___", "://").replace("_", "/") - return mousId - - return None - - -def find_working_subdirectory(request_path): - """ - A utility for handling external requests. The tool is - provided a directory named for the request id, and we - need to provide the name of the actual working directory - underneath. - - Note: for an externally-initiated AUDI there should be - a single subdirectory, if we find more than one, we've - got an issue. - :return: name of subdirectory (or None if an error occurs) - """ - - request_subdir = None - - for component in request_path.iterdir(): - if component.is_dir(): - # we really only ought to have one... - if request_subdir is None: - request_subdir = component.name - else: - # if we've already filled in an answer - # and found another subdirectory.... - # something's wrong. - return None - - return request_subdir - - -def launch_alma_image_ingest_qa(): - r"""Launch runAoiIngestionWorkflow for data in given image-qa subdirectory - Based on ingest_wf_interfaces.launch_image_ingestion() -- thanks, Jim - """ - - # example command lines: - # - # audiPass uid___A002_Xd3607d_X2b0d_2018_10_16_T14_19_15.962 -E jgoldste@nrao.edu - # audiPass 299837780 - # - # subdirectory is assumed to exist under AlmaImagingWorkflowSettings.qaDirectory - # - - # parse our arguments; get profile and other info we need - args = _make_audi_pass_parser().parse_args() - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - capo_profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = capo_profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(capo_profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - capo_profile = os.environ["CAPO_PROFILE"] - configuration = CapoConfig(profile=capo_profile) - top_level_dir = configuration.get("edu.nrao.archive.workflow.config.AlmaImagingWorkflowSettings.qaDirectory") - - # stray '/' cause problems: - provided_qa_dir = args.sourceDirectory.replace("/", "") - path_to_data = os.path.join(top_level_dir, provided_qa_dir) - - if not os.path.isdir(path_to_data): - raise NotADirectoryError(f"{path_to_data} not found") - - # Check if we were given a request Id - try: - request_id = int(provided_qa_dir) - # with a request id, our subdirectory of interest is one level down, - # go find it - subdirectory = find_working_subdirectory(Path(top_level_dir, provided_qa_dir)) - - if subdirectory is None: - print(f"Error: Could not identify the working directory under {provided_qa_dir}.") - - exit(-1) - - except ValueError: - # If this fails, then we have an internal run - # no request id, just directly given the working directory - request_id = None - subdirectory = provided_qa_dir - - mous_id = find_mous_id(path_to_data) - - if mous_id is not None: - try: - project_code = lookup_project_code(mous_id) - except TypeError: - print(f">>> No project code found for MOUS ID {mous_id}") - exit(-1) - else: - print(f"Error: MOUS ID not found in {provided_qa_dir}.") - exit(-1) - - if project_code is None: - print(f"Error: No project code found for MOUS ID {mous_id}.") - exit(-1) - - my_tracker = WorkflowTracker(capo_profile) - monitor_key = my_tracker.prepareWorkflowTracking(_WORKFLOW_NAME, email=args.email) - - launch_audi_pass(mous_id, project_code, subdirectory, request_id, monitor_key) - - # Now wait for information: - my_tracker.waitForReply() - - print(f"Image ingestion QA ({my_tracker.getLoggingId()}) running in: {my_tracker.getWorkingDirectory()}") - - -def _make_audi_pass_parser(): - - r"""Command-line AOI Parser""" - - result = ap.ArgumentParser( - description=_RUN_AOI_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter - ) - - result.add_argument("-P", "--profile", action="store", default="", help="profile name to use, e.g. nmtest, mnprod") - - result.add_argument("sourceDirectory", action="store", type=str, help="image-qa subdirectory containing data") - - result.add_argument( - "-E", "--email", action="store", default=None, help="Optional email address for a completion message" - ) - - # Placeholder; workflow can't do this yet. - # result.add_argument('-D', '--destination', action='store', default='', help='Override location for AUDI pass') - - return result - - -def launch_audi_pass(data_set_id, project_code, subdir, request_id, tracking_key): - # build pieces of command line - - capo_profile = os.environ["CAPO_PROFILE"] - arguments = "-P " + capo_profile - arguments += " -s NAASC" - arguments += " -p telescope=ALMA" - arguments += " -p projectCode=" + project_code - arguments += " -p workflowName=AoiIngestionWorkflow" - arguments += " -p subDirOrFileName=" + subdir - arguments += " -p dataSetId=" + data_set_id - if request_id is not None: - arguments += " -p requestId=" + str(request_id) - arguments += " -p ingestionType=alma_aoi" - arguments += " -p cliCorrId=" + tracking_key - arguments += " run" + _WORKFLOW_NAME - - wf(args=arguments.split(" ")) - - -# -# -# Collection-specific Variants -# -# - - -def _make_realfast_parser(ingestion_description, major_arg): - r"""Shared Command-line Ingestion Launch Parser""" - result = ap.ArgumentParser( - description=ingestion_description.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument("-P", "--profile", action="store", default="", help="profile name to use, e.g. nmtest, mnprod") - result.add_argument( - "-s", "--sdm_path", action="store", default="", help="Path to the RealFast SDM (overrides CAPO setting)" - ) - result.add_argument( - "-p", "--png_path", action="store", default="", help="Path to the candidate PNG files (overrides CAPO setting)" - ) - result.add_argument("sdmName", type=str, action="store", nargs="+", help=major_arg) - return result - - -def launch_realfast_sdm_ingestion(): - r"""CLI for RealFast SDM Ingestion Workflow""" - rf_description = """RealFast SDM Ingestion, version {}: Initiates an ingestion workflow for the SDM and ancillary - files for each execution block listed.""" - rf_argument = "FileSet Identifiers(s) to ingest" - parser = _make_realfast_parser(rf_description, rf_argument) - args = parser.parse_args() - - # Automatic Profile Determination: - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # - # Very similar to regular SDM ingestion, the command line we want is: - # - # wf -P [test|nmprod] -p workflowName=RfSdmIngestion -p dataSetId=arg runRealFastSdmIngestionWorkflow - # or - # wf -P [nmtest|nmprod] -p workflowName=RfSdmIngestion -p SDMPath=arg -p pngPath=arg -p datasetId=arg runRealFastSdmIngestionWorkflow - # - # The pieces of the string - clBase = "-p workflowName=RfSdmIngestion -p processingSite=DSOC -P" # profile here - clArgPiece = " -p ingestionType=realfast_sdm -p datasetId=" # fileSetId here - if "" != args.sdm_path: - clPathPiece = " -p SDMPath=" + args.sdm_path - # insert the casa parameter here, since it is fixed for all fileSetIds - clArgPiece = clPathPiece + clArgPiece - - if "" != args.png_path: - clPathPiece = " -p pngPath=" + args.png_path - # insert the casa parameter here, since it is fixed for all fileSetIds - clArgPiece = clPathPiece + clArgPiece - - clFinish = " runRealFastIngestionWorkflow" - - # - # Loop over the provided fileSetIds and send a command for each: - # - for id in args.sdmName: - wfArgs = clBase + os.environ["CAPO_PROFILE"] + clArgPiece + id + clFinish - print("wf " + wfArgs) - wf(args=wfArgs.split(" ")) - time.sleep(0.25) # 1/4 second delay between workflow launches for safety diff --git a/apps/cli/executables/pexable/ingest/pyat/wf/ous_wf_interfaces.py b/apps/cli/executables/pexable/ingest/pyat/wf/ous_wf_interfaces.py deleted file mode 100644 index 4ef45a8fbcaebf1baa035e22f92b78569c180267..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/wf/ous_wf_interfaces.py +++ /dev/null @@ -1,378 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import argparse as ap -import json -import os -import re -import sys -from datetime import datetime -from pathlib import Path - -import cx_Oracle as almadb -import psycopg2 -import pyat.schema -from pyat import version -from pyat.wf import WorkflowTracker, wf -from pycapo import CapoConfig - -# Alma Restores CLI: -_RUN_ALMA_RESTORE_DESCRIPTION = """AAT/PPI ALMA Data Restore, version {}: This tool takes a Member OUS Status UID, - and from there it launches an ALMA specific version of the Restore workflow using the current version of the - calibration information from the NAASC archives. """ - - -def _make_alma_restore_parser(): - r"""Command-line ALMA Restore Launch Parser""" - result = ap.ArgumentParser( - description=_RUN_ALMA_RESTORE_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument("-P", "--profile", action="store", default="", help="profile name to use, e.g. nmtest, mnprod") - result.add_argument("-C", "--casa", action="store", default="", help="Path to Casa package to use") - result.add_argument( - "-E", "--email", action="store", default=None, help="Optional email address for a completion message" - ) - # Placeholder, workflow can't do this yet. - # result.add_argument('-D', '--destination', action='store', default='', help='Override location for CMS delivery') - result.add_argument("mousUid", type=str, action="store", help="Member ObsUnitSet Identifier to be Restored") - - return result - - -def connect_alma(config): - return pyat.schema.create_session("ALMA").connection().engine.raw_connection() - - -def connect_metadata(config): - return pyat.schema.create_session("SDM").connection().engine.raw_connection() - - -def lookup_project_code(mous_uid): - r"""We want the project code to simplify the job of the workflow (and, as a smoke test for whether - the alma archive will behave itself for this process)""" - - configuration = CapoConfig() - - alma_handle = connect_alma(configuration).cursor() - - _ALMA_PC_QUERY = "select ASA_PROJECT_CODE from ASA_OUS where ASA_OUS_ID= :mous_id" - - alma_handle.execute(_ALMA_PC_QUERY, mous_id=mous_uid) - - result = alma_handle.fetchone()[0] - - return result - - -def lookup_single_locator(mous_uid): - configuration = CapoConfig() - - _AAT_PL_QUERY = """SELECT science_product_locator FROM execution_blocks WHERE alma_ous_id=%s""" - - aat_handle = connect_metadata(configuration).cursor() - aat_handle.execute(_AAT_PL_QUERY, [mous_uid]) - - return aat_handle.fetchone()[0] - - -def lookup_eb_uid(mous_uid): - r"""Another query, we need a fileSetId related to our MOUS""" - configuration = CapoConfig() - - alma_handle = connect_alma(configuration).cursor() - - _ALMA_EB_QUERY = "select ASDM_UID from ASA_SCIENCE where MEMBER_OUSS_ID= :mous_id" - - alma_handle.execute(_ALMA_EB_QUERY, mous_id=mous_uid) - - # We'll get a bunch of results, but we only need one ASDM to proceed - result = alma_handle.fetchone()[0] - - return result - - -def send_alma_ous_workflow_start(args, project_code, locator, file_set_id, tracking_key, cube_params=None): - r"""Build the arguments for the WF call, and off we go!""" - # An Example Command Line from workflow testing: - # - # wf -P nmtest -s DSOC - # -p ousStatusId=uid://A001/X1284/X265f - # -p fileSetIds=uid://A002/Xc7111c/X3979 - # -p telescope=ALMA - # -p projectCodeOrDataType=2017.1.00886.L - # runAlmaRestoreTest - # - # Build the wf command line, starting with all the fixed pieces: - arguments = "-s NAASC -p processingSite=NAASC -p telescope=ALMA" - # Required Parameters - arguments += " -P " + os.environ["CAPO_PROFILE"] - arguments += " -p productLocator=" + locator - arguments += " -p fileSetIds=" + file_set_id - arguments += " -p ousStatusId=" + args.mousUid - arguments += " -p projectCodeOrDataType=" + project_code - arguments += " -p cliCorrId=" + tracking_key - - # # Initial attempt to get it working again: Give it an explict working directory: - # santized_mous = args.mousUid.replace(':', '_').replace('/', '_') - # timestamp = datetime.now().isoformat().replace('-','_').replace(':','_') - # arguments += " -p relativePath="+santized_mous+'_'+timestamp - - # Control whether we just restore, or image as well: - if cube_params is None: - arguments += " -p workflowName=AlmaOusRestoreWorkflow" - arguments += " -p downloadDataFormat=CMS" - arguments += " -p deliveryFormat=CMS" - else: - arguments += " -p workflowName=AlmaOusImagingWorkflow" - arguments += " -p downloadDataFormat=IMG" - arguments += " -p deliveryFormat=IMG" - arguments += " -p optimizedImagingParameters=" + cube_params - # The Optional Parameters: - if "" != args.casa: - arguments += " -p casaHome=" + args.casa - else: - config = CapoConfig() - arguments += " -p casaHome=" + config["edu.nrao.archive.workflow.config.CasaVersions.homeForAlmaRestore"] - # Option not available yet, so don't display or use it - # if '' != args.destination: - # arguments += " -p deliveryDirectory=" + args.destination - # The Finale - if cube_params is None: - arguments += " runAlmaBasicRestoreWorkflow" - else: - arguments += " runAlmaOptimizedImagingWorkflow" - # Build our command line and execute: - wf(args=arguments.split(" ")) - - # Talk to the user, these CLIs are bad on feedback - print("Initiating processing of {} to spool.\n".format(args.mousUid)) - - -def launch_alma_restore(): - r"""Take given mous_uid and launch a restore for it. One/command, these are expensive.""" - - # parse our arguments, get profile and list of Ids - args = _make_alma_restore_parser().parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - - # In order to use the direct reply functionality, we need to - # send these messages via the NM system. - if "va" in args.profile: - profile_to_use = args.profile.replace("va", "nm") - else: - profile_to_use = args.profile - - os.environ["CAPO_PROFILE"] = profile_to_use - - # Obtain the Project Code & an ASDM UID: Require queries of the ALMA database: - project_code = lookup_project_code(args.mousUid) - asdm_uid = lookup_eb_uid(args.mousUid) - asdm_locator = lookup_single_locator(args.mousUid) - - # Send an event to initiate workflow monitoring: - - my_tracker = WorkflowTracker(args.profile) - monitor_key = my_tracker.prepareWorkflowTracking("runAlmaRestoreWorkflow", email=args.email) - - # Launch the workflow - send_alma_ous_workflow_start(args, project_code, asdm_locator, asdm_uid, monitor_key) - - # Now wait for information: - my_tracker.waitForReply() - - # and tell the user where things are happening: - print("Alma Restore ({}) running in: {}".format(my_tracker.getLoggingId(), my_tracker.getWorkingDirectory())) - - -# Optimized Imaging -_RUN_ALMA_IMAGING_DESCRIPTION = """AAT/PPI ALMA Optimized Imaging, version {}: This tool takes a Member OUS Status UID - and json file of parameters. It then proceeds to initate the Optimized Imaging variant of the ALMA OUS processing - workflow. It makes use of the template_hifa_cubeimage.xml recipe provided by the pipeline. """ - - -def _make_alma_cube_imaging_parser(): - r"""Command-line ALMA Restore Launch Parser""" - result = ap.ArgumentParser( - description=_RUN_ALMA_RESTORE_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument("-P", "--profile", action="store", default="", help="profile name to use, e.g. vatest, vaprod") - result.add_argument("-C", "--casa", action="store", default="", help="Path to Casa package to use") - result.add_argument( - "-E", "--email", action="store", default=None, help="Optional email address for a completion message" - ) - result.add_argument("file", action="store", type=str, help="Name of the parameters file to use for imaging.") - result.add_argument("mousUid", type=str, action="store", help="Member ObsUnitSet Identifier to be Imaged") - - return result - - -def launch_alma_cube_imaging(): - r""" - A wrapper to set up the metadata for and tracking of an Alma Optimized - Imaging workflow (note: this is a variant on the restore above. Except - for the imaging parameters & the downloadDataFormat value, things should - be pretty much the same. - """ - - args = _make_alma_cube_imaging_parser().parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - - # In order to use the direct reply functionality, we need to - # send these messages via the NM system. - if "va" in args.profile: - profile_to_use = args.profile.replace("va", "nm") - else: - profile_to_use = args.profile - - os.environ["CAPO_PROFILE"] = profile_to_use - - parameters_file = Path(args.file) - if not parameters_file.exists(): - print(f"Can't find file {parameters_file}! Not executing workflow.") - exit(5) - - # if we got here, then the file exists, read the contents for passing on to the workflow: - file_handle = open(parameters_file, "r") - raw_parameters = file_handle.read() - # remove all tab/newline/spaces to allow easier writing of the json by peoples: - parameters_json = re.sub(r"[\n\t\s]*", "", raw_parameters) - - try: - structured_json = json.loads(parameters_json) - print(f"Parameters loaded in: {structured_json}") - # Note: the json parsing here is just for validation purposes. - except ValueError: - print(f"{parameters_file} is not properly formatted Json. Attempted to parse: {parameters_json}") - exit(3) - - # Obtain the Project Code & an ASDM UID: Require queries of the ALMA database: - project_code = lookup_project_code(args.mousUid) - asdm_uid = lookup_eb_uid(args.mousUid) - asdm_locator = lookup_single_locator(args.mousUid) - - # Send an event to initiate workflow monitoring: - my_tracker = WorkflowTracker(args.profile) - monitor_key = my_tracker.prepareWorkflowTracking("runAlmaOptimizedCubeWorkflow", email=args.email) - - # Launch the workflow - send_alma_ous_workflow_start(args, project_code, asdm_locator, asdm_uid, monitor_key, cube_params=parameters_json) - - # Now wait for information: - my_tracker.waitForReply() - - # and tell the user where things are happening: - print("Alma Cube Imaging ({}) running in: {}".format(my_tracker.getLoggingId(), my_tracker.getWorkingDirectory())) - - -# Optimized Imaging Reprocess - -_RUN_AOI_REPRO_DESCRIPTION = """AAT/PPI Alma Imaging Reprocessing, version {}: This tool initiates a re-run of the CASA imaging pipeline on the desired directory. The data are placed in the Spool for the processing and returned to the QA area upon successful completion.""" - - -def _make_aoi_reprocess_parser(): - r"""Parser""" - result = ap.ArgumentParser( - description=_RUN_AOI_REPRO_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument( - "-P", "--profile", action="store", default="", help="profile name to use, e.g. test, production" - ) - result.add_argument( - "-I", - "--image_casa", - action="store", - default="", - help="Specify a CASA for imaging purposes (overrides what was chosen in the UI)", - ) - result.add_argument( - "-K", - "--restore_casa", - action="store", - default="", - help="The C5 Kludge(tm): Separates restore processing, and sets the CASA version for restore", - ) - result.add_argument( - "-r", - "--request", - action="store", - default="", - type=str, - help="The external RequestId for this run (if applicable)", - ) - result.add_argument( - "directoryOfInterest", type=str, action="store", help="Name of the directories to be re-run through AOI" - ) - return result - - -def launch_reimaging_run(): - """From a (list of) directory(s) launch the AOI Reprocessing workflow for each""" - - # parse our arguments, get profile and list of Ids - args = _make_aoi_reprocess_parser().parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # - # Command line we want is similar to that for CIPL reprocessing: - # (processingSite for message routing) - # - # wf -P [nmtest|nmprod] -p workflowName=CiplReprocess -p processingSite=DSOC -p targetDirectory=arg runCiplReprocessingWorkflow - # - # Build up the arguments: - arguments = "-p workflowName=AoiReprocess -p processingSite=NAASC -p telescope=ALMA -s NAASC" - arguments += " -P " + os.environ["CAPO_PROFILE"] - arguments += " -p targetDirectory=" + args.directoryOfInterest - - if "" != args.image_casa: - arguments += " -p casaHome=" + args.image_casa - - # Setting this variable activates The C5 Kludge(tm) - if "" != args.restore_casa: - arguments += " -p restoreCasa=" + args.restore_casa - - if "" != args.request: - arguments += " -p requestId=" + args.request - - arguments += " runAoiReprocessingWorkflow" - # clFinish = " runTestWorkflow" - - wf(args=arguments.split(" ")) - print(f"Re-running CASA for {args.directoryOfInterest} in spool. You'll recieve an email shortly.") diff --git a/apps/cli/executables/pexable/ingest/pyat/wf/utility_wf_interfaces.py b/apps/cli/executables/pexable/ingest/pyat/wf/utility_wf_interfaces.py deleted file mode 100644 index 86d7e9824eb036817084f90526b738770d728f72..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/pyat/wf/utility_wf_interfaces.py +++ /dev/null @@ -1,82 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import argparse as ap -import os -import sys - -from pyat import version -from pyat.wf import wf - -_RUN_QACLEAN_DESCRIPTION = """""" - - -def _make_qaclean_parser(): - r"""Command-line CIPL Launch Parser""" - result = ap.ArgumentParser( - description=_RUN_QACLEAN_DESCRIPTION.format(version), formatter_class=ap.RawTextHelpFormatter - ) - result.add_argument( - "-P", "--profile", action="store", default="", help="profile name to use, e.g. dsoc-dev, dsoc-prod" - ) - result.add_argument( - "workingDirectory", type=str, action="store", nargs="+", help="Working Directories to remove from the qa area." - ) - return result - - -def launch_deletions(): - r"""Direct launch of the QaCleanupWorkflow (because SRDP)""" - - # parse our arguments, get profile and list of Ids - args = _make_qaclean_parser().parse_args() - - # Shamelessly stolen from epilogue with a twist: allow for explict profile setting via the CL - if "CAPO_PROFILE" not in os.environ and "" == args.profile: - # try to synthesize a profile from our installation root - profile = os.path.abspath(sys.argv[0]).split(os.path.sep)[-3] - os.environ["CAPO_PROFILE"] = profile - print("No CAPO_PROFILE explicitly set, synthesizing {0} by path".format(str(profile))) - elif "" != args.profile: - os.environ["CAPO_PROFILE"] = args.profile - - # - # Command line we want is: - # - # wf -s [] -P [] -p workflowName=QaCleanup -p =arg runQaCleanupWorkflow - # - # The pieces of the string - profile_name = os.environ["CAPO_PROFILE"] - if (profile_name.find("dsoc") == -1) and (profile_name.find("nm") == -1): - # Running in CV: - cl_basics = "-s NAASC -P " - else: - # Running in NM: - cl_basics = "-s DSOC -P " # profile here - cl_wf_args = " -p workflowName=QaCleanup -p subDirOrFileName=" # - cl_finish = " runQaCleanupWorkflow" - - # - # Loop over the provided fileSetIds and send a command for each, - # waiting for the previous one to report back information before - # starting the next. - # - for id in args.workingDirectory: - - wfArgs = cl_basics + profile_name + cl_wf_args + id + cl_finish - wf(args=wfArgs.split(" ")) - print(f"Launched workflow to delete {id} from the QA areas.") diff --git a/apps/cli/executables/pexable/ingest/requirements.txt b/apps/cli/executables/pexable/ingest/requirements.txt deleted file mode 100644 index b34c7f92abe06c3702ae53b342b4ca9192f3c5d5..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/requirements.txt +++ /dev/null @@ -1,28 +0,0 @@ -astropy==4.3.post1 -bcrypt==3.2.0 -certifi==2021.5.30 -cffi==1.14.6 -charset-normalizer==2.0.3 -cryptography==3.4.7 -cx-Oracle==8.2.1 -greenlet==1.1.0 -idna==3.2 -jxmlease==1.0.3 -lxml==4.6.3 -mysqlclient==2.0.3 -numpy==1.21.1 -paramiko==2.7.2 -pex==2.1.43 -pika==1.2.0 -psycopg2-binary==2.9.1 -pycapo==0.3.1 -pycparser==2.20 -pyerfa==2.0.0 -PyNaCl==1.4.0 -pysftp==0.2.9 -python-dateutil==2.8.2 -requests==2.26.0 -simplejson==3.17.3 -six==1.16.0 -SQLAlchemy==1.4.22 -urllib3==1.26.6 diff --git a/apps/cli/executables/pexable/ingest/scripts/alma-data-fetcher.sh b/apps/cli/executables/pexable/ingest/scripts/alma-data-fetcher.sh deleted file mode 100644 index a8634316feab861a49ccfd9d04467e5ac97d23d4..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/scripts/alma-data-fetcher.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. - -# -o nounset does not work if you source the ACS bash profile thing :) -set -o errexit -o xtrace - -JAVA_HOME=/opt/local/java/java8 -PATH=$JAVA_HOME/bin:$PATH -ACS_RETAIN=true -ALMASW_ROOTDIR=$(capo -q OodtSettings.almaswRootdir) -ALMASW_RELEASE=$(capo -q OodtSettings.almaswRelease) - -source ${ALMASW_ROOTDIR}/${ALMASW_RELEASE}/ACSSW/config/.acs/.bash_profile.acs - -# Let's make sure to fail if we try a data fetch inside the DSOC data center -if ! hostname -f | grep -q .cv.; then - echo "ERROR! Cannot fetch ALMA data outside the NAASC data center!" - exit 1 -fi - -# argument 1 is the directory -# argument 2 is optionally "-m" for metadata-only -# argument 3 is (or two) is the ASDM ID - -DIRECTORY=$1; shift -DATA_TYPE=$1; shift -DATASET=$1; shift - -if [ "$DATA_TYPE" = "SDMonly" ]; then - asdmExportLight -d "$DIRECTORY/rawdata" -m "$DATASET" -else - asdmExportLight -d "$DIRECTORY/rawdata" "$DATASET" -fi diff --git a/apps/cli/executables/pexable/ingest/setup.py b/apps/cli/executables/pexable/ingest/setup.py deleted file mode 100644 index 567dc644b9dc0ae444d550daedbfaadaa99babd3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/setup.py +++ /dev/null @@ -1,134 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -"""A setuptools based setup module. - -See: -https://packaging.python.org/en/latest/distributing.html -https://github.com/pypa/sampleproject -""" - -# For matching the version string. -import re - -# To use a consistent encoding -from codecs import open -from os import path - -# Always prefer setuptools over distutils -from setuptools import find_packages, setup - -this_module = "ingest" -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, "pyat/README.txt"), encoding="utf-8") as f: - long_description = f.read() - - -def read(*parts): - with open(path.join(here, *parts), "r") as fp: - return fp.read() - - -def find_version(*file_paths): - version_file = read(*file_paths) - version_match = re.search(r"^___version___ = ['\"]([^'\"]*)['\"]", version_file, re.M) - if version_match: - return version_match.group(1) - raise RuntimeError("Unable to find version string.") - - -with open("requirements.txt") as f: - requires = f.read().splitlines() - -setup( - name=this_module, - # Versions should comply with PEP440. For a discussion on single-sourcing - # the version across setup.py and the project code, see - # https://packaging.python.org/en/latest/single_source_version.html - version=find_version(this_module, "_version.py"), - description="NRAO Archive Ingest", - long_description=long_description, - # The project's main homepage. - # url='https://github.com/pypa/sampleproject', - # Author details - author="SSA Team", - author_email="dms-ssa@nrao.edu", - # Choose your license - license="GPL", - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - "Development Status :: 4 - Beta", - # Indicate who your project is intended for - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - # Pick your license as you wish (should match "license" above) - "License :: OSI Approved :: GPL License", - # Specify the Python versions you support here. In particular, ensure - # that you indicate whether you support Python 2, Python 3 or both. - "Programming Language :: Python :: 3.6", - ], - # What does your project relate to? - keywords="nrao archive", - # You can just specify the packages manually here if your project is - # simple. Or you can use find_packages(). - packages=find_packages(), - include_package_data=True, - # Alternatively, if you want to distribute just a my_module.py, uncomment - # this: - # py_modules=["my_module"], - # List run-time dependencies here. These will be installed by pip when - # your project is installed. For an analysis of "install_requires" vs pip's - # requirements files see: - # https://packaging.python.org/en/latest/requirements.html - install_requires=requires, - # tests - test_suite="pyat.tests", - tests_require=["pytest-runner==2.9"], - # List additional groups of dependencies here (e.g. development - # dependencies). You can install these using the following syntax, - # for example: - # $ pip install -e .[dev,test] - # extras_require={ - # 'dev': ['check-manifest'], - # 'test': ['coverage'], - # }, - # If there are data files included in your packages that need to be - # installed, specify them here. If using Python 2.6 or less, then these - # have to be included in MANIFEST.in as well. - # package_data={ - # 'sample': ['package_data.dat'], - # }, - # Although 'package_data' is the preferred approach, in some case you may - # need to place data files outside of your packages. See: - # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files # noqa - # In this case, 'data_file' will be installed into '<sys.prefix>/my_data' - # data_files=[('my_data', ['data/data_file'])], - # To provide executable scripts, use entry points in preference to the - # "scripts" keyword. Entry points provide cross-platform support and allow - # pip to create the appropriate form of executable for the target platform. - entry_points={ - "console_scripts": [ - "ingest = ingest.archive:main", - ], - }, -) diff --git a/apps/cli/executables/pexable/ingest/test/test_eb_persistence.py b/apps/cli/executables/pexable/ingest/test/test_eb_persistence.py deleted file mode 100644 index d293d7577f06a05ce409be1cdb5403ca2a1131b0..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/test/test_eb_persistence.py +++ /dev/null @@ -1,49 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. - -# pylint: disable=C0114, C0103, E0401, E0402 - -import pyat -from pyat.schema import ExecutionBlock, Filegroup, Project, RealfastExecutionBlock - - -def test_realfast_execblock_persistence(): - """ - Test for persistents of realfast execution blocks. - - :return: - """ - p = Project() - p.project_code = "foo" - fg = Filegroup() - eb = RealfastExecutionBlock(filegroup=fg, calibration_level=1, telescope="VLA", project_code="foo") - - session = pyat.schema.create_session("SDM", profile="local") - try: - session.add(p) - session.add(eb) - session.commit() - eb2 = session.query(RealfastExecutionBlock).all()[-1] - assert eb2 == eb - eb3 = session.query(ExecutionBlock).get(eb2.execution_block_id) - assert eb3 == eb - finally: - session.delete(eb) - session.delete(fg) - session.delete(p) - session.commit() diff --git a/apps/cli/executables/pexable/ingest/test/test_ingestion_manifest.py b/apps/cli/executables/pexable/ingest/test/test_ingestion_manifest.py deleted file mode 100644 index 9f460e739916787eba2c6fe210209411cc1c62dc..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest/test/test_ingestion_manifest.py +++ /dev/null @@ -1,96 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. - -""" Tests of the ingestion manifest """ - -# pylint: disable=C0116, E0401, W0621 - -from pathlib import Path - -import pyat.ingestion.manifestpersist as mp -import pytest -from pyat.ingestion.IngestionManifest import INGESTION_MANIFEST_FILE, IngestionManifest -from pyat.ingestion.JSONMetadataUtil import JSONMetadata -from pyat.ingestion.RealFastMetadata import RealFastMetadata -from pyat.schema import RealfastExecutionBlock - - -@pytest.fixture -def ingestion_manifest(): - ingestion_manifest = IngestionManifest(INGESTION_MANIFEST_FILE) - return ingestion_manifest - - -@pytest.fixture -def realfast_metadata(): - manifest = IngestionManifest(INGESTION_MANIFEST_FILE) - if manifest.has_collection(): - collection_metadata_file = Path("unit") / manifest.get_additional_metadata_file() - json_metadata = JSONMetadata(collection_metadata_file) - if json_metadata.isRealFast(): - realfast_metadata = RealFastMetadata(json_metadata) - return realfast_metadata - else: - return None - else: - return None - - -@pytest.mark.skip(reason="Ignoring for now") -def test_associate_group(ingestion_manifest): - assert ingestion_manifest.get_associate_group_locator() == "uid://evla/execblock/abcd-efgh-ijkl-mnop" - - -# @pytest.mark.skip(reason="Ignoring for now") -def test_type(realfast_metadata): - assert isinstance(realfast_metadata, RealFastMetadata) - - -# TODO -# NGAS files -@pytest.mark.skip(reason="Ignoring for now") -def test_realfast_attributes(realfast_metadata): - assert realfast_metadata.get_transient_dm() == 576.9 - assert realfast_metadata.get_transient_ra() == "01:55:50.2715" - assert realfast_metadata.get_transient_ra_error() == 0.05664506927973141 - assert realfast_metadata.get_transient_dec() == "+31:27:54.8557" - assert realfast_metadata.get_transient_dec_error() == 0.8496760391959711 - assert realfast_metadata.get_transient_snr() == 7.483555793762207 - assert realfast_metadata.get_transient_dm() == 576.9 - assert realfast_metadata.get_transient_dm_error() == 576.9 - assert realfast_metadata.get_preaverage_time() == 0.019999999999999997 - assert realfast_metadata.get_rfpipe_version() == "1.5.7" - assert realfast_metadata.get_prefs_id() == "f245c8a5fad6005dbe85fbee85428b4d" - assert realfast_metadata.get_rf_qa_label() == "Questionable" - assert realfast_metadata.get_rf_qa_zero_fraction() == 0.2119006529116276 - assert realfast_metadata.get_rf_qa_visibility_noise() == 0.017208602279424667 - assert realfast_metadata.get_rf_qa_image_noise() == 847.9179077148438 - - -@pytest.mark.skip(reason="Ignoring for now") -def test_realfast_execution_block(realfast_metadata): - execution_block = RealfastExecutionBlock() - assert isinstance(execution_block, RealfastExecutionBlock) - execution_block.transient_ra = realfast_metadata.get_transient_ra() - assert execution_block.transient_ra == realfast_metadata.get_transient_ra() - - -def test_manifest(): - path = Path("./tests") - manifest = IngestionManifest(path / INGESTION_MANIFEST_FILE) - assert manifest.has_collection_metadata_file() diff --git a/apps/cli/executables/pexable/ingest_envoy/LICENSE b/apps/cli/executables/pexable/ingest_envoy/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/ingest_envoy/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/ingest_envoy/README.md b/apps/cli/executables/pexable/ingest_envoy/README.md index 5005c46826bc47deb0b8ae56e27b5ae7cb7e562e..5e8f27158855eeeb450388063480f11f2ea0cee3 100644 --- a/apps/cli/executables/pexable/ingest_envoy/README.md +++ b/apps/cli/executables/pexable/ingest_envoy/README.md @@ -4,15 +4,18 @@ Ingest Envoy is responsible for setup and launch of all types of file ingestion Currently, this includes standard calibration and standard image ingestion. ``` -usage: ingest_envoy [-h] [--calibration CALIBRATION] [--image IMAGE] +usage: ingest_envoy [-h] [--calibration CALIBRATION] [--image IMAGE] [--observation OBSERVATION OBSERVATION] [--seci SECI SECI] Workspaces Ingestion System -optional arguments: +options: -h, --help show this help message and exit --calibration CALIBRATION run ingestion for a calibration product --image IMAGE run ingestion for an image product + --observation OBSERVATION OBSERVATION + run ingestion for an observation + --seci SECI SECI run ingestion for VLASS SECI image products ``` diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/__init__.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..605f9da5d335a4716acec7630ac6f50305e69202 100644 --- a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/__init__.py +++ b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Ingest envoy +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/_version.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/collectors.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/collectors.py index 49c33c0704ef316fc9b7aaf23a8147be039e5f7c..a9545581ca316e0e9ddbbe64a877a34af5db3dce 100644 --- a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/collectors.py +++ b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/collectors.py @@ -21,7 +21,7 @@ import os import shutil import subprocess -import pendulum +import arrow import sys from ingest_envoy.interfaces import CollectorIF @@ -134,7 +134,7 @@ class SECICollector(CollectorIF): :return: string """ name = "pipeline_artifacts_" - date = pendulum.now().format("YYYY_MM_DDThh_mm_ss") + date = arrow.now().format("YYYY_MM_DDThh_mm_ss") return name + date def collect_products(self): @@ -144,7 +144,7 @@ class SECICollector(CollectorIF): :return: """ self.logger.info("Collecting SECI products for staging...") - cache_path = self.parameters["seciCachePath"] + cache_path = self.parameters["sourcePath"] workflow_dir = self.parameters["workflowDir"] staging_dir = self.parameters["staging_area"] tar_name = self.create_artifacts_name() @@ -159,3 +159,31 @@ class SECICollector(CollectorIF): exit(1) aux_file_to_staging(self.staging_source_dir) + + +class ObservationCollector(CollectorIF): + """Collect Observation Products for Ingestion""" + + def __init__(self, parameters): + self.logger = logging.getLogger("ingest_envoy") + self.parameters = parameters + self.staging_source_dir = self.parameters["staging_area"] + "/" + self.parameters["workflowDir"] + + def collect_products(self): + """ + Run observation product collection script + """ + self.logger.info("Collecting observation products for staging...") + source_path = self.parameters["sourcePath"] + workflow_dir = self.parameters["workflowDir"] + staging_dir = self.parameters["staging_area"] + + # run script + collector = subprocess.run( + ["./observation-product-collector.sh", source_path, workflow_dir, staging_dir], + stdout=sys.stdout, + stderr=sys.stderr, + ) + if collector.returncode != 0: + self.logger.error("ERROR: Observation product collection failed!") + exit(1) diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingest.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingest.py index f2b5f6934eb900bebe79c4b01d8dad27ac6f2e69..2eb12035e82f443d81cb7cad42b1e48797400343 100644 --- a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingest.py +++ b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingest.py @@ -19,18 +19,20 @@ import argparse import http import logging import pathlib -from typing import Tuple, Union - -import requests import sys from distutils.util import strtobool +from typing import Tuple, Union +import requests from ingest_envoy.interfaces import IngestLauncherIF -from ingest_envoy.launchers import IngestCalibrationLauncher, IngestImageLauncher +from ingest_envoy.launchers import ( + IngestCalibrationLauncher, + IngestImageLauncher, + IngestObservationLauncher, +) from ingest_envoy.solicitor import Solicitor -from pycapo import CapoConfig - from ingest_envoy.utilities import IngestType, VLASSIngestType +from pycapo import CapoConfig """ Setup and Launch ingestion via Workspaces @@ -63,7 +65,7 @@ def _get_settings( parameters["calSpl"] = cal_spl if source_dir is not None: parameters["workflowDir"] = pathlib.Path(source_dir).name - parameters["seciCachePath"] = pathlib.Path(source_dir).parent + parameters["sourcePath"] = pathlib.Path(source_dir).parent parameters["staging_area"] = ingestion_settings.stagingDirectory parameters["storage_area"] = ingestion_settings.storageDirectory @@ -96,6 +98,13 @@ def arg_parser() -> argparse.ArgumentParser: required=False, help="run ingestion for an image product", ) + parser.add_argument( + "--observation", + nargs=2, + action="store", + required=False, + help="run ingestion for an observation", + ) parser.add_argument( "--seci", nargs=2, @@ -114,6 +123,9 @@ def check_ingest_type(args_type: Union[IngestType, VLASSIngestType], parameters: :param parameters: the parameters determined from metadata.json :return: boolean representing if the requested ingestion type matches the product type """ + if "workflowName" not in parameters and args_type == IngestType.OBS: + return True + wf_name = parameters["workflowName"] if args_type.value in wf_name: return True @@ -191,6 +203,10 @@ def _determine_ingestion_info( arg_type = VLASSIngestType.SECI parameters = _get_settings(arg_type, cal_spl=args.seci[0], source_dir=args.seci[1]) launcher = IngestImageLauncher(arg_type, parameters) + if args.observation is not None: + arg_type = IngestType.OBS + parameters = _get_settings(arg_type, filename=args.observation[0], source_dir=args.observation[1]) + launcher = IngestObservationLauncher(parameters) return arg_type, parameters, launcher diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingestion_manifest.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingestion_manifest.py index e8221a46cfaac8448ecf6c620c7d1a68e860992f..59c28cf917db89316a147e1271fd5bc844262800 100644 --- a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingestion_manifest.py +++ b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingestion_manifest.py @@ -25,7 +25,8 @@ from pathlib import Path # pylint: disable=C0301, E0401, R0903, R1721 from typing import Tuple -import pendulum +import arrow +from arrow import Arrow from ingest_envoy.manifest_components import ( INGESTION_ARTIFACTS_NAME, INIT_WEBLOG_FILENAME, @@ -44,6 +45,7 @@ from ingest_envoy.manifest_components import ( ) from ingest_envoy.schema import AbstractTextFile from ingest_envoy.std_img_manifest_utils import ImageIngestionProductsFinder +from ingest_envoy.std_obs_manifest_utils import ObservationIngestionProductsFinder from ingest_envoy.utilities import ( AncillaryProductType, IngestionManifestException, @@ -53,7 +55,6 @@ from ingest_envoy.utilities import ( find_output_tars, find_weblogs, ) -from pendulum import DateTime logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) @@ -77,6 +78,7 @@ class IngestionManifest(ManifestComponentIF): output_group: OutputGroup, # image manifest has this: additional_metadata: AbstractTextFile = None, + filename: str = None, ): self.staging_source_dir = staging_source_dir self.sp_type = sp_type @@ -94,7 +96,12 @@ class IngestionManifest(ManifestComponentIF): :return: """ - if self.sp_type not in [ScienceProductType.EVLA_CAL, ScienceProductType.IMAGE, ScienceProductType.VLASS_SECI]: + if self.sp_type not in [ + ScienceProductType.EVLA_CAL, + ScienceProductType.IMAGE, + ScienceProductType.VLASS_SECI, + ScienceProductType.EXEC_BLOCK, + ]: raise NotImplementedError() if additional_metadata: @@ -171,10 +178,15 @@ class IngestionManifest(ManifestComponentIF): to_return = { IngestionManifestKey.PARAMETERS.value: self.parameters.to_json(), - IngestionManifestKey.INPUT_GROUP.value: me_dict[IngestionManifestKey.INPUT_GROUP.value].to_json(), IngestionManifestKey.OUTPUT_GROUP.value: me_dict[IngestionManifestKey.OUTPUT_GROUP.value].to_json(), } + # Ingestion manifests with empty input groups can cause errors on ingest + if len(self.input_group.science_products) > 0: + to_return[IngestionManifestKey.INPUT_GROUP.value] = me_dict[ + IngestionManifestKey.INPUT_GROUP.value + ].to_json() + return to_return @@ -188,6 +200,7 @@ class IngestionManifestBuilder: locator: str, telescope: str, additional_metadata: AbstractTextFile = None, + filename: str = None, ): # get the telescope self.telescope = Telescope(telescope) @@ -204,15 +217,25 @@ class IngestionManifestBuilder: self.sp_type = ScienceProductType(sp_type) if self.sp_type is None or not isinstance(self.sp_type, ScienceProductType): raise ValueError(f"Invalid/unknown science product type: {sp_type}") - if self.sp_type not in [ScienceProductType.EVLA_CAL, ScienceProductType.IMAGE, ScienceProductType.VLASS_SECI]: + if self.sp_type not in [ + ScienceProductType.EVLA_CAL, + ScienceProductType.IMAGE, + ScienceProductType.VLASS_SECI, + ScienceProductType.EXEC_BLOCK, + ]: + raise NotImplementedError(f"Don't know yet how to build a {self.sp_type.value} manifest") - self.locator = locator + if locator is not None: + self.locator = locator self.files_found = [file for file in staging_source_dir.iterdir()] if len(self.files_found) == 0: raise IngestionManifestException(f"No ingestion files found at {staging_source_dir}") + if filename is not None: + self.filename = filename + def build(self) -> Tuple[IngestionManifest, Path]: """ Using only -relevant- files in ingestion_path, write the manifest @@ -223,6 +246,8 @@ class IngestionManifestBuilder: if self.sp_type == ScienceProductType.EVLA_CAL: return self._build_evla_cal_manifest() + elif self.sp_type == ScienceProductType.EXEC_BLOCK: + return self._build_observation_manifest() return self._build_image_manifest() @@ -257,6 +282,32 @@ class IngestionManifestBuilder: return manifest, manifest_file + def _build_observation_manifest(self): + # create the manifest + manifest = IngestionManifest( + telescope=self.telescope, + locator=None, + sp_type=self.sp_type, + staging_source_dir=self.staging_source_dir, + input_group=InputGroup([]), + output_group=self._build_observation_output_group(), + filename=self.filename, + ) + + artifacts_filename = self._build_artifacts_filename() + artifacts_ap = AncillaryProduct(AncillaryProductType.INGESTION_ARTIFACTS, filename=artifacts_filename) + if artifacts_ap not in manifest.output_group.ancillary_products: + manifest.output_group.ancillary_products.append(artifacts_ap) + + if not manifest.output_group.ancillary_products: + manifest.output_group.ancillary_products = [] + + manifest_file = manifest.write() + artifacts_file = self.staging_source_dir / artifacts_filename + self.write_ingestion_artifacts_tar(artifacts_file) + + return manifest, manifest_file + def _find_init_weblog_if_any(self): """ Is there an initial weblog in the staging source dir? @@ -352,6 +403,20 @@ class IngestionManifestBuilder: return OutputGroup(science_products=science_products, ancillary_products=ancillary_products) + def _build_observation_output_group(self) -> OutputGroup: + """ + Create observation manifest output group using the parameters + and the contents of the staging dir. + + :return: + """ + + products_finder = ObservationIngestionProductsFinder(self.staging_source_dir, self.sp_type) + science_products = products_finder.output_science_products + ancillary_products = products_finder.ancillary_products + + return OutputGroup(science_products=science_products, ancillary_products=ancillary_products) + @staticmethod def _build_artifacts_filename() -> str: """ @@ -359,7 +424,7 @@ class IngestionManifestBuilder: :return: the filename """ - current_time = pendulum.now() + current_time = arrow.now() timestamp = format_timestamp(current_time) return f"{INGESTION_ARTIFACTS_NAME}{timestamp}{TARFILE_EXT}" @@ -390,7 +455,7 @@ class IngestionManifestBuilder: return ingestion_artifacts_tar -def format_timestamp(datetime: DateTime) -> str: +def format_timestamp(datetime: Arrow) -> str: """ Format the current time as 2021_07_01T13_49_17.237 diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/launchers.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/launchers.py index b6d442c2cd40fc38b9fb995b6c38d896f869cbfa..b871bf64eb59c22e8596afb624528fe452a7093e 100644 --- a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/launchers.py +++ b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/launchers.py @@ -17,12 +17,16 @@ # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. import logging import subprocess -from typing import Union - import sys from pathlib import Path +from typing import Union -from ingest_envoy.collectors import ImageCollector, SECICollector, collect_image_metadata +from ingest_envoy.collectors import ( + ImageCollector, + SECICollector, + ObservationCollector, + collect_image_metadata, +) from ingest_envoy.ingestion_manifest import IngestionManifestBuilder from ingest_envoy.interfaces import IngestLauncherIF from ingest_envoy.schema import AbstractTextFile @@ -203,3 +207,61 @@ class IngestImageLauncher(IngestLauncherIF): telescope, additional_metadata, ).build() + + +class IngestObservationLauncher(IngestLauncherIF): + """Setup and Launch Observation Ingestion""" + + def __init__(self, parameters: dict): + self.logger = logging.getLogger("ingest_envoy") + self.sci_product_type = "execution_block" + self.parameters = parameters + self.staging_source_dir = self.parameters["staging_area"] + "/" + self.parameters["workflowDir"] + self.collector = ObservationCollector(self.parameters) + + def launch_ingestion(self) -> int: + """ + Prepare and run ingestion script + + :return: Return code of ingestion script process + """ + self.logger.info("RUNNING OBSERVATION INGESTION!") + self.prepare_for_ingest() + + self.logger.info("Running ingest!") + return trigger_ingest(self.parameters["useIngest"], self.staging_source_dir) + + def prepare_for_ingest(self): + """ + Prepare files for ingestion, creation of collection tars and manifest + + :return: + """ + self.logger.info("Preparing for ingest...") + # 1. run collection script to move observation data to the staging area + self.run_collector() + + # 2. create ingestion manifest + self.create_manifest() + + def run_collector(self): + """ + Run ObservationCollector + """ + # 1. collect products to staging area + self.collector.collect_products() + + def create_manifest(self, additional_file=None): + """ + Create the observation ingestion manifest + + :param additional_file: Unneeded for observation ingestion + :return: + """ + self.logger.info("Creating ingestion manifest...") + telescope = self.parameters["telescope"] + filename = self.parameters["filename"] + + IngestionManifestBuilder( + Path(self.staging_source_dir), self.sci_product_type, None, telescope, filename=filename + ).build() diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/solicitor.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/solicitor.py index 0ab8b77427bab76772a211966c7120ea5da77551..e3d9ddb4c84f83b8298426caa74eaf0f2cc35220 100644 --- a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/solicitor.py +++ b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/solicitor.py @@ -25,10 +25,8 @@ import pathlib from typing import List, Union import requests - from ingest_envoy.utilities import IngestType, VLASSIngestType - INVALID_INITIAL_VERSION = "Initial version not valid for ingest" @@ -206,6 +204,21 @@ class Solicitor: return {**general, **img} + def solicit_observation_params(self) -> dict: + """ + Determine observation specific parameters (WS Only) + + :return: dict + """ + + obs = { + "filename": self.filename, + "telescope": self.metadata["projectMetadata"]["telescope"], # all, needed by manifest generator + "project": self.metadata["projectMetadata"]["projectCode"], # needed for post ingestion messaging + } + + return {**obs} + def solicit_seci_params(self) -> dict: """ Determine SECI image specific parameters @@ -235,5 +248,7 @@ class Solicitor: return self.solicit_calibration_params() elif self.argument == IngestType.IMG: return self.solicit_image_params() + elif self.argument == IngestType.OBS: + return self.solicit_observation_params() elif self.argument == VLASSIngestType.SECI: return self.solicit_seci_params() diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/std_img_manifest_utils.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/std_img_manifest_utils.py index 42c50113d0a0f442a43013eb4456770fcd1676b7..d4d6d26497f71a5c7769259e982876b6b8afe0d9 100644 --- a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/std_img_manifest_utils.py +++ b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/std_img_manifest_utils.py @@ -15,6 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. + """ Helper for building image ingestion manifest """ import logging from pathlib import Path @@ -37,6 +38,7 @@ RMS = "rms" PB = "pb" MASK = "mask" ALPHA = "alpha" +PBCOR = "pbcor" # pylint: disable=R1721 @@ -68,14 +70,11 @@ class ImageIngestionProductsFinder: if file.name.endswith(FITS) and TT0 in file.name and RMS not in file.name ] else: + # The science products will be named *pbcor.tt0.fits sp_image_files = [ file for file in self.files_found - if file.name.endswith(FITS) - and RMS not in file.name - and PB not in file.name - and MASK not in file.name - and ALPHA not in file.name + if file.name.endswith(FITS) and PBCOR in file.name and TT0 in file.name ] self.logger.info(f"Science Product(s) to ingest: {sp_image_files}") image_files = [ @@ -86,29 +85,30 @@ class ImageIngestionProductsFinder: ] self.logger.info(f"Science Product ancillaries are: {image_files}") - sp_aps = [] + # Build a mapping of science products -> ancillaries + sp_aps = {k: [] for k in sp_image_files} for image_file in image_files: sp_ap = self._build_ancillary_image_science_product(image_file) - sp_aps.append(sp_ap) + for sp in sp_aps.keys(): + if image_file.name.startswith(sp.name.split(PBCOR)[0]): + # Add this as an ancillary to a similarly named science product + sp_aps.get(sp).append(sp_ap) + break + elif sp == next(reversed(sp_aps.keys())): + # No similar names found, add this as an ancillary to the first sp (covers VLASS_SECI too) + next(iter(sp_aps.values())).append(sp_ap) + self.logger.info(f"Science Product -> Ancillary mapping: {sp_aps}") science_products = [] for file in sp_image_files: - # For the case where there are two image science products, all ancillaries should be attached to only one - if file == sp_image_files[0]: - science_products.append( - OutputScienceProduct( - product_type=AncillaryProductType.FITS, - filename=file.name, - ancillary_products=sp_aps, - ) - ) - else: - science_products.append( - OutputScienceProduct( - product_type=AncillaryProductType.FITS, - filename=file.name, - ) + # Add all science products and their ancillaries + science_products.append( + OutputScienceProduct( + product_type=AncillaryProductType.FITS, + filename=file.name, + ancillary_products=sp_aps.get(file), ) + ) return science_products @@ -170,6 +170,8 @@ class ImageIngestionProductsFinder: return AncillaryProduct(type=AncillaryProductType.FITS_MASK, filename=filename) if ALPHA in filename: return AncillaryProduct(type=AncillaryProductType.ALPHA_FITS, filename=filename) + else: + return AncillaryProduct(type=AncillaryProductType.FITS, filename=filename) if filename.endswith(CSV): return AncillaryProduct(type=AncillaryProductType.COMPONENT_LIST, filename=filename) diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/std_obs_manifest_utils.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/std_obs_manifest_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..6d835d337c20cfa7bd98e42e954a37394ecd4e66 --- /dev/null +++ b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/std_obs_manifest_utils.py @@ -0,0 +1,115 @@ +# +# Copyright (C) 2023 Associated Universities, Inc. Washington DC, USA. +# +# This file is part of NRAO Workspaces. +# +# Workspaces is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Workspaces is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. + +""" Helper for building observation ingestion manifest """ +import logging +import sys +from pathlib import Path +from typing import List + +from ingest_envoy.manifest_components import ( + PARAMETER_FILENAME, + REIMAGING_FILENAME, + TARFILE_EXT, + WEBLOG_FILENAME, + AncillaryProduct, + OutputScienceProduct, +) +from ingest_envoy.utilities import AncillaryProductType, ScienceProductType + +FITS = "fits" +IDIFITS = "idifits" +XML = "xml" +LOG = "log" +TEXT = "txt" +CSV = "csv" +TT0 = "tt0" +RMS = "rms" +PB = "pb" +MASK = "mask" +ALPHA = "alpha" +PBCOR = "pbcor" + + +# pylint: disable=R1721 +class ObservationIngestionProductsFinder: + """Finds ancillary science products and other ancillary products needed for observation ingestion""" + + def __init__(self, staging_source_dir: Path, sp_type: ScienceProductType): + self.logger = logging.getLogger("ingest_envoy") + self.staging_source_dir = staging_source_dir + self.sp_type = sp_type + self.files_found = [file for file in self.staging_source_dir.iterdir()] + self.output_science_products = self._find_output_science_products() + self.ancillary_products = self._find_ancillary_products() + + def _find_output_science_products(self) -> List[OutputScienceProduct]: + """ + Find the ancillary products belonging to the science product* + in the staging dir. + + N.B. ingestion artifacts file will not be there until manifest has been created! + + :return: + """ + + # Currently we only support ingestion of GMVA/VLBI observations. If there + # is not yet implemented + # is an SDM file present we know it's a different type of observation which + for file in self.files_found: + if file.name.endswith(XML): + self.logger.error("Non-VLBA/GMVA observation ingestion is not currently implemented!") + sys.exit(1) + + # Ingest all *fits files as science products + fits_files = [file for file in self.files_found if file.name.endswith(IDIFITS)] + self.logger.info(f"Science Product(s) to ingest: {fits_files}") + + science_products = [] + for file in fits_files: + # Add all science products and their ancillaries + science_products.append( + OutputScienceProduct( + product_type=ScienceProductType.EXEC_BLOCK, + filename=file.name, + ) + ) + + return science_products + + def _find_ancillary_products(self) -> List[AncillaryProduct]: + """ + Find the ancillary observation products in the staging dir: there should be a + weblog and a pipeline artifacts tar. (The ingestion artifacts tar will be produced + during the building of the manifest.) + + :return: + """ + log_files = [file for file in self.files_found if file.name.endswith(LOG)] + text_files = [file for file in self.files_found if file.name.endswith(TEXT)] + self.logger.info(f"Ancillary product(s) to ingest: {[*log_files, *text_files]}") + + ancillary_products = [] + for file in log_files: + ancillary_products.append(AncillaryProduct(type=AncillaryProductType.LOG_TYPE, filename=file.name)) + for file in text_files: + ancillary_products.append( + AncillaryProduct(type=AncillaryProductType.OBSERVATION_DETAILS, filename=file.name) + ) + + return ancillary_products diff --git a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/utilities.py b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/utilities.py index b76d39d616b18ec3e658e515978449a4fb5249d8..07674c9a906a8de4ab9b73cc5ae394d8eca490a6 100644 --- a/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/utilities.py +++ b/apps/cli/executables/pexable/ingest_envoy/ingest_envoy/utilities.py @@ -31,6 +31,7 @@ class IngestType(Enum): CAL = "calibration" IMG = "image" + OBS = "observation_data" class VLASSIngestType(Enum): @@ -49,6 +50,7 @@ class Telescope(Enum): ALMA = "ALMA" VLBA = "VLBA" GBT = "GBT" + GMVA = "GMVA" NONE = "NONE" UNKNOWN = "UNKNOWN" @@ -69,7 +71,7 @@ class AncillaryProductType(Enum): INGESTION_ARTIFACTS = "ingestion_artifacts" PIPELINE_ARTIFACTS = "pipeline_artifacts" PIPELINE_WEBLOG = "pipeline_weblog" - LOG_TYPE = "log_file" + LOG_TYPE = "observation_log" ### Images ### @@ -86,6 +88,7 @@ class AncillaryProductType(Enum): REIMAGING_RSC = "reimaging_resources" PARAMETER_LIST = "parameter_list" COMPONENT_LIST = "component_list" + OBSERVATION_DETAILS = "observation_details" class InvalidLocatorException(Exception): diff --git a/apps/cli/executables/pexable/ingest_envoy/poetry.lock b/apps/cli/executables/pexable/ingest_envoy/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..cf74459ef8993607afaf483b62473c15557de22c --- /dev/null +++ b/apps/cli/executables/pexable/ingest_envoy/poetry.lock @@ -0,0 +1,492 @@ +# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. + +[[package]] +name = "arrow" +version = "1.2.3" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[[package]] +name = "astropy" +version = "5.3" +description = "Astronomy and astrophysics core library" +optional = false +python-versions = ">=3.9" +files = [ + {file = "astropy-5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a9eeda64e35d28d5e408df5ee4c5ad1ef5501b58986d05e91b0ea6bb40288e14"}, + {file = "astropy-5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32b24ba8cf6c345103f3f09f0b3229c99b71f17bc523dc9a608cee5ec43deb83"}, + {file = "astropy-5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250f9c257d215020d7827ed9aa49f1c7994f663ab809749b4c81aeb2675e74ca"}, + {file = "astropy-5.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:acf5b88c371d172dd3d79e2aacef0a3ab35ea89c9e78c9179c1abe23c4b416da"}, + {file = "astropy-5.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f6e36a06561d66be3c28f64fe509c9c029a1f3350191cbb5b5b19ed22463441"}, + {file = "astropy-5.3-cp310-cp310-win32.whl", hash = "sha256:2c5e568bf6c11115f126d39353df2a7666b7cc1a7b11a6868ad478733195364c"}, + {file = "astropy-5.3-cp310-cp310-win_amd64.whl", hash = "sha256:5f2f861f62c89ffdbf98541d62b41cd12cf50a9bd102513889d927ba73c8094e"}, + {file = "astropy-5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52f415dc724eae77be6af6c1e20cd4a9ae903881e12d0d07f7358f481cdf6ade"}, + {file = "astropy-5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75e6da73734b85c07e833175205e2847d176e155559f90a1132b034ec359322d"}, + {file = "astropy-5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87d652a22379211f3daa5c7fbaf9c3810c9967e4b5c803c62a1ce775da961f85"}, + {file = "astropy-5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db4bcf9f5770c661f25c1ffed9c4d9cb6a376c3741c91f12fce3621a1ca01b6"}, + {file = "astropy-5.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:be46392aea07f237ed8a0df45fb0c44d857a8e11feba3b2f53e752c911ce8248"}, + {file = "astropy-5.3-cp311-cp311-win32.whl", hash = "sha256:7f0270f9710b92be926dc210fba8262784d70690558bef2fccb8af3a11720ed5"}, + {file = "astropy-5.3-cp311-cp311-win_amd64.whl", hash = "sha256:e3fabb89411a81cfcdacf95c3c80d7aa83dc138e33dd44167c99e972434a617b"}, + {file = "astropy-5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aa01cfedd1c62b0c764002e62a52ad966025f254cc9ec0b2c2a11610b3815b19"}, + {file = "astropy-5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2d85e0325de35bf027b9adbeb220db04fbd65b897c1c08a51c1babbf12aeead0"}, + {file = "astropy-5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfa99e66c37b981505b1bbac0334c878ad8076d1da8847587c1891bf516a25c7"}, + {file = "astropy-5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f21e62e734f1f52f34fd3a38baab981e679aebd22a3824b47ead4005b1d43ec7"}, + {file = "astropy-5.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2c492930cbb89789b37da0b869c062dcf87cd4e5af98197ab89cc39e1a8656ad"}, + {file = "astropy-5.3-cp39-cp39-win32.whl", hash = "sha256:d7c0a05628f0c8f99cb30463ffb431902118d65224b2822a4a33f69bcf4b17df"}, + {file = "astropy-5.3-cp39-cp39-win_amd64.whl", hash = "sha256:7240bd5784f7c856fb0b69c3b556572c8196d9f4c7bbc075b573b4fae113cefd"}, + {file = "astropy-5.3.tar.gz", hash = "sha256:1f694be1c2b32309aca15cf7b54aa17546e944135209394cdceebd7a7889e4e5"}, +] + +[package.dependencies] +numpy = ">=1.21" +packaging = ">=19.0" +pyerfa = ">=2.0" +PyYAML = ">=3.13" + +[package.extras] +all = ["asdf (>=2.10.0)", "beautifulsoup4", "bleach", "bottleneck", "certifi", "dask[array]", "fsspec[http] (>=2022.8.2)", "h5py", "html5lib", "ipython (>=4.2)", "jplephem", "matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "mpmath", "pandas", "pre-commit", "pyarrow (>=5.0.0)", "pytest (>=7.0)", "pytz", "s3fs (>=2022.8.2)", "scipy (>=1.5)", "sortedcontainers", "typing-extensions (>=3.10.0.1)"] +docs = ["Jinja2 (>=3.0)", "matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "pytest (>=7.0)", "scipy (>=1.3)", "sphinx", "sphinx-astropy (>=1.6)", "sphinx-changelog (>=1.2.0)"] +recommended = ["matplotlib (>=3.3,!=3.4.0,!=3.5.2)", "scipy (>=1.5)"] +test = ["pytest (>=7.0)", "pytest-astropy (>=0.10)", "pytest-astropy-header (>=0.2.1)", "pytest-doctestplus (>=0.12)", "pytest-xdist"] +test-all = ["coverage[toml]", "ipython (>=4.2)", "objgraph", "pytest (>=7.0)", "pytest-astropy (>=0.10)", "pytest-astropy-header (>=0.2.1)", "pytest-doctestplus (>=0.12)", "pytest-xdist", "sgp4 (>=2.3)", "skyfield (>=1.20)", "timezonefinder"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "numpy" +version = "1.25.0" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8aa130c3042052d656751df5e81f6d61edff3e289b5994edcf77f54118a8d9f4"}, + {file = "numpy-1.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e3f2b96e3b63c978bc29daaa3700c028fe3f049ea3031b58aa33fe2a5809d24"}, + {file = "numpy-1.25.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6b267f349a99d3908b56645eebf340cb58f01bd1e773b4eea1a905b3f0e4208"}, + {file = "numpy-1.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4aedd08f15d3045a4e9c648f1e04daca2ab1044256959f1f95aafeeb3d794c16"}, + {file = "numpy-1.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d183b5c58513f74225c376643234c369468e02947b47942eacbb23c1671f25d"}, + {file = "numpy-1.25.0-cp310-cp310-win32.whl", hash = "sha256:d76a84998c51b8b68b40448ddd02bd1081bb33abcdc28beee6cd284fe11036c6"}, + {file = "numpy-1.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0dc071017bc00abb7d7201bac06fa80333c6314477b3d10b52b58fa6a6e38f6"}, + {file = "numpy-1.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c69fe5f05eea336b7a740e114dec995e2f927003c30702d896892403df6dbf0"}, + {file = "numpy-1.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c7211d7920b97aeca7b3773a6783492b5b93baba39e7c36054f6e749fc7490c"}, + {file = "numpy-1.25.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc68f11404930e9c7ecfc937aa423e1e50158317bf67ca91736a9864eae0232"}, + {file = "numpy-1.25.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e559c6afbca484072a98a51b6fa466aae785cfe89b69e8b856c3191bc8872a82"}, + {file = "numpy-1.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6c284907e37f5e04d2412950960894b143a648dea3f79290757eb878b91acbd1"}, + {file = "numpy-1.25.0-cp311-cp311-win32.whl", hash = "sha256:95367ccd88c07af21b379be1725b5322362bb83679d36691f124a16357390153"}, + {file = "numpy-1.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:b76aa836a952059d70a2788a2d98cb2a533ccd46222558b6970348939e55fc24"}, + {file = "numpy-1.25.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b792164e539d99d93e4e5e09ae10f8cbe5466de7d759fc155e075237e0c274e4"}, + {file = "numpy-1.25.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7cd981ccc0afe49b9883f14761bb57c964df71124dcd155b0cba2b591f0d64b9"}, + {file = "numpy-1.25.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5aa48bebfb41f93043a796128854b84407d4df730d3fb6e5dc36402f5cd594c0"}, + {file = "numpy-1.25.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5177310ac2e63d6603f659fadc1e7bab33dd5a8db4e0596df34214eeab0fee3b"}, + {file = "numpy-1.25.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0ac6edfb35d2a99aaf102b509c8e9319c499ebd4978df4971b94419a116d0790"}, + {file = "numpy-1.25.0-cp39-cp39-win32.whl", hash = "sha256:7412125b4f18aeddca2ecd7219ea2d2708f697943e6f624be41aa5f8a9852cc4"}, + {file = "numpy-1.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:26815c6c8498dc49d81faa76d61078c4f9f0859ce7817919021b9eba72b425e3"}, + {file = "numpy-1.25.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b1b90860bf7d8a8c313b372d4f27343a54f415b20fb69dd601b7efe1029c91e"}, + {file = "numpy-1.25.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85cdae87d8c136fd4da4dad1e48064d700f63e923d5af6c8c782ac0df8044542"}, + {file = "numpy-1.25.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cc3fda2b36482891db1060f00f881c77f9423eead4c3579629940a3e12095fe8"}, + {file = "numpy-1.25.0.tar.gz", hash = "sha256:f1accae9a28dc3cda46a91de86acf69de0d1b5f4edd44a9b0c3ceb8036dfff19"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pex" +version = "2.1.119" +description = "The PEX packaging toolchain." +optional = false +python-versions = ">=2.7,<3.12,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "pex-2.1.119-py2.py3-none-any.whl", hash = "sha256:b0dbdf2b1c608b159e50b19fa03b74659d1ecab593335bba0f2ec2ac1184ed7b"}, + {file = "pex-2.1.119.tar.gz", hash = "sha256:42e82163c1b467dff7ef5b651b454c52a78a5bf36776ff6631b4750080659930"}, +] + +[package.extras] +subprocess = ["subprocess32 (>=3.2.7)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pyerfa" +version = "2.0.0.3" +description = "Python bindings for ERFA" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyerfa-2.0.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:676515861ca3f0cb9d7e693389233e7126413a5ba93a0cc4d36b8ca933951e8d"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a438865894d226247dcfcb60d683ae075a52716504537052371b2b73458fe4fc"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73bf7d23f069d47632a2feeb1e73454b10392c4f3c16116017a6983f1f0e9b2b"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:780b0f90adf500b8ba24e9d509a690576a7e8287e354cfb90227c5963690d3fc"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5447bb45ddedde3052693c86b941a4908f5dbeb4a697bda45b5b89de92cfb74a"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7c24e7960c6cdd3fa3f4dba5f3444a106ad48c94ff0b19eebaee06a142c18c52"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-win32.whl", hash = "sha256:170a83bd0243da518119b846f296cf33fa03f1f884a88578c1a38560182cf64e"}, + {file = "pyerfa-2.0.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:51aa6e0faa4aa9ad8f0eef1c47fec76c5bebc0da7023a436089bdd6e5cfd625f"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4fa9fceeb78057bfff7ae3aa6cdad3f1b193722de22bdbb75319256f4a9e2f76"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a8a2029fc62ff2369d01219f66a5ce6aed35ef33eddb06118b6c27e8573a9ed8"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da888da2c8db5a78273fbf0af4e74f04e2d312d371c3c021cf6c3b14fa60fe3b"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7354753addba5261ec1cbf1ba45784ed3a5c42da565ecc6e0aa36b7a17fa4689"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b55f7278c1dd362648d7956e1a5365ade5fed2fe5541b721b3ceb5271128892"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:23e5efcf96ed7161d74f79ca261d255e1f36988843d22cd97d8f60fe9c868d44"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-win32.whl", hash = "sha256:f0e9d0b122c454bcad5dbd0c3283b200783031d3f99ca9c550f49a7a7d4c41ea"}, + {file = "pyerfa-2.0.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:09af83540e23a7d61a8368b0514b3daa4ed967e1e52d0add4f501f58c500dd7f"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a07444fd53a5dd18d7955f86f8d9b1be9a68ceb143e1145c0019a310c913c04"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:daf7364e475cff1f973e2fcf6962de9df9642c8802b010e29b2c592ae337e3c5"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8458421166f6ffe2e259aaf4aaa6e802d6539649a40e3194a81d30dccdc167a"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96ea688341176ae6220cc4743cda655549d71e3e3b60c5a99d02d5912d0ddf55"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d56f6b5a0a3ed7b80d630041829463a872946df277259b5453298842d42a54a4"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-win32.whl", hash = "sha256:3ecb598924ddb4ea2b06efc6f1e55ca70897ed178a690e2eaa1e290448466c7c"}, + {file = "pyerfa-2.0.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:1033fdb890ec70d3a511e20a464afc8abbea2180108f27b14d8f1d1addc38cbe"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d8c0dbb17119e52def33f9d6dbf2deaf2113ed3e657b6ff692df9b6a3598397"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8a1edd2cbe4ead3bf9a51e578d5d83bdd7ab3b3ccb69e09b89a4c42aa5b35ffb"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a04c3b715c924b6f972dd440a94a701a16a07700bc8ba9e88b1df765bdc36ad0"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d01c341c45b860ee5c7585ef003118c8015e9d65c30668d2f5bf657e1dcdd68"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24d89ead30edc6038408336ad9b696683e74c4eef550708fca6afef3ecd5b010"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b8c5e74d48a505a014e855cd4c7be11604901d94fd6f34b685f6720b7b20ed8"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-win32.whl", hash = "sha256:2ccba04de166d81bdd3adcf10428d908ce2f3a56ed1c2767d740fec12680edbd"}, + {file = "pyerfa-2.0.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3df87743e27588c5bd5e1f3a886629b3277fdd418059ca048420d33169376775"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88aa1acedf298d255cc4b0740ee11a3b303b71763dba2f039d48abf0a95cf9df"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06d4f08e96867b1fc3ae9a9e4b38693ed0806463288efc41473ad16e14774504"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1819e0d95ff8dead80614f8063919d82b2dbb55437b6c0109d3393c1ab55954"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61f1097ac2ee8c15a2a636cdfb99340d708574d66f4610456bd457d1e6b852f4"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f42ee01a62c6cbba58103e6f8e600b21ad3a71262dccf03d476efb4a20ea71"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3ecd6167b48bb8f1922fae7b49554616f2e7382748a4320ad46ebd7e2cc62f3d"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-win32.whl", hash = "sha256:7f9eabfefa5317ce58fe22480102902f10f270fc64a5636c010f7c0b7e0fb032"}, + {file = "pyerfa-2.0.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:4ea7ca03ecc440224c2bed8fb136fadf6cf8aea8ba67d717f635116f30c8cc8c"}, + {file = "pyerfa-2.0.0.3.tar.gz", hash = "sha256:d77fbbfa58350c194ccb99e5d93aa05d3c2b14d5aad8b662d93c6ad9fff41f39"}, +] + +[package.dependencies] +numpy = ">=1.17" + +[package.extras] +docs = ["sphinx-astropy (>=1.3)"] +test = ["pytest", "pytest-doctestplus (>=0.7)"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, + {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, + {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, + {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, + {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "7c6fddafae475e4ad18b81f328834bc1aa8627ec74ac890f56581d59f7272b62" diff --git a/apps/cli/executables/pexable/ingest_envoy/pyproject.toml b/apps/cli/executables/pexable/ingest_envoy/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..073d478cbed0e0dc2c8df210b8cc4089171e9b89 --- /dev/null +++ b/apps/cli/executables/pexable/ingest_envoy/pyproject.toml @@ -0,0 +1,28 @@ +[tool.poetry] +name = "ingest_envoy" +version = "2.8.2rc1" +description = "Ingest envoy" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" +packages = [{ include = "ingest_envoy" }] + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +pycapo = "^0.3.1" +astropy = "^5.2.2" +requests = "^2.29.0" +arrow = "^1.2.3" + +[tool.poetry.group.dev.dependencies] +pex = "2.1.119" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[tool.poetry.scripts] +ingest_envoy = "ingest_envoy.ingest:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/executables/pexable/ingest_envoy/setup.py b/apps/cli/executables/pexable/ingest_envoy/setup.py deleted file mode 100644 index 553289f9a9643aad0df416edaa27ac0517673464..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest_envoy/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("ingest_envoy/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["pycapo", "pex==2.1.119", "astropy", "pendulum", "requests"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces ingestion functionality bridge", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["ingest_envoy = ingest_envoy.ingest:main"]}, -) diff --git a/apps/cli/executables/pexable/ingest_envoy/test/__init__.py b/apps/cli/executables/pexable/ingest_envoy/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ingest_envoy/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/ingest_envoy/test/conftest.py b/apps/cli/executables/pexable/ingest_envoy/test/conftest.py index 587cea7aa5f7184d69d6efca57f8ba0a9dcae73a..8ed2489cafe48d23a09164945748e27f4f3b9805 100644 --- a/apps/cli/executables/pexable/ingest_envoy/test/conftest.py +++ b/apps/cli/executables/pexable/ingest_envoy/test/conftest.py @@ -113,17 +113,55 @@ EXAMPLE_MANIFEST_FILE = find_example_manifest("image_manifest_tmpx_ratuqh") ADDITIONAL_METADATA_FILENAME = "aux_image_metadata.json" PRIMARY_BEAM_ANCILLARY = AncillaryProduct( - type=AncillaryProductType.PB_FITS, filename="oussid.1-93305_sci.L_band.cont.I.pb.tt0.fits" + type=AncillaryProductType.PB_FITS, filename="oussid.J1522+3934_sci.K_band.cont.I.pb.tt0.fits" ) CLEAN_MASK_ANCILLARY = AncillaryProduct( - type=AncillaryProductType.FITS_MASK, filename="oussid.1-93305_sci.L_band.cont.I.mask.fits" + type=AncillaryProductType.FITS_MASK, filename="oussid.J1522+3934_sci.K_band.cont.I.mask.fits" ) -OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES = [PRIMARY_BEAM_ANCILLARY, CLEAN_MASK_ANCILLARY] +ALPHA_ERROR = AncillaryProduct( + type=AncillaryProductType.FITS, filename="oussid.J1522+3934_sci.K_band.cont.I.alpha.error.fits" +) +ALPHA = AncillaryProduct( + type=AncillaryProductType.FITS, filename="oussid.J1522+3934_sci.K_band.cont.I.alpha.fits" +) +TT0 = AncillaryProduct( + type=AncillaryProductType.FITS, filename="oussid.J1522+3934_sci.K_band.cont.I.tt0.fits" +) +TT1 = AncillaryProduct( + type=AncillaryProductType.FITS, filename="oussid.J1522+3934_sci.K_band.cont.I.tt1.fits" +) +OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_K = [PRIMARY_BEAM_ANCILLARY, CLEAN_MASK_ANCILLARY, ALPHA_ERROR, ALPHA, TT0, TT1] + +OUTPUT_SCIENCE_PRODUCT_K = OutputScienceProduct( + product_type=AncillaryProductType.FITS, + filename="oussid.J1522+3934_sci.K_band.cont.I.pbcor.tt0.fits", + ancillary_products=OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_K, +) + +PRIMARY_BEAM_ANCILLARY = AncillaryProduct( + type=AncillaryProductType.PB_FITS, filename="oussid.J1522+3934_sci.X_band.cont.I.pb.tt0.fits" +) +CLEAN_MASK_ANCILLARY = AncillaryProduct( + type=AncillaryProductType.FITS_MASK, filename="oussid.J1522+3934_sci.X_band.cont.I.mask.fits" +) +ALPHA_ERROR = AncillaryProduct( + type=AncillaryProductType.FITS, filename="oussid.J1522+3934_sci.X_band.cont.I.alpha.error.fits" +) +ALPHA = AncillaryProduct( + type=AncillaryProductType.FITS, filename="oussid.J1522+3934_sci.X_band.cont.I.alpha.fits" +) +TT0 = AncillaryProduct( + type=AncillaryProductType.FITS, filename="oussid.J1522+3934_sci.X_band.cont.I.tt0.fits" +) +TT1 = AncillaryProduct( + type=AncillaryProductType.FITS, filename="oussid.J1522+3934_sci.X_band.cont.I.tt1.fits" +) +OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_X = [PRIMARY_BEAM_ANCILLARY, CLEAN_MASK_ANCILLARY, ALPHA_ERROR, ALPHA, TT0, TT1] -OUTPUT_SCIENCE_PRODUCT = OutputScienceProduct( +OUTPUT_SCIENCE_PRODUCT_X = OutputScienceProduct( product_type=AncillaryProductType.FITS, - filename="oussid.1-93305_sci.L_band.cont.I.tt0.fits", - ancillary_products=OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES, + filename="oussid.J1522+3934_sci.X_band.cont.I.pbcor.tt0.fits", + ancillary_products=OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_X, ) # input files @@ -142,7 +180,8 @@ ANCILLARY_PRODUCTS = [WEBLOG_ANCILLARY, INGESTION_AF_ANCILLARY, PIPELINE_AF_ANCI STAGING_DIR_FILES = [ "aux_image_metadata.json", - "oussid.1-93305_sci.L_band.cont.I.tt0.fits", + "oussid.J1522+3934_sci.K_band.cont.I.pbcor.tt0.fits", + "oussid.J1522+3934_sci.X_band.cont.I.pbcor.tt0.fits", ] @@ -155,7 +194,10 @@ def populate_fake_tmpx_ratuqh_ingest_path(staging_source_dir: Path, is_final: bo """ fake_files_to_create = [ADDITIONAL_METADATA_FILENAME] - for product in OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES: + for product in OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_K: + fake_files_to_create.append(product.filename) + + for product in OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_X: fake_files_to_create.append(product.filename) fake_files_to_create.append(PIPELINE_AF_ANCILLARY.filename) @@ -163,7 +205,8 @@ def populate_fake_tmpx_ratuqh_ingest_path(staging_source_dir: Path, is_final: bo if is_final: fake_files_to_create.append(INIT_WEBLOG_ANCILLARY.filename) - fake_files_to_create.append(OUTPUT_SCIENCE_PRODUCT.filename) + fake_files_to_create.append(OUTPUT_SCIENCE_PRODUCT_K.filename) + fake_files_to_create.append(OUTPUT_SCIENCE_PRODUCT_X.filename) files = [] for filename in fake_files_to_create: diff --git a/apps/cli/executables/pexable/ingest_envoy/test/examples/image_manifest_tmpx_ratuqh.json b/apps/cli/executables/pexable/ingest_envoy/test/examples/image_manifest_tmpx_ratuqh.json index f36003c9403cc223407f41ad7d78c1e7e44e4b87..9e2309246f72b815cda711f4200db7e96350295c 100644 --- a/apps/cli/executables/pexable/ingest_envoy/test/examples/image_manifest_tmpx_ratuqh.json +++ b/apps/cli/executables/pexable/ingest_envoy/test/examples/image_manifest_tmpx_ratuqh.json @@ -18,15 +18,61 @@ "science_products": [ { "type": "fits_image", - "filename": "oussid.1-93305_sci.L_band.cont.I.tt0.fits", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.K_band.cont.I.pbcor.tt0.fits", "ancillary_products": [ { "type": "primary_beam", - "filename": "oussid.1-93305_sci.L_band.cont.I.pb.tt0.fits" + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.K_band.cont.I.pb.tt0.fits" }, { "type": "clean_mask", - "filename": "oussid.1-93305_sci.L_band.cont.I.mask.fits" + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.K_band.cont.I.mask.fits" + }, + { + "type": "spectral_index", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.K_band.cont.I.alpha.error.fits" + }, + { + "type": "spectral_index", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.K_band.cont.I.alpha.fits" + }, + { + "type": "fits_image", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.K_band.cont.I.tt0.fits" + }, + { + "type": "fits_image", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.K_band.cont.I.tt1.fits" + } + ] + }, + { + "type": "fits_image", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.X_band.cont.I.pbcor.tt0.fits", + "ancillary_products": [ + { + "type": "primary_beam", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.X_band.cont.I.pb.tt0.fits" + }, + { + "type": "clean_mask", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.X_band.cont.I.mask.fits" + }, + { + "type": "spectral_index", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.X_band.cont.I.alpha.error.fits" + }, + { + "type": "spectral_index", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.X_band.cont.I.alpha.fits" + }, + { + "type": "fits_image", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.X_band.cont.I.tt0.fits" + }, + { + "type": "fits_image", + "filename": "16B-069.MJD57713.51329133102.J1522+3934_sci.X_band.cont.I.tt1.fits" } ] } diff --git a/apps/cli/executables/pexable/ingest_envoy/test/test_evla_cal_manifest.py b/apps/cli/executables/pexable/ingest_envoy/test/test_evla_cal_manifest.py index 716aab7b101ee09beb8780078d8f3357ea93f009..64e2b7df0a1fca3dfea3e0257deb7e2e4a0756bb 100644 --- a/apps/cli/executables/pexable/ingest_envoy/test/test_evla_cal_manifest.py +++ b/apps/cli/executables/pexable/ingest_envoy/test/test_evla_cal_manifest.py @@ -47,7 +47,7 @@ from ingest_envoy.manifest_components import ( from ingest_envoy.utilities import AncillaryProductType, ScienceProductType, Telescope # ingest_path is NOT unused! Don't let IJ remove the import! -from .conftest import ( +from conftest import ( EVLA_CAL_INPUT_FILENAMES, UNWANTED, find_example_manifest, diff --git a/apps/cli/executables/pexable/ingest_envoy/test/test_img_manifest_example.py b/apps/cli/executables/pexable/ingest_envoy/test/test_img_manifest_example.py index 78f32e4fcf4a152f958a6e53586a10b430f32fc7..3c56f7cef6d3b2f2174fe4aae98f91717ab4a81a 100644 --- a/apps/cli/executables/pexable/ingest_envoy/test/test_img_manifest_example.py +++ b/apps/cli/executables/pexable/ingest_envoy/test/test_img_manifest_example.py @@ -34,7 +34,7 @@ from ingest_envoy.manifest_components import ( from ingest_envoy.schema import AbstractTextFile from ingest_envoy.utilities import AncillaryProductType, ScienceProductType, Telescope -from .conftest import ( +from conftest import ( ADDITIONAL_METADATA_FILENAME, ANCILLARY_PRODUCTS, ingest_path, @@ -219,8 +219,8 @@ def test_output_science_products_rendered_correctly(ingest_path: Path): """ The output_group section of the manifest we build should match the one in the example: - * a "science_products" section containing one science product comprising "type", "filename", - and two ancillary products + * a "science_products" section containing two science products comprising "type", "filename", + and six ancillary products on each science product * an "ancillary products" section comprising three ancillary products :param ingest_path: @@ -232,15 +232,25 @@ def test_output_science_products_rendered_correctly(ingest_path: Path): og_json = mf_json[IngestionManifestKey.OUTPUT_GROUP.value] print(og_json) - # there should be a science product... + # there should be the first science product... sp_json = og_json[IngestionManifestKey.SCIENCE_PRODUCTS.value][0] assert len(sp_json) == 3 for key in (IngestionManifestKey.ANCILLARY_PRODUCTS.value, "type", "filename"): assert key in sp_json.keys() - # and ancillary products belonging to the science product... + # and ancillary products belonging to the first science product... sp_ap_jsons = sp_json[IngestionManifestKey.ANCILLARY_PRODUCTS.value] - assert len(sp_ap_jsons) == 2 + assert len(sp_ap_jsons) == 6 + + # then a second science product... + sp_json = og_json[IngestionManifestKey.SCIENCE_PRODUCTS.value][1] + assert len(sp_json) == 3 + for key in (IngestionManifestKey.ANCILLARY_PRODUCTS.value, "type", "filename"): + assert key in sp_json.keys() + + # and ancillary products belonging to the second science product... + sp_ap_jsons = sp_json[IngestionManifestKey.ANCILLARY_PRODUCTS.value] + assert len(sp_ap_jsons) == 6 # ... and ancillary products twisting in the wind all by themselves ap_jsons = og_json[IngestionManifestKey.ANCILLARY_PRODUCTS.value] diff --git a/apps/cli/executables/pexable/ingest_envoy/test/test_manifest_builder_entry_points.py b/apps/cli/executables/pexable/ingest_envoy/test/test_manifest_builder_entry_points.py index 7ab4abb09df35815e46bad39601bcbf05d04ddec..41d0aa3cb2dd4813f10a7f46709c14a9db37809e 100644 --- a/apps/cli/executables/pexable/ingest_envoy/test/test_manifest_builder_entry_points.py +++ b/apps/cli/executables/pexable/ingest_envoy/test/test_manifest_builder_entry_points.py @@ -32,9 +32,10 @@ from ingest_envoy.ingestion_manifest import ( from ingest_envoy.manifest_components import INGESTION_ARTIFACTS_NAME, TARFILE_EXT from ingest_envoy.utilities import ScienceProductType, Telescope -from .conftest import ( +from conftest import ( ANCILLARY_PRODUCTS, - OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES, + OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_K, + OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_X, ingest_path, populate_fake_evla_cal_ingest_path, populate_fake_tmpx_ratuqh_ingest_path, @@ -95,7 +96,8 @@ def test_entry_point_for_image(ingest_path: Path): # we should be starting out with various image manifest input files # and CASA byproducts, a random file, and -not- the image ingestion # manifest yet to be created - expected_file_count_before = len(ANCILLARY_PRODUCTS) + len(OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES) + 1 + expected_file_count_before = len(ANCILLARY_PRODUCTS) + len(OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_K) +\ + len(OUTPUT_GROUP_SCIENCE_PRODUCT_ANCILLARIES_X) + 2 ingestion_files_before = [file for file in ingest_path.iterdir()] assert len(ingestion_files_before) == expected_file_count_before diff --git a/apps/cli/executables/pexable/mediator/LICENSE b/apps/cli/executables/pexable/mediator/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/mediator/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/mediator/poetry.lock b/apps/cli/executables/pexable/mediator/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..101fc8d79da0366cdcf5aca26c7a667bdc013865 --- /dev/null +++ b/apps/cli/executables/pexable/mediator/poetry.lock @@ -0,0 +1,418 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "sqlalchemy" +version = "1.4.47" +description = "Database Abstraction Library" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.47-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:dcfb480bfc9e1fab726003ae00a6bfc67a29bad275b63a4e36d17fe7f13a624e"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28fda5a69d6182589892422c5a9b02a8fd1125787aab1d83f1392aa955bf8d0a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win32.whl", hash = "sha256:45e799c1a41822eba6bee4e59b0e38764e1a1ee69873ab2889079865e9ea0e23"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win_amd64.whl", hash = "sha256:10edbb92a9ef611f01b086e271a9f6c1c3e5157c3b0c5ff62310fb2187acbd4a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a4df53472c9030a8ddb1cce517757ba38a7a25699bbcabd57dcc8a5d53f324e"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:511d4abc823152dec49461209607bbfb2df60033c8c88a3f7c93293b8ecbb13d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbe57f39f531c5d68d5594ea4613daa60aba33bb51a8cc42f96f17bbd6305e8d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca8ab6748e3ec66afccd8b23ec2f92787a58d5353ce9624dccd770427ee67c82"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299b5c5c060b9fbe51808d0d40d8475f7b3873317640b9b7617c7f988cf59fda"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win32.whl", hash = "sha256:684e5c773222781775c7f77231f412633d8af22493bf35b7fa1029fdf8066d10"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win_amd64.whl", hash = "sha256:2bba39b12b879c7b35cde18b6e14119c5f1a16bd064a48dd2ac62d21366a5e17"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:795b5b9db573d3ed61fae74285d57d396829e3157642794d3a8f72ec2a5c719b"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:989c62b96596b7938cbc032e39431e6c2d81b635034571d6a43a13920852fb65"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b67bda733da1dcdccaf354e71ef01b46db483a4f6236450d3f9a61efdba35a"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win32.whl", hash = "sha256:9a198f690ac12a3a807e03a5a45df6a30cd215935f237a46f4248faed62e69c8"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win_amd64.whl", hash = "sha256:03be6f3cb66e69fb3a09b5ea89d77e4bc942f3bf84b207dba84666a26799c166"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:16ee6fea316790980779268da47a9260d5dd665c96f225d28e7750b0bb2e2a04"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:557675e0befafa08d36d7a9284e8761c97490a248474d778373fb96b0d7fd8de"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb2797fee8a7914fb2c3dc7de404d3f96eb77f20fc60e9ee38dc6b0ca720f2c2"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28297aa29e035f29cba6b16aacd3680fbc6a9db682258d5f2e7b49ec215dbe40"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win32.whl", hash = "sha256:998e782c8d9fd57fa8704d149ccd52acf03db30d7dd76f467fd21c1c21b414fa"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win_amd64.whl", hash = "sha256:dde4d02213f1deb49eaaf8be8a6425948963a7af84983b3f22772c63826944de"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e98ef1babe34f37f443b7211cd3ee004d9577a19766e2dbacf62fce73c76245a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a3879853208a242b5913f3a17c6ac0eae9dc210ff99c8f10b19d4a1ed8ed9b"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7120a2f72599d4fed7c001fa1cbbc5b4d14929436135768050e284f53e9fbe5e"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048509d7f3ac27b83ad82fd96a1ab90a34c8e906e4e09c8d677fc531d12c23c5"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win32.whl", hash = "sha256:6572d7c96c2e3e126d0bb27bfb1d7e2a195b68d951fcc64c146b94f088e5421a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win_amd64.whl", hash = "sha256:a6c3929df5eeaf3867724003d5c19fed3f0c290f3edc7911616616684f200ecf"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71d4bf7768169c4502f6c2b0709a02a33703544f611810fb0c75406a9c576ee1"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd45c60cc4f6d68c30d5179e2c2c8098f7112983532897566bb69c47d87127d3"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fdbb8e9d4e9003f332a93d6a37bca48ba8095086c97a89826a136d8eddfc455"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f216a51451a0a0466e082e163591f6dcb2f9ec182adb3f1f4b1fd3688c7582c"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win32.whl", hash = "sha256:bd988b3362d7e586ef581eb14771bbb48793a4edb6fcf62da75d3f0f3447060b"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win_amd64.whl", hash = "sha256:32ab09f2863e3de51529aa84ff0e4fe89a2cb1bfbc11e225b6dbc60814e44c94"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:07764b240645627bc3e82596435bd1a1884646bfc0721642d24c26b12f1df194"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e2a42017984099ef6f56438a6b898ce0538f6fadddaa902870c5aa3e1d82583"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b6d807c76c20b4bc143a49ad47782228a2ac98bdcdcb069da54280e138847fc"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a94632ba26a666e7be0a7d7cc3f7acab622a04259a3aa0ee50ff6d44ba9df0d"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win32.whl", hash = "sha256:f80915681ea9001f19b65aee715115f2ad310730c8043127cf3e19b3009892dd"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win_amd64.whl", hash = "sha256:fc700b862e0a859a37faf85367e205e7acaecae5a098794aff52fdd8aea77b12"}, + {file = "SQLAlchemy-1.4.47.tar.gz", hash = "sha256:95fc02f7fc1f3199aaa47a8a757437134cf618e9d994c84effd53f530c38586f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and platform_machine == \"aarch64\" or python_version >= \"3\" and platform_machine == \"ppc64le\" or python_version >= \"3\" and platform_machine == \"x86_64\" or python_version >= \"3\" and platform_machine == \"amd64\" or python_version >= \"3\" and platform_machine == \"AMD64\" or python_version >= \"3\" and platform_machine == \"win32\" or python_version >= \"3\" and platform_machine == \"WIN32\""} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "urllib3" +version = "2.0.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "5c75ba2572db6fdf6337342efa3d0d9f779b19353075b5eafce44361bf333ab8" diff --git a/apps/cli/executables/pexable/mediator/pyproject.toml b/apps/cli/executables/pexable/mediator/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..d6908b8aedeb6fde905662bbcba914a016ada25f --- /dev/null +++ b/apps/cli/executables/pexable/mediator/pyproject.toml @@ -0,0 +1,24 @@ +[tool.poetry] +name = "ssa_mediator" +version = "2.8.2rc1" +description = "Mediator: the Workspaces intervention utility" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" +packages = [{ include = "system_mediator" }] + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +sqlalchemy = "1.4.47" +pycapo = "^0.3.1" +requests = "^2.29.0" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[tool.poetry.scripts] +mediator = "system_mediator.mediator:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/executables/pexable/mediator/setup.py b/apps/cli/executables/pexable/mediator/setup.py deleted file mode 100644 index c67b1e64468f4ad12676ba448c8b8afc732220d1..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/mediator/setup.py +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("system_mediator/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = [ - "sqlalchemy==1.4.46", - "pycapo", - "requests", -] - -# Setup Mediator -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="System Mediator allows an operations manager to intervene in currently processing jobs", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["mediator = system_mediator.mediator:main"]}, -) diff --git a/apps/cli/executables/pexable/mediator/system_mediator/__init__.py b/apps/cli/executables/pexable/mediator/system_mediator/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..d47acbceb4b05e5cd9b7fda90f8e934f574994e8 100644 --- a/apps/cli/executables/pexable/mediator/system_mediator/__init__.py +++ b/apps/cli/executables/pexable/mediator/system_mediator/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Mediator: the Workspaces intervention utility +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/mediator/system_mediator/_version.py b/apps/cli/executables/pexable/mediator/system_mediator/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/mediator/system_mediator/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/null/LICENSE b/apps/cli/executables/pexable/null/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/null/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/null/null/__init__.py b/apps/cli/executables/pexable/null/null/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..33a73619dda5a6bf7b2185f98ec2d662a406630c 100644 --- a/apps/cli/executables/pexable/null/null/__init__.py +++ b/apps/cli/executables/pexable/null/null/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +This is the null executable, a baseline test of the functionality of the Workspaces system. +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/null/null/_version.py b/apps/cli/executables/pexable/null/null/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/null/null/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/null/null/null.py b/apps/cli/executables/pexable/null/null/null.py index c7460f1fde2408b99cc8870eecd68cc4294958e7..6c06a54898482fee2d8649971935f36b4032a468 100644 --- a/apps/cli/executables/pexable/null/null/null.py +++ b/apps/cli/executables/pexable/null/null/null.py @@ -15,9 +15,6 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" -This is the null executable, a baseline test of the functionality of the Workspaces system. -""" import argparse import logging @@ -26,7 +23,7 @@ import random import sys import time -from ._version import ___version___ as version +from . import __version__ as version _DESCRIPTION = """Workspaces null executable, a status capture test of the Workspaces system. Version {}""" ERRORS = { diff --git a/apps/cli/executables/pexable/null/poetry.lock b/apps/cli/executables/pexable/null/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..1c25d673072e6010dacff6c0d0daa17c55c291d1 --- /dev/null +++ b/apps/cli/executables/pexable/null/poetry.lock @@ -0,0 +1,141 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pex" +version = "2.1.119" +description = "The PEX packaging toolchain." +category = "dev" +optional = false +python-versions = ">=2.7,<3.12,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "pex-2.1.119-py2.py3-none-any.whl", hash = "sha256:b0dbdf2b1c608b159e50b19fa03b74659d1ecab593335bba0f2ec2ac1184ed7b"}, + {file = "pex-2.1.119.tar.gz", hash = "sha256:42e82163c1b467dff7ef5b651b454c52a78a5bf36776ff6631b4750080659930"}, +] + +[package.extras] +subprocess = ["subprocess32 (>=3.2.7)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pytest-mock" +version = "3.10.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"}, + {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"}, +] + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "502986918b7eaed2ab8f3dcd040230c561e5b94f52a5c58f5c3f73c2214d2d2e" diff --git a/apps/cli/executables/pexable/null/pyproject.toml b/apps/cli/executables/pexable/null/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..00c25d8fd7ea442a09b3934d5cacebd626348e1d --- /dev/null +++ b/apps/cli/executables/pexable/null/pyproject.toml @@ -0,0 +1,25 @@ +[tool.poetry] +name = "ssa_null" +version = "2.8.2rc1" +description = "This is the null executable, a baseline test of the functionality of the Workspaces system." +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" +packages = [{ include = "null" }] + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" + +[tool.poetry.group.dev.dependencies] +pex = "2.1.119" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" +pytest-mock = "^3.10.0" + +[tool.poetry.scripts] +null = "null.null:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/executables/pexable/null/setup.py b/apps/cli/executables/pexable/null/setup.py deleted file mode 100644 index 08ab70ee8e4f5062393171df5dc2647d034de052..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/null/setup.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("null/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces null executable.", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=["pex==2.1.119"], - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["null = null.null:main"]}, -) diff --git a/apps/cli/executables/pexable/null/test/__init__.py b/apps/cli/executables/pexable/null/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/null/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/productfetcher/LICENSE b/apps/cli/executables/pexable/productfetcher/LICENSE index d2701d9a83f59492b2f60129314555e9468ca9c9..bc08fe2e41e331fcf35fe07812c5f68f637f79ae 100644 --- a/apps/cli/executables/pexable/productfetcher/LICENSE +++ b/apps/cli/executables/pexable/productfetcher/LICENSE @@ -1,82 +1,619 @@ -GNU GENERAL PUBLIC LICENSE -Version 2, June 1991 - -Copyright (C) 1989, 1991 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -Preamble -The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. - -To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. - -For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. - -We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. - -Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. - -Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - -1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - -a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. -b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. -c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) -These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: - -a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, -b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, -c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) -The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - -4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - -6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - -10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/productfetcher/poetry.lock b/apps/cli/executables/pexable/productfetcher/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..2429f852a56133b3dc67363cc3022418b619818c --- /dev/null +++ b/apps/cli/executables/pexable/productfetcher/poetry.lock @@ -0,0 +1,732 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cx-oracle" +version = "8.3.0" +description = "Python interface to Oracle" +optional = false +python-versions = "*" +files = [ + {file = "cx_Oracle-8.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b6a23da225f03f50a81980c61dbd6a358c3575f212ca7f4c22bb65a9faf94f7f"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win32.whl", hash = "sha256:715a8bbda5982af484ded14d184304cc552c1096c82471dd2948298470e88a04"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:07f01608dfb6603a8f2a868fc7c7bdc951480f187df8dbc50f4d48c884874e6a"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4b3afe7a911cebaceda908228d36839f6441cbd38e5df491ec25960562bb01a0"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win32.whl", hash = "sha256:076ffb71279d6b2dcbf7df028f62a01e18ce5bb73d8b01eab582bf14a62f4a61"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b82e4b165ffd807a2bd256259a6b81b0a2452883d39f987509e2292d494ea163"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b902db61dcdcbbf8dd981f5a46d72fef40c5150c7fc0eb0f0698b462d6eb834e"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win32.whl", hash = "sha256:4c82ca74442c298ceec56d207450c192e06ecf8ad52eb4aaad0812e147ceabf7"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:54164974d526b76fdefb0b66a42b68e1fca5df78713d0eeb8c1d0047b83f6bcf"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:410747d542e5f94727f5f0e42e9706c772cf9094fb348ce965ab88b3a9e4d2d8"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win32.whl", hash = "sha256:3baa878597c5fadb2c72f359f548431c7be001e722ce4a4ebdf3d2293a1bb70b"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:de42bdc882abdc5cea54597da27a05593b44143728e5b629ad5d35decb1a2036"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df412238a9948340591beee9ec64fa62a2efacc0d91107034a7023e2991fba97"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win32.whl", hash = "sha256:70d3cf030aefd71f99b45beba77237b2af448adf5e26be0db3d0d3dee6ea4230"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf01ce87edb4ef663b2e5bd604e1e0154d2cc2f12b60301f788b569d9db8a900"}, + {file = "cx_Oracle-8.3.0.tar.gz", hash = "sha256:3b2d215af4441463c97ea469b9cc307460739f89fdfa8ea222ea3518f1a424d9"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "lxml" +version = "4.9.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "marshmallow" +version = "3.20.1" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "marshmallow-3.20.1-py3-none-any.whl", hash = "sha256:684939db93e80ad3561392f47be0230743131560a41c5110684c16e21ade0a5c"}, + {file = "marshmallow-3.20.1.tar.gz", hash = "sha256:5d2371bbe42000f2b3fb5eaa065224df7d8f8597bc19a1bbfa5bfe7fba8da889"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pex" +version = "2.1.119" +description = "The PEX packaging toolchain." +optional = false +python-versions = ">=2.7,<3.12,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "pex-2.1.119-py2.py3-none-any.whl", hash = "sha256:b0dbdf2b1c608b159e50b19fa03b74659d1ecab593335bba0f2ec2ac1184ed7b"}, + {file = "pex-2.1.119.tar.gz", hash = "sha256:42e82163c1b467dff7ef5b651b454c52a78a5bf36776ff6631b4750080659930"}, +] + +[package.extras] +subprocess = ["subprocess32 (>=3.2.7)"] + +[[package]] +name = "pika" +version = "1.3.2" +description = "Pika Python AMQP Client Library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pika-1.3.2-py3-none-any.whl", hash = "sha256:0779a7c1fafd805672796085560d290213a465e4f6f76a6fb19e378d8041a14f"}, + {file = "pika-1.3.2.tar.gz", hash = "sha256:b2a327ddddf8570b4965b3576ac77091b850262d34ce8c1d8cb4e4146aa4145f"}, +] + +[package.extras] +gevent = ["gevent"] +tornado = ["tornado"] +twisted = ["twisted"] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.7" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-binary-2.9.7.tar.gz", hash = "sha256:1b918f64a51ffe19cd2e230b3240ba481330ce1d4b7875ae67305bd1d37b041c"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ea5f8ee87f1eddc818fc04649d952c526db4426d26bab16efbe5a0c52b27d6ab"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2993ccb2b7e80844d534e55e0f12534c2871952f78e0da33c35e648bf002bbff"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbbc3c5d15ed76b0d9db7753c0db40899136ecfe97d50cbde918f630c5eb857a"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:692df8763b71d42eb8343f54091368f6f6c9cfc56dc391858cdb3c3ef1e3e584"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dcfd5d37e027ec393a303cc0a216be564b96c80ba532f3d1e0d2b5e5e4b1e6e"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17cc17a70dfb295a240db7f65b6d8153c3d81efb145d76da1e4a096e9c5c0e63"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e5666632ba2b0d9757b38fc17337d84bdf932d38563c5234f5f8c54fd01349c9"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7db7b9b701974c96a88997d458b38ccb110eba8f805d4b4f74944aac48639b42"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c82986635a16fb1fa15cd5436035c88bc65c3d5ced1cfaac7f357ee9e9deddd4"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4fe13712357d802080cfccbf8c6266a3121dc0e27e2144819029095ccf708372"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-win32.whl", hash = "sha256:122641b7fab18ef76b18860dd0c772290566b6fb30cc08e923ad73d17461dc63"}, + {file = "psycopg2_binary-2.9.7-cp310-cp310-win_amd64.whl", hash = "sha256:f8651cf1f144f9ee0fa7d1a1df61a9184ab72962531ca99f077bbdcba3947c58"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4ecc15666f16f97709106d87284c136cdc82647e1c3f8392a672616aed3c7151"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3fbb1184c7e9d28d67671992970718c05af5f77fc88e26fd7136613c4ece1f89"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a7968fd20bd550431837656872c19575b687f3f6f98120046228e451e4064df"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:094af2e77a1976efd4956a031028774b827029729725e136514aae3cdf49b87b"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:26484e913d472ecb6b45937ea55ce29c57c662066d222fb0fbdc1fab457f18c5"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f309b77a7c716e6ed9891b9b42953c3ff7d533dc548c1e33fddc73d2f5e21f9"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6d92e139ca388ccfe8c04aacc163756e55ba4c623c6ba13d5d1595ed97523e4b"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2df562bb2e4e00ee064779902d721223cfa9f8f58e7e52318c97d139cf7f012d"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4eec5d36dbcfc076caab61a2114c12094c0b7027d57e9e4387b634e8ab36fd44"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1011eeb0c51e5b9ea1016f0f45fa23aca63966a4c0afcf0340ccabe85a9f65bd"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-win32.whl", hash = "sha256:ded8e15f7550db9e75c60b3d9fcbc7737fea258a0f10032cdb7edc26c2a671fd"}, + {file = "psycopg2_binary-2.9.7-cp311-cp311-win_amd64.whl", hash = "sha256:8a136c8aaf6615653450817a7abe0fc01e4ea720ae41dfb2823eccae4b9062a3"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2dec5a75a3a5d42b120e88e6ed3e3b37b46459202bb8e36cd67591b6e5feebc1"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc10da7e7df3380426521e8c1ed975d22df678639da2ed0ec3244c3dc2ab54c8"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee919b676da28f78f91b464fb3e12238bd7474483352a59c8a16c39dfc59f0c5"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb1c0e682138f9067a58fc3c9a9bf1c83d8e08cfbee380d858e63196466d5c86"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00d8db270afb76f48a499f7bb8fa70297e66da67288471ca873db88382850bf4"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9b0c2b466b2f4d89ccc33784c4ebb1627989bd84a39b79092e560e937a11d4ac"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:51d1b42d44f4ffb93188f9b39e6d1c82aa758fdb8d9de65e1ddfe7a7d250d7ad"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:11abdbfc6f7f7dea4a524b5f4117369b0d757725798f1593796be6ece20266cb"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f02f4a72cc3ab2565c6d9720f0343cb840fb2dc01a2e9ecb8bc58ccf95dc5c06"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-win32.whl", hash = "sha256:81d5dd2dd9ab78d31a451e357315f201d976c131ca7d43870a0e8063b6b7a1ec"}, + {file = "psycopg2_binary-2.9.7-cp37-cp37m-win_amd64.whl", hash = "sha256:62cb6de84d7767164a87ca97e22e5e0a134856ebcb08f21b621c6125baf61f16"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:59f7e9109a59dfa31efa022e94a244736ae401526682de504e87bd11ce870c22"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:95a7a747bdc3b010bb6a980f053233e7610276d55f3ca506afff4ad7749ab58a"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c721ee464e45ecf609ff8c0a555018764974114f671815a0a7152aedb9f3343"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4f37bbc6588d402980ffbd1f3338c871368fb4b1cfa091debe13c68bb3852b3"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac83ab05e25354dad798401babaa6daa9577462136ba215694865394840e31f8"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:024eaeb2a08c9a65cd5f94b31ace1ee3bb3f978cd4d079406aef85169ba01f08"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1c31c2606ac500dbd26381145684d87730a2fac9a62ebcfbaa2b119f8d6c19f4"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:42a62ef0e5abb55bf6ffb050eb2b0fcd767261fa3faf943a4267539168807522"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7952807f95c8eba6a8ccb14e00bf170bb700cafcec3924d565235dffc7dc4ae8"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e02bc4f2966475a7393bd0f098e1165d470d3fa816264054359ed4f10f6914ea"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-win32.whl", hash = "sha256:fdca0511458d26cf39b827a663d7d87db6f32b93efc22442a742035728603d5f"}, + {file = "psycopg2_binary-2.9.7-cp38-cp38-win_amd64.whl", hash = "sha256:d0b16e5bb0ab78583f0ed7ab16378a0f8a89a27256bb5560402749dbe8a164d7"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6822c9c63308d650db201ba22fe6648bd6786ca6d14fdaf273b17e15608d0852"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f94cb12150d57ea433e3e02aabd072205648e86f1d5a0a692d60242f7809b15"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5ee89587696d808c9a00876065d725d4ae606f5f7853b961cdbc348b0f7c9a1"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad5ec10b53cbb57e9a2e77b67e4e4368df56b54d6b00cc86398578f1c635f329"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:642df77484b2dcaf87d4237792246d8068653f9e0f5c025e2c692fc56b0dda70"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6a8b575ac45af1eaccbbcdcf710ab984fd50af048fe130672377f78aaff6fc1"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f955aa50d7d5220fcb6e38f69ea126eafecd812d96aeed5d5f3597f33fad43bb"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ad26d4eeaa0d722b25814cce97335ecf1b707630258f14ac4d2ed3d1d8415265"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ced63c054bdaf0298f62681d5dcae3afe60cbae332390bfb1acf0e23dcd25fc8"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2b04da24cbde33292ad34a40db9832a80ad12de26486ffeda883413c9e1b1d5e"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-win32.whl", hash = "sha256:18f12632ab516c47c1ac4841a78fddea6508a8284c7cf0f292cb1a523f2e2379"}, + {file = "psycopg2_binary-2.9.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb3b8d55924a6058a26db69fb1d3e7e32695ff8b491835ba9f479537e14dcf9f"}, +] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.4.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-resource-path" +version = "1.3.0" +description = "Provides path for uniform access to test resources in isolated directory" +optional = false +python-versions = ">=3.5" +files = [ + {file = "pytest-resource-path-1.3.0.tar.gz", hash = "sha256:5f11b705e57f027141ef651bfeb5d14250ceb5fdb16acd0110228cf07f4a3d1b"}, + {file = "pytest_resource_path-1.3.0-py3-none-any.whl", hash = "sha256:0f794f6b24c14cb20cfd773b08f9de63b3826d1dad0ba4f107fa6f8d65a41350"}, +] + +[package.dependencies] +colorama = "*" +pytest = ">=3.5.0" + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-mock" +version = "1.11.0" +description = "Mock out responses from the requests package" +optional = false +python-versions = "*" +files = [ + {file = "requests-mock-1.11.0.tar.gz", hash = "sha256:ef10b572b489a5f28e09b708697208c4a3b2b89ef80a9f01584340ea357ec3c4"}, + {file = "requests_mock-1.11.0-py2.py3-none-any.whl", hash = "sha256:f7fae383f228633f6bececebdab236c478ace2284d6292c6e7e2867b9ab74d15"}, +] + +[package.dependencies] +requests = ">=2.3,<3" +six = "*" + +[package.extras] +fixture = ["fixtures"] +test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "testtools"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "sqlalchemy" +version = "1.4.47" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.47-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:dcfb480bfc9e1fab726003ae00a6bfc67a29bad275b63a4e36d17fe7f13a624e"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28fda5a69d6182589892422c5a9b02a8fd1125787aab1d83f1392aa955bf8d0a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win32.whl", hash = "sha256:45e799c1a41822eba6bee4e59b0e38764e1a1ee69873ab2889079865e9ea0e23"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win_amd64.whl", hash = "sha256:10edbb92a9ef611f01b086e271a9f6c1c3e5157c3b0c5ff62310fb2187acbd4a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a4df53472c9030a8ddb1cce517757ba38a7a25699bbcabd57dcc8a5d53f324e"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:511d4abc823152dec49461209607bbfb2df60033c8c88a3f7c93293b8ecbb13d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbe57f39f531c5d68d5594ea4613daa60aba33bb51a8cc42f96f17bbd6305e8d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca8ab6748e3ec66afccd8b23ec2f92787a58d5353ce9624dccd770427ee67c82"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299b5c5c060b9fbe51808d0d40d8475f7b3873317640b9b7617c7f988cf59fda"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win32.whl", hash = "sha256:684e5c773222781775c7f77231f412633d8af22493bf35b7fa1029fdf8066d10"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win_amd64.whl", hash = "sha256:2bba39b12b879c7b35cde18b6e14119c5f1a16bd064a48dd2ac62d21366a5e17"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:795b5b9db573d3ed61fae74285d57d396829e3157642794d3a8f72ec2a5c719b"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:989c62b96596b7938cbc032e39431e6c2d81b635034571d6a43a13920852fb65"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b67bda733da1dcdccaf354e71ef01b46db483a4f6236450d3f9a61efdba35a"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win32.whl", hash = "sha256:9a198f690ac12a3a807e03a5a45df6a30cd215935f237a46f4248faed62e69c8"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win_amd64.whl", hash = "sha256:03be6f3cb66e69fb3a09b5ea89d77e4bc942f3bf84b207dba84666a26799c166"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:16ee6fea316790980779268da47a9260d5dd665c96f225d28e7750b0bb2e2a04"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:557675e0befafa08d36d7a9284e8761c97490a248474d778373fb96b0d7fd8de"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb2797fee8a7914fb2c3dc7de404d3f96eb77f20fc60e9ee38dc6b0ca720f2c2"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28297aa29e035f29cba6b16aacd3680fbc6a9db682258d5f2e7b49ec215dbe40"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win32.whl", hash = "sha256:998e782c8d9fd57fa8704d149ccd52acf03db30d7dd76f467fd21c1c21b414fa"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win_amd64.whl", hash = "sha256:dde4d02213f1deb49eaaf8be8a6425948963a7af84983b3f22772c63826944de"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e98ef1babe34f37f443b7211cd3ee004d9577a19766e2dbacf62fce73c76245a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a3879853208a242b5913f3a17c6ac0eae9dc210ff99c8f10b19d4a1ed8ed9b"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7120a2f72599d4fed7c001fa1cbbc5b4d14929436135768050e284f53e9fbe5e"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048509d7f3ac27b83ad82fd96a1ab90a34c8e906e4e09c8d677fc531d12c23c5"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win32.whl", hash = "sha256:6572d7c96c2e3e126d0bb27bfb1d7e2a195b68d951fcc64c146b94f088e5421a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win_amd64.whl", hash = "sha256:a6c3929df5eeaf3867724003d5c19fed3f0c290f3edc7911616616684f200ecf"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71d4bf7768169c4502f6c2b0709a02a33703544f611810fb0c75406a9c576ee1"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd45c60cc4f6d68c30d5179e2c2c8098f7112983532897566bb69c47d87127d3"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fdbb8e9d4e9003f332a93d6a37bca48ba8095086c97a89826a136d8eddfc455"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f216a51451a0a0466e082e163591f6dcb2f9ec182adb3f1f4b1fd3688c7582c"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win32.whl", hash = "sha256:bd988b3362d7e586ef581eb14771bbb48793a4edb6fcf62da75d3f0f3447060b"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win_amd64.whl", hash = "sha256:32ab09f2863e3de51529aa84ff0e4fe89a2cb1bfbc11e225b6dbc60814e44c94"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:07764b240645627bc3e82596435bd1a1884646bfc0721642d24c26b12f1df194"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e2a42017984099ef6f56438a6b898ce0538f6fadddaa902870c5aa3e1d82583"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b6d807c76c20b4bc143a49ad47782228a2ac98bdcdcb069da54280e138847fc"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a94632ba26a666e7be0a7d7cc3f7acab622a04259a3aa0ee50ff6d44ba9df0d"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win32.whl", hash = "sha256:f80915681ea9001f19b65aee715115f2ad310730c8043127cf3e19b3009892dd"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win_amd64.whl", hash = "sha256:fc700b862e0a859a37faf85367e205e7acaecae5a098794aff52fdd8aea77b12"}, + {file = "SQLAlchemy-1.4.47.tar.gz", hash = "sha256:95fc02f7fc1f3199aaa47a8a757437134cf618e9d994c84effd53f530c38586f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tqdm" +version = "4.66.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, + {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "urllib3" +version = "1.26.16" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "8902f5b5809776080f7aed59b2c0c27c940db831e892adcb878414208cc6f584" diff --git a/apps/cli/executables/pexable/productfetcher/productfetcher/__init__.py b/apps/cli/executables/pexable/productfetcher/productfetcher/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..728cc4513a7ab6007de64c22acd447def124e46e 100644 --- a/apps/cli/executables/pexable/productfetcher/productfetcher/__init__.py +++ b/apps/cli/executables/pexable/productfetcher/productfetcher/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Product fetcher: retrieve products from NGAS and other places for the archive and place them on disk +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/productfetcher/productfetcher/_version.py b/apps/cli/executables/pexable/productfetcher/productfetcher/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/productfetcher/productfetcher/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/productfetcher/productfetcher/locations.py b/apps/cli/executables/pexable/productfetcher/productfetcher/locations.py index 4371e2279271081aaaf4595e3161e1cc6b8e3ce0..7ae7234788951843fe324c677bc3bc57b7ff667b 100644 --- a/apps/cli/executables/pexable/productfetcher/productfetcher/locations.py +++ b/apps/cli/executables/pexable/productfetcher/productfetcher/locations.py @@ -241,7 +241,7 @@ class OracleXml(LocatedFile): subdirectory: str relative_path: str _size: int - _science_product_locator: str + _science_product_locator: str = None def __init__(self, archive_uid: str, table: str, subdirectory: str, relative_path: str, size): super().__init__() diff --git a/apps/cli/executables/pexable/productfetcher/productfetcher/product_fetcher.py b/apps/cli/executables/pexable/productfetcher/productfetcher/product_fetcher.py index 1d343a3c1648112696b1d13a34e1e78053a1fb4b..dfde05de41db35a74e0b01e56878f9ebc4a3e024 100644 --- a/apps/cli/executables/pexable/productfetcher/productfetcher/product_fetcher.py +++ b/apps/cli/executables/pexable/productfetcher/productfetcher/product_fetcher.py @@ -53,7 +53,9 @@ class RetrievalMode(Enum): class CLIParam(Enum): - """Codifies productfetcher's various command-line parameters""" + """ + Codifies productfetcher's various command-line parameters + """ DESTINATION_DIRECTORY = "--output" SPL = "--product-locator" diff --git a/apps/cli/executables/pexable/productfetcher/pyproject.toml b/apps/cli/executables/pexable/productfetcher/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..5496580bb2f515b7e55aa747a8df099eb77f4de4 --- /dev/null +++ b/apps/cli/executables/pexable/productfetcher/pyproject.toml @@ -0,0 +1,36 @@ +[tool.poetry] +name = "productfetcher" +version = "2.8.2rc1" +description = "Product fetcher: retrieve products from NGAS and other places for the archive and place them on disk" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +marshmallow = "^3.19.0" +cx-oracle = "^8.3.0" +pika = "^1.3.1" +pycapo = "^0.3.1" +beautifulsoup4 = "^4.12.2" +lxml = "4.9.2" +psycopg2-binary = "^2.9.6" +requests = "^2.29.0" +tqdm = "^4.65.0" +sqlalchemy = "1.4.47" +urllib3 = "<2.0.0" + +[tool.poetry.group.test.dependencies] +requests-mock = "^1.10.0" +pytest = "^7.3.1" +pytest-resource-path = "^1.3.0" + +[tool.poetry.group.dev.dependencies] +pex = "2.1.119" + +[tool.poetry.scripts] +productfetcher = "productfetcher.product_fetcher:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/executables/pexable/productfetcher/setup.cfg b/apps/cli/executables/pexable/productfetcher/setup.cfg deleted file mode 100644 index 2ca87049b2d769e6fcc4587bf014254a83223373..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/productfetcher/setup.cfg +++ /dev/null @@ -1,5 +0,0 @@ -[metadata] -description_file = README.md - -[aliases] -test=pytest diff --git a/apps/cli/executables/pexable/productfetcher/setup.py b/apps/cli/executables/pexable/productfetcher/setup.py deleted file mode 100644 index 87f80b740bba321ea5bae9edc6f30f0a00f53425..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/productfetcher/setup.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("productfetcher/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = [ - "marshmallow>=3.12.1,<3.13", - "cx_Oracle>=8.1.0,<8.2", - "sqlalchemy==1.4.46", - "pika>=1.1,<2", - "pycapo>=0.3.0,<1.0", - "beautifulsoup4>=4.9.1,<5.0", - "lxml>=4.3.2,<5.0", - "psycopg2>=2.8.5,<3.0", - "requests>=2.23,<2.30.0", - "requests-mock", - "marshmallow", - "pex==2.1.119", - "tqdm>=4.60.00,<4.61", -] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="NRAO Archive Data Fetcher Script", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - tests_require=["pytest", "pytest-resource-path", "requests-mock"], - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={ - "console_scripts": [ - "productfetcher = productfetcher.product_fetcher:main", - ] - }, -) diff --git a/apps/cli/executables/pexable/pycapo b/apps/cli/executables/pexable/pycapo index e8e3cd0aa55276ffd49dcf03eee5eeba4ebc18f8..77edd5a7a7be236adfd18b20b0a627dc7c7fe489 160000 --- a/apps/cli/executables/pexable/pycapo +++ b/apps/cli/executables/pexable/pycapo @@ -1 +1 @@ -Subproject commit e8e3cd0aa55276ffd49dcf03eee5eeba4ebc18f8 +Subproject commit 77edd5a7a7be236adfd18b20b0a627dc7c7fe489 diff --git a/apps/cli/executables/pexable/update_stage/LICENSE b/apps/cli/executables/pexable/update_stage/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/update_stage/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/update_stage/poetry.lock b/apps/cli/executables/pexable/update_stage/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..bcf9465861eaef081467dd9c488df2c46028b4e7 --- /dev/null +++ b/apps/cli/executables/pexable/update_stage/poetry.lock @@ -0,0 +1,135 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "htchirp" +version = "2.0" +description = "Pure Python Chirp client for HTCondor" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "htchirp-2.0-py2.py3-none-any.whl", hash = "sha256:862c1b06485fa6e28d21303be0c6f8507fa4f1b5487e96ca9ad9c4a1249cbb13"}, + {file = "htchirp-2.0.tar.gz", hash = "sha256:3bcca4b809b81ea7b68acffed54104096437ea9aaf6063928120ad4c50cbd9f7"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pex" +version = "2.1.119" +description = "The PEX packaging toolchain." +category = "dev" +optional = false +python-versions = ">=2.7,<3.12,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "pex-2.1.119-py2.py3-none-any.whl", hash = "sha256:b0dbdf2b1c608b159e50b19fa03b74659d1ecab593335bba0f2ec2ac1184ed7b"}, + {file = "pex-2.1.119.tar.gz", hash = "sha256:42e82163c1b467dff7ef5b651b454c52a78a5bf36776ff6631b4750080659930"}, +] + +[package.extras] +subprocess = ["subprocess32 (>=3.2.7)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "391cd98fe2cdf0441287f1f2bd07603e148acd1b367fd4be97c36f868c1d3190" diff --git a/apps/cli/executables/pexable/update_stage/pyproject.toml b/apps/cli/executables/pexable/update_stage/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..42acba6ac20cfa18da5fdd6897192e285b9bcd9a --- /dev/null +++ b/apps/cli/executables/pexable/update_stage/pyproject.toml @@ -0,0 +1,25 @@ +[tool.poetry] +name = "ssa_update_stage" +version = "2.8.2rc1" +description = "Update stage: pass status information back to workspaces over the HT Chirp protocol" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" +packages = [{ include = "update_stage" }] + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +htchirp = "^2.0" + +[tool.poetry.group.dev.dependencies] +pex = "2.1.119" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[tool.poetry.scripts] +update_stage = "update_stage.update:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/executables/pexable/update_stage/setup.py b/apps/cli/executables/pexable/update_stage/setup.py deleted file mode 100644 index cb51756ae7a0d712978e841393bb0ef5608c8fff..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/update_stage/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("update_stage/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["htchirp", "pex==2.1.119"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Update Stage allows for progress visibility into currently running HTCondor workflows", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["update_stage = update_stage.update:main"]}, -) diff --git a/apps/cli/executables/pexable/update_stage/tests/test_nothing.py b/apps/cli/executables/pexable/update_stage/tests/test_nothing.py new file mode 100644 index 0000000000000000000000000000000000000000..1bf2f7e783c407f766c14dad0f9a39cc7841a8f7 --- /dev/null +++ b/apps/cli/executables/pexable/update_stage/tests/test_nothing.py @@ -0,0 +1,3 @@ +def test_always_passes(): + assert True + diff --git a/apps/cli/executables/pexable/update_stage/update_stage/__init__.py b/apps/cli/executables/pexable/update_stage/update_stage/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..57393140dd80a25c1285f0053048ff48642de385 100644 --- a/apps/cli/executables/pexable/update_stage/update_stage/__init__.py +++ b/apps/cli/executables/pexable/update_stage/update_stage/__init__.py @@ -0,0 +1,21 @@ +# +# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. +# +# This file is part of NRAO Workspaces. +# +# Workspaces is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Workspaces is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Update stage: pass status information back to workspaces over the HT Chirp protocol +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/update_stage/update_stage/_version.py b/apps/cli/executables/pexable/update_stage/update_stage/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/update_stage/update_stage/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/vela/LICENSE b/apps/cli/executables/pexable/vela/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/vela/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/vela/poetry.lock b/apps/cli/executables/pexable/vela/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..4e21b8526b96104b80ae62ca931d037543545193 --- /dev/null +++ b/apps/cli/executables/pexable/vela/poetry.lock @@ -0,0 +1,299 @@ +# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. + +[[package]] +name = "arrow" +version = "1.2.3" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +optional = false +python-versions = "*" +files = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "lxml" +version = "4.9.2" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892"}, + {file = "lxml-4.9.2-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a"}, + {file = "lxml-4.9.2-cp27-cp27m-win32.whl", hash = "sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de"}, + {file = "lxml-4.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50"}, + {file = "lxml-4.9.2-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975"}, + {file = "lxml-4.9.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4"}, + {file = "lxml-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7"}, + {file = "lxml-4.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184"}, + {file = "lxml-4.9.2-cp310-cp310-win32.whl", hash = "sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda"}, + {file = "lxml-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf"}, + {file = "lxml-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92"}, + {file = "lxml-4.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1"}, + {file = "lxml-4.9.2-cp311-cp311-win32.whl", hash = "sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33"}, + {file = "lxml-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"}, + {file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"}, + {file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"}, + {file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"}, + {file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1"}, + {file = "lxml-4.9.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"}, + {file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"}, + {file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"}, + {file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"}, + {file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894"}, + {file = "lxml-4.9.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e"}, + {file = "lxml-4.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b"}, + {file = "lxml-4.9.2-cp37-cp37m-win32.whl", hash = "sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe"}, + {file = "lxml-4.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9"}, + {file = "lxml-4.9.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03"}, + {file = "lxml-4.9.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f"}, + {file = "lxml-4.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457"}, + {file = "lxml-4.9.2-cp38-cp38-win32.whl", hash = "sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b"}, + {file = "lxml-4.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7"}, + {file = "lxml-4.9.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947"}, + {file = "lxml-4.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5"}, + {file = "lxml-4.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2"}, + {file = "lxml-4.9.2-cp39-cp39-win32.whl", hash = "sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1"}, + {file = "lxml-4.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c"}, + {file = "lxml-4.9.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f"}, + {file = "lxml-4.9.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7"}, + {file = "lxml-4.9.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409"}, + {file = "lxml-4.9.2.tar.gz", hash = "sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.7)"] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pex" +version = "2.1.119" +description = "The PEX packaging toolchain." +optional = false +python-versions = ">=2.7,<3.12,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "pex-2.1.119-py2.py3-none-any.whl", hash = "sha256:b0dbdf2b1c608b159e50b19fa03b74659d1ecab593335bba0f2ec2ac1184ed7b"}, + {file = "pex-2.1.119.tar.gz", hash = "sha256:42e82163c1b467dff7ef5b651b454c52a78a5bf36776ff6631b4750080659930"}, +] + +[package.extras] +subprocess = ["subprocess32 (>=3.2.7)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "soupsieve" +version = "2.4.1" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "ac19e3eb81d195457c52b603282df6005d89a101efcbf108c68f9eebe5c0a459" diff --git a/apps/cli/executables/pexable/vela/pyproject.toml b/apps/cli/executables/pexable/vela/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..bdb1bd21ccd8819c768f19c77c06b89750bfd617 --- /dev/null +++ b/apps/cli/executables/pexable/vela/pyproject.toml @@ -0,0 +1,28 @@ +[tool.poetry] +name = "ssa_vela" +version = "2.8.2rc1" +description = "Workspaces CASA functionality bridge" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" +packages = [{ include = "vela" }] + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +pycapo = "^0.3.1" +bs4 = "^0.0.1" +lxml = "^4.9.2" +arrow = "^1.2.3" + +[tool.poetry.group.dev.dependencies] +pex = "2.1.119" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[tool.poetry.scripts] +vela = "vela.quasar:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/executables/pexable/vela/setup.py b/apps/cli/executables/pexable/vela/setup.py deleted file mode 100644 index 4b0faaf635bd15fd67c11d578bd2f0f59cfe9879..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/vela/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("vela/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["pycapo", "bs4", "lxml", "pex==2.1.119", "pendulum", "argparse"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces CASA functionality bridge", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["vela = vela.quasar:main"]}, -) diff --git a/apps/cli/executables/pexable/vela/test/__init__.py b/apps/cli/executables/pexable/vela/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/vela/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/executables/pexable/vela/test/test_forger.py b/apps/cli/executables/pexable/vela/test/test_forger.py index be674af3d0fcd5e22580b5c911660f411a7957d1..d3a3eece22098a4384a5e61cd1083c8dedf262df 100644 --- a/apps/cli/executables/pexable/vela/test/test_forger.py +++ b/apps/cli/executables/pexable/vela/test/test_forger.py @@ -37,8 +37,8 @@ class TestVelaLog: assert img_logs.call_count == 1 @patch("os.chdir") - @patch("pendulum.now") - def test_cal_logs(self, mock_pendulum, mock_os): + @patch("arrow.now") + def test_cal_logs(self, mock_arrow, mock_os): with patch("builtins.open", mock_open()) as o: VelaLog("test.json").cal_logs() assert o.call_count == 3 @@ -46,8 +46,8 @@ class TestVelaLog: assert handle.write.call_count == 3 @patch("os.chdir") - @patch("pendulum.now") - def test_img_logs(self, mock_pendulum, mock_os): + @patch("arrow.now") + def test_img_logs(self, mock_arrow, mock_os): with patch("builtins.open", mock_open()) as o: VelaLog("image-metadata.json").img_logs() assert o.call_count == 3 @@ -93,9 +93,9 @@ class TestVelaProduct: @patch("os.mkdir") @patch("os.chdir") - @patch("pendulum.now") + @patch("arrow.now") @patch("tarfile.open") - def test_forge_weblog(self, mock_tar, mock_pendulum, mock_os_chdir, mock_os_mkdir): + def test_forge_weblog(self, mock_tar, mock_arrow, mock_os_chdir, mock_os_mkdir): with patch("builtins.open", mock_open()) as o: VelaProduct("test.json", "standard_cal").forge_weblog(path="/tmp/workspaces_tmp/testing") assert o.call_count == 2 diff --git a/apps/cli/executables/pexable/vela/vela/__init__.py b/apps/cli/executables/pexable/vela/vela/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..7408bcca31bfcadcdde868c6ec44c9bafb102f23 100644 --- a/apps/cli/executables/pexable/vela/vela/__init__.py +++ b/apps/cli/executables/pexable/vela/vela/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Workspaces CASA functionality bridge +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/vela/vela/_version.py b/apps/cli/executables/pexable/vela/vela/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/vela/vela/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/vela/vela/forger.py b/apps/cli/executables/pexable/vela/vela/forger.py index 57628ab271af2ea2579f7cf5fd345279adc23ca6..03cdbaff52ff413b320ad51ab0635ec5a7b64676 100644 --- a/apps/cli/executables/pexable/vela/vela/forger.py +++ b/apps/cli/executables/pexable/vela/vela/forger.py @@ -24,7 +24,7 @@ import os import tarfile from pathlib import Path -import pendulum.date +import arrow import vela.content.forger_content as content @@ -64,8 +64,8 @@ class VelaLog: pipe_err.write(forged_content()) pipe_err.close() - datestring = pendulum.now().format("YYYYMMDD") - timestring = pendulum.now().utcnow().format("hhmmss") + datestring = arrow.now().format("YYYYMMDD") + timestring = arrow.utcnow().format("hhmmss") log = open(f"vela-{datestring}-{timestring}.log", "w") log.write(forged_content()) @@ -165,8 +165,8 @@ class VelaProduct: def forge_weblog(self, path): self.logger.info("Forging weblog...") - datestring = pendulum.now().format("YYYYMMDD") - timestring = pendulum.now().utcnow().format("hhmmss") + datestring = arrow.now().format("YYYYMMDD") + timestring = arrow.utcnow().format("hhmmss") dirname = f"pipeline-{datestring}-{timestring}" os.mkdir(dirname) os.chdir(path + "/" + dirname) diff --git a/apps/cli/executables/pexable/vela/vela/quasar.py b/apps/cli/executables/pexable/vela/vela/quasar.py index b7687b19ac5b70e60723619f3fdf338573c2ad87..cd22e00d277902a48da930829b26193a5079ac96 100644 --- a/apps/cli/executables/pexable/vela/vela/quasar.py +++ b/apps/cli/executables/pexable/vela/vela/quasar.py @@ -83,6 +83,7 @@ def parser() -> argparse.ArgumentParser: required=False, help="run an integrated calibration-imaging pipeline", ) + return arg_parser diff --git a/apps/cli/executables/pexable/wf_inspector/LICENSE b/apps/cli/executables/pexable/wf_inspector/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/wf_inspector/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/wf_inspector/poetry.lock b/apps/cli/executables/pexable/wf_inspector/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..67569faacb00f390fff96ba0236bf2df2274d73e --- /dev/null +++ b/apps/cli/executables/pexable/wf_inspector/poetry.lock @@ -0,0 +1,333 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "hypothesis" +version = "6.75.7" +description = "A library for property-based testing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "hypothesis-6.75.7-py3-none-any.whl", hash = "sha256:d8a093a3d30281cda6a493321826bc5088f7d8d54695cac867b7e9b035bcb2d6"}, + {file = "hypothesis-6.75.7.tar.gz", hash = "sha256:a8ef2e0c7d5ebd90043a4ed8f6987de6a2b497b2caf6863364ff41db25971856"}, +] + +[package.dependencies] +attrs = ">=19.2.0" +exceptiongroup = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +sortedcontainers = ">=2.1.0,<3.0.0" + +[package.extras] +all = ["backports.zoneinfo (>=0.2.1)", "black (>=19.10b0)", "click (>=7.0)", "django (>=3.2)", "dpcontracts (>=0.4)", "importlib-metadata (>=3.6)", "lark (>=0.10.1)", "libcst (>=0.3.16)", "numpy (>=1.16.0)", "pandas (>=1.1)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "tzdata (>=2023.3)"] +cli = ["black (>=19.10b0)", "click (>=7.0)", "rich (>=9.0.0)"] +codemods = ["libcst (>=0.3.16)"] +dateutil = ["python-dateutil (>=1.4)"] +django = ["django (>=3.2)"] +dpcontracts = ["dpcontracts (>=0.4)"] +ghostwriter = ["black (>=19.10b0)"] +lark = ["lark (>=0.10.1)"] +numpy = ["numpy (>=1.16.0)"] +pandas = ["pandas (>=1.1)"] +pytest = ["pytest (>=4.6)"] +pytz = ["pytz (>=2014.1)"] +redis = ["redis (>=3.0.0)"] +zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2023.3)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "urllib3" +version = "2.0.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.10,<3.12" +content-hash = "c3f67be1ea146fb7e101187645d28e2d912bd4d0faac0bcc7764970e30aacdf7" diff --git a/apps/cli/executables/pexable/wf_inspector/pyproject.toml b/apps/cli/executables/pexable/wf_inspector/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..a6de7ace8cafa9744e758659c31090d4f26687ad --- /dev/null +++ b/apps/cli/executables/pexable/wf_inspector/pyproject.toml @@ -0,0 +1,23 @@ +[tool.poetry] +name = "wf_inspector" +version = "2.8.2rc1" +description = "Command-line script that wraps the functionality of `docker exec -it` to enter our workflow Docker container" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = ">=3.10,<3.12" +requests = "^2.29.0" +pycapo = "^0.3.1" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" +hypothesis = "^6.75.7" + +[tool.poetry.scripts] +wf_inspector = "wf_inspector.inspector:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/executables/pexable/wf_inspector/setup.py b/apps/cli/executables/pexable/wf_inspector/setup.py deleted file mode 100644 index 0c25ce403dd6ef0622f4d249caf69c65e19167a0..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/wf_inspector/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("wf_inspector/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["argparse", "requests", "pycapo"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces workflow inspector; inspect a running workflow!", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["wf_inspector = wf_inspector.inspector:main"]}, -) diff --git a/apps/cli/executables/pexable/wf_inspector/test/test_inspector.py b/apps/cli/executables/pexable/wf_inspector/test/test_inspector.py index 16f0c72c8aeaaa1e4f03e9871efcd08dbd1eafb8..d4feb6ed83dadde56ed8441117562552bf808eee 100644 --- a/apps/cli/executables/pexable/wf_inspector/test/test_inspector.py +++ b/apps/cli/executables/pexable/wf_inspector/test/test_inspector.py @@ -50,61 +50,7 @@ TEST_BATCH_ID = 4 TEST_DAG_JOB_ID = 5 -def test_get_container_id_by_substr_found(): - fake_completed_process = CompletedProcess( - ["docker", "ps", "-q", "-f", "workflow"], returncode=0, stdout=TEST_CONTAINER_ID - ) - with patch("wf_inspector.inspector.subprocess.run", return_value=fake_completed_process): - test_container_id = get_container_id_by_substr("workflow") - - assert test_container_id == TEST_CONTAINER_ID - - -def test_get_container_id_by_substr_not_found(): - fake_completed_process = CompletedProcess(["docker", "ps", "-q", "-f", "workflow"], returncode=0, stdout="") - with patch("wf_inspector.inspector.subprocess.run", return_value=fake_completed_process): - test_container_id = get_container_id_by_substr("workflow") - - assert test_container_id is None - - -def test_get_container_id_by_substr_error(caplog): - expected_logs = [ - "Docker command not accessible. Docker is either not installed or you lack permissions to use it.", - "Are you running this from within a Docker container? Docker is not installed in containers.", - ] - fake_completed_process = CompletedProcess(["docker", "ps", "-q", "-f", "workflow"], returncode=1, stdout="") - with patch("wf_inspector.inspector.subprocess.run", return_value=fake_completed_process): - test_container_id = get_container_id_by_substr("workflow") - - assert test_container_id is None - # Assert all expected logs have been logged out - assert all(log in [record.message for record in caplog.records] for log in expected_logs) - - -def test_get_wf_request_htcondor_id_docker(): - # Environment save point - capo_profile_savepoint = os.environ.get("CAPO_PROFILE") - # Set environment to check that the URL is set correctly - os.environ["CAPO_PROFILE"] = "docker" - - fake_response = MagicMock() - fake_response.status_code = 200 - fake_response.json.return_value = {"htcondor_job_id": "-1"} - - with patch("wf_inspector.inspector.requests.get", return_value=fake_response) as mock_get: - test_htcondor_id = get_wf_request_htcondor_id("-1") - mock_get.assert_called_with("http://localhost:3456/workflows/name/requests/-1/htcondor_id") - - assert test_htcondor_id == -1 - - # Return environment to previous state - if capo_profile_savepoint is None: - capo_profile_savepoint = "" - os.environ["CAPO_PROFILE"] = capo_profile_savepoint - - -def test_get_wf_request_htcondor_id_nondocker(): +def test_get_wf_request_htcondor_id(): # Environment save point capo_profile_savepoint = os.environ.get("CAPO_PROFILE") # Set environment to check that the URL is set correctly diff --git a/apps/cli/executables/pexable/wf_inspector/wf_inspector/__init__.py b/apps/cli/executables/pexable/wf_inspector/wf_inspector/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..e58ac519c58101e2c3f270cfc2968da18b5713d9 100644 --- a/apps/cli/executables/pexable/wf_inspector/wf_inspector/__init__.py +++ b/apps/cli/executables/pexable/wf_inspector/wf_inspector/__init__.py @@ -15,3 +15,6 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +"""wf_inspector: access a running workflow via ssh""" +__version__ = "2.8.2rc1" + diff --git a/apps/cli/executables/pexable/wf_inspector/wf_inspector/_version.py b/apps/cli/executables/pexable/wf_inspector/wf_inspector/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/wf_inspector/wf_inspector/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/ws_annihilator/LICENSE b/apps/cli/executables/pexable/ws_annihilator/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/ws_annihilator/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/ws_annihilator/poetry.lock b/apps/cli/executables/pexable/ws_annihilator/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..2f57cfa8f0d26ddfb5020b0461e07cd731e9b562 --- /dev/null +++ b/apps/cli/executables/pexable/ws_annihilator/poetry.lock @@ -0,0 +1,269 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "urllib3" +version = "2.0.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "65ef930114a0048ddbcefef440e5c0f8dfd5ce56e7a4d0cd7e63850870986c77" diff --git a/apps/cli/executables/pexable/ws_annihilator/pyproject.toml b/apps/cli/executables/pexable/ws_annihilator/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..cf88a12028887a30509d88203a7bf10ff039109f --- /dev/null +++ b/apps/cli/executables/pexable/ws_annihilator/pyproject.toml @@ -0,0 +1,22 @@ +[tool.poetry] +name = "ws_annihilator" +version = "2.8.2rc1" +description = "Workspaces Directory Annihilator; Clean up generated products from lustre!" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +requests = "^2.29.0" +pycapo = "^0.3.1" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[tool.poetry.scripts] +ws_annihilator = "ws_annihilator.annihilator:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/executables/pexable/ws_annihilator/setup.py b/apps/cli/executables/pexable/ws_annihilator/setup.py deleted file mode 100644 index 8610aab0dc8e7d2c71128818a9480aca57bc75c2..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ws_annihilator/setup.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("ws_annihilator/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = [ - "argparse", - "pycapo", - "requests", -] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces Directory Annihilator; Clean up generated products from lustre!", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["ws_annihilator = ws_annihilator.annihilator:main"]}, -) diff --git a/apps/cli/executables/pexable/ws_annihilator/tests/test_nothing.py b/apps/cli/executables/pexable/ws_annihilator/tests/test_nothing.py new file mode 100644 index 0000000000000000000000000000000000000000..3b79f3d7c6cde773aff5ea674837f99aaad06fe3 --- /dev/null +++ b/apps/cli/executables/pexable/ws_annihilator/tests/test_nothing.py @@ -0,0 +1,2 @@ +def test_always_passes(): + assert True diff --git a/apps/cli/executables/pexable/ws_annihilator/ws_annihilator/__init__.py b/apps/cli/executables/pexable/ws_annihilator/ws_annihilator/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..282cd2a7bc63112ba3c7b94572ea52cc8f9be88c 100644 --- a/apps/cli/executables/pexable/ws_annihilator/ws_annihilator/__init__.py +++ b/apps/cli/executables/pexable/ws_annihilator/ws_annihilator/__init__.py @@ -0,0 +1,21 @@ +# +# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. +# +# This file is part of NRAO Workspaces. +# +# Workspaces is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Workspaces is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Workspaces Directory Annihilator; Clean up generated products from lustre! +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/ws_annihilator/ws_annihilator/_version.py b/apps/cli/executables/pexable/ws_annihilator/ws_annihilator/_version.py deleted file mode 100644 index 427549ea2fb1722c4a0b559aead85a25493b41f6..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ws_annihilator/ws_annihilator/_version.py +++ /dev/null @@ -1 +0,0 @@ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/ws_metrics/LICENSE b/apps/cli/executables/pexable/ws_metrics/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/executables/pexable/ws_metrics/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/executables/pexable/ws_metrics/poetry.lock b/apps/cli/executables/pexable/ws_metrics/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..2c10361d0d869f1f16946efc6adb7c862a4a041b --- /dev/null +++ b/apps/cli/executables/pexable/ws_metrics/poetry.lock @@ -0,0 +1,381 @@ +# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. + +[[package]] +name = "aenum" +version = "3.1.15" +description = "Advanced Enumerations (compatible with Python's stdlib Enum), NamedTuples, and NamedConstants" +optional = false +python-versions = "*" +files = [ + {file = "aenum-3.1.15-py2-none-any.whl", hash = "sha256:27b1710b9d084de6e2e695dab78fe9f269de924b51ae2850170ee7e1ca6288a5"}, + {file = "aenum-3.1.15-py3-none-any.whl", hash = "sha256:e0dfaeea4c2bd362144b87377e2c61d91958c5ed0b4daf89cb6f45ae23af6288"}, + {file = "aenum-3.1.15.tar.gz", hash = "sha256:8cbd76cd18c4f870ff39b24284d3ea028fbe8731a58df3aa581e434c575b9559"}, +] + +[[package]] +name = "arrow" +version = "1.2.3" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, + {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-binary-2.9.6.tar.gz", hash = "sha256:1f64dcfb8f6e0c014c7f55e51c9759f024f70ea572fbdef123f85318c297947c"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d26e0342183c762de3276cca7a530d574d4e25121ca7d6e4a98e4f05cb8e4df7"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c48d8f2db17f27d41fb0e2ecd703ea41984ee19362cbce52c097963b3a1b4365"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a76e027f87753f9bd1ab5f7c9cb8c7628d1077ef927f5e2446477153a602f2c"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6460c7a99fc939b849431f1e73e013d54aa54293f30f1109019c56a0b2b2ec2f"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae102a98c547ee2288637af07393dd33f440c25e5cd79556b04e3fca13325e5f"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9972aad21f965599ed0106f65334230ce826e5ae69fda7cbd688d24fa922415e"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a40c00dbe17c0af5bdd55aafd6ff6679f94a9be9513a4c7e071baf3d7d22a70"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:cacbdc5839bdff804dfebc058fe25684cae322987f7a38b0168bc1b2df703fb1"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f0438fa20fb6c7e202863e0d5ab02c246d35efb1d164e052f2f3bfe2b152bd0"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-win32.whl", hash = "sha256:b6c8288bb8a84b47e07013bb4850f50538aa913d487579e1921724631d02ea1b"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:61b047a0537bbc3afae10f134dc6393823882eb263088c271331602b672e52e9"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:964b4dfb7c1c1965ac4c1978b0f755cc4bd698e8aa2b7667c575fb5f04ebe06b"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afe64e9b8ea66866a771996f6ff14447e8082ea26e675a295ad3bdbffdd72afb"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e2ee79e7cf29582ef770de7dab3d286431b01c3bb598f8e05e09601b890081"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa74c903a3c1f0d9b1c7e7b53ed2d929a4910e272add6700c38f365a6002820"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b83456c2d4979e08ff56180a76429263ea254c3f6552cd14ada95cff1dec9bb8"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0645376d399bfd64da57148694d78e1f431b1e1ee1054872a5713125681cf1be"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99e34c82309dd78959ba3c1590975b5d3c862d6f279f843d47d26ff89d7d7e1"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4ea29fc3ad9d91162c52b578f211ff1c931d8a38e1f58e684c45aa470adf19e2"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4ac30da8b4f57187dbf449294d23b808f8f53cad6b1fc3623fa8a6c11d176dd0"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78e6e2a00c223e164c417628572a90093c031ed724492c763721c2e0bc2a8df"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-win32.whl", hash = "sha256:1876843d8e31c89c399e31b97d4b9725a3575bb9c2af92038464231ec40f9edb"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b4b24f75d16a89cc6b4cdff0eb6a910a966ecd476d1e73f7ce5985ff1328e9a6"}, + {file = "psycopg2_binary-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:498807b927ca2510baea1b05cc91d7da4718a0f53cb766c154c417a39f1820a0"}, + {file = "psycopg2_binary-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0d236c2825fa656a2d98bbb0e52370a2e852e5a0ec45fc4f402977313329174d"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:34b9ccdf210cbbb1303c7c4db2905fa0319391bd5904d32689e6dd5c963d2ea8"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d2222e61f313c4848ff05353653bf5f5cf6ce34df540e4274516880d9c3763"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30637a20623e2a2eacc420059be11527f4458ef54352d870b8181a4c3020ae6b"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8122cfc7cae0da9a3077216528b8bb3629c43b25053284cc868744bfe71eb141"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38601cbbfe600362c43714482f43b7c110b20cb0f8172422c616b09b85a750c5"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c7e62ab8b332147a7593a385d4f368874d5fe4ad4e341770d4983442d89603e3"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2ab652e729ff4ad76d400df2624d223d6e265ef81bb8aa17fbd63607878ecbee"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c83a74b68270028dc8ee74d38ecfaf9c90eed23c8959fca95bd703d25b82c88e"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d4e6036decf4b72d6425d5b29bbd3e8f0ff1059cda7ac7b96d6ac5ed34ffbacd"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:a8c28fd40a4226b4a84bdf2d2b5b37d2c7bd49486b5adcc200e8c7ec991dfa7e"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:51537e3d299be0db9137b321dfb6a5022caaab275775680e0c3d281feefaca6b"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4499e0a83b7b7edcb8dabecbd8501d0d3a5ef66457200f77bde3d210d5debb"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7e13a5a2c01151f1208d5207e42f33ba86d561b7a89fca67c700b9486a06d0e2"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e0f754d27fddcfd74006455b6e04e6705d6c31a612ec69ddc040a5468e44b4e"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d57c3fd55d9058645d26ae37d76e61156a27722097229d32a9e73ed54819982a"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71f14375d6f73b62800530b581aed3ada394039877818b2d5f7fc77e3bb6894d"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:441cc2f8869a4f0f4bb408475e5ae0ee1f3b55b33f350406150277f7f35384fc"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:65bee1e49fa6f9cf327ce0e01c4c10f39165ee76d35c846ade7cb0ec6683e303"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af335bac6b666cc6aea16f11d486c3b794029d9df029967f9938a4bed59b6a19"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cfec476887aa231b8548ece2e06d28edc87c1397ebd83922299af2e051cf2827"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65c07febd1936d63bfde78948b76cd4c2a411572a44ac50719ead41947d0f26b"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-win32.whl", hash = "sha256:4dfb4be774c4436a4526d0c554af0cc2e02082c38303852a36f6456ece7b3503"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:02c6e3cf3439e213e4ee930308dc122d6fb4d4bea9aef4a12535fbd605d1a2fe"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9182eb20f41417ea1dd8e8f7888c4d7c6e805f8a7c98c1081778a3da2bee3e4"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a6979cf527e2603d349a91060f428bcb135aea2be3201dff794813256c274f1"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8338a271cb71d8da40b023a35d9c1e919eba6cbd8fa20a54b748a332c355d896"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ed340d2b858d6e6fb5083f87c09996506af483227735de6964a6100b4e6a54"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81e65376e52f03422e1fb475c9514185669943798ed019ac50410fb4c4df232"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfb13af3c5dd3a9588000910178de17010ebcccd37b4f9794b00595e3a8ddad3"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4c727b597c6444a16e9119386b59388f8a424223302d0c06c676ec8b4bc1f963"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d67fbdaf177da06374473ef6f7ed8cc0a9dc640b01abfe9e8a2ccb1b1402c1f"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0892ef645c2fabb0c75ec32d79f4252542d0caec1d5d949630e7d242ca4681a3"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:02c0f3757a4300cf379eb49f543fb7ac527fb00144d39246ee40e1df684ab514"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-win32.whl", hash = "sha256:c3dba7dab16709a33a847e5cd756767271697041fbe3fe97c215b1fc1f5c9848"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:f6a88f384335bb27812293fdb11ac6aee2ca3f51d3c7820fe03de0a304ab6249"}, +] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sqlalchemy" +version = "1.4.47" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.47-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:dcfb480bfc9e1fab726003ae00a6bfc67a29bad275b63a4e36d17fe7f13a624e"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28fda5a69d6182589892422c5a9b02a8fd1125787aab1d83f1392aa955bf8d0a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win32.whl", hash = "sha256:45e799c1a41822eba6bee4e59b0e38764e1a1ee69873ab2889079865e9ea0e23"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win_amd64.whl", hash = "sha256:10edbb92a9ef611f01b086e271a9f6c1c3e5157c3b0c5ff62310fb2187acbd4a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a4df53472c9030a8ddb1cce517757ba38a7a25699bbcabd57dcc8a5d53f324e"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:511d4abc823152dec49461209607bbfb2df60033c8c88a3f7c93293b8ecbb13d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbe57f39f531c5d68d5594ea4613daa60aba33bb51a8cc42f96f17bbd6305e8d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca8ab6748e3ec66afccd8b23ec2f92787a58d5353ce9624dccd770427ee67c82"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299b5c5c060b9fbe51808d0d40d8475f7b3873317640b9b7617c7f988cf59fda"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win32.whl", hash = "sha256:684e5c773222781775c7f77231f412633d8af22493bf35b7fa1029fdf8066d10"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win_amd64.whl", hash = "sha256:2bba39b12b879c7b35cde18b6e14119c5f1a16bd064a48dd2ac62d21366a5e17"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:795b5b9db573d3ed61fae74285d57d396829e3157642794d3a8f72ec2a5c719b"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:989c62b96596b7938cbc032e39431e6c2d81b635034571d6a43a13920852fb65"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b67bda733da1dcdccaf354e71ef01b46db483a4f6236450d3f9a61efdba35a"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win32.whl", hash = "sha256:9a198f690ac12a3a807e03a5a45df6a30cd215935f237a46f4248faed62e69c8"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win_amd64.whl", hash = "sha256:03be6f3cb66e69fb3a09b5ea89d77e4bc942f3bf84b207dba84666a26799c166"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:16ee6fea316790980779268da47a9260d5dd665c96f225d28e7750b0bb2e2a04"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:557675e0befafa08d36d7a9284e8761c97490a248474d778373fb96b0d7fd8de"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb2797fee8a7914fb2c3dc7de404d3f96eb77f20fc60e9ee38dc6b0ca720f2c2"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28297aa29e035f29cba6b16aacd3680fbc6a9db682258d5f2e7b49ec215dbe40"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win32.whl", hash = "sha256:998e782c8d9fd57fa8704d149ccd52acf03db30d7dd76f467fd21c1c21b414fa"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win_amd64.whl", hash = "sha256:dde4d02213f1deb49eaaf8be8a6425948963a7af84983b3f22772c63826944de"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e98ef1babe34f37f443b7211cd3ee004d9577a19766e2dbacf62fce73c76245a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a3879853208a242b5913f3a17c6ac0eae9dc210ff99c8f10b19d4a1ed8ed9b"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7120a2f72599d4fed7c001fa1cbbc5b4d14929436135768050e284f53e9fbe5e"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048509d7f3ac27b83ad82fd96a1ab90a34c8e906e4e09c8d677fc531d12c23c5"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win32.whl", hash = "sha256:6572d7c96c2e3e126d0bb27bfb1d7e2a195b68d951fcc64c146b94f088e5421a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win_amd64.whl", hash = "sha256:a6c3929df5eeaf3867724003d5c19fed3f0c290f3edc7911616616684f200ecf"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71d4bf7768169c4502f6c2b0709a02a33703544f611810fb0c75406a9c576ee1"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd45c60cc4f6d68c30d5179e2c2c8098f7112983532897566bb69c47d87127d3"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fdbb8e9d4e9003f332a93d6a37bca48ba8095086c97a89826a136d8eddfc455"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f216a51451a0a0466e082e163591f6dcb2f9ec182adb3f1f4b1fd3688c7582c"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win32.whl", hash = "sha256:bd988b3362d7e586ef581eb14771bbb48793a4edb6fcf62da75d3f0f3447060b"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win_amd64.whl", hash = "sha256:32ab09f2863e3de51529aa84ff0e4fe89a2cb1bfbc11e225b6dbc60814e44c94"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:07764b240645627bc3e82596435bd1a1884646bfc0721642d24c26b12f1df194"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e2a42017984099ef6f56438a6b898ce0538f6fadddaa902870c5aa3e1d82583"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b6d807c76c20b4bc143a49ad47782228a2ac98bdcdcb069da54280e138847fc"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a94632ba26a666e7be0a7d7cc3f7acab622a04259a3aa0ee50ff6d44ba9df0d"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win32.whl", hash = "sha256:f80915681ea9001f19b65aee715115f2ad310730c8043127cf3e19b3009892dd"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win_amd64.whl", hash = "sha256:fc700b862e0a859a37faf85367e205e7acaecae5a098794aff52fdd8aea77b12"}, + {file = "SQLAlchemy-1.4.47.tar.gz", hash = "sha256:95fc02f7fc1f3199aaa47a8a757437134cf618e9d994c84effd53f530c38586f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "4fc7fed26040a0b8490504a13ea0fffa414d200e4002a1c50bae9ab278587d2c" diff --git a/apps/cli/executables/pexable/ws_metrics/pyproject.toml b/apps/cli/executables/pexable/ws_metrics/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..0441ff62987079a6364bbfe033ba891d19e596ee --- /dev/null +++ b/apps/cli/executables/pexable/ws_metrics/pyproject.toml @@ -0,0 +1,25 @@ +[tool.poetry] +name = "ws_metrics" +version = "2.8.2rc1" +description = "Workspaces metrics reporter for users outside of SSA." +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +pycapo = "^0.3.1" +aenum = "^3.1.12" +psycopg2-binary = "^2.9.6" +sqlalchemy = "1.4.47" +arrow = "^1.2.3" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[tool.poetry.scripts] +ws_metrics = "ws_metrics.deep_thought:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/executables/pexable/ws_metrics/setup.py b/apps/cli/executables/pexable/ws_metrics/setup.py deleted file mode 100644 index 60cd8e8efdbd06fd8a6bd567fbee3e19b332e995..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ws_metrics/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("ws_metrics/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["psycopg2", "pycapo", "aenum", "pendulum", "sqlalchemy==1.4.46"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces metrics reporter for users outside of SSA.", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["ws_metrics = ws_metrics.deep_thought:main"]}, -) diff --git a/apps/cli/executables/pexable/ws_metrics/test/test_nothing.py b/apps/cli/executables/pexable/ws_metrics/test/test_nothing.py new file mode 100644 index 0000000000000000000000000000000000000000..1bf2f7e783c407f766c14dad0f9a39cc7841a8f7 --- /dev/null +++ b/apps/cli/executables/pexable/ws_metrics/test/test_nothing.py @@ -0,0 +1,3 @@ +def test_always_passes(): + assert True + diff --git a/apps/cli/executables/pexable/ws_metrics/test/test_ws_metrics.py b/apps/cli/executables/pexable/ws_metrics/test/test_ws_metrics.py deleted file mode 100644 index 6bb4a7f3f97623da32d34eacea7782e324563d79..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ws_metrics/test/test_ws_metrics.py +++ /dev/null @@ -1,87 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" -Testing suite for ws_metrics -""" -import argparse -import logging -import sys -from unittest.mock import patch - -import pytest -from ws_metrics.deep_thought import LifeUniverseEverything - -logger = logging.getLogger("test_ws_metrics") -logger.setLevel(logging.INFO) -logger.addHandler(logging.StreamHandler(sys.stdout)) - -args_b = argparse.Namespace(between=["null", "2021-03-30T00:00:00", "2021-03-30T23:59:59"], capability=None) -result_b = 4 - -args_c = argparse.Namespace(between=None, capability="null") -result_c = 10 - -args_rd = argparse.Namespace(requestdatasize=["1"], datasize=None) -result_rd = 10 - -args_d = argparse.Namespace(requestdatasize=None, datasize=["2021-03-30T00:00:00", "2021-03-30T23:59:59"]) -result_d = 100 - - -def mock_leu(args: argparse.Namespace) -> LifeUniverseEverything: - with patch("psycopg2.connect") as mock_connect: - return LifeUniverseEverything(connection=mock_connect, args=args) - - -mock_leu_b = mock_leu(args_b) -mock_leu_c = mock_leu(args_c) -mock_leu_rd = mock_leu(args_rd) -mock_leu_d = mock_leu(args_d) - - -class TestWSMetrics: - @pytest.mark.skip("broken by rewrite") - def test_get_total_cap_executions(self): - mock_leu_c.conn.cursor.return_value.fetchone.return_value = result_c - assert args_c.capability == "null" - value = mock_leu_c.get_total_cap_executions(args_c.capability) - assert value == result_c - - @pytest.mark.skip("broken by rewrite") - def test_get_total_executions_in_range(self): - mock_leu_b.conn.cursor.return_value.fetchone.return_value = result_b - assert args_b.between[0] == "null" - assert args_b.between[1] == "2021-03-30T00:00:00" - assert args_b.between[2] == "2021-03-30T23:59:59" - value = mock_leu_b.get_total_executions_in_range(args_b.between[0], args_b.between[1], args_b.between[2]) - assert value == result_b - - @pytest.mark.skip("broken by rewrite") - def test_get_total_data_volume(self): - mock_leu_d.conn.cursor.return_value.fetchone.return_value = result_d - assert args_d.datasize[0] == "2021-03-30T00:00:00" - assert args_d.datasize[1] == "2021-03-30T23:59:59" - value = mock_leu_d.get_total_data_volume(args_d.datasize[0], args_d.datasize[1]) - assert value == result_d - - @pytest.mark.skip("broken by rewrite") - def test_get_request_data_volume(self): - mock_leu_rd.conn.cursor.return_value.fetchone.return_value = result_rd - assert args_rd.requestdatasize[0] == "1" - value = mock_leu_rd.get_request_data_volume("1") - assert value == result_rd diff --git a/apps/cli/executables/pexable/ws_metrics/ws_metrics/__init__.py b/apps/cli/executables/pexable/ws_metrics/ws_metrics/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..eb2c882f38f6033dd6c10291beb41509ecb8ae73 100644 --- a/apps/cli/executables/pexable/ws_metrics/ws_metrics/__init__.py +++ b/apps/cli/executables/pexable/ws_metrics/ws_metrics/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Workspaces metrics reporter for users outside of SSA. +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/executables/pexable/ws_metrics/ws_metrics/_version.py b/apps/cli/executables/pexable/ws_metrics/ws_metrics/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/executables/pexable/ws_metrics/ws_metrics/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/executables/pexable/ws_metrics/ws_metrics/deep_thought.py b/apps/cli/executables/pexable/ws_metrics/ws_metrics/deep_thought.py index 2139950fd160664bc2e9968753611f89eb95cf6d..f3b07abe5ab7aacce45cca3f306368463c32b9e9 100644 --- a/apps/cli/executables/pexable/ws_metrics/ws_metrics/deep_thought.py +++ b/apps/cli/executables/pexable/ws_metrics/ws_metrics/deep_thought.py @@ -26,8 +26,6 @@ import argparse import logging import sys -from pycapo import CapoConfig - from ws_metrics.connections import MDDBConnector from ws_metrics.inquisition import LifeUniverseEverything @@ -106,15 +104,6 @@ def parser() -> argparse.ArgumentParser: return parser -def _get_capo_settings(): - """ - return all settings for database connection - - :return: - """ - return CapoConfig().settings("metadataDatabase") - - def main(): print("**********************************") print("* WELCOME TO WORKSPACES METRICS! *") diff --git a/apps/cli/executables/pexable/ws_metrics/ws_metrics/inquisition.py b/apps/cli/executables/pexable/ws_metrics/ws_metrics/inquisition.py index 7e62a2d157d3505c1302a2615f8612f784b86c0f..30046e6d63157c7970b6bb2b082c6d3daebe1aff 100644 --- a/apps/cli/executables/pexable/ws_metrics/ws_metrics/inquisition.py +++ b/apps/cli/executables/pexable/ws_metrics/ws_metrics/inquisition.py @@ -1,8 +1,7 @@ import argparse -from pathlib import Path - -from pendulum import datetime +import arrow +from pathlib import Path from ws_metrics.enums import FetchType, ReportEnum from ws_metrics.queries.constructor import QueryConstructor, QueryString from ws_metrics.queries.query_definitions import CAPABILITY_EXECUTIONS, DOWNLOAD_VOLUME, OPERATIONS @@ -27,7 +26,7 @@ class LifeUniverseEverything: params = {"capability_name": capability_name[0]} return self.constructor.construct_query(sql, params, FetchType.ONE) - def get_total_executions_in_range(self, capability_name: str, beginning_date: datetime, end_date: datetime) -> list: + def get_total_executions_in_range(self, capability_name: str, beginning_date: str, end_date: str) -> list: """ Determine the total number of executions of a specified capability @@ -37,7 +36,11 @@ class LifeUniverseEverything: :return: The number of capability executions that occurred in the specified date range """ sql = QueryString(CAPABILITY_EXECUTIONS, True, 0) - params = {"capability_name": capability_name, "beginning": beginning_date, "end": end_date} + params = { + "capability_name": capability_name, + "beginning": arrow.get(beginning_date).datetime, + "end": arrow.get(end_date).datetime, + } return self.constructor.construct_query(sql, params, FetchType.ONE) def get_request_data_volume(self, request_id: str) -> list: @@ -51,7 +54,7 @@ class LifeUniverseEverything: params = {"request_id": request_id} return self.constructor.construct_query(sql, params, FetchType.ONE) - def get_total_data_volume(self, beginning_date: datetime, end_date: datetime) -> list: + def get_total_data_volume(self, beginning_date: str, end_date: str) -> list: """ Determine the total data volume downloaded withing a specified date rge @@ -60,29 +63,19 @@ class LifeUniverseEverything: :return: The total data size in Kilobytes """ sql = QueryString(DOWNLOAD_VOLUME, True, 1) - params = {"beginning": beginning_date, "end": end_date} + params = {"beginning": arrow.get(beginning_date).datetime, "end": arrow.get(end_date).datetime} return self.constructor.construct_query(sql, params, FetchType.ONE) - def get_operations_report_info(self, beginning_date: datetime, end_date: datetime): + def get_operations_report_info(self, beginning_date: str, end_date: str): """ Run operations metrics report :return: report data """ sql = QueryString(OPERATIONS, True) - params = {"beginning": beginning_date, "end": end_date} + params = {"beginning": arrow.get(beginning_date).datetime, "end": arrow.get(end_date).datetime} return self.constructor.construct_query(sql, params, FetchType.ALL) - # def get_operations_report_count(self, beginning_date: datetime, end_date: datetime) -> int: - # """ - # Determine count of all datasets archived between two dates - # - # :return: Number of archive datasets - # """ - # sql = QueryString(OPERATIONS_COUNT, False) - # params = {"beginning": beginning_date, "end": end_date} - # return self.constructor.construct_query(sql, params, FetchType.ONE) - def run_metrics(self, args: argparse.Namespace): """ Run a specified metrics report. Output data to file or terminal diff --git a/apps/cli/executables/pexable/ws_metrics/ws_metrics/reporting/generate_report.py b/apps/cli/executables/pexable/ws_metrics/ws_metrics/reporting/generate_report.py index 3b8d918478d1cbf8380db196f5b20265ce23feb2..8eb7022265f2d8b975e21281f1e4ee16a160fc2c 100644 --- a/apps/cli/executables/pexable/ws_metrics/ws_metrics/reporting/generate_report.py +++ b/apps/cli/executables/pexable/ws_metrics/ws_metrics/reporting/generate_report.py @@ -1,7 +1,7 @@ """Generic Report operations for metrics reporting""" from typing import Dict -import pendulum +import arrow from ws_metrics.enums import ReportEnum from ws_metrics.schema import AbstractTextFile @@ -24,7 +24,7 @@ class Report: :param report: The report type to generate :return: the title of the report """ - timestamp = pendulum.now().format("YYYY_MM_DDThh_mm_ss") + timestamp = arrow.now().format("YYYY_MM_DDThh_mm_ss") return f"{report.title}_{timestamp}{report.template_type.file_type}" diff --git a/apps/cli/executables/wf_framework/ingest_requirements/observation-product-collector.sh b/apps/cli/executables/wf_framework/ingest_requirements/observation-product-collector.sh new file mode 100644 index 0000000000000000000000000000000000000000..59407a43ac70926723550b30f3bf4af5e0a2c0b4 --- /dev/null +++ b/apps/cli/executables/wf_framework/ingest_requirements/observation-product-collector.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# +# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. +# +# This file is part of NRAO Workspaces. +# +# Workspaces is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Workspaces is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. + +# +# A file to copy all files from a provided source directory to +# the Workspaces staging directory for ingestion. +# +# Arguments: +# 1: The path to the source directory +# 2: The source directory name +# 3: The staging directory root path +# +set -o errexit -o nounset -o xtrace + +SRC_PATH=$1;shift +SRC_NAME=$1;shift +STAGE_DIR=$1;shift + +SRC_DIR=${SRC_PATH}/${SRC_NAME} + +# Create the staging directory carefully: +mkdir -p ${STAGE_DIR}/${SRC_NAME} + +# Link all the files over to the staging directory (Create hard link, and be insistent) +# +# We just want the file name, so we'll work in the source directory +pushd ${SRC_DIR} +# link the files +for srcFile in $(ls);do cp ${SRC_DIR}/${srcFile} ${STAGE_DIR}/${SRC_NAME};done +# move back to the working directory +popd diff --git a/apps/cli/utilities/aat_wrest/LICENSE b/apps/cli/utilities/aat_wrest/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/utilities/aat_wrest/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/utilities/aat_wrest/aat_wrest/__init__.py b/apps/cli/utilities/aat_wrest/aat_wrest/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..5e212c36c9cb668b34eb73b7ec476d27989dcbf0 100644 --- a/apps/cli/utilities/aat_wrest/aat_wrest/__init__.py +++ b/apps/cli/utilities/aat_wrest/aat_wrest/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +AAT Wrest: Workspaces-to-Archive metadata retriever +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/utilities/aat_wrest/aat_wrest/_version.py b/apps/cli/utilities/aat_wrest/aat_wrest/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/utilities/aat_wrest/aat_wrest/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/utilities/aat_wrest/poetry.lock b/apps/cli/utilities/aat_wrest/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..d639dba9c038fac1ad971fa25bf710e48fe6c44b --- /dev/null +++ b/apps/cli/utilities/aat_wrest/poetry.lock @@ -0,0 +1,266 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + { file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" }, + { file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + { file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e" }, + { file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785" }, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + { file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" }, + { file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3" }, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + { file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61" }, + { file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" }, +] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + { file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe" }, + { file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739" }, + { file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394" }, + { file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0" }, + { file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3" }, + { file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b" }, + { file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360" }, + { file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0" }, + { file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087" }, + { file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db" }, + { file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002" }, + { file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5" }, + { file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b" }, + { file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b" }, + { file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116" }, + { file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052" }, + { file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be" }, + { file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269" }, + { file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a" }, + { file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7" }, + { file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207" }, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + { file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3" }, + { file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159" }, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + { file = "psycopg2-binary-2.9.6.tar.gz", hash = "sha256:1f64dcfb8f6e0c014c7f55e51c9759f024f70ea572fbdef123f85318c297947c" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d26e0342183c762de3276cca7a530d574d4e25121ca7d6e4a98e4f05cb8e4df7" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c48d8f2db17f27d41fb0e2ecd703ea41984ee19362cbce52c097963b3a1b4365" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a76e027f87753f9bd1ab5f7c9cb8c7628d1077ef927f5e2446477153a602f2c" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6460c7a99fc939b849431f1e73e013d54aa54293f30f1109019c56a0b2b2ec2f" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae102a98c547ee2288637af07393dd33f440c25e5cd79556b04e3fca13325e5f" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9972aad21f965599ed0106f65334230ce826e5ae69fda7cbd688d24fa922415e" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a40c00dbe17c0af5bdd55aafd6ff6679f94a9be9513a4c7e071baf3d7d22a70" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:cacbdc5839bdff804dfebc058fe25684cae322987f7a38b0168bc1b2df703fb1" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f0438fa20fb6c7e202863e0d5ab02c246d35efb1d164e052f2f3bfe2b152bd0" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-win32.whl", hash = "sha256:b6c8288bb8a84b47e07013bb4850f50538aa913d487579e1921724631d02ea1b" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:61b047a0537bbc3afae10f134dc6393823882eb263088c271331602b672e52e9" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:964b4dfb7c1c1965ac4c1978b0f755cc4bd698e8aa2b7667c575fb5f04ebe06b" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afe64e9b8ea66866a771996f6ff14447e8082ea26e675a295ad3bdbffdd72afb" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e2ee79e7cf29582ef770de7dab3d286431b01c3bb598f8e05e09601b890081" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa74c903a3c1f0d9b1c7e7b53ed2d929a4910e272add6700c38f365a6002820" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b83456c2d4979e08ff56180a76429263ea254c3f6552cd14ada95cff1dec9bb8" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0645376d399bfd64da57148694d78e1f431b1e1ee1054872a5713125681cf1be" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99e34c82309dd78959ba3c1590975b5d3c862d6f279f843d47d26ff89d7d7e1" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4ea29fc3ad9d91162c52b578f211ff1c931d8a38e1f58e684c45aa470adf19e2" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4ac30da8b4f57187dbf449294d23b808f8f53cad6b1fc3623fa8a6c11d176dd0" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78e6e2a00c223e164c417628572a90093c031ed724492c763721c2e0bc2a8df" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-win32.whl", hash = "sha256:1876843d8e31c89c399e31b97d4b9725a3575bb9c2af92038464231ec40f9edb" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b4b24f75d16a89cc6b4cdff0eb6a910a966ecd476d1e73f7ce5985ff1328e9a6" }, + { file = "psycopg2_binary-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:498807b927ca2510baea1b05cc91d7da4718a0f53cb766c154c417a39f1820a0" }, + { file = "psycopg2_binary-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0d236c2825fa656a2d98bbb0e52370a2e852e5a0ec45fc4f402977313329174d" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:34b9ccdf210cbbb1303c7c4db2905fa0319391bd5904d32689e6dd5c963d2ea8" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d2222e61f313c4848ff05353653bf5f5cf6ce34df540e4274516880d9c3763" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30637a20623e2a2eacc420059be11527f4458ef54352d870b8181a4c3020ae6b" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8122cfc7cae0da9a3077216528b8bb3629c43b25053284cc868744bfe71eb141" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38601cbbfe600362c43714482f43b7c110b20cb0f8172422c616b09b85a750c5" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c7e62ab8b332147a7593a385d4f368874d5fe4ad4e341770d4983442d89603e3" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2ab652e729ff4ad76d400df2624d223d6e265ef81bb8aa17fbd63607878ecbee" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c83a74b68270028dc8ee74d38ecfaf9c90eed23c8959fca95bd703d25b82c88e" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d4e6036decf4b72d6425d5b29bbd3e8f0ff1059cda7ac7b96d6ac5ed34ffbacd" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:a8c28fd40a4226b4a84bdf2d2b5b37d2c7bd49486b5adcc200e8c7ec991dfa7e" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:51537e3d299be0db9137b321dfb6a5022caaab275775680e0c3d281feefaca6b" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4499e0a83b7b7edcb8dabecbd8501d0d3a5ef66457200f77bde3d210d5debb" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7e13a5a2c01151f1208d5207e42f33ba86d561b7a89fca67c700b9486a06d0e2" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e0f754d27fddcfd74006455b6e04e6705d6c31a612ec69ddc040a5468e44b4e" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d57c3fd55d9058645d26ae37d76e61156a27722097229d32a9e73ed54819982a" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71f14375d6f73b62800530b581aed3ada394039877818b2d5f7fc77e3bb6894d" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:441cc2f8869a4f0f4bb408475e5ae0ee1f3b55b33f350406150277f7f35384fc" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:65bee1e49fa6f9cf327ce0e01c4c10f39165ee76d35c846ade7cb0ec6683e303" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af335bac6b666cc6aea16f11d486c3b794029d9df029967f9938a4bed59b6a19" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cfec476887aa231b8548ece2e06d28edc87c1397ebd83922299af2e051cf2827" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65c07febd1936d63bfde78948b76cd4c2a411572a44ac50719ead41947d0f26b" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-win32.whl", hash = "sha256:4dfb4be774c4436a4526d0c554af0cc2e02082c38303852a36f6456ece7b3503" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:02c6e3cf3439e213e4ee930308dc122d6fb4d4bea9aef4a12535fbd605d1a2fe" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9182eb20f41417ea1dd8e8f7888c4d7c6e805f8a7c98c1081778a3da2bee3e4" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a6979cf527e2603d349a91060f428bcb135aea2be3201dff794813256c274f1" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8338a271cb71d8da40b023a35d9c1e919eba6cbd8fa20a54b748a332c355d896" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ed340d2b858d6e6fb5083f87c09996506af483227735de6964a6100b4e6a54" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81e65376e52f03422e1fb475c9514185669943798ed019ac50410fb4c4df232" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfb13af3c5dd3a9588000910178de17010ebcccd37b4f9794b00595e3a8ddad3" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4c727b597c6444a16e9119386b59388f8a424223302d0c06c676ec8b4bc1f963" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d67fbdaf177da06374473ef6f7ed8cc0a9dc640b01abfe9e8a2ccb1b1402c1f" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0892ef645c2fabb0c75ec32d79f4252542d0caec1d5d949630e7d242ca4681a3" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:02c0f3757a4300cf379eb49f543fb7ac527fb00144d39246ee40e1df684ab514" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-win32.whl", hash = "sha256:c3dba7dab16709a33a847e5cd756767271697041fbe3fe97c215b1fc1f5c9848" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:f6a88f384335bb27812293fdb11ac6aee2ca3f51d3c7820fe03de0a304ab6249" }, +] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + { file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35" }, + { file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f" }, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + { file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362" }, + { file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3" }, +] + +[package.dependencies] +colorama = { version = "*", markers = "sys_platform == \"win32\"" } +exceptiongroup = { version = ">=1.0.0rc8", markers = "python_version < \"3.11\"" } +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = { version = ">=1.0.0", markers = "python_version < \"3.11\"" } + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + { file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86" }, + { file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" }, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + { file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f" }, + { file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540" }, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + { file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" }, + { file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926" }, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + { file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc" }, + { file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" }, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "84e8aa4cf79adb1dda1d698d1b5d23a5dabb44cf1f5ab1a3f1783470ab063a1f" diff --git a/apps/cli/utilities/aat_wrest/pyproject.toml b/apps/cli/utilities/aat_wrest/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..c6e61a7d4d78491550344965dba182d36da4cd64 --- /dev/null +++ b/apps/cli/utilities/aat_wrest/pyproject.toml @@ -0,0 +1,23 @@ +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry] +name = "aat_wrest" +version = "2.8.2rc1" +description = "AAT Wrest: Workspaces-to-Archive metadata retriever" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +pycapo = "^0.3.1" +psycopg2-binary = "^2.9.6" +pendulum = "^2.1.2" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[tool.poetry.scripts] +aat_wrest = "aat_wrest.wrest:main" diff --git a/apps/cli/utilities/aat_wrest/setup.py b/apps/cli/utilities/aat_wrest/setup.py deleted file mode 100644 index 7331d88b91c14c3fad28a15166aed56183dceb05..0000000000000000000000000000000000000000 --- a/apps/cli/utilities/aat_wrest/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import setup - -VERSION = open("aat_wrest/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["psycopg2", "pycapo"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces-to-Archive metadata retriever.", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=["aat_wrest"], - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["aat_wrest = aat_wrest.wrest:main"]}, -) diff --git a/apps/cli/utilities/contacts_wrest/LICENSE b/apps/cli/utilities/contacts_wrest/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/utilities/contacts_wrest/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/utilities/contacts_wrest/contacts_wrest/__init__.py b/apps/cli/utilities/contacts_wrest/contacts_wrest/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..25a1ed4e3078b8ee70640258a65b91200524b799 100644 --- a/apps/cli/utilities/contacts_wrest/contacts_wrest/__init__.py +++ b/apps/cli/utilities/contacts_wrest/contacts_wrest/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Contact information wrester +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/utilities/contacts_wrest/contacts_wrest/_version.py b/apps/cli/utilities/contacts_wrest/contacts_wrest/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/utilities/contacts_wrest/contacts_wrest/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/utilities/contacts_wrest/poetry.lock b/apps/cli/utilities/contacts_wrest/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..bfdaeb107f6cdfafcac90f3781455c6a38512060 --- /dev/null +++ b/apps/cli/utilities/contacts_wrest/poetry.lock @@ -0,0 +1,175 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "dsnparse" +version = "0.1.15" +description = "parse dsn urls" +optional = false +python-versions = "*" +files = [ + {file = "dsnparse-0.1.15.tar.gz", hash = "sha256:2ac5705b17cb28e8b115053c2d51cf3321dc2041b1d75e2db6157e05146d0fba"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "mysqlclient" +version = "2.1.1" +description = "Python interface to MySQL" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mysqlclient-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c1ed71bd6244993b526113cca3df66428609f90e4652f37eb51c33496d478b37"}, + {file = "mysqlclient-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:c812b67e90082a840efb82a8978369e6e69fc62ce1bda4ca8f3084a9d862308b"}, + {file = "mysqlclient-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:0d1cd3a5a4d28c222fa199002810e8146cffd821410b67851af4cc80aeccd97c"}, + {file = "mysqlclient-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b355c8b5a7d58f2e909acdbb050858390ee1b0e13672ae759e5e784110022994"}, + {file = "mysqlclient-2.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:996924f3483fd36a34a5812210c69e71dea5a3d5978d01199b78b7f6d485c855"}, + {file = "mysqlclient-2.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:dea88c8d3f5a5d9293dfe7f087c16dd350ceb175f2f6631c9cf4caf3e19b7a96"}, + {file = "mysqlclient-2.1.1.tar.gz", hash = "sha256:828757e419fb11dd6c5ed2576ec92c3efaa93a0f7c39e263586d1ee779c3d782"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "psycopg2" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, + {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, + {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, + {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, + {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, + {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, + {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, + {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, + {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, +] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pymysql" +version = "1.1.0" +description = "Pure Python MySQL Driver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PyMySQL-1.1.0-py3-none-any.whl", hash = "sha256:8969ec6d763c856f7073c4c64662882675702efcb114b4bcbb955aea3a069fa7"}, + {file = "PyMySQL-1.1.0.tar.gz", hash = "sha256:4f13a7df8bf36a51e81dd9f3605fede45a4878fe02f9236349fd82a3f0612f96"}, +] + +[package.extras] +ed25519 = ["PyNaCl (>=1.4.0)"] +rsa = ["cryptography"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "29ad67bf80199bd5e4369f74fe04c8fad378439f046f18af9ea0caebf608f298" diff --git a/apps/cli/utilities/contacts_wrest/pyproject.toml b/apps/cli/utilities/contacts_wrest/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..c8a3e9db11ee3bace02727c5bec681aa7a4cf273 --- /dev/null +++ b/apps/cli/utilities/contacts_wrest/pyproject.toml @@ -0,0 +1,25 @@ +[tool.poetry] +name = "contacts_wrest" +version = "2.8.2rc1" +description = "Contact information wrester" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +dsnparse = "0.1.15" +mysqlclient = "2.1.1" +psycopg2 = "^2.9.6" +pycapo = "^0.3.1" +pymysql = "^1.0.3" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.scripts] +contacts_wrest = "contacts_wrest.contacts_wrester:main" diff --git a/apps/cli/utilities/contacts_wrest/setup.py b/apps/cli/utilities/contacts_wrest/setup.py deleted file mode 100644 index d0b12774c60cb94c6629af2a43e93d1294ebd63f..0000000000000000000000000000000000000000 --- a/apps/cli/utilities/contacts_wrest/setup.py +++ /dev/null @@ -1,49 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. - -# pylint: disable=C0114, W1514 - -""" Setup for contacts wrester """ - -from pathlib import Path - -from setuptools import setup - -with open("contacts_wrest/_version.py", "r") as vfile: - VERSION = vfile.readlines()[-1].split()[-1].strip("\"'") - -README = Path("README.md").read_text() - - -requires = ["dsnparse==0.1.15", "mysqlclient==2.1.1", "psycopg2", "pycapo", "pymysql"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces-to-Archive metadata retriever.", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=["contacts_wrest"], - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["contacts_wrest = contacts_wrest.contacts_wrester:main"]}, -) diff --git a/shared/schema/README.md b/apps/cli/utilities/contacts_wrest2/README.md similarity index 100% rename from shared/schema/README.md rename to apps/cli/utilities/contacts_wrest2/README.md diff --git a/apps/cli/utilities/contacts_wrest2/go.mod b/apps/cli/utilities/contacts_wrest2/go.mod new file mode 100644 index 0000000000000000000000000000000000000000..b2877a287d0651518b1dee5f76080351d672593f --- /dev/null +++ b/apps/cli/utilities/contacts_wrest2/go.mod @@ -0,0 +1,29 @@ +module ssa/contacts_wrest + +go 1.18 + +require ( + github.com/go-sql-driver/mysql v1.7.1 + github.com/lib/pq v1.10.9 + gitlab.nrao.edu/ssa/gocapo v0.0.0-20230307183307-91ffd4356566 +) + +require ( + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.5 // indirect + github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.13.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect + golang.org/x/text v0.3.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/apps/cli/utilities/contacts_wrest2/go.sum b/apps/cli/utilities/contacts_wrest2/go.sum new file mode 100644 index 0000000000000000000000000000000000000000..69074bc7f49b2c8a64df06e92e99969af579466e --- /dev/null +++ b/apps/cli/utilities/contacts_wrest2/go.sum @@ -0,0 +1,476 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.13.0 h1:BWSJ/M+f+3nmdz9bxB+bWX28kkALN2ok11D0rSo8EJU= +github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +gitlab.nrao.edu/ssa/gocapo v0.0.0-20230307183307-91ffd4356566 h1:ThTqAQM1LTn9YYOeTLT3P++gG5dhBT3J6npwzdj57HY= +gitlab.nrao.edu/ssa/gocapo v0.0.0-20230307183307-91ffd4356566/go.mod h1:1YUS/BksXZTvYstBpeSh2UjBVz4MKyPJve9zmPGkCuA= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= +golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/apps/cli/utilities/contacts_wrest2/main.go b/apps/cli/utilities/contacts_wrest2/main.go new file mode 100644 index 0000000000000000000000000000000000000000..ef49e622e5798473f9101c7839ed2b5e65160cdb --- /dev/null +++ b/apps/cli/utilities/contacts_wrest2/main.go @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2022 Associated Universities, Inc. Washington DC, USA. + * + * This file is part of NRAO Workspaces. + * + * Workspaces is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Workspaces is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Workspaces. If not, see <https://www.gnu.org/licenses/>. + */ + +// Entry point for the contacts-wrest tool +package main + +import ( + "encoding/json" + "flag" + "fmt" + "os" + wrest "ssa/contacts_wrest/wrest" + "strings" +) + +func main() { + jsonMode := flag.Bool("j", false, "Output a JSON-friendly list of strings instead of human-friendly list") + + // Parse the CLI arguments + flag.Parse() + + // We must have one argument: the project code + if flag.NArg() != 1 { + fmt.Printf("Usage: %v [-j] <PROJECT-CODE>\n", os.Args[0]) + os.Exit(1) + } + + // Obtain the contacts for this project + proposalId := flag.Arg(0) + contacts, err := wrest.RetrieveContacts(proposalId) + + if err != nil { + fmt.Fprintf(os.Stderr, "Unable to retrieve contacts for %s: %v\n", proposalId, err) + os.Exit(1) + } + + if *jsonMode { + // In JSON mode, we output using the JSON marshaller + binary, _ := json.Marshal(contacts) + fmt.Println(string(binary)) + } else { + // In non-JSON mode, we output something human-friendly + fmt.Println(strings.Join(contacts, ", ")) + } +} diff --git a/apps/cli/utilities/contacts_wrest2/wrest/connect.go b/apps/cli/utilities/contacts_wrest2/wrest/connect.go new file mode 100644 index 0000000000000000000000000000000000000000..1544343dee7b98cfd434a9858a246f70f3431b71 --- /dev/null +++ b/apps/cli/utilities/contacts_wrest2/wrest/connect.go @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2022 Associated Universities, Inc. Washington DC, USA. + * + * This file is part of NRAO Workspaces. + * + * Workspaces is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Workspaces is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Workspaces. If not, see <https://www.gnu.org/licenses/>. + */ + +package wrest + +import ( + "database/sql" + "fmt" + "gitlab.nrao.edu/ssa/gocapo/capo/config" + "gitlab.nrao.edu/ssa/gocapo/helpers" + "os" + "strconv" + "strings" +) + +// databaseType represents the database driver we are using (Postgres or MySQL +// for now) +type databaseType string + +const ( + Postgres databaseType = "postgres" + MySQL databaseType = "mysql" +) + +// defaultPort returns the default server port for the given database type. This +// is needed to connect +func (databaseType databaseType) defaultPort() int { + if databaseType == Postgres { + return 5432 + } else { + return 3306 + } +} + +// jdbcPrefix return the JDBC string prefix that will sadly be prepended to the +// URL in the Capo profile +func (databaseType databaseType) jdbcPrefix() string { + if databaseType == Postgres { + return "jdbc:postgresql://" + } else { + return "jdbc:mysql://" + } +} + +// connectionString formats the connection string for this database flavor, which +// we can then hand to the sql package. +func (flavor databaseFlavor) connectionString(host string, port int, user string, password string, dbName string) string { + if flavor.Type == Postgres { + return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", host, port, user, password, dbName) + } else { + return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s", user, password, host, port, dbName) + } +} + +// databaseFlavor represents the information we need to build a connection to +// some database, based on what we know a priori and from Capo +type databaseFlavor struct { + CapoPrefix string + UserCapoKey string + PasswordCapoKey string + UrlCapoKey string + Type databaseType +} + +// archiveDB holds the information necessary to connect to the archive database +var archiveDB = databaseFlavor{ + CapoPrefix: "edu.nrao.ssa.project.db", + UserCapoKey: "username", + PasswordCapoKey: "password", + UrlCapoKey: "url", + Type: Postgres, +} + +// proposalsDB holds the information necessary to connect to the proposals database +var proposalsDB = databaseFlavor{ + CapoPrefix: "my.nrao.jdbc", + UserCapoKey: "username", + PasswordCapoKey: "password", + UrlCapoKey: "URL", + Type: MySQL, +} + +// getConnection uses the information in a particular database flavor to connect +// to a certain database +func getConnection(flavor databaseFlavor) (*sql.DB, error) { + // Get db info and build string to get connection + prop, err := config.InitConfig(os.Getenv("CAPO_PROFILE"), helpers.DefaultCapoPath) + if err != nil { + return nil, fmt.Errorf("unable to load CAPO config: %v", err) + } + + // obtain the Capo settings for this flavor + settings := prop.SettingsForPrefix(flavor.CapoPrefix) + + // get the user, password, and URL settings + user := settings.GetString(flavor.UserCapoKey) + password := settings.GetString(flavor.PasswordCapoKey) + url := settings.GetString(flavor.UrlCapoKey) + + // remove the JDBC prefix + url = strings.TrimPrefix(url, flavor.Type.jdbcPrefix()) + + // split the URL into host/database sections + splitUrl := strings.Split(url, "/") + if len(splitUrl) != 2 { + return nil, fmt.Errorf("URL does not contain 'host/database' pattern: %s", url) + } + host := splitUrl[0] + dbName := splitUrl[1] + + // split the host into host and port + splitHostPort := strings.Split(host, ":") + host = splitHostPort[0] + + // use the default port if there is no port component, otherwise use the port component + port := flavor.Type.defaultPort() + if len(splitHostPort) > 1 { + port, err = strconv.Atoi(splitHostPort[1]) + if err != nil { + return nil, fmt.Errorf("unable to convert %s to integer: %v", splitHostPort[1], err) + } + } + + // build the connect string + connInfo := flavor.connectionString(host, port, user, password, dbName) + + // open the database connection and check for errors + db, err := sql.Open(string(flavor.Type), connInfo) + if err != nil { + return nil, fmt.Errorf("unable to open the database connection to %s@%s: %v", dbName, host, err) + } + + // attempt to connect to the database and check for errors + err = db.Ping() + if err != nil { + return nil, fmt.Errorf("unable to ping the database connection for %s@%s: %v", dbName, host, err) + } + + // OK, we have a valid database connection + return db, nil +} + +// GetArchiveDBConnection returns a connection to the archive database +func GetArchiveDBConnection() (*sql.DB, error) { + return getConnection(archiveDB) +} + +// GetProposalsDBConnection returns a connection to the proposals database +func GetProposalsDBConnection() (*sql.DB, error) { + return getConnection(proposalsDB) +} diff --git a/apps/cli/utilities/contacts_wrest2/wrest/wrest.go b/apps/cli/utilities/contacts_wrest2/wrest/wrest.go new file mode 100644 index 0000000000000000000000000000000000000000..d295b0fcc46fdda58558c81bd58c8f9bd55e89ec --- /dev/null +++ b/apps/cli/utilities/contacts_wrest2/wrest/wrest.go @@ -0,0 +1,160 @@ +/* + * Copyright (C) 2022 Associated Universities, Inc. Washington DC, USA. + * + * This file is part of NRAO Workspaces. + * + * Workspaces is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Workspaces is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Workspaces. If not, see <https://www.gnu.org/licenses/>. + */ + +/* +Package wrest looks up contact authors for a given project. + +If this tool isn't working, the same information can be obtained by logging +into the OPT, opening the project in question, and clicking on the coauthors. +*/ +package wrest + +import ( + "database/sql" + "fmt" + _ "github.com/go-sql-driver/mysql" + _ "github.com/lib/pq" + "strings" +) + +// RetrieveContacts for a given project code +func RetrieveContacts(projectCode string) ([]string, error) { + // Get the designated contact(s) for this project. + + // step 1: retrieve the contact author globalIDs from the OPT + globalIds, err := retrieveGlobalIds(projectCode) + + if err != nil { + return nil, fmt.Errorf("unable to retrieve global ids: %v", err) + } + + // step 2: look up email addresses in the my.nrao.edu database + emails, err := retrieveEmailsForGlobalIds(globalIds) + if err != nil { + return nil, fmt.Errorf("unable to retrieve emails: %v", err) + } + + return emails, nil +} + +// retrieveGlobalIds for a given project code +func retrieveGlobalIds(projectCode string) ([]int, error) { + // connect to the database + connection, err := GetArchiveDBConnection() + if err != nil { + return nil, fmt.Errorf("unable to connect to archive database: %v", err) + } + + // build the query + query := `select globalid + from project + join projectauthor p on project.pi = p.id + where projectcode = $1 and receivesemail + union + select globalid + from project + join projectauthor p on project.contactauthor = p.id + where projectcode = $1 and receivesemail + union + select globalid + from project + join coauthors c on project.id = c.project_id + join projectauthor p on c.projectauthor_id = p.id + where projectcode = $1 and receivesemail` + + // close the database when we're done + defer func(connection *sql.DB) { + if err := connection.Close(); err != nil { + fmt.Printf("unable to close the database connection: %v\n", err) + } + }(connection) + + // run the query and get the result object + rows, err := connection.Query(query, projectCode) + if err != nil { + return nil, fmt.Errorf("unable to execute project code query: %v", err) + } + + // make a result slice + globalIds := make([]int, 0) + + // clean up + defer rows.Close() + + // walk through the list, scanning into a variable and appending to the result slice + for rows.Next() { + globalId := 0 + if err := rows.Scan(&globalId); err != nil { + return globalIds, fmt.Errorf("unable to read global ID from the user query: %v", err) + } + globalIds = append(globalIds, globalId) + } + + // done, return + return globalIds, nil +} + +// retrieveEmailsForGlobalIds obtains the emails for the given slice of global IDs +func retrieveEmailsForGlobalIds(globalIds []int) ([]string, error) { + // Now that we have the global IDs, we can use them to look up contacts' email addresses + connection, err := GetProposalsDBConnection() + if err != nil { + return nil, fmt.Errorf("unable to connect to PST database: %v", err) + } + + // build the IN list, this is so gross + inClause := strings.Trim(strings.Join(strings.Fields(fmt.Sprint(globalIds)), ","), "[]") + + // build the query + query := fmt.Sprintf(`select email + from email + where person_id IN (%s) and defaultEmail`, inClause) + + // close the database when we're done + defer func(connection *sql.DB) { + if err := connection.Close(); err != nil { + fmt.Printf("unable to close the database connection: %v\n", err) + } + }(connection) + + // run the query and get the result object + rows, err := connection.Query(query) + if err != nil { + return nil, fmt.Errorf("unable to execute the project code query: %v", err) + } + + // make a result slice + emails := make([]string, 0) + + // clean up + defer rows.Close() + + // walk through the list, scanning into a variable and appending to the result slice + for rows.Next() { + var email string + err := rows.Scan(&email) + if err != nil { + return nil, fmt.Errorf("unable to read email from the email query: %v", err) + } + emails = append(emails, email) + } + + // done, return + return emails, nil +} diff --git a/apps/cli/utilities/core_sampler/LICENSE b/apps/cli/utilities/core_sampler/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/utilities/core_sampler/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/utilities/core_sampler/README.md b/apps/cli/utilities/core_sampler/README.md index f1ebb200492567853993558da38bbddfdaaa111d..25a8c239599cef50c4f77c0b917ec0e43b33b2f8 100644 --- a/apps/cli/utilities/core_sampler/README.md +++ b/apps/cli/utilities/core_sampler/README.md @@ -12,3 +12,4 @@ examples: `core_sampler -p 18B-120` `core_sampler -e 18B-120.sb35750660.eb36089297_000.58485.110194270834.sql` + diff --git a/apps/cli/utilities/core_sampler/core_sampler/__init__.py b/apps/cli/utilities/core_sampler/core_sampler/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..989f65a311582a575bd077f9b0c6e14bedcf478f 100644 --- a/apps/cli/utilities/core_sampler/core_sampler/__init__.py +++ b/apps/cli/utilities/core_sampler/core_sampler/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Workspaces database core sampler +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/utilities/core_sampler/core_sampler/_version.py b/apps/cli/utilities/core_sampler/core_sampler/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/utilities/core_sampler/core_sampler/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/utilities/core_sampler/core_sampler/core_sampler.py b/apps/cli/utilities/core_sampler/core_sampler/core_sampler.py index 50cc20fb06b89da192e44a1b3f813ce0a7460742..f3e2c93289b1466af5f029a0f2c72ee1d6cff14c 100644 --- a/apps/cli/utilities/core_sampler/core_sampler/core_sampler.py +++ b/apps/cli/utilities/core_sampler/core_sampler/core_sampler.py @@ -25,21 +25,24 @@ The core sampler outputs an SQL file you can use to load the core sample into a """ import argparse +from typing import Literal import psycopg2 as pg from psycopg2 import extras from pycapo import CapoConfig from .database import PGTable -from .interfaces import RowSet, Table +from .interfaces import RowSet, Table, RowWriter from .row_writer import ( PostgresCopyRowWriter, TopologicallySortingRowWriter, UniquifyingRowWriter, + DictionaryKeeper, ) # pylint: disable=C0103, E0402, R0201, R0903 + # stolen shamelessly from aat_wrest class MDDBConnector: """Use this connection to interrogate this science product locator""" @@ -82,15 +85,58 @@ class MDDBConnector: class CoreSampler: """ - A device for retrieving core samples from a database. + A device for retrieving core samples from a database. When used from main, it is called as + ``CoreSampler(connection, format="sql")`` and the result is PostgreSQL ``COPY`` statements + written to standard output. To use it for obtaining a dictionary of differences, do this: + + .. code-block:: python + + sampler = CoreSampler(conn, format="dict") + list_of_tables_and_rows = sampler.sample_project("uid://evla/execblock/...").items + + The returned items will look like this in YAML format: + + .. code-block:: yaml + + table_name: + - column1: value1 + column2: value2 + ... + + Note that the same table name may appear multiple times in the output. This will occur + if there are dependencies between rows that necessitate it, such as self-references that + have references to values in other tables. It should always be possible to insert directly + into a new database from these rows. """ - def __init__(self, connection): + def __init__(self, connection, *, format: Literal["sql", "dict"] = "sql"): self.connection = connection - self.writer = TopologicallySortingRowWriter(UniquifyingRowWriter(PostgresCopyRowWriter())) + + # if there is no supplied writer, we generate one carefully + if format == "sql": + writer = TopologicallySortingRowWriter(UniquifyingRowWriter(PostgresCopyRowWriter())) + else: + writer = TopologicallySortingRowWriter(UniquifyingRowWriter(DictionaryKeeper())) + + self.writer = writer self.visited = set() - def sample_project(self, project_code: str): + def sample_science_product(self, product_locator: str) -> RowWriter: + """ + Get metadata from the archive database for a certain science product locator + + :param product_locator: SPL of interest + :return: + """ + + # the first time through, we select from the projects table and get that row + projects = self.table("science_products") + requested = projects.fetch({"science_product_locator": product_locator}) + self.save(requested) + self.writer.close() + return self.writer.bottom() + + def sample_project(self, project_code: str) -> RowWriter: """ Get project metadata from the archive database. @@ -103,8 +149,9 @@ class CoreSampler: requested = projects.fetch({"project_code": project_code}) self.save(requested) self.writer.close() + return self.writer.bottom() - def sample_eb(self, sdm_name: str): + def sample_eb(self, sdm_name: str) -> RowWriter: """ Pull execution block metadata from the archive database. @@ -118,8 +165,9 @@ class CoreSampler: requested = ebs.fetch({"execution_block_id": eb_id}) self.save(requested) self.writer.close() + return self.writer.bottom() - def save(self, rows: "RowSet"): + def save(self, rows: RowSet): """ Save some rows, and then go and fetch their related rows and save them too, recursively. diff --git a/apps/cli/utilities/core_sampler/core_sampler/interfaces.py b/apps/cli/utilities/core_sampler/core_sampler/interfaces.py index 23128158dbd843e181b6b881b8141fa3ebe479db..fd56dcaf3e9e3d8a50efaa0e903d08e06d3b5263 100644 --- a/apps/cli/utilities/core_sampler/core_sampler/interfaces.py +++ b/apps/cli/utilities/core_sampler/core_sampler/interfaces.py @@ -74,6 +74,9 @@ class Table(ABC): class RowWriter: + def bottom(self) -> "RowWriter": + return self + def write_rows(self, table: Table, rows: List[Dict]): raise NotImplementedError diff --git a/apps/cli/utilities/core_sampler/core_sampler/row_writer.py b/apps/cli/utilities/core_sampler/core_sampler/row_writer.py index 9fcf75d98a9fdcfcc66e296086708fddc05f1336..36b2ac889279b61e944b51fd581c0d500449cae7 100644 --- a/apps/cli/utilities/core_sampler/core_sampler/row_writer.py +++ b/apps/cli/utilities/core_sampler/core_sampler/row_writer.py @@ -51,6 +51,24 @@ class PostgresCopyRowWriter(RowWriter): raise TypeError(f"Unable to figure out what to do with {value} of type {type(value)}") +class DictionaryKeeper(RowWriter): + """ + Retain rows as a list of dictionaries under each table name. Intended to support + reingestion. + + Ask for the property ``items`` to read the items afterwards. + """ + + def __init__(self): + self.items = [] + + def write_rows(self, table: Table, rows: List[Dict]): + self.items.append({"table": table.name, "items": [dict(row) for row in rows]}) + + def close(self): + """A no-op; nothing to do here""" + + class UniquifyingRowWriter(RowWriter): """ Ensure that only a single instance of each row gets dumped out. @@ -60,6 +78,9 @@ class UniquifyingRowWriter(RowWriter): self.underlying = underlying self.seen = {} + def bottom(self) -> "RowWriter": + return self.underlying.bottom() + def write_rows(self, table: "Table", rows: List[Dict]): seen = self.seen.setdefault(table.name, []) new_rows = [row for row in rows if row not in seen] @@ -96,6 +117,9 @@ class TopologicallySortingRowWriter(RowWriter): self.tables_rows: Dict["Table", List[Dict]] = {} self.underlying = underlying + def bottom(self) -> "RowWriter": + return self.underlying.bottom() + def write_rows(self, table: "Table", rows: List[Dict]): # We've been asked to output some rows for this table. # What we must now do is keep track of this table and the in-bound relationships with it. diff --git a/apps/cli/utilities/core_sampler/poetry.lock b/apps/cli/utilities/core_sampler/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..8a47572ffe4a96be8c343f07fb2118fb92831c87 --- /dev/null +++ b/apps/cli/utilities/core_sampler/poetry.lock @@ -0,0 +1,192 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + { file = "psycopg2-binary-2.9.6.tar.gz", hash = "sha256:1f64dcfb8f6e0c014c7f55e51c9759f024f70ea572fbdef123f85318c297947c" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d26e0342183c762de3276cca7a530d574d4e25121ca7d6e4a98e4f05cb8e4df7" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c48d8f2db17f27d41fb0e2ecd703ea41984ee19362cbce52c097963b3a1b4365" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a76e027f87753f9bd1ab5f7c9cb8c7628d1077ef927f5e2446477153a602f2c" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6460c7a99fc939b849431f1e73e013d54aa54293f30f1109019c56a0b2b2ec2f" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae102a98c547ee2288637af07393dd33f440c25e5cd79556b04e3fca13325e5f" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9972aad21f965599ed0106f65334230ce826e5ae69fda7cbd688d24fa922415e" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a40c00dbe17c0af5bdd55aafd6ff6679f94a9be9513a4c7e071baf3d7d22a70" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:cacbdc5839bdff804dfebc058fe25684cae322987f7a38b0168bc1b2df703fb1" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f0438fa20fb6c7e202863e0d5ab02c246d35efb1d164e052f2f3bfe2b152bd0" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-win32.whl", hash = "sha256:b6c8288bb8a84b47e07013bb4850f50538aa913d487579e1921724631d02ea1b" }, + { file = "psycopg2_binary-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:61b047a0537bbc3afae10f134dc6393823882eb263088c271331602b672e52e9" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:964b4dfb7c1c1965ac4c1978b0f755cc4bd698e8aa2b7667c575fb5f04ebe06b" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afe64e9b8ea66866a771996f6ff14447e8082ea26e675a295ad3bdbffdd72afb" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e2ee79e7cf29582ef770de7dab3d286431b01c3bb598f8e05e09601b890081" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa74c903a3c1f0d9b1c7e7b53ed2d929a4910e272add6700c38f365a6002820" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b83456c2d4979e08ff56180a76429263ea254c3f6552cd14ada95cff1dec9bb8" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0645376d399bfd64da57148694d78e1f431b1e1ee1054872a5713125681cf1be" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99e34c82309dd78959ba3c1590975b5d3c862d6f279f843d47d26ff89d7d7e1" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4ea29fc3ad9d91162c52b578f211ff1c931d8a38e1f58e684c45aa470adf19e2" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4ac30da8b4f57187dbf449294d23b808f8f53cad6b1fc3623fa8a6c11d176dd0" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78e6e2a00c223e164c417628572a90093c031ed724492c763721c2e0bc2a8df" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-win32.whl", hash = "sha256:1876843d8e31c89c399e31b97d4b9725a3575bb9c2af92038464231ec40f9edb" }, + { file = "psycopg2_binary-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b4b24f75d16a89cc6b4cdff0eb6a910a966ecd476d1e73f7ce5985ff1328e9a6" }, + { file = "psycopg2_binary-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:498807b927ca2510baea1b05cc91d7da4718a0f53cb766c154c417a39f1820a0" }, + { file = "psycopg2_binary-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0d236c2825fa656a2d98bbb0e52370a2e852e5a0ec45fc4f402977313329174d" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:34b9ccdf210cbbb1303c7c4db2905fa0319391bd5904d32689e6dd5c963d2ea8" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d2222e61f313c4848ff05353653bf5f5cf6ce34df540e4274516880d9c3763" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30637a20623e2a2eacc420059be11527f4458ef54352d870b8181a4c3020ae6b" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8122cfc7cae0da9a3077216528b8bb3629c43b25053284cc868744bfe71eb141" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38601cbbfe600362c43714482f43b7c110b20cb0f8172422c616b09b85a750c5" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c7e62ab8b332147a7593a385d4f368874d5fe4ad4e341770d4983442d89603e3" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2ab652e729ff4ad76d400df2624d223d6e265ef81bb8aa17fbd63607878ecbee" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c83a74b68270028dc8ee74d38ecfaf9c90eed23c8959fca95bd703d25b82c88e" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d4e6036decf4b72d6425d5b29bbd3e8f0ff1059cda7ac7b96d6ac5ed34ffbacd" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:a8c28fd40a4226b4a84bdf2d2b5b37d2c7bd49486b5adcc200e8c7ec991dfa7e" }, + { file = "psycopg2_binary-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:51537e3d299be0db9137b321dfb6a5022caaab275775680e0c3d281feefaca6b" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4499e0a83b7b7edcb8dabecbd8501d0d3a5ef66457200f77bde3d210d5debb" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7e13a5a2c01151f1208d5207e42f33ba86d561b7a89fca67c700b9486a06d0e2" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e0f754d27fddcfd74006455b6e04e6705d6c31a612ec69ddc040a5468e44b4e" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d57c3fd55d9058645d26ae37d76e61156a27722097229d32a9e73ed54819982a" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71f14375d6f73b62800530b581aed3ada394039877818b2d5f7fc77e3bb6894d" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:441cc2f8869a4f0f4bb408475e5ae0ee1f3b55b33f350406150277f7f35384fc" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:65bee1e49fa6f9cf327ce0e01c4c10f39165ee76d35c846ade7cb0ec6683e303" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af335bac6b666cc6aea16f11d486c3b794029d9df029967f9938a4bed59b6a19" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cfec476887aa231b8548ece2e06d28edc87c1397ebd83922299af2e051cf2827" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65c07febd1936d63bfde78948b76cd4c2a411572a44ac50719ead41947d0f26b" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-win32.whl", hash = "sha256:4dfb4be774c4436a4526d0c554af0cc2e02082c38303852a36f6456ece7b3503" }, + { file = "psycopg2_binary-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:02c6e3cf3439e213e4ee930308dc122d6fb4d4bea9aef4a12535fbd605d1a2fe" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9182eb20f41417ea1dd8e8f7888c4d7c6e805f8a7c98c1081778a3da2bee3e4" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a6979cf527e2603d349a91060f428bcb135aea2be3201dff794813256c274f1" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8338a271cb71d8da40b023a35d9c1e919eba6cbd8fa20a54b748a332c355d896" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ed340d2b858d6e6fb5083f87c09996506af483227735de6964a6100b4e6a54" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81e65376e52f03422e1fb475c9514185669943798ed019ac50410fb4c4df232" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfb13af3c5dd3a9588000910178de17010ebcccd37b4f9794b00595e3a8ddad3" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4c727b597c6444a16e9119386b59388f8a424223302d0c06c676ec8b4bc1f963" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d67fbdaf177da06374473ef6f7ed8cc0a9dc640b01abfe9e8a2ccb1b1402c1f" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0892ef645c2fabb0c75ec32d79f4252542d0caec1d5d949630e7d242ca4681a3" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:02c0f3757a4300cf379eb49f543fb7ac527fb00144d39246ee40e1df684ab514" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-win32.whl", hash = "sha256:c3dba7dab16709a33a847e5cd756767271697041fbe3fe97c215b1fc1f5c9848" }, + { file = "psycopg2_binary-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:f6a88f384335bb27812293fdb11ac6aee2ca3f51d3c7820fe03de0a304ab6249" }, +] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "d3a3cfb11a6639a508a2623c8fe4e7c2b843b89aca6f51a256220d31b9b7cde7" diff --git a/apps/cli/utilities/core_sampler/pyproject.toml b/apps/cli/utilities/core_sampler/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..93240ca5ff391fee935b847fdcb7d258b33e15d0 --- /dev/null +++ b/apps/cli/utilities/core_sampler/pyproject.toml @@ -0,0 +1,22 @@ +[tool.poetry] +name = "core_sampler" +version = "2.8.2rc1" +description = "Workspaces database core sampler" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +pycapo = "^0.3.1" +psycopg2-binary = "^2.9.6" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry.scripts] +core_sampler = "core_sampler.core_sampler:main" diff --git a/apps/cli/utilities/core_sampler/setup.py b/apps/cli/utilities/core_sampler/setup.py deleted file mode 100644 index 1e902809988152673a4134be201e0c721db5ead6..0000000000000000000000000000000000000000 --- a/apps/cli/utilities/core_sampler/setup.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("core_sampler/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = ["pycapo", "psycopg2"] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces database core sampler", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["core_sampler = core_sampler.core_sampler:main"]}, -) diff --git a/apps/cli/utilities/core_sampler/test/test_core_sampler.py b/apps/cli/utilities/core_sampler/test/test_core_sampler.py index 0651b0b8943dd28d3369f5208028b7e87a99eff6..9670f0d12a4b6f411cf4e349ab0a97a41054422a 100644 --- a/apps/cli/utilities/core_sampler/test/test_core_sampler.py +++ b/apps/cli/utilities/core_sampler/test/test_core_sampler.py @@ -21,73 +21,66 @@ import logging import sys from io import StringIO -from logging import getLogger from unittest.mock import patch +import pytest + from core_sampler.core_sampler import main logger = logging.getLogger("core_sampler") logger.setLevel(logging.INFO) logger.addHandler(logging.StreamHandler(sys.stdout)) -import pytest - +@pytest.mark.skip("Can't connect to the real database during unit testing") def test_gets_eb_as_expected(): """ Do we get the output we expect for this 21A-409 execution block? :return: """ - sys.argv.append("-e") - sys.argv.append("21A-409.sb39530397.eb39561636.59309.07888592593") - - with patch("sys.stdout", new=StringIO()) as fake_out: - main() - output = fake_out.getvalue() - rows = output.split("\n") - found = False - for row in rows: - if "156759763" in row and "23142018" in row: - found = True - break - assert found + with patch("sys.argv", ["core_sampler", "-e", "21A-409.sb39530397.eb39561636.59309.07888592593"]): + with patch("sys.stdout", new=StringIO()) as fake_out: + main() + output = fake_out.getvalue() + rows = output.split("\n") - if len(rows) == 181: - # sometimes we get an extra blank line - assert len(rows[-1]) == 0 - else: - assert len(rows) == 180 + found = False + for row in rows: + if "156759763" in row and "23142018" in row: + found = True + break + assert found - sys.argv.pop() - sys.argv.pop() + if len(rows) == 181: + # sometimes we get an extra blank line + assert len(rows[-1]) == 0 + else: + assert len(rows) == 180 +@pytest.mark.skip("Can't connect to the real database during unit testing") def test_gets_project_as_expected(): """ Do we get the output we expect for 20A-465? :return: """ - sys.argv.append("-p") - sys.argv.append("20A-465") - - with patch("sys.stdout", new=StringIO()) as fake_out: - main() - output = fake_out.getvalue() - rows = output.split("\n") - if len(rows) == 705: - # sometimes we get an extra blank line - assert len(rows[-1]) == 0 - else: - assert len(rows) == 704 - found = False - for row in rows: - if "uid____evla_bdf_1589728351957.bdf" in row and "121847" in row: - found = True - break - assert found - sys.argv.pop() - sys.argv.pop() + with patch("sys.argv", ["core_sampler", "-p", "20A-465"]): + with patch("sys.stdout", new=StringIO()) as fake_out: + main() + output = fake_out.getvalue() + rows = output.split("\n") + if len(rows) == 705: + # sometimes we get an extra blank line + assert len(rows[-1]) == 0 + else: + assert len(rows) == 704 + found = False + for row in rows: + if "uid____evla_bdf_1589728351957.bdf" in row and "121847" in row: + found = True + break + assert found diff --git a/apps/cli/utilities/core_sampler/test/test_row_writer.py b/apps/cli/utilities/core_sampler/test/test_row_writer.py index 5d1717bcc338eeb2bd8e2a2a810d0775903f72f8..fc78937222018be8084fb423d891353ad8786bbe 100644 --- a/apps/cli/utilities/core_sampler/test/test_row_writer.py +++ b/apps/cli/utilities/core_sampler/test/test_row_writer.py @@ -53,9 +53,9 @@ def test_copy_output(capsys, project_rowset: RowSet): project_rowset.write_to(rw) lines = capsys.readouterr().out.strip().split("\n") assert len(lines) == 3 - assert lines[0] == "COPY projects (id, name, timestamp, existential_crisis) FROM stdin;" - assert lines[1] == "0 this 2021-07-16T16:16:50.010410 \\N" - assert lines[2] == "\\." + assert lines[0] == r"COPY projects (id, name, timestamp, existential_crisis) FROM stdin;" + assert lines[1] == r"0 this 2021-07-16T22:16:50.010410 \N" + assert lines[2] == r"\." def test_uniquifier(capsys, project_rowset: RowSet): @@ -71,7 +71,7 @@ def test_uniquifier(capsys, project_rowset: RowSet): def test_topological_sort(capsys): - # The problem here can probably arise with just two tables but I want to show it with three. + # The problem here can probably arise with just two tables, but I want to show it with three. # The basic idea is that if A -> B and B -> C and A -> C, then the topological sort is A, B, C. # But that order must be respected no matter what order we happen to find rows we want to output. # So to prove it works, we're going to generate a single row in three tables, A, B, and C with diff --git a/apps/cli/utilities/wf_monitor/LICENSE b/apps/cli/utilities/wf_monitor/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/apps/cli/utilities/wf_monitor/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/apps/cli/utilities/wf_monitor/poetry.lock b/apps/cli/utilities/wf_monitor/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..7e5a138fe20a50fc5ff60e268b5e4e4d395a8fec --- /dev/null +++ b/apps/cli/utilities/wf_monitor/poetry.lock @@ -0,0 +1,720 @@ +# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand. + +[[package]] +name = "amqp" +version = "5.1.1" +description = "Low-level AMQP client for Python (fork of amqplib)." +optional = false +python-versions = ">=3.6" +files = [ + {file = "amqp-5.1.1-py3-none-any.whl", hash = "sha256:6f0956d2c23d8fa6e7691934d8c3930eadb44972cbbd1a7ae3a520f735d43359"}, + {file = "amqp-5.1.1.tar.gz", hash = "sha256:2c1b13fecc0893e946c65cbd5f36427861cffa4ea2201d8f6fca22e2a373b5e2"}, +] + +[package.dependencies] +vine = ">=5.0.0" + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "chevron" +version = "0.14.0" +description = "Mustache templating language renderer" +optional = false +python-versions = "*" +files = [ + {file = "chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443"}, + {file = "chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cx-oracle" +version = "8.3.0" +description = "Python interface to Oracle" +optional = false +python-versions = "*" +files = [ + {file = "cx_Oracle-8.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b6a23da225f03f50a81980c61dbd6a358c3575f212ca7f4c22bb65a9faf94f7f"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win32.whl", hash = "sha256:715a8bbda5982af484ded14d184304cc552c1096c82471dd2948298470e88a04"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:07f01608dfb6603a8f2a868fc7c7bdc951480f187df8dbc50f4d48c884874e6a"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4b3afe7a911cebaceda908228d36839f6441cbd38e5df491ec25960562bb01a0"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win32.whl", hash = "sha256:076ffb71279d6b2dcbf7df028f62a01e18ce5bb73d8b01eab582bf14a62f4a61"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b82e4b165ffd807a2bd256259a6b81b0a2452883d39f987509e2292d494ea163"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b902db61dcdcbbf8dd981f5a46d72fef40c5150c7fc0eb0f0698b462d6eb834e"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win32.whl", hash = "sha256:4c82ca74442c298ceec56d207450c192e06ecf8ad52eb4aaad0812e147ceabf7"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:54164974d526b76fdefb0b66a42b68e1fca5df78713d0eeb8c1d0047b83f6bcf"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:410747d542e5f94727f5f0e42e9706c772cf9094fb348ce965ab88b3a9e4d2d8"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win32.whl", hash = "sha256:3baa878597c5fadb2c72f359f548431c7be001e722ce4a4ebdf3d2293a1bb70b"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:de42bdc882abdc5cea54597da27a05593b44143728e5b629ad5d35decb1a2036"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df412238a9948340591beee9ec64fa62a2efacc0d91107034a7023e2991fba97"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win32.whl", hash = "sha256:70d3cf030aefd71f99b45beba77237b2af448adf5e26be0db3d0d3dee6ea4230"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf01ce87edb4ef663b2e5bd604e1e0154d2cc2f12b60301f788b569d9db8a900"}, + {file = "cx_Oracle-8.3.0.tar.gz", hash = "sha256:3b2d215af4441463c97ea469b9cc307460739f89fdfa8ea222ea3518f1a424d9"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "immutable-views" +version = "0.6.1" +description = "Immutable views on other collection objects" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "immutable-views-0.6.1.tar.gz", hash = "sha256:48e0543786e8a196667fb8412ce35c4f555ce08f39eab21dcf4b0a23d8d19295"}, + {file = "immutable_views-0.6.1-py2.py3-none-any.whl", hash = "sha256:549dbe1106c53e26da28e1ab0f19f54ff20592cc6590f791ffd060de140c1aff"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "kombu" +version = "5.3.1" +description = "Messaging library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "kombu-5.3.1-py3-none-any.whl", hash = "sha256:48ee589e8833126fd01ceaa08f8a2041334e9f5894e5763c8486a550454551e9"}, + {file = "kombu-5.3.1.tar.gz", hash = "sha256:fbd7572d92c0bf71c112a6b45163153dea5a7b6a701ec16b568c27d0fd2370f2"}, +] + +[package.dependencies] +amqp = ">=5.1.1,<6.0.0" +vine = "*" + +[package.extras] +azureservicebus = ["azure-servicebus (>=7.10.0)"] +azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] +confluentkafka = ["confluent-kafka (==2.1.1)"] +consul = ["python-consul2"] +librabbitmq = ["librabbitmq (>=2.0.0)"] +mongodb = ["pymongo (>=4.1.1)"] +msgpack = ["msgpack"] +pyro = ["pyro4"] +qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] +redis = ["redis (>=4.5.2)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=2.8.0)"] + +[[package]] +name = "marshmallow" +version = "3.19.0" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.7" +files = [ + {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, + {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "messaging" +version = "2.8.2rc1" +description = "SSA Messaging is an AMQP-based asynchronous messaging system based on passing simple Python objects as JSON." +optional = false +python-versions = "^3.10" +files = [] +develop = false + +[package.dependencies] +kombu = "^5.2.4" +pycapo = "^0.3.1" + +[package.source] +type = "directory" +url = "../../../../shared/messaging" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sqlalchemy" +version = "1.4.47" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.47-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:dcfb480bfc9e1fab726003ae00a6bfc67a29bad275b63a4e36d17fe7f13a624e"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28fda5a69d6182589892422c5a9b02a8fd1125787aab1d83f1392aa955bf8d0a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win32.whl", hash = "sha256:45e799c1a41822eba6bee4e59b0e38764e1a1ee69873ab2889079865e9ea0e23"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win_amd64.whl", hash = "sha256:10edbb92a9ef611f01b086e271a9f6c1c3e5157c3b0c5ff62310fb2187acbd4a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a4df53472c9030a8ddb1cce517757ba38a7a25699bbcabd57dcc8a5d53f324e"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:511d4abc823152dec49461209607bbfb2df60033c8c88a3f7c93293b8ecbb13d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbe57f39f531c5d68d5594ea4613daa60aba33bb51a8cc42f96f17bbd6305e8d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca8ab6748e3ec66afccd8b23ec2f92787a58d5353ce9624dccd770427ee67c82"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299b5c5c060b9fbe51808d0d40d8475f7b3873317640b9b7617c7f988cf59fda"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win32.whl", hash = "sha256:684e5c773222781775c7f77231f412633d8af22493bf35b7fa1029fdf8066d10"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win_amd64.whl", hash = "sha256:2bba39b12b879c7b35cde18b6e14119c5f1a16bd064a48dd2ac62d21366a5e17"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:795b5b9db573d3ed61fae74285d57d396829e3157642794d3a8f72ec2a5c719b"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:989c62b96596b7938cbc032e39431e6c2d81b635034571d6a43a13920852fb65"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b67bda733da1dcdccaf354e71ef01b46db483a4f6236450d3f9a61efdba35a"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win32.whl", hash = "sha256:9a198f690ac12a3a807e03a5a45df6a30cd215935f237a46f4248faed62e69c8"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win_amd64.whl", hash = "sha256:03be6f3cb66e69fb3a09b5ea89d77e4bc942f3bf84b207dba84666a26799c166"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:16ee6fea316790980779268da47a9260d5dd665c96f225d28e7750b0bb2e2a04"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:557675e0befafa08d36d7a9284e8761c97490a248474d778373fb96b0d7fd8de"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb2797fee8a7914fb2c3dc7de404d3f96eb77f20fc60e9ee38dc6b0ca720f2c2"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28297aa29e035f29cba6b16aacd3680fbc6a9db682258d5f2e7b49ec215dbe40"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win32.whl", hash = "sha256:998e782c8d9fd57fa8704d149ccd52acf03db30d7dd76f467fd21c1c21b414fa"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win_amd64.whl", hash = "sha256:dde4d02213f1deb49eaaf8be8a6425948963a7af84983b3f22772c63826944de"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e98ef1babe34f37f443b7211cd3ee004d9577a19766e2dbacf62fce73c76245a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a3879853208a242b5913f3a17c6ac0eae9dc210ff99c8f10b19d4a1ed8ed9b"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7120a2f72599d4fed7c001fa1cbbc5b4d14929436135768050e284f53e9fbe5e"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048509d7f3ac27b83ad82fd96a1ab90a34c8e906e4e09c8d677fc531d12c23c5"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win32.whl", hash = "sha256:6572d7c96c2e3e126d0bb27bfb1d7e2a195b68d951fcc64c146b94f088e5421a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win_amd64.whl", hash = "sha256:a6c3929df5eeaf3867724003d5c19fed3f0c290f3edc7911616616684f200ecf"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71d4bf7768169c4502f6c2b0709a02a33703544f611810fb0c75406a9c576ee1"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd45c60cc4f6d68c30d5179e2c2c8098f7112983532897566bb69c47d87127d3"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fdbb8e9d4e9003f332a93d6a37bca48ba8095086c97a89826a136d8eddfc455"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f216a51451a0a0466e082e163591f6dcb2f9ec182adb3f1f4b1fd3688c7582c"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win32.whl", hash = "sha256:bd988b3362d7e586ef581eb14771bbb48793a4edb6fcf62da75d3f0f3447060b"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win_amd64.whl", hash = "sha256:32ab09f2863e3de51529aa84ff0e4fe89a2cb1bfbc11e225b6dbc60814e44c94"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:07764b240645627bc3e82596435bd1a1884646bfc0721642d24c26b12f1df194"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e2a42017984099ef6f56438a6b898ce0538f6fadddaa902870c5aa3e1d82583"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b6d807c76c20b4bc143a49ad47782228a2ac98bdcdcb069da54280e138847fc"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a94632ba26a666e7be0a7d7cc3f7acab622a04259a3aa0ee50ff6d44ba9df0d"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win32.whl", hash = "sha256:f80915681ea9001f19b65aee715115f2ad310730c8043127cf3e19b3009892dd"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win_amd64.whl", hash = "sha256:fc700b862e0a859a37faf85367e205e7acaecae5a098794aff52fdd8aea77b12"}, + {file = "SQLAlchemy-1.4.47.tar.gz", hash = "sha256:95fc02f7fc1f3199aaa47a8a757437134cf618e9d994c84effd53f530c38586f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "transaction" +version = "3.1.0" +description = "Transaction management for Python" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "transaction-3.1.0-py2.py3-none-any.whl", hash = "sha256:8376a959aa71821df1bdd7d066858a3f9f34b7f5f1c0a0e1efbd11d626895449"}, + {file = "transaction-3.1.0.tar.gz", hash = "sha256:65d0b1ea92dbe7c4e3b237fb6bd8b41dea23d7459e7bdd8c3880bffdaf912fa4"}, +] + +[package.dependencies] +"zope.interface" = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["mock"] +testing = ["coverage", "mock", "nose"] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "vine" +version = "5.0.0" +description = "Promises, promises, promises." +optional = false +python-versions = ">=3.6" +files = [ + {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"}, + {file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"}, +] + +[[package]] +name = "workspaces" +version = "2.8.2rc1" +description = "SSA Workspaces shared library" +optional = false +python-versions = "^3.10" +files = [] +develop = false + +[package.dependencies] +chevron = "^0.14.0" +cx-oracle = "^8.3.0" +immutable-views = "^0.6.1" +marshmallow = "^3.19.0" +pendulum = "^2.1.2" +pycapo = "^0.3.1" +requests = "^2.29.0" +sqlalchemy = "1.4.47" +transaction = "^3.1.0" + +[package.source] +type = "directory" +url = "../../../../shared/workspaces" + +[[package]] +name = "zope-interface" +version = "6.0" +description = "Interfaces for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, + {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, + {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, + {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, + {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, + {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, + {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, + {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, + {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "711e83141ea8c82c0cbd0a9a2965a138fd614434cbd5b4f0bd7b4b73a9fb2d05" diff --git a/apps/cli/utilities/wf_monitor/pyproject.toml b/apps/cli/utilities/wf_monitor/pyproject.toml new file mode 100644 index 0000000000000000000000000000000000000000..c8c1c54712952fedc609be9a6c61dad52aa37810 --- /dev/null +++ b/apps/cli/utilities/wf_monitor/pyproject.toml @@ -0,0 +1,23 @@ +[tool.poetry] +name = "wf_monitor" +version = "2.8.2rc1" +description = "Workflow monitor that reads in HTCondor logs and translates them into AMQP events" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +pendulum = "^2.1.2" +workspaces = {path="../../../../shared/workspaces"} +messaging = {path="../../../../shared/messaging"} + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[tool.poetry.scripts] +wf_monitor = "wf_monitor.monitor:main" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/apps/cli/utilities/wf_monitor/setup.py b/apps/cli/utilities/wf_monitor/setup.py deleted file mode 100644 index 8cb572b4847a0836cfb52ba3cf9b7ffdb4f6225d..0000000000000000000000000000000000000000 --- a/apps/cli/utilities/wf_monitor/setup.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import setup - -VERSION = open("wf_monitor/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = [ - "pendulum==2.1.2", - "ssa-workspaces", - "ssa-messaging", -] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workflow monitor that reads in HTCondor logs and translates them into AMQP events", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=["wf_monitor"], - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["wf_monitor = wf_monitor.monitor:main"]}, -) diff --git a/apps/cli/utilities/wf_monitor/test/__init__.py b/apps/cli/utilities/wf_monitor/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/apps/cli/utilities/wf_monitor/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/apps/cli/utilities/wf_monitor/wf_monitor/__init__.py b/apps/cli/utilities/wf_monitor/wf_monitor/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..2d85394fa2f19076f6ef61776653c8a852918c53 100644 --- a/apps/cli/utilities/wf_monitor/wf_monitor/__init__.py +++ b/apps/cli/utilities/wf_monitor/wf_monitor/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Workflow monitor that reads in HTCondor logs and translates them into AMQP events +""" +__version__ = "2.8.2rc1" diff --git a/apps/cli/utilities/wf_monitor/wf_monitor/_version.py b/apps/cli/utilities/wf_monitor/wf_monitor/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/apps/cli/utilities/wf_monitor/wf_monitor/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/apps/cli/utilities/wf_monitor/wf_monitor/monitor.py b/apps/cli/utilities/wf_monitor/wf_monitor/monitor.py index 411cb830184f36bfdffdee4b3f82a783d0644c87..372e18cf826b91c6e225af82c827f4e1f8288e0b 100644 --- a/apps/cli/utilities/wf_monitor/wf_monitor/monitor.py +++ b/apps/cli/utilities/wf_monitor/wf_monitor/monitor.py @@ -35,7 +35,7 @@ from typing import Any, Callable, Dict, Tuple, Union, List from messaging.messenger import MessageSender -from ._version import ___version___ as version +from . import __version__ as version from .enum import HtcEventCodes, WorkflowStatusMessages, DAGFinalStage # pylint: disable=E0401, E0402, W1203 diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index cd41f7145567e505f23210dd424c87a8a0965a2d..4251b092b9374b118c41d88d401b7df968f57dae 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -1,13 +1,51 @@ -FROM ssa-containers.aoc.nrao.edu/ops/base:nodejs-14 as base-build +FROM node:14.16-alpine3.12 as base +ARG WS_VERSION=unknown-version +ENV WS_VERSION=${WS_VERSION} + +RUN apk update && apk add --virtual build-dependencies \ + git \ + python2 \ + g++ \ + make \ + && rm -rf /var/cache/apk/* + +# Create vlapipe group +# and create vlapipe in vlapipe group +RUN addgroup --gid 6000 vlapipe && \ + adduser --disabled-password --gecos "" --ingroup vlapipe --uid 6000 vlapipe + +FROM base as dev +# set container working directory to /code +WORKDIR /code/ + +# copy web app from host to container +COPY ./apps/web ./ + +# Disable Angular Analytics prompt +ENV NG_CLI_ANALYTICS=false + +# Requires build-arg WS_VERSION +# Build arg that sets Workspaces Version; defaults if no build arg is given +ENV NG_APP_WS_VERSION=${WS_VERSION} + +# install node_modules +RUN npm install + +# start Angular development server +CMD [ "./node_modules/.bin/ng", "serve", "--host", "0.0.0.0" ] + + +FROM base as base-build # Requires build-arg $env # Build arg that sets environment; sets to "dev" if no build arg is given -ARG env=dev -ENV ENV=${env} +ARG DEPLOY_ENV=dev +ENV DEPLOY_ENV=${DEPLOY_ENV} +ARG ENV_HOST +ENV ENV_HOST=${ENV_HOST} # Requires build-arg WS_VERSION -# Build arg that sets Workspaces Version; defaults to "dev" if no build arg is given -ARG WS_VERSION=dev +# Build arg that sets Workspaces Version; defaults to "unknown-version" if no build arg is given ENV NG_APP_WS_VERSION=${WS_VERSION} # Switch to vlapipe @@ -47,13 +85,13 @@ USER vlapipe COPY --chown=vlapipe:vlapipe ./apps/web ./ # Build the angular app -RUN ./node_modules/.bin/ng build --configuration=${ENV} --output-path=dist +RUN ./node_modules/.bin/ng build --configuration=${DEPLOY_ENV} --output-path=dist # ## NGINX section of multi-stage image # # Use nginx base image -FROM nginx:1.19.7-alpine +FROM nginx:1.19.7-alpine as prod # Copy WS nginx config from base-build stage COPY --from=base-build /home/vlapipe/app/ws-nginx.conf.template /etc/nginx/templates/ diff --git a/apps/web/Dockerfile.base b/apps/web/Dockerfile.base deleted file mode 100644 index c9194f9527d70670b2bb9ca4c202428d4ad21648..0000000000000000000000000000000000000000 --- a/apps/web/Dockerfile.base +++ /dev/null @@ -1,13 +0,0 @@ -FROM node:14.16-alpine3.12 - -RUN apk update && apk add --virtual build-dependencies \ - git \ - python2 \ - g++ \ - make \ - && rm -rf /var/cache/apk/* - -# Create vlapipe group -# and create vlapipe in vlapipe group -RUN addgroup --gid 6000 vlapipe && \ - adduser --disabled-password --gecos "" --ingroup vlapipe --uid 6000 vlapipe diff --git a/apps/web/Dockerfile.ci b/apps/web/Dockerfile.ci deleted file mode 100644 index 8fc13f1946a09e2d6d53ad1b407b1531e10ce9fb..0000000000000000000000000000000000000000 --- a/apps/web/Dockerfile.ci +++ /dev/null @@ -1,19 +0,0 @@ -# base-build:ci references the first stage in app/web/Dockerfile -# in which npm install has already been ran and app/web/ has been -# copied to /app in the image - -# For e2e testing, we want to use this first stage as the base for our -# e2e container when we run e2e tests in the CI. We'll copy /app/ from -# base-build:ci and copy it to /app of the trion/ng-cli-karma:11.2.7 image. -# Then we are able to run `ng e2e` with our Angular environment already setup. -# https://hub.docker.com/r/trion/ng-cli-karma/ - -# Both images use NodeJS 14.16 -ARG TAGNAME="ci" -FROM base-build:${TAGNAME} as web-base - -FROM trion/ng-cli-karma:11.2.8 -WORKDIR /app -COPY --from=web-base /home/vlapipe/app/ ./ - -CMD ./node_modules/protractor/bin/webdriver-manager update --versions.chrome 89.0.4389.114 && ng e2e --configuration=ci --webdriver-update=false diff --git a/apps/web/Dockerfile.local b/apps/web/Dockerfile.local deleted file mode 100644 index 2bc72113ee32bf5cb2ade0e180c885967cb3adf2..0000000000000000000000000000000000000000 --- a/apps/web/Dockerfile.local +++ /dev/null @@ -1,16 +0,0 @@ -FROM ssa-containers.aoc.nrao.edu/ops/base:nodejs-14 - -# set container working directory to /code -WORKDIR /code/ - -# copy web app from host to container -COPY ./apps/web ./ - -# Disable Angular Analytics prompt -ENV NG_CLI_ANALYTICS=false - -# install node_modules -RUN npm install - -# start Angular development server -CMD [ "./node_modules/.bin/ng", "serve", "--host", "0.0.0.0" ] diff --git a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.html b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.html index 91299499be8f487d8bdf3c564acaa1be0972f828..16e3807f311353afb0431dff35e574b609a779d8 100644 --- a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.html +++ b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.html @@ -86,6 +86,7 @@ <span><i class="text-dark small fas fa-filter"></i></span> </button> </th> + <th>NGAS Download Status</th> <th>SDM ID</th> <th>Bands</th> <th>Array Configuration</th> @@ -145,7 +146,10 @@ <app-status-badge [capabilityRequest]="request"></app-status-badge> </a> </td> - <td>{{ getExecutionStatusName(request) }}</td> + <td [ngClass]="{'stage1-status': getExecutionStatusName(request) === 'Awaiting QA', + 'execution-status': getExecutionStatusName(request) === 'Executing', + 'stage2-status': getExecutionStatusName(request) === 'Stage 2 Review'}">{{ getExecutionStatusName(request) }}</td> + <td>{{ getFetchStatus(request) }}</td> <td>{{ getMetadata(request).sdm_id }}</td> <td>{{ getMetadata(request).bands ? getMetadata(request).bands.split(' ').join(', ') : "" }}</td> <td>{{ getMetadata(request).array_config }}</td> @@ -158,7 +162,6 @@ (change)=" toggleSRDPCompatibility( request.id, - request.versions[request.versions.length - 1].version_number, getMetadata(request).is_srdp ) " @@ -171,7 +174,7 @@ </div> <div class="form-check" *ngIf="request.state === 'Created'"> <input - (change)="toggleSRDPCompatibility(request.id, 1, getMetadata(request).is_srdp)" + (change)="toggleSRDPCompatibility(request.id, getMetadata(request).is_srdp)" class="form-check-input" type="checkbox" value="" diff --git a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.scss b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.scss index 687ea6b94672c55522813eecf00f4e81b380a240..b9751cb99a66cc2b9e7ffe05b7f4066db32f88ff 100644 --- a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.scss +++ b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.scss @@ -13,6 +13,27 @@ } } +.execution-status { + background-color: #FFC0CB; + mat-label { + opacity: 1 !important; + } +} + +.stage1-status { + background-color: #99FFFF; + mat-label { + opacity: 1 !important; + } +} + +.stage2-status { + background-color: #FF7F50; + mat-label { + opacity: 1; + } +} + .mat-select-panel-wrap { mat-option:last-child:before { content: 'All ('; diff --git a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.ts b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.ts index ba03627a63081c4f1da771e4447979413afd93e0..3f4e614282b3f6650f4f79849dd329dcaef313f3 100644 --- a/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.ts +++ b/apps/web/src/app/workspaces/components/active-capability-requests/active-capability-requests.component.ts @@ -440,7 +440,7 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy { .subscribe(togglePauseCapabilityObservable); } - public toggleSRDPCompatibility(request_id: string, version_id: number, isSRDP: boolean): void { + public toggleSRDPCompatibility(request_id: string, isSRDP: boolean): void { // stop polling when user clicks checkbox this.ngUnsubscribe.next(false); const toggleSRDPCompatibilityObservable = { @@ -457,7 +457,7 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy { }, }; this.capabilityRequestService - .toggleSRDPCompatibility(request_id, version_id, isSRDP) + .toggleSRDPCompatibility(request_id, isSRDP) .subscribe(toggleSRDPCompatibilityObservable); } @@ -688,4 +688,19 @@ export class ActiveCapabilityRequestsComponent implements OnInit, OnDestroy { trackActiveRequests(index: number, activeRequest: any) { return activeRequest.id; } + + getFetchStatus(request: CapabilityRequest): string { + // figure out the latest version + if (request.versions.length == 0) + return "Not started"; + + let version = request.versions[request.versions.length - 1]; + + if (version.workflow_metadata && version.workflow_metadata.fetch_end_time) + return "Complete"; + else if (version.workflow_metadata && version.workflow_metadata.fetch_start_time) + return "In Progress"; + else + return ""; + } } diff --git a/apps/web/src/app/workspaces/components/active-capability-requests/components/manual-calibrate-observation/manual-calibrate-observation.component.ts b/apps/web/src/app/workspaces/components/active-capability-requests/components/manual-calibrate-observation/manual-calibrate-observation.component.ts index 4de3ea9c9c29735978190cb75b2fb7d333a100b7..35ed1f63a39579c4d7c11a5f31cdac0f1089def0 100644 --- a/apps/web/src/app/workspaces/components/active-capability-requests/components/manual-calibrate-observation/manual-calibrate-observation.component.ts +++ b/apps/web/src/app/workspaces/components/active-capability-requests/components/manual-calibrate-observation/manual-calibrate-observation.component.ts @@ -37,7 +37,7 @@ export class ManualCalibrateObservationComponent implements OnInit { } setSdmId(sdmId: string): void { - this.sdmId = sdmId; + this.sdmId = sdmId.trim(); } launchCalibrationFromSdmIdOnClick(capabilityName: string): void { diff --git a/apps/web/src/app/workspaces/components/capability-request/components/qa-controls/qa-controls.component.html b/apps/web/src/app/workspaces/components/capability-request/components/qa-controls/qa-controls.component.html index 35dbe1fa728ffbe6416042805ac997550a885f60..835fdeeba9814c573ff0cfd15430e3affe836b42 100644 --- a/apps/web/src/app/workspaces/components/capability-request/components/qa-controls/qa-controls.component.html +++ b/apps/web/src/app/workspaces/components/capability-request/components/qa-controls/qa-controls.component.html @@ -16,18 +16,30 @@ </button> <send-email - id="set-qa-fail" + id="set-qa-email-pass" style="margin-left: 100px" - modalTitleText="Fail QA Email" - customStyle="btn btn-secondary btn-sm" - templateName="std_calibration_fail" + modalTitleText="QA Pass Email" + customStyle="btn btn-success btn-sm" + templateName="std_calibration_complete" [defaultCC]="defaultCC" [emailParameters]="getEmailParams()" - (emailSentEvent)="failQa(currentVersion)"> - <span class="fas fa-times"></span> - <span class="pl-2">Fail QA</span> + (emailSentEvent)="passQa(currentVersion)"> + <span class="fas fa fa-envelope"></span> + <span class="pl-2">QA Pass With Message</span> </send-email> + + <button + id="set-qa-fail" + type="button" + class="btn btn-secondary btn-sm" + style="margin-left: 100px" + (click)="failQa(currentVersion)" + > + <span class="fas fa-times"></span> + <span class="pl-2">Fail QA</span> + </button> + <send-email id="set-qa-abandon" style="margin-left: 100px" @@ -63,19 +75,17 @@ <span class="pl-2">Send to Stage 2</span> </button> - <send-email + <button id="set-qa-fail" + type="button" + class="btn btn-secondary btn-sm" style="margin-left: 100px" - modalTitleText="Fail QA Email" - customStyle="btn btn-secondary btn-sm" - templateName="std_calibration_fail" - [defaultCC]="defaultCC" - [emailParameters]="getEmailParams()" - (emailSentEvent)="failQa(currentVersion)" - [shouldDisable]="currentVersion.current_execution.state_name === 'Stage 2 Review'"> - <span class="fas fa-times"></span> - <span class="pl-2">Fail QA</span> - </send-email> + (click)="failQa(currentVersion)" + [disabled]="currentVersion.current_execution.state_name === 'Stage 2 Review'" + > + <span class="fas fa-times"></span> + <span class="pl-2">Fail QA</span> + </button> <send-email id="set-qa-abandon" @@ -109,6 +119,20 @@ <span class="pl-2">QA Pass</span> </button> + <send-email + id="set-stage-2-email-pass" + style="margin-left: 120px" + modalTitleText="QA Pass Email" + customStyle="btn btn-success btn-sm" + templateName="std_calibration_complete" + [defaultCC]="defaultCC" + [shouldDisable]="currentVersion.current_execution.state_name === 'Awaiting QA'" + [emailParameters]="getEmailParams()" + (emailSentEvent)="confirmQa(currentVersion)"> + <span class="fas fa fa-envelope"></span> + <span class="pl-2">QA Pass With Message</span> + </send-email> + <button id="set-qa-revisit" type="button" diff --git a/apps/web/src/app/workspaces/components/editor/editor.component.html b/apps/web/src/app/workspaces/components/editor/editor.component.html index b2598b4059a4029a6637c11183086b3b26a7b765..7632636af55241cd2559ff6fe6bec3644ead5ea7 100644 --- a/apps/web/src/app/workspaces/components/editor/editor.component.html +++ b/apps/web/src/app/workspaces/components/editor/editor.component.html @@ -31,6 +31,7 @@ <div class="modal-footer"> <button type="button" class="btn btn-outline-secondary mr-auto" (click)="undoEditChanges()">Revert Changes</button> <button type="button" class="btn btn-secondary" (click)="modal.close('exit')">Cancel</button> - <button type="button" class="btn btn-primary" mdbBtn (click)="modal.close('save')">Save</button> + <button type="button" class="btn btn-primary" mdbBtn (click)="this.newEditEvent.emit(this.editedData)">Save</button> + <button type="button" class="btn btn-primary" mdbBtn (click)="modal.close('save-and-close')">Save and Close</button> </div> </ng-template> diff --git a/apps/web/src/app/workspaces/components/editor/editor.component.ts b/apps/web/src/app/workspaces/components/editor/editor.component.ts index 93c8841955307f9c72f0cbe3ead91a7bbabf4432..83209fe827a622dfb9f223892c179445c763b474 100644 --- a/apps/web/src/app/workspaces/components/editor/editor.component.ts +++ b/apps/web/src/app/workspaces/components/editor/editor.component.ts @@ -51,7 +51,7 @@ export class EditorComponent implements OnInit { this.toggleEditorOpen() this.modalService.open(content, { ariaLabelledBy: "modal-title", centered: true, size: "lg" }).result.then( (result) => { - if (result === "save" && this.editedData) { + if (result === "save-and-close" && this.editedData) { // "Save" button clicked; emit edited data to parent component this.newEditEvent.emit(this.editedData) this.toggleEditorOpen() diff --git a/apps/web/src/app/workspaces/services/capability-request.service.ts b/apps/web/src/app/workspaces/services/capability-request.service.ts index 97b03b9d660000c016b596fa70659c25c5c49850..024e92e4aa03ac63434f62b5e30cd823b9e305af 100644 --- a/apps/web/src/app/workspaces/services/capability-request.service.ts +++ b/apps/web/src/app/workspaces/services/capability-request.service.ts @@ -272,8 +272,8 @@ export class CapabilityRequestService { * @param version_id Given version ID * @param isAlreadySRDP The current status of SRDP-Compatability */ - public toggleSRDPCompatibility(request_id: string, version_id: number, isAlreadySRDP: boolean): Observable<any> { - const url = `/capability/request/${request_id}/version/${version_id}/srdp_compatible`; + public toggleSRDPCompatibility(request_id: string, isAlreadySRDP: boolean): Observable<any> { + const url = `/capability/request/${request_id}/srdp_compatible`; let toggleSRDP = isAlreadySRDP ? false : true return this.httpClient.post<any>(url, JSON.stringify(toggleSRDP)); } diff --git a/apps/web/ws-nginx.conf.template b/apps/web/ws-nginx.conf.template index a71268aa7d5ff066a309a98da7de19fd5092d1a4..ee71ee7eb21aab4569b57af20fb07b7781ddca59 100644 --- a/apps/web/ws-nginx.conf.template +++ b/apps/web/ws-nginx.conf.template @@ -20,14 +20,14 @@ server { location /workflows { proxy_pass http://${ENV_HOST}:3456; - proxy_redirect default; + proxy_redirect http://${ENV_HOST}:3456 /workflows; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /notify { proxy_pass http://${ENV_HOST}:3458; - proxy_redirect default; + proxy_redirect http://${ENV_HOST}:3458 /notify; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } diff --git a/ci/bin/Dockerfile.pex b/ci/bin/Dockerfile.pex deleted file mode 100644 index 8e1ceda0ef41eeb383045b44d98e42b4765f4eef..0000000000000000000000000000000000000000 --- a/ci/bin/Dockerfile.pex +++ /dev/null @@ -1,17 +0,0 @@ -FROM centos/python-38-centos7:20210726-fad62e9 - -USER root - -Run mkdir /ci - -WORKDIR /ci - -COPY ./ci/bin /ci - -RUN /ci/install-python310.sh -RUN python3.10 -m pip install pex - -# Add Python install location to the path (can't set in boot script) -ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/opt/Python-3.10.9 -ENV PATH $PATH:/home/ssa/bin - diff --git a/ci/bin/build-pexables.sh b/ci/bin/build-pexables.sh deleted file mode 100755 index 07f66d5ad8f8bb719e40cb3579294eb8ea2d8b8d..0000000000000000000000000000000000000000 --- a/ci/bin/build-pexables.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# - -# Set failfast -set -e -set -o pipefail - -BUILD_DIR=/builds/ssa/workspaces/pexes -[[ -d $BUILD_DIR ]] || mkdir -p $BUILD_DIR - -cd apps/cli/executables/pexable/ -for pexable in "$@" -do - if [ $pexable == "ingest" ]; then - echo "Skipping $pexable" - continue - fi - - # if directory doesn't exist, skip - if [ ! -d "$pexable" ]; then - echo "Directory $pexable doesn't exist skipping" - continue - fi - - cd "$pexable" - if [ -e setup.py ]; then - until python3.10 setup.py bdist_pex --bdist-all --bdist-dir="$BUILD_DIR" --pex-args="--python-shebang /home/ssa/bin/python3.10"; do - echo "PEX build failed. Retrying."; sleep 2; - done - else - echo "PEX build impossible in $PWD because there is no setup.py file" - fi - cd .. -done diff --git a/ci/bin/generate-yaml.py b/ci/bin/generate-yaml.py deleted file mode 100755 index 418d9066fb0d8f4202fb80485da2da13b633503a..0000000000000000000000000000000000000000 --- a/ci/bin/generate-yaml.py +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. - - -import os -import re -import subprocess -import sys - - -# Write gitlab-ci workflow rule for generated yaml -def write_global_rule(**kwargs): - global_rule = """ -workflow: - rules: - - if: {rule} -""" - with open("generated-pex-build-pipeline.yml", "a") as yfile: - yfile.write(global_rule.format(**kwargs)) - - -# Write build job to generated yaml -def write_build_config(**kwargs): - template = """ -pex-{pex_name}-build: - image: nrao_pex_base_3_10 - variables: - GIT_SUBMODULE_STRATEGY: recursive - script: - - echo "Building PEX - {pex_name}" - - ./ci/bin/build-pexables.sh {pex_name} - - | - curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file pexes/{pex_name} "$CI_API_V4_URL/projects/$CI_PROJECT_ID/packages/generic/{pex_name}/0.0.1/{pex_name}" - rules: - - if: {build_rule} - {changes_rule} -""" - with open("generated-pex-build-pipeline.yml", "a") as yfile: - yfile.write(template.format(**kwargs)) - - -# Write release job to generated yaml -def write_release_config(**kwargs): - template = """ -pex-{pex_name}-release: - image: python:3.10-slim - needs: ["pex-{pex_name}-build"] - before_script: - - mkdir -p ~/.ssh - - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - - eval $(ssh-agent -s) - - chmod 700 ~/.ssh - - echo "$SSH_PRIVATE_KEY" | ssh-add - > ~/.ssh/id_rsa - - '[[ -f /.dockerenv ]] && echo -e "Host *\\n\\tStrictHostKeyChecking no\\n\\n" > ~/.ssh/config' - script: - - echo "Releasing PEX to sbin area - {pex_name}" - - | - RELEASE_CMD="cd /lustre/aoc/cluster/pipeline/dsoc-{env}/workspaces/sbin/ && \\ - curl --header 'JOB-TOKEN: ${{CI_JOB_TOKEN}}' '${{CI_API_V4_URL}}/projects/${{CI_PROJECT_ID}}/packages/generic/{pex_name}/0.0.1/{pex_name}' --output {pex_name} && \\ - chmod 755 {pex_name}" - - B64CMD=$(echo "$RELEASE_CMD" | base64 | sed ':a;N;$!ba;s/\\n//g') - - ssh -A shipman.aoc.nrao.edu "echo ${{B64CMD}} | base64 -d | bash" - rules: - - if: {build_rule} - {changes_rule} - allow_failure: true -""" - with open("generated-pex-build-pipeline.yml", "a") as yfile: - yfile.write(template.format(**kwargs)) - - -# Get list of all pexables -def get_list_of_pexables(): - pex_changes = os.listdir("./apps/cli/executables/pexable") - pex_changes.remove("ingest") - return pex_changes - - -def main(argv): - deploy_env = os.environ["DEPLOY_ENV"] - - pex_changes = [] - rule = "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/" - changes_rule = "" - - if deploy_env == "dev": - commit_sha = os.environ["CI_COMMIT_SHA"] - - # Get list of files that have changed from commit SHA - # git diff-tree --no-commit-id --name-only -r $CI_COMMIT_SHA - sp = subprocess.run( - ["git", "diff-tree", "-m", "--no-commit-id", "--name-only", "-r", f"{commit_sha}"], - stdout=subprocess.PIPE, - universal_newlines=True, - ) - # Of those changes, make a list of changes to pexables - # and remove duplicates - pex_changes = list(dict.fromkeys(re.findall("/pexable/(.*?)/", sp.stdout))) - - # remove ingest - if "ingest" in pex_changes: - pex_changes.remove("ingest") - - write_global_rule(rule=rule) - changes_rule = """changes: - - apps/cli/executables/pexable/**/*""" - else: - if deploy_env == "test": - rule = "$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/" - if deploy_env == "prod": - rule = "$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/" - - write_global_rule(rule=rule) - pex_changes = get_list_of_pexables() - - print(f"{pex_changes}") - - for pexable in pex_changes: - write_build_config(pex_name=pexable, build_rule=rule, changes_rule=changes_rule) - write_release_config(pex_name=pexable, build_rule=rule, changes_rule=changes_rule, env=deploy_env) - - -if __name__ == "__main__": - main(sys.argv[1:]) diff --git a/ci/build.template.yml b/ci/build.template.yml index 9dc7a6a7d87f92bea4f4379ba6398ce5c63da80e..a4f0ddcdf428f5dfacb1b2194c55b4e56b378734 100644 --- a/ci/build.template.yml +++ b/ci/build.template.yml @@ -2,8 +2,9 @@ .build: script: - echo "Building branch or tag -- ${IMAGE_TAG}" - - NAME="${REGISTRY_URL}/${PROJECT_NAME}/${SERVICE_NAME}" - - docker build -t ${NAME}:${CI_COMMIT_SHORT_SHA} -f ${PATH_PREFIX}${SERVICE_NAME}/Dockerfile . --build-arg env=${DEPLOY_ENV} --build-arg TAGNAME=${CI_COMMIT_SHORT_SHA} --build-arg WS_VERSION=${VERSION} + - NAME="${REGISTRY_URL}/workspaces/${SERVICE_NAME}" + - docker build -t ${NAME}:${CI_COMMIT_SHORT_SHA} -f ${PATH_PREFIX}${SERVICE_NAME}/Dockerfile . --build-arg DEPLOY_ENV=${DEPLOY_ENV} --build-arg WS_VERSION=${VERSION} + --build-arg CAPO_PROFILE=dsoc-${DEPLOY_ENV} --build-arg API_TOKEN=${API_TOKEN} --target prod - docker tag ${NAME}:${CI_COMMIT_SHORT_SHA} ${NAME}:${IMAGE_TAG} - echo "TAG=${IMAGE_TAG}" >> build.env artifacts: @@ -15,27 +16,36 @@ IMAGE_TAG: $CI_COMMIT_BRANCH VERSION: 0.0.1+$CI_COMMIT_BRANCH DEPLOY_ENV: "dev" + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' variables: IMAGE_TAG: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME VERSION: 0.0.1+$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME DEPLOY_ENV: "dev" - - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/' variables: IMAGE_TAG: $CI_COMMIT_TAG VERSION: 0.0.2+$CI_COMMIT_TAG # override DEPLOY_ENV DEPLOY_ENV: "test" + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' variables: IMAGE_TAG: $CI_COMMIT_TAG VERSION: $CI_COMMIT_TAG # override DEPLOY_ENV DEPLOY_ENV: "test" + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' variables: IMAGE_TAG: $CI_COMMIT_TAG VERSION: $CI_COMMIT_TAG # override DEPLOY_ENV DEPLOY_ENV: "prod" + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* diff --git a/ci/cleanup.template.yml b/ci/cleanup.template.yml index 517f1893b8b6b7520a3919a040ac47dc605db499..b71aef79548ac867b287c703a1cde423da934b68 100644 --- a/ci/cleanup.template.yml +++ b/ci/cleanup.template.yml @@ -1,14 +1,34 @@ # Cleanup Images Template .cleanup: script: - - NAME="${REGISTRY_URL}/${PROJECT_NAME}/${SERVICE_NAME}" + - NAME="${REGISTRY_URL}/workspaces/${SERVICE_NAME}" - | printf "%s\n" "- Removing Images -" \ - "${NAME}:${CI_COMMIT_SHORT_SHA}" - - docker image rm --force "${NAME}:${CI_COMMIT_SHORT_SHA}" "cache:${CI_COMMIT_SHORT_SHA}" + "${NAME}:${IMAGE_TAG}" + - docker image rm --force "${REGISTRY_URL}/workspaces/${SERVICE_NAME}:${IMAGE_TAG}" rules: - - if: '$CI_PIPELINE_SOURCE == "merge_request_event" && $CI_COMMIT_MESSAGE =~ /\A(?i)-debug/' - when: never - - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' - - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' - - if: $CI_COMMIT_TAG + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' + variables: + IMAGE_TAG: $CI_COMMIT_BRANCH + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + variables: + IMAGE_TAG: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* + - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/' + variables: + IMAGE_TAG: $CI_COMMIT_TAG + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* + - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/' + variables: + IMAGE_TAG: $CI_COMMIT_TAG + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* + - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/' + variables: + IMAGE_TAG: $CI_COMMIT_TAG + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* diff --git a/ci/package-build.template.yml b/ci/package-build.template.yml new file mode 100644 index 0000000000000000000000000000000000000000..42f7091023ccd5389cd169a9087e095ae921452a --- /dev/null +++ b/ci/package-build.template.yml @@ -0,0 +1,35 @@ +# CI Build Template +.build-package: + image: python:3.10 + script: + # Enter the package directory + - echo building package in $PACKAGE_PATH + - export CAPO_PATH=$PWD + - export CAPO_PROFILE=docker + - WD=$PWD + - cd ${PACKAGE_PATH} + + # Make symbolic link of python3 install to where it's installed on dev + - mkdir -p /home/ssa/bin + - ln -s "$(which python3)" /home/ssa/bin/python3.10 + - export PATH=$PATH:/home/ssa/bin + + # Install build, poetry and pytest + - pip install poetry + - poetry env use /home/ssa/bin/python3.10 + + # Install the package for testing + - poetry install --with test + - $(poetry env info -p)/bin/pytest . + + # Build the package and push to the gitlab repo + - poetry build + - poetry config repositories.gitlab "https://gitlab.nrao.edu/api/v4/projects/$CI_PROJECT_ID/packages/pypi" + - poetry config http-basic.gitlab gitlab-ci-token "$CI_JOB_TOKEN" + - poetry publish --repository gitlab + + # Return to the parent directory + - cd $WD + rules: + - changes: + - ${PACKAGE_PATH}/**/* diff --git a/ci/push-package.template.yml b/ci/push-package.template.yml new file mode 100644 index 0000000000000000000000000000000000000000..ea92b88cdcab52ec5180636b1c56dee73f4006b0 --- /dev/null +++ b/ci/push-package.template.yml @@ -0,0 +1,44 @@ +# CI Build Template +.push-packages: + image: python:3.10-slim + before_script: + - mkdir -p ~/.ssh + - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' + - eval $(ssh-agent -s) + - chmod 700 ~/.ssh + - echo "$SSH_PRIVATE_KEY" | ssh-add - > ~/.ssh/id_rsa + - '[[ -f /.dockerenv ]] && echo -e "Host *\\n\\tStrictHostKeyChecking no\\n\\n" > ~/.ssh/config' + script: + - mkdir -p /home/ssa/bin + - ln -s "$(which python3)" /home/ssa/bin/python3.10 + - export PATH=$PATH:/home/ssa/bin + - pip install pex + - pex ${PIP_NAME} -c ${PACKAGE_NAME} -o ./${PACKAGE_NAME} -i https://gitlab.nrao.edu/api/v4/projects/621/packages/pypi/simple --python-shebang /home/ssa/bin/python3.10 --disable-cache + - echo "Releasing PEX to sbin area - ${PACKAGE_NAME}" + - scp ${PACKAGE_NAME} root@shipman.aoc.nrao.edu:/lustre/aoc/cluster/pipeline/dsoc-${DEPLOY_ENV}/workspaces/sbin/ + rules: + - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' + variables: + DEPLOY_ENV: "dev" + changes: + - apps/cli/executables/pexable/${PACKAGE_NAME}/**/* + - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + variables: + DEPLOY_ENV: "dev" + changes: + - apps/cli/executables/pexable/${PACKAGE_NAME}/**/* + - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/' + variables: + DEPLOY_ENV: "test" + changes: + - apps/cli/executables/pexable/${PACKAGE_NAME}/**/* + - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/' + variables: + DEPLOY_ENV: "test" + changes: + - apps/cli/executables/pexable/${PACKAGE_NAME}/**/* + - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/' + variables: + DEPLOY_ENV: "prod" + changes: + - apps/cli/executables/pexable/${PACKAGE_NAME}/**/* diff --git a/ci/push.template.yml b/ci/push.template.yml index e43e610fabc4fe4ef2cdd6768b3e7d61513dbbff..c57df7c9dadebf13370b1cbb663c3d6667621b47 100644 --- a/ci/push.template.yml +++ b/ci/push.template.yml @@ -2,17 +2,29 @@ .push: script: - echo "$HARBOR_PASSWORD" | docker login -u "$HARBOR_USER" --password-stdin $REGISTRY_URL - - NAME="${REGISTRY_URL}/${PROJECT_NAME}/${SERVICE_NAME}" - - docker push ${NAME}:${CI_COMMIT_SHORT_SHA} + - NAME="${REGISTRY_URL}/workspaces/${SERVICE_NAME}" - docker push ${NAME}:${IMAGE_TAG} rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' variables: IMAGE_TAG: $CI_COMMIT_BRANCH + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* + # For pipeline testing only! + # - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + # variables: + # IMAGE_TAG: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME + # changes: + # - ${PATH_PREFIX}${SERVICE_NAME}/**/* - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' variables: IMAGE_TAG: $CI_COMMIT_TAG + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' variables: IMAGE_TAG: $CI_COMMIT_TAG + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* + dependencies: [] diff --git a/ci/unit-test.template.yml b/ci/unit-test.template.yml index e67de8c0e9568a0628a7569cd772a6a5dbba8a0c..5b4b0545e5d254767b15f80a5d7d3b35f79c9aa8 100644 --- a/ci/unit-test.template.yml +++ b/ci/unit-test.template.yml @@ -1,23 +1,34 @@ .unit-test: - # Postgres DB service - services: - - name: ssa-containers.aoc.nrao.edu/ops/ci/db:workspaces - alias: db - image: ${REGISTRY_URL}/${PROJECT_NAME}/${SERVICE_NAME}:${CI_COMMIT_SHORT_SHA} + image: ${REGISTRY_URL}/workspaces/${SERVICE_NAME}:${IMAGE_TAG} script: - - | - ([ $(whoami) = "root" ] && su vlapipe -c "cd /code && ./bin/run-tests.sh -b") || (cd /code && ./bin/run-tests.sh -b) - - mv /code/.coverage ${CI_PROJECT_DIR}/.coverage.${SERVICE_NAME}.${CI_COMMIT_SHORT_SHA} + - ls -la + - pip3 install --upgrade pip + - pip3 install -r test-requirements.txt + - cd ${PATH_PREFIX}${SERVICE_NAME} + - python3 -m pytest ./test --cov=${SERVICE_NAME} --cov-report=html artifacts: paths: - .coverage.${SERVICE_NAME}.${CI_COMMIT_SHORT_SHA} rules: - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_BRANCH =~ /(^[0-9]\.[0-9]|^[0-9]\.[0-9]\.[0-9])-DEVELOPMENT/' + variables: + IMAGE_TAG: $CI_COMMIT_BRANCH + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' + variables: + IMAGE_TAG: $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* - if: '$CI_COMMIT_TAG =~ /^end-of-sprint-[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+-rc[0-9]+/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0.9]+-rc[0-9]+/' variables: IMAGE_TAG: $CI_COMMIT_TAG + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* - if: '$CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+$/ || $CI_COMMIT_TAG =~ /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/' variables: IMAGE_TAG: $CI_COMMIT_TAG + changes: + - ${PATH_PREFIX}${SERVICE_NAME}/**/* + dependencies: [] diff --git a/config/htcondor/submit/99-workspaces-submit.dev.conf b/config/htcondor/submit/99-workspaces-submit.dev.conf index 6f87fe2a5259dd19c7c764f320194e38c169ff4c..6a65d0e4e2d022d99d5cc70f9aaebb97944b4040 100644 --- a/config/htcondor/submit/99-workspaces-submit.dev.conf +++ b/config/htcondor/submit/99-workspaces-submit.dev.conf @@ -29,3 +29,9 @@ FILESYSTEM_DOMAIN = aoc.nrao.edu #krowe Feb 15 2023: VLASS submits more than 200 DAGs MAX_RUNNING_SCHEDULER_JOBS_PER_OWNER = 1400 + + # Submit host settings for the RADIAL cluster + CONDOR_GAHP = $(SBIN)/condor_c-gahp + C_GAHP_LOG = /tmp/CGAHPLog.$(USERNAME) + C_GAHP_WORKER_THREAD_LOG = /tmp/CGAHPWorkerLog.$(USERNAME) + C_GAHP_WORKER_THREAD_LOCK = /tmp/CGAHPWorkerLock.$(USERNAME) diff --git a/config/htcondor/submit/99-workspaces-submit.conf b/config/htcondor/submit/99-workspaces-submit.local.conf similarity index 100% rename from config/htcondor/submit/99-workspaces-submit.conf rename to config/htcondor/submit/99-workspaces-submit.local.conf diff --git a/config/htcondor/submit/99-workspaces-submit.prod.conf b/config/htcondor/submit/99-workspaces-submit.prod.conf index b6054574679a323ef657950a5580a2350cefdc3b..a2969fedd3888e07028a4a77c38aa99db00ba86a 100644 --- a/config/htcondor/submit/99-workspaces-submit.prod.conf +++ b/config/htcondor/submit/99-workspaces-submit.prod.conf @@ -29,3 +29,9 @@ FILESYSTEM_DOMAIN = aoc.nrao.edu #krowe Feb 15 2023: VLASS submits more than 200 DAGs MAX_RUNNING_SCHEDULER_JOBS_PER_OWNER = 1400 + + # Submit host settings for the RADIAL cluster + CONDOR_GAHP = $(SBIN)/condor_c-gahp + C_GAHP_LOG = /tmp/CGAHPLog.$(USERNAME) + C_GAHP_WORKER_THREAD_LOG = /tmp/CGAHPWorkerLog.$(USERNAME) + C_GAHP_WORKER_THREAD_LOCK = /tmp/CGAHPWorkerLock.$(USERNAME) diff --git a/config/htcondor/submit/99-workspaces-submit.test.conf b/config/htcondor/submit/99-workspaces-submit.test.conf index a6415512939b7ca2d8cf6bc8d146acdf87146630..5e2b754aea70d240a156423dbc03b133f7790836 100644 --- a/config/htcondor/submit/99-workspaces-submit.test.conf +++ b/config/htcondor/submit/99-workspaces-submit.test.conf @@ -29,3 +29,9 @@ FILESYSTEM_DOMAIN = aoc.nrao.edu #krowe Feb 15 2023: VLASS submits more than 200 DAGs MAX_RUNNING_SCHEDULER_JOBS_PER_OWNER = 1400 + + # Submit host settings for the RADIAL cluster + CONDOR_GAHP = $(SBIN)/condor_c-gahp + C_GAHP_LOG = /tmp/CGAHPLog.$(USERNAME) + C_GAHP_WORKER_THREAD_LOG = /tmp/CGAHPWorkerLog.$(USERNAME) + C_GAHP_WORKER_THREAD_LOCK = /tmp/CGAHPWorkerLock.$(USERNAME) diff --git a/config/htcondor/submit/condor_ssh_config b/config/htcondor/submit/condor_ssh_config new file mode 100644 index 0000000000000000000000000000000000000000..60cfdb13d075f3e91dc02133b6382d6a4411d8bc --- /dev/null +++ b/config/htcondor/submit/condor_ssh_config @@ -0,0 +1,5 @@ +# This allows for the -J option to tunnel through the schedd (radialhead) +IdentityFile condor_transfer +# This prevents ssh from prompting to accept a host figerprint +StrictHostKeyChecking no +EOM diff --git a/config/pex-watcher/bin/local-build-pexables.sh b/config/pex-watcher/bin/local-build-pexables.sh index ee3199631d198318077976e28d0af7ec16e313c8..af99932334c6c4e01e6da512034bf2aeb8e43f22 100755 --- a/config/pex-watcher/bin/local-build-pexables.sh +++ b/config/pex-watcher/bin/local-build-pexables.sh @@ -34,15 +34,15 @@ do # continue # fi cd "$pexable" - if [ -e setup.py ]; then - pex_build_cmd="python3.10 setup.py bdist_pex --bdist-all --bdist-dir=\"$BUILD_DIR\" --pex-args=\"--python-shebang /home/ssa/bin/python3.10\"" + if [ -e pyproject.toml ]; then + pex_build_cmd="pex . -c $pexable -o $BUILD_DIR/$pexable --python-shebang /home/ssa/bin/python3.10" build_attempts=0 until eval "$pex_build_cmd" || [ $build_attempts -gt 3 ] ; do ((build_attempts++)) echo "PEX build failed. Attempt: $build_attempts. Retrying."; sleep 2; done else - echo "PEX build impossible in $PWD because there is no setup.py file" + echo "PEX build impossible in $PWD because there is no pyproject.toml file" fi cd .. done diff --git a/development.md b/development.md index 9623e5cd22b222f1e3b2b8b5ac89972b12e42399..1a777d8dae81e0a1912aaf1e071d266b43f5c1ae 100644 --- a/development.md +++ b/development.md @@ -6,28 +6,26 @@ Workspaces' services run on Docker containers. These containers can be all start ### Setup Build the base image: ```sh -make docker-base -``` -In the Makefile, this Docker command is run: -```sh -docker build -t ssa-containers.aoc.nrao.edu/ops/base:workspaces -f Dockerfile.base . +docker build -t brooks.aoc.nrao.edu:5000/ssa-docker/workspaces/base:local -f Dockerfile.base . ``` -This builds a local Docker image tagged as `ssa-containers.aoc.nrao.edu/ops/base:workspaces` on your machine -using the `Dockerfile.base` Dockerfile. +This builds a local Docker image tagged as `brooks.aoc.nrao.edu:5000/ssa-docker/workspaces/base:local` on your machine +using the `Dockerfile.base` Dockerfile. Once the image has been built, Docker will save this image on your machine. -Once the image has been built, Docker will save this image on your machine. You do not need to run the `make docker-base` -command again unless you delete this image or modify the `Dockerfile.base` Dockerfile. +Next, you will need to run a similar command for the cache image: +```sh +docker build --no-cache -t brooks.aoc.nrao.edu:5000/ssa-docker/workspaces/cache:local -f Dockerfile.cache . --build-arg BASE_IMAGE_TAG=local --build-arg BASE_REGISTRY_URL="brooks.aoc.nrao.edu:5000/ssa-docker/workspaces" +``` ### Starting Workspaces -To start Workspaces as foreground process, run: +To start a dev version of Workspaces as foreground process, run: ```sh -docker compose -f docker-compose.local.yml up +docker compose -f docker-compose.yml -f docker-compose.local.yml up ``` -To start Workspaces as background process, run: +To start a porduction version of Workspaces as background process, run: ```sh -docker compose -f docker-compose.local.yml up -d +docker compose -f docker-compose.yml up -d ``` ### Stopping Workspaces diff --git a/docker-compose.local.yml b/docker-compose.local.yml index fdc34ec608b79651f230937b0fb3fc9831990df9..a9b70b590e52515d1e6b4494b45eb31810a606c2 100644 --- a/docker-compose.local.yml +++ b/docker-compose.local.yml @@ -6,14 +6,18 @@ services: ports: - "4444:80" depends_on: - - frontend + frontend: + condition: service_started command: nginx -g "daemon off;" volumes: - ./apps/web/ws-nginx.local.conf:/etc/nginx/conf.d/default.conf - ./lustre/:/lustre/aoc/cluster/pipeline/docker/workspaces - ./delivery_root:/tmp/delivery_root db: - image: ssa-containers.aoc.nrao.edu/ops/ci/db:workspaces + image: ssa-containers.aoc.nrao.edu/db + build: + context: . + dockerfile: ./ci/psql/Dockerfile.db restart: always ports: - "54322:5432" @@ -23,7 +27,7 @@ services: command: postgres -c listen_addresses=* healthcheck: test: pg_isready -U archive -d archive - start_period: 2s + start_period: 5s interval: 2s timeout: 2s retries: 5 @@ -33,11 +37,12 @@ services: amqp: image: rabbitmq:3.8-management restart: always + user: rabbitmq ports: - "15672:15672" healthcheck: test: rabbitmq-diagnostics -q ping - start_period: 2s + start_period: 5s interval: 2s timeout: 2s retries: 5 @@ -81,24 +86,24 @@ services: schema: build: - context: ./shared/workspaces/alembic/ - dockerfile: Dockerfile.local + context: . + dockerfile: ./shared/workspaces/alembic/Dockerfile.local depends_on: db: condition: service_healthy volumes: - - ./shared/workspaces/alembic:/code/shared/workspaces/alembic + - ./shared:/code/shared - ./docker.properties:/home/ssa/capo/docker.properties # Used for doing a DB migration on dsoc-dev # Run the command `docker compose -f docker-compose.local.yml --profile schema-dev up schema-dev` and the migration will run schema-dev: build: - context: ./shared/workspaces/alembic/ - dockerfile: Dockerfile.local + context: . + dockerfile: ./shared/workspaces/alembic/Dockerfile.local command: ["./bin/run-migrations.sh", "dsoc-dev"] volumes: - - ./shared/workspaces/alembic:/code/shared/workspaces/alembic + - ./shared:/code/shared - ~/.capo:/home/ssa/capo profiles: - schema-dev @@ -107,11 +112,11 @@ services: # Run the command `docker compose -f docker-compose.local.yml --profile schema-test up schema-test` and the migration will run schema-test: build: - context: ./shared/workspaces/alembic/ - dockerfile: Dockerfile.local + context: . + dockerfile: ./shared/workspaces/alembic/Dockerfile.local command: ["./bin/run-migrations.sh", "dsoc-test"] volumes: - - ./shared/workspaces/alembic:/code/shared/workspaces/alembic + - ./shared:/code/shared - ~/.capo:/home/ssa/capo profiles: - schema-test @@ -120,11 +125,11 @@ services: # Run the command `docker compose -f docker-compose.local.yml --profile schema-prod up schema-prod` and the migration will run schema-prod: build: - context: ./shared/workspaces/alembic/ - dockerfile: Dockerfile.local + context: . + dockerfile: ./shared/workspaces/alembic/Dockerfile.local command: ["./bin/run-migrations.sh", "dsoc-prod"] volumes: - - ./shared/workspaces/alembic:/code/shared/workspaces/alembic + - ./shared:/code/shared - ~/.capo:/home/ssa/capo profiles: - schema-prod @@ -132,137 +137,120 @@ services: workflow: build: context: . - dockerfile: ./services/workflow/Dockerfile.local + dockerfile: ./services/workflow/Dockerfile + target: dev args: - - WS_VERSION=0.0.0+local + - WS_VERSION=${WS_VERSION} + - LOCAL_OR_SERVER_PEX=${LOCAL_OR_SERVER_PEX} + - DEPLOY_ENV=${DEPLOY_ENV} ports: - "3456:3456" - 9618 depends_on: - - schema - - amqp + schema: + condition: service_completed_successfully + amqp: + condition: service_healthy + extra_hosts: + # Allow the workflow container to reach the RADIAL cluster for jobs that require it + - "radialhead.nrao.radial.local:10.64.1.77" healthcheck: test: curl -f -LI localhost:3456/healthcheck interval: 5s retries: 5 - start_period: 2s + start_period: 5s timeout: 5s volumes: - - ./services/workflow:/code - - /code/ssa_workflow.egg-info - - ./shared:/packages/shared - - ./apps/cli:/packages/apps/cli - - ./testing:/packages/testing + - ./services/workflow:/code/services/workflow + - ./shared:/code/shared + - ./apps/cli:/code/apps/cli + - ./testing:/code/testing - ./lustre/aoc/cluster/pipeline/docker/workspaces:/lustre/aoc/cluster/pipeline/docker/workspaces - ./lustre/aoc/cluster/pipeline/vlass_docker:/lustre/aoc/cluster/pipeline/vlass_docker - ./delivery_root:/tmp/delivery_root - ~/.capo:/home/ssa/capo - ~/.ssh:/home/vlapipe/.ssh - ./docker.properties:/home/ssa/capo/docker.properties - - /packages/shared/workspaces/ssa_workspaces.egg-info - - /packages/shared/schema/ssa_schema.egg-info - - /packages/shared/messaging/ssa_messaging.egg-info - - /packages/apps/cli/utilities/wf_monitor/ssa_wf_monitor.egg-info - - /packages/apps/cli/utilities/aat_wrest/ssa_aat_wrest.egg-info - - /packages/apps/cli/utilities/contacts_wrest/ssa_contacts_wrest.egg-info - - /packages/apps/cli/executables/pexable/mediator/ssa_system_mediator.egg-info - - /packages/apps/cli/executables/pexable/productfetcher/ssa_productfetcher.egg-info - - /packages/apps/cli/executables/pexable/casa_envoy/ssa_casa_envoy.egg-info - - /packages/apps/cli/executables/pexable/vela/ssa_vela.egg-info - - /packages/apps/cli/executables/pexable/deliver/ssa_delivery.egg-info - - /packages/apps/cli/executables/pexable/null/ssa_null.egg-info - - /packages/apps/cli/executables/pexable/ws_metrics/ssa_ws_metrics.egg-info - condor:/var/spool/condor capability: build: context: . - dockerfile: ./services/capability/Dockerfile.local + dockerfile: ./services/capability/Dockerfile + target: dev args: - - WS_VERSION=0.0.0+local + - WS_VERSION=${WS_VERSION} + - ENV_HOST=${ENV_HOST} ports: - "3457:3457" depends_on: schema: - condition: service_started + condition: service_completed_successfully workflow: condition: service_healthy notification: condition: service_healthy amqp: - condition: service_started + condition: service_healthy + healthcheck: + test: curl -f -LI localhost:3457/healthcheck + interval: 5s + retries: 5 + start_period: 5s + timeout: 5s volumes: - ./docker.properties:/home/ssa/capo/docker.properties - - ./services/capability:/code - - ./shared:/packages/shared - - ./apps/cli:/packages/apps/cli - - ./testing:/packages/testing - - /code/ssa_capability.egg-info - - /packages/shared/workspaces/ssa_workspaces.egg-info - - /packages/shared/schema/ssa_schema.egg-info - - /packages/shared/messaging/ssa_messaging.egg-info - - /packages/apps/cli/utilities/wf_monitor/ssa_wf_monitor.egg-info - - /packages/apps/cli/utilities/aat_wrest/ssa_aat_wrest.egg-info - - /packages/apps/cli/utilities/contacts_wrest/ssa_contacts_wrest.egg-info - - /packages/apps/cli/executables/pexable/vela/ssa_vela.egg-info - - /packages/apps/cli/executables/pexable/mediator/ssa_system_mediator.egg-info - - /packages/apps/cli/executables/pexable/productfetcher/ssa_productfetcher.egg-info - - /packages/apps/cli/executables/pexable/casa_envoy/ssa_casa_envoy.egg-info - - /packages/apps/cli/executables/pexable/deliver/ssa_delivery.egg-info - - /packages/apps/cli/executables/pexable/null/ssa_null.egg-info - - /packages/apps/cli/executables/pexable/ws_metrics/ssa_ws_metrics.egg-info + - ./services/capability:/code/services/capability + - ./shared:/code/shared + - ./apps/cli:/code/apps/cli + - ./testing:/code/testing notification: build: context: . - dockerfile: ./services/notification/Dockerfile.local + dockerfile: ./services/notification/Dockerfile + target: dev args: - - WS_VERSION=0.0.0+local + - WS_VERSION=${WS_VERSION} + - DEPLOY_ENV=${DEPLOY_ENV} + - ENV_HOST=${ENV_HOST} ports: - "3458:3458" depends_on: - - schema - - amqp + schema: + condition: service_completed_successfully + amqp: + condition: service_healthy healthcheck: test: curl -f -LI http://localhost:3458/healthcheck interval: 5s retries: 5 - start_period: 2s + start_period: 5s timeout: 5s volumes: - ./docker.properties:/home/ssa/capo/docker.properties - - ./services/notification:/code - - /code/ssa_notification.egg-info - - ./shared:/packages/shared - - ./apps/cli:/packages/apps/cli - - ./testing:/packages/testing - - /packages/shared/workspaces/ssa_workspaces.egg-info - - /packages/shared/schema/ssa_schema.egg-info - - /packages/shared/messaging/ssa_messaging.egg-info - - /packages/apps/cli/utilities/wf_monitor/ssa_wf_monitor.egg-info - - /packages/apps/cli/utilities/aat_wrest/ssa_aat_wrest.egg-info - - /packages/apps/cli/utilities/contacts_wrest/ssa_contacts_wrest.egg-info - - /packages/apps/cli/executables/pexable/vela/ssa_vela.egg-info - - /packages/apps/cli/executables/pexable/mediator/ssa_system_mediator.egg-info - - /packages/apps/cli/executables/pexable/productfetcher/ssa_productfetcher.egg-info - - /packages/apps/cli/executables/pexable/casa_envoy/ssa_casa_envoy.egg-info - - /packages/apps/cli/executables/pexable/deliver/ssa_delivery.egg-info - - /packages/apps/cli/executables/pexable/null/ssa_null.egg-info - - /packages/apps/cli/executables/pexable/ws_metrics/ssa_ws_metrics.egg-info + - ./services/notification:/code/services/notification + - ./shared:/code/shared + - ./apps/cli:/code/apps/cli + - ./testing:/code/testing + frontend: build: context: . - dockerfile: ./apps/web/Dockerfile.local - environment: - NG_APP_WS_VERSION: "local" + dockerfile: ./apps/web/Dockerfile + target: dev + args: + - WS_VERSION=${WS_VERSION} init: true ports: - "4200:4200" depends_on: - - capability - - workflow + capability: + condition: service_healthy + workflow: + condition: service_healthy volumes: - ./apps/web:/code - /code/node_modules diff --git a/docker-compose.yml b/docker-compose.yml index 555904bac903ebbe11c673d614a095f48492e691..4763ed834ce61db4310e04084fb8321784e32d06 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,9 +5,20 @@ services: image: ssa-containers.aoc.nrao.edu/workspaces/workflow:${TAG} networks: - host + build: + context: . + dockerfile: ./services/workflow/Dockerfile + target: prod + args: + - WS_VERSION=${WS_VERSION} + - LOCAL_OR_SERVER_PEX="server-pex" + - DEPLOY_ENV=${ENV} + - API_TOKEN=${API_TOKEN} environment: CAPO_PATH: /home/casa/capo CAPO_PROFILE: dsoc-${ENV} + DL_HOST: ${DL_HOST} + ENV_HOST: ${ENV_HOST} deploy: placement: constraints: @@ -36,6 +47,13 @@ services: capability: image: ssa-containers.aoc.nrao.edu/workspaces/capability:${TAG} + build: + context: . + dockerfile: ./services/capability/Dockerfile + target: prod + args: + - WS_VERSION=${WS_VERSION} + - DEPLOY_ENV=${ENV} ports: - target: 3457 published: 3457 @@ -44,6 +62,7 @@ services: environment: CAPO_PATH: /home/casa/capo CAPO_PROFILE: dsoc-${ENV} + DL_HOST: ${DL_HOST} ENV_HOST: ${ENV_HOST} volumes: - /home/casa/capo:/home/casa/capo @@ -68,9 +87,18 @@ services: image: ssa-containers.aoc.nrao.edu/workspaces/notification:${TAG} networks: - host + build: + context: . + dockerfile: ./services/notification/Dockerfile + target: prod + args: + - WS_VERSION=${WS_VERSION} + - DEPLOY_ENV=${ENV} environment: CAPO_PATH: /home/casa/capo CAPO_PROFILE: dsoc-${ENV} + DL_HOST: ${DL_HOST} + ENV_HOST: ${ENV_HOST} volumes: - /home/casa/capo:/home/casa/capo deploy: @@ -92,6 +120,14 @@ services: web: image: ssa-containers.aoc.nrao.edu/workspaces/web:${TAG} + build: + context: . + dockerfile: ./apps/web/Dockerfile + target: prod + args: + - WS_VERSION=${WS_VERSION} + - DEPLOY_ENV=${ENV} + - ENV_HOST=${ENV_HOST} ports: - target: 80 published: 4444 diff --git a/docker.properties b/docker.properties index 707cd55e955a81f5fb4ef1a99b38d7a9d46ba043..ce42fc956dd4123376b6a16d6cdb33658ef6b9be 100644 --- a/docker.properties +++ b/docker.properties @@ -85,9 +85,6 @@ edu.nrao.carta.reverseProxyHost = black-abyss.nrao.edu edu.nrao.carta.redisPort = 6397 edu.nrao.carta.redisPassword = password -# Sentry.io Settings -edu.nrao.workspaces.SentrySettings.sentry_key = local - # WS Annihilator Settings edu.nrao.workspaces.AnnihilatorSettings.keepSpoolForDays = 10 edu.nrao.workspaces.AnnihilatorSettings.keepStagingForDays = 10 diff --git a/docs/requirements.txt b/docs/requirements.txt index 8066453fe41c5874da8c9db306f0aebf838822a7..1d13d23e3f48f21086bcc671a90f580711ee4a71 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -36,12 +36,11 @@ prettierfier pytest requests scp -sentry_sdk simplejson sqlalchemy==1.4.46 tqdm transaction waitress zc.buildout -zope.sqlalchemy +zope.sqlalchemy==2.0 immutable_views diff --git a/docs/source/confluence/dockerized-setup.rst b/docs/source/confluence/dockerized-setup.rst index 8f9164b159c23e08ed2effb08f25186642410e3b..eea835f5f19bdb5f04d3892f79ccebd06de9e442 100644 --- a/docs/source/confluence/dockerized-setup.rst +++ b/docs/source/confluence/dockerized-setup.rst @@ -20,10 +20,11 @@ Initial Setup .. code-block:: sh make clean - make build - docker compose -f docker-compose.local.yml up + docker build -t brooks.aoc.nrao.edu:5000/ssa-docker/workspaces/base:local -f Dockerfile.base . + docker build -t brooks.aoc.nrao.edu:5000/ssa-docker/workspaces/cache:local -f Dockerfile.cache . --build-arg BASE_IMAGE_TAG=local --build-arg BASE_REGISTRY_URL="brooks.aoc.nrao.edu:5000/ssa-docker/workspaces" + docker compose -f docker-compose.yml -f docker-compose.local.yml up -e TAG=local -This will build your local images and containers +This will build your local development images and containers Note: If you notice 'no such file or directory' errors with the docker compose command, try the following: @@ -32,6 +33,55 @@ Note: If you notice 'no such file or directory' errors with the docker compose c 3. Run ``make reallyclean`` 4. Run ``make build`` again, followed by the docker compose command previously mentioned. +Running Different Docker Setups +~~~~~~~~~~~~~ + +Workspaces has multiple different environments it can run, ranging from a slimmed and cleaned production environment, to +a more development and testing friendly local environment. To build the most stripped down version of workspaces, run: + +.. code-block:: sh + docker compose up + +This command will build the default 'prod' environment using docker-compose.yml, and is used during deployment. However, +this compose file does not contain all of the necessary resources to run the system in a local developer's environment. To +do that, one would need to use the provided compose override file when building, as shown below: + +.. code-block:: sh + docker compose -f docker-compose.yml -f docker-compose.local.yml up + +This command will build the default 'local' environment by first gathering requirements from docker-compose.yml, and then overriding +certain aspects of the build with the contents of docker-compose.local.yml. This contains all necessary resources for building +and running the workspaces system in a non-production setting. + +Creating Different Docker Environments +~~~~~~~~~~~~~ + +During the process of development, developers will frequently need to modify certain assumptions the docker system makes about +the environment. At an image level, all environment variables are listed as build arguments, and can therefor be modified +when the image is being created. For example, if a developer wanted to change the version of workspaces that the cache image +uses, they would modify their build command from: + +.. code-block:: sh + docker build -t local/cache:local -f Dockerfile.cache . + +to: + +.. code-block:: sh + docker build -t local/cache:local -f Dockerfile.cache . --build-arg WS_VERSION="desired_version_here" + +However, development will more likely default to using docker compose. By default docker compose uses the top level .env file +to pull in environment variables; this file has the values necessary for a production build and should not be modified. A +build using the docker-compose.local.yml file will override some of those values in its definitions, but a developer is still +able to override the environment further by setting environment variables in the command line. For example, if a developer +wanted to change the version of workspaces that the entire system builds with, they would run: + +.. code-block:: sh + docker compose -f docker-compose.local.yml -e WS_VERSION="desired_version_here" up + +When multiple values exist for a single environment variable, docker compose will give the highest weight to values passed +in through the command line, then variables declared within the compose file itself, and will finally give the lowest weight +to environment variables declared in the default.env file. + Set up Pre-Commit ~~~~~~~~~~~~~~~~~ diff --git a/docs/source/deployment/production_deployment.md b/docs/source/deployment/production_deployment.md index de614d1edcd41818b82697b95cb9296726a5b19c..a040d56382a6cb880f051a164e54ae2e85f14aa9 100644 --- a/docs/source/deployment/production_deployment.md +++ b/docs/source/deployment/production_deployment.md @@ -15,7 +15,7 @@ * Checkout the main branch. * Run any needed schema migrations on the production database: <span style="color:cornflowerblue"> - docker compose -f docker-compose.local.yml --profile schema-prod up schema-prod + docker compose -f docker-compose.yml -f docker-compose.local.yml --profile schema-prod up schema-prod </span> * Tag the main branch for production deployment: <span style="color:cornflowerblue"> diff --git a/docs/source/deployment/test_deployment.md b/docs/source/deployment/test_deployment.md index 826e354e9827edac785c7a2bf0f7e683c04bd422..3c03ca2a06cad703cb667234de1637818ee54b86 100644 --- a/docs/source/deployment/test_deployment.md +++ b/docs/source/deployment/test_deployment.md @@ -18,7 +18,7 @@ Deployment. * Run any needed schema migrations against the test database: <span style="color:cornflowerblue"> -docker compose -f docker-compose.local.yml --profile schema-test up schema-test +docker compose -f docker-compose.yml -f docker-compose.local.yml --profile schema-test up schema-test </span> * Update any needed Capo properties * Tag main branch as: diff --git a/docs/swagger-schema.yaml b/docs/swagger-schema.yaml index 7fe1677674115358b33d3255a57507aaa6f5ca3c..c35a228b9143a86e735d836329b16db51c20a56a 100644 --- a/docs/swagger-schema.yaml +++ b/docs/swagger-schema.yaml @@ -531,7 +531,7 @@ paths: description: "successful operation" "404": description: "Capability request not found" - /capability/request/{id}/version/{version_id}/srdp_compatible: + /capability/request/{id}/version/srdp_compatible: parameters: - $ref: "#/parameters/capability-request-id" - $ref: "#/parameters/capability-version-id" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 5d272979a948cac136c2d7c158e7340d25555e10..0000000000000000000000000000000000000000 --- a/requirements.txt +++ /dev/null @@ -1,14 +0,0 @@ --e ../packages/shared/schema --e ../packages/shared/messaging --e ../packages/shared/workspaces --e ../packages/apps/cli/utilities/wf_monitor --e ../packages/apps/cli/utilities/aat_wrest --e ../packages/apps/cli/utilities/contacts_wrest --e ../packages/apps/cli/executables/pexable/mediator --e ../packages/apps/cli/executables/pexable/productfetcher --e ../packages/apps/cli/executables/pexable/deliver --e ../packages/apps/cli/executables/pexable/null --e ../packages/apps/cli/executables/pexable/casa_envoy --e ../packages/apps/cli/executables/pexable/conveyor --e ../packages/apps/cli/executables/pexable/ws_metrics - diff --git a/services/capability/Dockerfile b/services/capability/Dockerfile index 815752075cbf440145efb5fd99fae596af42b864..01e066d30074b1a46762633c9b8b0e06fd799025 100644 --- a/services/capability/Dockerfile +++ b/services/capability/Dockerfile @@ -1,39 +1,65 @@ # This is nrao:capability -ARG TAGNAME="tmp" -FROM cache:${TAGNAME} +FROM python:3.10-slim-buster as base +ARG WS_VERSION=unknown-version -# Install curl for healthcheck -USER root -RUN apt update -y && apt install -y curl nano +ARG ENV_HOST +ENV ENV_HOST=${ENV_HOST} -# Build arg that sets environment; sets to "dev" if no build arg is given -ARG env=dev -ENV ENV=${env} -# Build arg that sets Workspace version; sets to "unknown-version" if no build arg is given -ARG VERSION=unknown-version -ENV WS_VERSION=${VERSION} +# Environment Variables +ENV CAPO_PROFILE docker +ENV CAPO_PATH /home/ssa/capo -# Change working directory to /code -WORKDIR /code +# Get postgres/mysql development stuff in the image +RUN apt update \ + && apt install -y --no-install-recommends \ + gcc \ + libmariadb-dev-compat \ + libpq-dev \ + curl \ + && rm -rf /var/lib/apt/lists + +# Create vlapipe group and create vlapipe user placed in vlapipe group +RUN addgroup --gid 6000 vlapipe && \ + useradd --create-home --comment "" --gid 6000 --uid 6000 vlapipe -# set ownership of /code directory to vlapipe:vlapipe +# Create almapipe group and create almapipe user placed in almapipe group +RUN addgroup --gid 9233 almapipe && \ + useradd --create-home --comment "" --gid 9233 --uid 9233 almapipe + +# needed for unit tests +USER vlapipe +WORKDIR /home/ssa/capo +COPY --chown=vlapipe:vlapipe docker.properties docker.properties + +USER root +WORKDIR /code +RUN apt update -y && apt install -y curl nano RUN chown vlapipe . && chgrp vlapipe . -# Switch to vlapipe +# package installation USER vlapipe +RUN curl -sSL https://install.python-poetry.org | python3 - + +ENV PATH "${PATH}:/home/vlapipe/.local/bin" +COPY --chown=vlapipe:vlapipe ./shared ./shared +COPY --chown=vlapipe:vlapipe ./apps/cli ./apps/cli +COPY --chown=vlapipe:vlapipe ./services/capability/requirements.txt ./requirements.txt +COPY --chown=vlapipe:vlapipe ./test-requirements.txt ./test-requirements.txt +RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} pip install --user -r requirements.txt +RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} pip install --user -r test-requirements.txt # Copy service directory to /code in the image # set ownership of content to vlapipe and the vlapipe group -COPY --chown=vlapipe:vlapipe ./services/capability ./ +COPY --chown=vlapipe:vlapipe ./services/capability ./services/capability +WORKDIR /code/services/capability +RUN poetry install -ENV PYTHONPATH "${PYTHONPATH}:/home/vlapipe/.local" -ENV PATH "${PATH}:/home/vlapipe/.local/bin" -RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} python setup.py develop --user +FROM base as prod +# Don't start until notification and workflow are ready +CMD sh ./bin/start-capability-with-healthchecks.sh -# Set Capo for build stage -# Gets reset to proper environment's profile in the deploy stage -ENV CAPO_PROFILE docker -# Don't start until notification and workflow are ready -CMD sh /code/bin/start-capability-with-healthchecks.sh +FROM base as dev + +CMD ["poetry", "run", "pserve", "--reload", "dev.ini"] diff --git a/services/capability/Dockerfile.local b/services/capability/Dockerfile.local deleted file mode 100644 index 640bd9eb93e2d94389bdad3a6d03fc562f18aa8b..0000000000000000000000000000000000000000 --- a/services/capability/Dockerfile.local +++ /dev/null @@ -1,21 +0,0 @@ -# This is nrao:capability -FROM cache:tmp - -# Build arg that sets Workspace version; sets to "unknown-version" if no build arg is given -ARG WS_VERSION=unknown-version -ENV WS_VERSION=${WS_VERSION} - -# Get capability code into the image -WORKDIR /code - -COPY --chown=vlapipe:vlapipe ./services/capability ./ - -# Python library installation -WORKDIR /code/ -RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} python setup.py develop --user - -# Set Capo -ARG capo_env=docker -ENV CAPO_PROFILE $capo_env - -CMD ["pserve", "--reload", "dev.ini"] diff --git a/services/capability/LICENSE b/services/capability/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/services/capability/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/services/capability/README.md b/services/capability/README.md index 6509dc1dbc00f9dea58b4d0ba170d1efd69049ea..f6fd7cc81e1271da4acbaadb75bdc86bcd784ebc 100644 --- a/services/capability/README.md +++ b/services/capability/README.md @@ -23,4 +23,5 @@ To see available capabilities: To view an existing capability request: -- http://localhost:4444/workspaces/request-status/{capability_request_id} +- http://localhost:4444/workspaces/request-status/{capability_request_id + diff --git a/services/capability/bin/config/.coveragerc b/services/capability/bin/config/.coveragerc deleted file mode 100644 index 9bcefe20482116c308d9b6031db3cf2309e102d4..0000000000000000000000000000000000000000 --- a/services/capability/bin/config/.coveragerc +++ /dev/null @@ -1,8 +0,0 @@ -[paths] -source = - ./services/capability/ - /code/ -[run] -source = - /code/ - /packages/apps/cli diff --git a/services/capability/bin/run-tests.sh b/services/capability/bin/run-tests.sh deleted file mode 100755 index 0717e34f6f2ed332f7f139e72a9081e77d4acec8..0000000000000000000000000000000000000000 --- a/services/capability/bin/run-tests.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. - -# Set failfast -set -e -set -o pipefail - -echo "Happy Testing!" - -# Set path to service unit tests -path_to_test="test" - -# Set skip behavior -skip_arg="--skip-empty" - -# Install testing requirements -init () { - pushd /packages/testing - python setup.py develop --user - popd - -# if exists, remove old .coverage file - if [[ -e .coverage ]]; then - echo "Removing old coverage file..." - rm .coverage - fi -} - -run_tests () { - # Look for lines in requirements.txt starting with "-e" - # to find paths to packages containings tests to be executed. - pkgs+=($((echo "$path_to_test"; sed -n "s|-e ..||p" requirements.txt) | grep -v testing | grep -v do-not-test | tr "\n" " ")) - - for pkg in "${pkgs[@]}" - do - cd "$pkg" || exit - if [[ $# -eq 0 ]]; then - pytest - else - pytestWithCoverage $1 - fi - cd /code/ || exit - done -} - -pytestWithCoverage () { - coverage run --parallel-mode --branch -m pytest - if [ "$1" == "b" ]; then - cd /code/ && coverage combine --rcfile="/code/bin/config/.coveragerc" --append "$pkg" && cd "$pkg" - else - cd /code/ && coverage combine --append "$pkg" && cd "$pkg" - fi -} - -while getopts "cbr:o:" OPTION -do - case $OPTION in - c) - init - run_tests "$OPTION" - coverage report "$skip_arg" --omit="**/test_*.py,**/_version.py,**/conftest.py,**/*interfaces.py" - ;; - b) - init - run_tests "$OPTION" - ;; - r) - echo "The generating coverage report as: $OPTARG" - report_output=$OPTARG - ;; - o) - echo "Naming coverage report: $OPTARG" - report_name=$OPTARG - ;; - \?) - echo "Option not recognized" - exit - ;; - esac -done - -if [[ $# -eq 0 ]] ; then - init - run_tests -fi - -if [[ -n $report_output ]]; then - if [[ -n $report_name ]]; then - coverage "$report_output" -o $report_name.$report_output "$skip_arg" - else - coverage "$report_output" "$skip_arg" - fi -fi - -echo "Tests have finished." diff --git a/services/capability/bin/start-capability-with-healthchecks.sh b/services/capability/bin/start-capability-with-healthchecks.sh index 7c697f06091b1e4db59d82e572bfd52c788045ff..b51d3cf738381983aef9ed56c5d799312e9996d8 100755 --- a/services/capability/bin/start-capability-with-healthchecks.sh +++ b/services/capability/bin/start-capability-with-healthchecks.sh @@ -16,4 +16,4 @@ # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -if ( curl -f -LI ${ENV_HOST}:3458/healthcheck ) && ( curl -f -LI ${ENV_HOST}:3456/healthcheck ); then pserve --reload dev.ini; else exit 1; fi +if ( curl -f -LI "${ENV_HOST}":3458/healthcheck ) && ( curl -f -LI "${ENV_HOST}":3456/healthcheck ); then poetry run pserve --reload dev.ini; else exit 1; fi diff --git a/services/capability/capability/__init__.py b/services/capability/capability/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..d5923d307f8cd71506648c1992c797c103eb58bb 100644 --- a/services/capability/capability/__init__.py +++ b/services/capability/capability/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Capability: the Workspaces Capability Service +""" +__version__ = "2.8.2rc1" diff --git a/services/capability/capability/_version.py b/services/capability/capability/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/services/capability/capability/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/services/capability/capability/routes.py b/services/capability/capability/routes.py index cd88d4786f8abff50f40dc50cc95f465fb778e8f..fb4d38d4e34d95232abc6b3995075cbf65208dd5 100644 --- a/services/capability/capability/routes.py +++ b/services/capability/capability/routes.py @@ -56,6 +56,7 @@ def default_routes(config: Configurator): config.add_route("home", "/") config.add_view(metrics, name="metrics") config.add_route("metrics", "metrics") + config.add_route(name="healthcheck", pattern="healthcheck") def capability_routes(config: Configurator): @@ -75,11 +76,7 @@ def capability_routes(config: Configurator): pattern="/capabilities/available_qa_staff", request_method="GET", ) - config.add_route( - name="get_analyst_email", - pattern="capabilities/analyst_email", - request_method="GET" - ) + config.add_route(name="get_analyst_email", pattern="capabilities/analyst_email", request_method="GET") # POST config.add_route( @@ -149,6 +146,13 @@ def capability_request_routes(config: Configurator): # DELETE config.add_route(name="delete_capability_request", pattern=f"{request_url}", request_method="DELETE") + # Update the workflow metadata + config.add_route( + name="change_srdp_compatibility_version_metadata", + pattern="capability/request/{capability_request_id}/srdp_compatible", + request_method="POST", + ) + def capability_version_routes(config: Configurator): """ @@ -219,13 +223,6 @@ def capability_version_routes(config: Configurator): request_method="POST", ) - # Update the workflow metadata - config.add_route( - name="change_srdp_compatibility_version_metadata", - pattern="capability/request/{capability_request_id}/version/{version_id}/srdp_compatible", - request_method="POST", - ) - def capability_execution_routes(config: Configurator): """ diff --git a/services/capability/capability/server.py b/services/capability/capability/server.py index 841edd50990a6b044f13956cccd35b53d2dd7fbc..9bf8e35a418623fa387011687010fcce20c56f8e 100644 --- a/services/capability/capability/server.py +++ b/services/capability/capability/server.py @@ -17,7 +17,6 @@ # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. import time -import sentry_sdk import sqlalchemy.orm import transaction import zope.sqlalchemy @@ -30,7 +29,6 @@ from pyramid.renderers import JSONP from pyramid.request import Request from pyramid.response import Response from pyramid_beaker import BeakerSessionFactoryConfig, session_factory_from_settings -from sentry_sdk.integrations.pyramid import PyramidIntegration from workspaces.capability.services.capability_info import CapabilityInfo from workspaces.capability.services.capability_service import ( @@ -46,6 +44,7 @@ from workspaces.workflow.services.workflow_service import WorkflowServiceRESTCli from .utility.notificationsender import TransactionalNotificationSender + # Copied from here: https://stackoverflow.com/questions/21107057/pyramid-cors-for-ajax-requests def add_cors_headers_response_callback(event: NewRequest): """ @@ -84,7 +83,9 @@ def add_cors_headers_response_callback(event: NewRequest): # --------------------------------------------------------- -def add_services(config: Configurator, session_factory: BeakerSessionFactoryConfig) -> Configurator: +def add_services( + config: Configurator, session_factory: BeakerSessionFactoryConfig +) -> Configurator: """ Add capability info, capability service, and workflow service to Pyramid request configuration @@ -95,10 +96,17 @@ def add_services(config: Configurator, session_factory: BeakerSessionFactoryConf # # these objects should exist across request boundaries workflow_rest_client = WorkflowServiceRESTClient() notification_rest_client = TransactionalNotificationSender(transaction.manager) - capability_info = CapabilityInfo(get_tm_session(session_factory, transaction.manager)) - state_machine_info = StateMachineInfo(get_tm_session(session_factory, transaction.manager)) + capability_info = CapabilityInfo( + get_tm_session(session_factory, transaction.manager) + ) + state_machine_info = StateMachineInfo( + get_tm_session(session_factory, transaction.manager) + ) capability_service = CapabilityService( - capability_info, state_machine_info, workflow_rest_client, notification_rest_client + capability_info, + state_machine_info, + workflow_rest_client, + notification_rest_client, ) archive_service = ArchiveService() @@ -128,13 +136,19 @@ def add_services(config: Configurator, session_factory: BeakerSessionFactoryConf ) # make capability launcher available for use in Pyramid - config.add_request_method(create_capability_launcher, "capability_launcher", reify=True) + config.add_request_method( + create_capability_launcher, "capability_launcher", reify=True + ) # make capability queue starter available for use in Pyramid - config.add_request_method(create_queue_restarter, "capability_queue_restarter", reify=True) + config.add_request_method( + create_queue_restarter, "capability_queue_restarter", reify=True + ) # make capability canceller available for use in Pyramid - config.add_request_method(create_capability_canceller, "capability_canceller", reify=True) + config.add_request_method( + create_capability_canceller, "capability_canceller", reify=True + ) # make workflow_info available for use in Pyramid config.add_request_method( @@ -144,15 +158,21 @@ def add_services(config: Configurator, session_factory: BeakerSessionFactoryConf reify=True, ) - config.add_request_method(lambda request: notification_rest_client, "notification_service", reify=True) + config.add_request_method( + lambda request: notification_rest_client, "notification_service", reify=True + ) # make archive_service available for use in Pyramid - config.add_request_method(lambda request: archive_service, "archive_service", reify=True) + config.add_request_method( + lambda request: archive_service, "archive_service", reify=True + ) return config def lookup_request(request): - return request.capability_info.lookup_capability_request(request.matchdict["request_id"]) + return request.capability_info.lookup_capability_request( + request.matchdict["request_id"] + ) # --------------------------------------------------------- @@ -163,7 +183,8 @@ def lookup_request(request): def get_tm_session( - session_factory: BeakerSessionFactoryConfig, transaction_manager: transaction.TransactionManager + session_factory: BeakerSessionFactoryConfig, + transaction_manager: transaction.TransactionManager, ) -> sqlalchemy.orm.Session: """ Enable Zope's transaction manager on our session @@ -183,7 +204,9 @@ def get_tm_session( # --------------------------------------------------------- # Prometheus logging -http_requests = Summary("http_request_timing", "HTTP Requests", ["status_code", "route_name"]) +http_requests = Summary( + "http_request_timing", "HTTP Requests", ["status_code", "route_name"] +) def prometheus_route_timing_factory(handler, registry): @@ -193,9 +216,9 @@ def prometheus_route_timing_factory(handler, registry): response = handler(request) end = time.time() if request.matched_route: - http_requests.labels(status_code=response.status_code, route_name=request.matched_route.name).observe( - end - start - ) + http_requests.labels( + status_code=response.status_code, route_name=request.matched_route.name + ).observe(end - start) return response return prometheus_route_timer @@ -211,7 +234,11 @@ class QueueReportCollector: self.capability_info = capability_info def collect(self): - c = CounterMetricFamily("capability_queue", "Queue status for each capability", labels=["capability", "status"]) + c = CounterMetricFamily( + "capability_queue", + "Queue status for each capability", + labels=["capability", "status"], + ) for report in self.capability_info.report(): c.add_metric([report.capability, "waiting"], report.waiting) @@ -228,18 +255,6 @@ class QueueReportCollector: def main(global_config, **settings): with Configurator(settings=settings) as config: - sentry_key = CapoConfig().settings("edu.nrao.workspaces.SentrySettings").sentry_key - - if sentry_key != "local": - sentry_sdk.init( - dsn=sentry_key, - integrations=[PyramidIntegration()], - # Set traces_sample_rate to 1.0 to capture 100% - # of transactions for performance monitoring. - # We recommend adjusting this value in production. - traces_sample_rate=1.0, - ) - # Helpers config.add_subscriber(add_cors_headers_response_callback, NewRequest) diff --git a/services/capability/capability/views/capability.py b/services/capability/capability/views/capability.py index b1c51b9e0bcbaf4d8b67e130747c627b11a82672..3e65f35618256d102565023b0fed27f21f93fce8 100644 --- a/services/capability/capability/views/capability.py +++ b/services/capability/capability/views/capability.py @@ -39,6 +39,18 @@ from pyramid.view import view_config from workspaces.capability.schema import Capability +@view_config(route_name="healthcheck", renderer="json") +def get_healthcheck(request: Request) -> Response: + """ + Route for capability container to check notification is ready + :param request: GET request + :return: + """ + return Response( + status=http.HTTPStatus.OK, json_body={"healthcheck": f"Capability service returned {http.HTTPStatus.OK}"} + ) + + @view_config(route_name="view_capability", renderer="json") def view_capability(request: Request) -> Response: """ diff --git a/services/capability/capability/views/capability_request.py b/services/capability/capability/views/capability_request.py index 0f5453b800cb3db5e4afc65127d5ad895ce9782c..dc4e7f859f1c58b3f817edb787681c6c06246936 100644 --- a/services/capability/capability/views/capability_request.py +++ b/services/capability/capability/views/capability_request.py @@ -23,12 +23,18 @@ concerning capability requests """ # pylint: disable=E0401 +import copy import json -from pycapo import CapoConfig - +import requests from capability.views.capability_version import submit_capability_version -from pyramid.httpexceptions import HTTPBadRequest, HTTPNotFound, HTTPPreconditionFailed +from pycapo import CapoConfig +from pyramid.httpexceptions import ( + HTTPBadRequest, + HTTPInternalServerError, + HTTPNotFound, + HTTPPreconditionFailed, +) from pyramid.request import Request from pyramid.response import Response from pyramid.view import view_config @@ -46,7 +52,7 @@ def view_capability_request(request: Request) -> Response: """ capability_request = request.capability_info.lookup_capability_request(request.matchdict["request_id"]) if capability_request: - return Response(json_body=capability_request.__json__()) + return Response(json_body=capability_request.__json__(hide_files=True)) else: not_found_msg = (f"Capability request with ID {request.matchdict['request_id']} not found.",) return HTTPNotFound(detail=not_found_msg) @@ -355,3 +361,54 @@ def update_system_messages(request: Request) -> Response: request.capability_info.update_system_messages(request_id, msg_id, action) return Response(body=f"Capability request #{request_id} successfully updated system messages.") + + +@view_config(route_name="change_srdp_compatibility_version_metadata", renderer="json") +def change_srdp_compatibility_version_metadata(request: Request) -> Response: + """ + Pyramid view that accepts a request to change the SRDP-Compatibility status of all versions of a capability request + URL: capability/request/{capability_request_id}/srdp_compatible + + :param request: GET request + :return: 200 OK response with SRDP-Compatibility status of request with given ID + or 404 response (HTTPNotFound) if no versions are found for given request ID + or 500 response (HTTPInternalServerError) if request to archive is_srdp endpoint fails + """ + + capability_request_id = request.matchdict["capability_request_id"] + versions = request.capability_info.lookup_versions_from_request_id(capability_request_id) + + if not versions: + no_versions_msg = f"No versions found for capability request {capability_request_id}." + return HTTPNotFound(detail=no_versions_msg) + + spl = None + for version in versions: + if not version.parameters.get("metadata"): + # version has no metadata; skip to the next + continue + + spl = version.parameters["product_locator"] + + # sqlalchemy does not detect in-place mutations of JSON + # https://docs.sqlalchemy.org/en/14/core/type_basics.html#sqlalchemy.types.JSON + # to get past this we use a deepcopy of version.parameters to create a "new" JSON obj + version.parameters = copy.deepcopy(version.parameters) + # we then update the "new" deepcopy version.parameters + version.parameters["metadata"]["is_srdp"] = request.json_body + request.capability_info.save_version(version) + + # Perform the SRDP change for the science product in the database; this + # transaction should only happen once + settings = CapoConfig().settings("edu.nrao.workspaces.ProductFetcherSettings") + archive_url = settings.locatorServiceUrlPrefix + # split the locatorServiceUrlPrefix to get url without /location? + archive_url = archive_url.split("/location?") + change_srdp_url = archive_url[0] + f"/is_srdp?locator={spl}" + + r = requests.post(change_srdp_url, json=request.json_body) + if r.status_code != requests.codes.ok: + srdp_change_failed_msg = f"SRDP-Compatibility change failed: {r.status_code}" + return HTTPInternalServerError(detail=srdp_change_failed_msg) + + return request.json_body diff --git a/services/capability/capability/views/capability_version.py b/services/capability/capability/views/capability_version.py index 8feabe9940b7182c6ab69581f070c2cb6d43fd12..46b93f85a9cb6071552193667226b65ee1fef2ed 100644 --- a/services/capability/capability/views/capability_version.py +++ b/services/capability/capability/views/capability_version.py @@ -26,12 +26,7 @@ import logging import requests from pycapo import CapoConfig -from pyramid.httpexceptions import ( - HTTPBadRequest, - HTTPInternalServerError, - HTTPNotFound, - HTTPPreconditionFailed, -) +from pyramid.httpexceptions import HTTPBadRequest, HTTPNotFound, HTTPPreconditionFailed from pyramid.request import Request from pyramid.response import Response from pyramid.view import view_config @@ -376,49 +371,3 @@ def edit_version_metadata(request: Request) -> Response: else: no_versions_msg = f"Capability request {capability_request_id} version {version_id} not found." return HTTPNotFound(detail=no_versions_msg) - - -@view_config(route_name="change_srdp_compatibility_version_metadata", renderer="json") -def change_srdp_compatibility_version_metadata(request: Request) -> Response: - """ - Pyramid view that accepts a request to change the SRDP-Compatibility status of a specific version of a capability request - URL: capability/request/{capability_request_id}/version/{version_id}/srdp_compatible - - :param request: GET request - :return: 200 OK response with SRDP-Compatibility status of specified version of request with given ID - or 404 response (HTTPNotFound) if given version is not found for given request ID - or 400 response (HTTPBadRequest) if the version is found but has no metadata - or 500 response (HTTPInternalServerError) if request to archive is_srdp endpoint fails - """ - - capability_request_id = request.matchdict["capability_request_id"] - version_id = request.matchdict["version_id"] - version = request.capability_info.lookup_version(capability_request_id, version_id) - - if version: - if not version.parameters.get("metadata"): - # version has no metadata; cannot proceed - return HTTPBadRequest(detail="latest version of request has no metadata associated with it") - - settings = CapoConfig().settings("edu.nrao.workspaces.ProductFetcherSettings") - archive_url = settings.locatorServiceUrlPrefix - # split the locatorServiceUrlPrefix to get url without /location? - archive_url = archive_url.split("/location?") - change_srdp_url = archive_url[0] + f"/is_srdp?locator={version.parameters['product_locator']}" - - # sqlalchemy does not detect in-place mutations of JSON - # https://docs.sqlalchemy.org/en/14/core/type_basics.html#sqlalchemy.types.JSON - # to get past this we use a deepcopy of version.parameters to create a "new" JSON obj - version.parameters = copy.deepcopy(version.parameters) - # we then update the "new" deepcopy version.parameters - version.parameters["metadata"]["is_srdp"] = request.json_body - - r = requests.post(change_srdp_url, json=request.json_body) - if r.status_code != requests.codes.ok: - srdp_change_failed_msg = f"SRDP-Compatibility change failed: {r.status_code}" - return HTTPInternalServerError(detail=srdp_change_failed_msg) - request.capability_info.save_version(version) - return request.json_body - else: - no_versions_msg = f"Capability request {capability_request_id} version {version_id} not found." - return HTTPNotFound(detail=no_versions_msg) diff --git a/services/capability/dev.ini b/services/capability/dev.ini index 41341770bf4eff418af6ae9d2d09c1fc0315c7ab..1d8bc5af8c3bb1eeb43452e242fd57ef3323ebf0 100644 --- a/services/capability/dev.ini +++ b/services/capability/dev.ini @@ -1,5 +1,5 @@ [app:main] -use = egg:ssa-capability +use = call:capability.server:main pyramid.includes = pyramid_debugtoolbar pyramid_tm diff --git a/services/capability/poetry.lock b/services/capability/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..0569ac4ff6a222c7607492dde558360e2dfb664a --- /dev/null +++ b/services/capability/poetry.lock @@ -0,0 +1,1427 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "aat-wrest" +version = "2.8.2rc1" +description = "AAT Wrest: Workspaces-to-Archive metadata retriever" +optional = false +python-versions = "^3.10" +files = [] +develop = false + +[package.dependencies] +pendulum = "^2.1.2" +psycopg2-binary = "^2.9.6" +pycapo = "^0.3.1" + +[package.source] +type = "directory" +url = "../../apps/cli/utilities/aat_wrest" + +[[package]] +name = "amqp" +version = "5.1.1" +description = "Low-level AMQP client for Python (fork of amqplib)." +optional = false +python-versions = ">=3.6" +files = [ + {file = "amqp-5.1.1-py3-none-any.whl", hash = "sha256:6f0956d2c23d8fa6e7691934d8c3930eadb44972cbbd1a7ae3a520f735d43359"}, + {file = "amqp-5.1.1.tar.gz", hash = "sha256:2c1b13fecc0893e946c65cbd5f36427861cffa4ea2201d8f6fca22e2a373b5e2"}, +] + +[package.dependencies] +vine = ">=5.0.0" + +[[package]] +name = "beaker" +version = "1.12.1" +description = "A Session and Caching library with WSGI Middleware" +optional = false +python-versions = "*" +files = [ + {file = "Beaker-1.12.1.tar.gz", hash = "sha256:57770b40956e6c5cf1d8221dc59519029e470080ed8d3065c4e6ab36ce7e3c81"}, +] + +[package.extras] +crypto = ["pycryptopp (>=0.5.12)"] +cryptography = ["cryptography"] +pycrypto = ["pycrypto"] +pycryptodome = ["pycryptodome"] +testsuite = ["Mock", "coverage", "cryptography", "pycryptodome", "pylibmc", "pymongo", "pytest", "python-memcached", "redis", "sqlalchemy", "webtest"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "chevron" +version = "0.14.0" +description = "Mustache templating language renderer" +optional = false +python-versions = "*" +files = [ + {file = "chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443"}, + {file = "chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cryptography" +version = "41.0.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, + {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, + {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, + {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cx-oracle" +version = "8.3.0" +description = "Python interface to Oracle" +optional = false +python-versions = "*" +files = [ + {file = "cx_Oracle-8.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b6a23da225f03f50a81980c61dbd6a358c3575f212ca7f4c22bb65a9faf94f7f"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win32.whl", hash = "sha256:715a8bbda5982af484ded14d184304cc552c1096c82471dd2948298470e88a04"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:07f01608dfb6603a8f2a868fc7c7bdc951480f187df8dbc50f4d48c884874e6a"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4b3afe7a911cebaceda908228d36839f6441cbd38e5df491ec25960562bb01a0"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win32.whl", hash = "sha256:076ffb71279d6b2dcbf7df028f62a01e18ce5bb73d8b01eab582bf14a62f4a61"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b82e4b165ffd807a2bd256259a6b81b0a2452883d39f987509e2292d494ea163"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b902db61dcdcbbf8dd981f5a46d72fef40c5150c7fc0eb0f0698b462d6eb834e"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win32.whl", hash = "sha256:4c82ca74442c298ceec56d207450c192e06ecf8ad52eb4aaad0812e147ceabf7"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:54164974d526b76fdefb0b66a42b68e1fca5df78713d0eeb8c1d0047b83f6bcf"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:410747d542e5f94727f5f0e42e9706c772cf9094fb348ce965ab88b3a9e4d2d8"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win32.whl", hash = "sha256:3baa878597c5fadb2c72f359f548431c7be001e722ce4a4ebdf3d2293a1bb70b"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:de42bdc882abdc5cea54597da27a05593b44143728e5b629ad5d35decb1a2036"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df412238a9948340591beee9ec64fa62a2efacc0d91107034a7023e2991fba97"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win32.whl", hash = "sha256:70d3cf030aefd71f99b45beba77237b2af448adf5e26be0db3d0d3dee6ea4230"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf01ce87edb4ef663b2e5bd604e1e0154d2cc2f12b60301f788b569d9db8a900"}, + {file = "cx_Oracle-8.3.0.tar.gz", hash = "sha256:3b2d215af4441463c97ea469b9cc307460739f89fdfa8ea222ea3518f1a424d9"}, +] + +[[package]] +name = "dnspython" +version = "2.3.0" +description = "DNS toolkit" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, + {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, +] + +[package.extras] +curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] +dnssec = ["cryptography (>=2.6,<40.0)"] +doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] +doq = ["aioquic (>=0.9.20)"] +idna = ["idna (>=2.1,<4.0)"] +trio = ["trio (>=0.14,<0.23)"] +wmi = ["wmi (>=1.5.1,<2.0.0)"] + +[[package]] +name = "email-validator" +version = "2.0.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.7" +files = [ + {file = "email_validator-2.0.0-py3-none-any.whl", hash = "sha256:07c61b62ee446e39274b18204afa8e422baf64570776045272b04d10c02f64f6"}, + {file = "email_validator-2.0.0.tar.gz", hash = "sha256:f4904f4145c11f8de5897afbb8d7db4b465c57f13db1c8c106c16d02bceebd9a"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "hupper" +version = "1.12" +description = "Integrated process monitor for developing and reloading daemons." +optional = false +python-versions = ">=3.7" +files = [ + {file = "hupper-1.12-py3-none-any.whl", hash = "sha256:b8bc41bb75939e816f30f118026d0ba99544af4d6992583df3b4813765af27ef"}, + {file = "hupper-1.12.tar.gz", hash = "sha256:18b1653d9832c9f8e7d3401986c7e7af2ae6783616be0bc406bfe0b14134a5c6"}, +] + +[package.extras] +docs = ["Sphinx", "pylons-sphinx-themes", "setuptools", "watchdog"] +testing = ["mock", "pytest", "pytest-cov", "watchdog"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "immutable-views" +version = "0.6.1" +description = "Immutable views on other collection objects" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "immutable-views-0.6.1.tar.gz", hash = "sha256:48e0543786e8a196667fb8412ce35c4f555ce08f39eab21dcf4b0a23d8d19295"}, + {file = "immutable_views-0.6.1-py2.py3-none-any.whl", hash = "sha256:549dbe1106c53e26da28e1ab0f19f54ff20592cc6590f791ffd060de140c1aff"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "kombu" +version = "5.3.1" +description = "Messaging library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "kombu-5.3.1-py3-none-any.whl", hash = "sha256:48ee589e8833126fd01ceaa08f8a2041334e9f5894e5763c8486a550454551e9"}, + {file = "kombu-5.3.1.tar.gz", hash = "sha256:fbd7572d92c0bf71c112a6b45163153dea5a7b6a701ec16b568c27d0fd2370f2"}, +] + +[package.dependencies] +amqp = ">=5.1.1,<6.0.0" +vine = "*" + +[package.extras] +azureservicebus = ["azure-servicebus (>=7.10.0)"] +azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] +confluentkafka = ["confluent-kafka (==2.1.1)"] +consul = ["python-consul2"] +librabbitmq = ["librabbitmq (>=2.0.0)"] +mongodb = ["pymongo (>=4.1.1)"] +msgpack = ["msgpack"] +pyro = ["pyro4"] +qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] +redis = ["redis (>=4.5.2)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=2.8.0)"] + +[[package]] +name = "mako" +version = "1.2.4" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "marshmallow" +version = "3.19.0" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.7" +files = [ + {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, + {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "messaging" +version = "2.8.2rc1" +description = "SSA Messaging is an AMQP-based asynchronous messaging system based on passing simple Python objects as JSON." +optional = false +python-versions = "^3.10" +files = [] +develop = false + +[package.dependencies] +kombu = "^5.2.4" +pycapo = "^0.3.1" + +[package.source] +type = "directory" +url = "../../shared/messaging" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pastedeploy" +version = "3.0.1" +description = "Load, configure, and compose WSGI applications and servers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PasteDeploy-3.0.1-py3-none-any.whl", hash = "sha256:6195c921b1c3ed9722e4e3e6aa29b70deebb2429b4ca3ff3d49185c8e80003bb"}, + {file = "PasteDeploy-3.0.1.tar.gz", hash = "sha256:5f4b4d5fddd39b8947ea727161e366bf55b90efc60a4d1dd7976b9031d0b4e5f"}, +] + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] +paste = ["Paste"] +testing = ["Paste", "pytest", "pytest-cov"] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + +[[package]] +name = "plaster" +version = "1.1.2" +description = "A loader interface around multiple config file formats." +optional = false +python-versions = ">=3.7" +files = [ + {file = "plaster-1.1.2-py2.py3-none-any.whl", hash = "sha256:42992ab1f4865f1278e2ad740e8ad145683bb4022e03534265528f0c23c0df2d"}, + {file = "plaster-1.1.2.tar.gz", hash = "sha256:f8befc54bf8c1147c10ab40297ec84c2676fa2d4ea5d6f524d9436a80074ef98"}, +] + +[package.extras] +docs = ["Sphinx", "pylons-sphinx-themes"] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "plaster-pastedeploy" +version = "1.0.1" +description = "A loader implementing the PasteDeploy syntax to be used by plaster." +optional = false +python-versions = ">=3.7" +files = [ + {file = "plaster_pastedeploy-1.0.1-py2.py3-none-any.whl", hash = "sha256:ad3550cc744648969ed3b810f33c9344f515ee8d8a8cec18e8f2c4a643c2181f"}, + {file = "plaster_pastedeploy-1.0.1.tar.gz", hash = "sha256:be262e6d2e41a7264875daa2fe2850cbb0615728bcdc92828fdc72736e381412"}, +] + +[package.dependencies] +PasteDeploy = ">=2.0" +plaster = ">=0.5" + +[package.extras] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prometheus-client" +version = "0.4.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = "*" +files = [ + {file = "prometheus_client-0.4.1.tar.gz", hash = "sha256:2c0ddba8b9dc5e06de7578a7b25e4becafd6880e6d727bc0a73f8d826c1b0112"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "psycopg2" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, + {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, + {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, + {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, + {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, + {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, + {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, + {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, + {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, +] + +[[package]] +name = "psycopg2-binary" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-binary-2.9.6.tar.gz", hash = "sha256:1f64dcfb8f6e0c014c7f55e51c9759f024f70ea572fbdef123f85318c297947c"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d26e0342183c762de3276cca7a530d574d4e25121ca7d6e4a98e4f05cb8e4df7"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c48d8f2db17f27d41fb0e2ecd703ea41984ee19362cbce52c097963b3a1b4365"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a76e027f87753f9bd1ab5f7c9cb8c7628d1077ef927f5e2446477153a602f2c"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6460c7a99fc939b849431f1e73e013d54aa54293f30f1109019c56a0b2b2ec2f"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae102a98c547ee2288637af07393dd33f440c25e5cd79556b04e3fca13325e5f"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9972aad21f965599ed0106f65334230ce826e5ae69fda7cbd688d24fa922415e"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7a40c00dbe17c0af5bdd55aafd6ff6679f94a9be9513a4c7e071baf3d7d22a70"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:cacbdc5839bdff804dfebc058fe25684cae322987f7a38b0168bc1b2df703fb1"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f0438fa20fb6c7e202863e0d5ab02c246d35efb1d164e052f2f3bfe2b152bd0"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-win32.whl", hash = "sha256:b6c8288bb8a84b47e07013bb4850f50538aa913d487579e1921724631d02ea1b"}, + {file = "psycopg2_binary-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:61b047a0537bbc3afae10f134dc6393823882eb263088c271331602b672e52e9"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:964b4dfb7c1c1965ac4c1978b0f755cc4bd698e8aa2b7667c575fb5f04ebe06b"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afe64e9b8ea66866a771996f6ff14447e8082ea26e675a295ad3bdbffdd72afb"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e2ee79e7cf29582ef770de7dab3d286431b01c3bb598f8e05e09601b890081"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfa74c903a3c1f0d9b1c7e7b53ed2d929a4910e272add6700c38f365a6002820"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b83456c2d4979e08ff56180a76429263ea254c3f6552cd14ada95cff1dec9bb8"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0645376d399bfd64da57148694d78e1f431b1e1ee1054872a5713125681cf1be"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e99e34c82309dd78959ba3c1590975b5d3c862d6f279f843d47d26ff89d7d7e1"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4ea29fc3ad9d91162c52b578f211ff1c931d8a38e1f58e684c45aa470adf19e2"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:4ac30da8b4f57187dbf449294d23b808f8f53cad6b1fc3623fa8a6c11d176dd0"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e78e6e2a00c223e164c417628572a90093c031ed724492c763721c2e0bc2a8df"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-win32.whl", hash = "sha256:1876843d8e31c89c399e31b97d4b9725a3575bb9c2af92038464231ec40f9edb"}, + {file = "psycopg2_binary-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b4b24f75d16a89cc6b4cdff0eb6a910a966ecd476d1e73f7ce5985ff1328e9a6"}, + {file = "psycopg2_binary-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:498807b927ca2510baea1b05cc91d7da4718a0f53cb766c154c417a39f1820a0"}, + {file = "psycopg2_binary-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0d236c2825fa656a2d98bbb0e52370a2e852e5a0ec45fc4f402977313329174d"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:34b9ccdf210cbbb1303c7c4db2905fa0319391bd5904d32689e6dd5c963d2ea8"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d2222e61f313c4848ff05353653bf5f5cf6ce34df540e4274516880d9c3763"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30637a20623e2a2eacc420059be11527f4458ef54352d870b8181a4c3020ae6b"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8122cfc7cae0da9a3077216528b8bb3629c43b25053284cc868744bfe71eb141"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38601cbbfe600362c43714482f43b7c110b20cb0f8172422c616b09b85a750c5"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c7e62ab8b332147a7593a385d4f368874d5fe4ad4e341770d4983442d89603e3"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2ab652e729ff4ad76d400df2624d223d6e265ef81bb8aa17fbd63607878ecbee"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c83a74b68270028dc8ee74d38ecfaf9c90eed23c8959fca95bd703d25b82c88e"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d4e6036decf4b72d6425d5b29bbd3e8f0ff1059cda7ac7b96d6ac5ed34ffbacd"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:a8c28fd40a4226b4a84bdf2d2b5b37d2c7bd49486b5adcc200e8c7ec991dfa7e"}, + {file = "psycopg2_binary-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:51537e3d299be0db9137b321dfb6a5022caaab275775680e0c3d281feefaca6b"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4499e0a83b7b7edcb8dabecbd8501d0d3a5ef66457200f77bde3d210d5debb"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7e13a5a2c01151f1208d5207e42f33ba86d561b7a89fca67c700b9486a06d0e2"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e0f754d27fddcfd74006455b6e04e6705d6c31a612ec69ddc040a5468e44b4e"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d57c3fd55d9058645d26ae37d76e61156a27722097229d32a9e73ed54819982a"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71f14375d6f73b62800530b581aed3ada394039877818b2d5f7fc77e3bb6894d"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:441cc2f8869a4f0f4bb408475e5ae0ee1f3b55b33f350406150277f7f35384fc"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:65bee1e49fa6f9cf327ce0e01c4c10f39165ee76d35c846ade7cb0ec6683e303"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af335bac6b666cc6aea16f11d486c3b794029d9df029967f9938a4bed59b6a19"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:cfec476887aa231b8548ece2e06d28edc87c1397ebd83922299af2e051cf2827"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65c07febd1936d63bfde78948b76cd4c2a411572a44ac50719ead41947d0f26b"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-win32.whl", hash = "sha256:4dfb4be774c4436a4526d0c554af0cc2e02082c38303852a36f6456ece7b3503"}, + {file = "psycopg2_binary-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:02c6e3cf3439e213e4ee930308dc122d6fb4d4bea9aef4a12535fbd605d1a2fe"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9182eb20f41417ea1dd8e8f7888c4d7c6e805f8a7c98c1081778a3da2bee3e4"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a6979cf527e2603d349a91060f428bcb135aea2be3201dff794813256c274f1"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8338a271cb71d8da40b023a35d9c1e919eba6cbd8fa20a54b748a332c355d896"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3ed340d2b858d6e6fb5083f87c09996506af483227735de6964a6100b4e6a54"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81e65376e52f03422e1fb475c9514185669943798ed019ac50410fb4c4df232"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfb13af3c5dd3a9588000910178de17010ebcccd37b4f9794b00595e3a8ddad3"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4c727b597c6444a16e9119386b59388f8a424223302d0c06c676ec8b4bc1f963"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4d67fbdaf177da06374473ef6f7ed8cc0a9dc640b01abfe9e8a2ccb1b1402c1f"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0892ef645c2fabb0c75ec32d79f4252542d0caec1d5d949630e7d242ca4681a3"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:02c0f3757a4300cf379eb49f543fb7ac527fb00144d39246ee40e1df684ab514"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-win32.whl", hash = "sha256:c3dba7dab16709a33a847e5cd756767271697041fbe3fe97c215b1fc1f5c9848"}, + {file = "psycopg2_binary-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:f6a88f384335bb27812293fdb11ac6aee2ca3f51d3c7820fe03de0a304ab6249"}, +] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyopenssl" +version = "23.2.0" +description = "Python wrapper module around the OpenSSL library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, + {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, +] + +[package.dependencies] +cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" + +[package.extras] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] +test = ["flaky", "pretend", "pytest (>=3.0.1)"] + +[[package]] +name = "pyramid" +version = "2.0.1" +description = "The Pyramid Web Framework, a Pylons project" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyramid-2.0.1-py3-none-any.whl", hash = "sha256:2f902589405ddc775e908bfdafebc92e836ffd85e1fd2a81dd724832cfae4d81"}, + {file = "pyramid-2.0.1.tar.gz", hash = "sha256:fabfd745039e26ad5b0915fc396e8725c0f8a3d17b941f9611ecd1ed76cfe7da"}, +] + +[package.dependencies] +hupper = ">=1.5" +plaster = "*" +plaster-pastedeploy = "*" +setuptools = "*" +translationstring = ">=0.4" +venusian = ">=1.0" +webob = ">=1.8.3" +"zope.deprecation" = ">=3.5.0" +"zope.interface" = ">=3.8.0" + +[package.extras] +docs = ["Sphinx (>=3.0.0)", "docutils", "pylons-sphinx-latesturl", "pylons-sphinx-themes (>=1.0.8)", "repoze.sphinx.autointerface", "sphinx-copybutton", "sphinxcontrib-autoprogram"] +testing = ["coverage", "pytest (>=5.4.2)", "pytest-cov", "webtest (>=1.3.1)", "zope.component (>=4.0)"] + +[[package]] +name = "pyramid-beaker" +version = "0.8" +description = "Beaker session factory backend for Pyramid" +optional = false +python-versions = "*" +files = [ + {file = "pyramid_beaker-0.8.tar.gz", hash = "sha256:77dc658c2c84c8c384b6c07f60dd9d2ccaa30df97a147c790db43636f1e8d441"}, +] + +[package.dependencies] +beaker = "*" +pyramid = "*" + +[package.extras] +docs = ["Sphinx", "docutils"] +testing = ["coverage", "nose"] + +[[package]] +name = "pyramid-debugtoolbar" +version = "4.10" +description = "A package which provides an interactive HTML debugger for Pyramid application development" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyramid_debugtoolbar-4.10-py3-none-any.whl", hash = "sha256:0cfef31c4b3ffd3208d15a6fd3e91019c9ec1e1d510c6d1c5cbc9c1a9e32ed92"}, + {file = "pyramid_debugtoolbar-4.10.tar.gz", hash = "sha256:cfc8cfaf342609577fbb93e899fbb2290b31e3418c4b68f0dae37cb3b60fe88b"}, +] + +[package.dependencies] +Pygments = "*" +pyramid = ">=1.4" +pyramid-mako = ">=0.3.1" + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes (>=0.3)", "setuptools"] +testing = ["WebTest", "pytest", "pytest-cov", "sqlalchemy", "webob"] + +[[package]] +name = "pyramid-mako" +version = "1.1.0" +description = "Mako template bindings for the Pyramid web framework" +optional = false +python-versions = "*" +files = [ + {file = "pyramid_mako-1.1.0-py2.py3-none-any.whl", hash = "sha256:76104592d292b6974cf7080aa52405c51f396a621535f01e274d7fe546e85a43"}, + {file = "pyramid_mako-1.1.0.tar.gz", hash = "sha256:0066c863441f1c3ddea60cee1ccc50d00a91a317a8052ca44131da1a12a840e2"}, +] + +[package.dependencies] +Mako = ">=1.1.0" +pyramid = "*" + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.8)", "repoze.sphinx.autointerface"] +testing = ["WebTest (>=1.3.1)", "coverage", "nose"] + +[[package]] +name = "pyramid-retry" +version = "2.1.1" +description = "An execution policy for Pyramid that supports retrying requests after certain failure exceptions." +optional = false +python-versions = "*" +files = [ + {file = "pyramid_retry-2.1.1-py2.py3-none-any.whl", hash = "sha256:b5129a60eb9d7409234ea52839006426d2ae887b4a1f0530c75ec336cabf2476"}, + {file = "pyramid_retry-2.1.1.tar.gz", hash = "sha256:baa8276ae68babad09e5f2f94efc4f7421f3b8fb526151df522052f8cd3ec0c9"}, +] + +[package.dependencies] +pyramid = ">=1.9" +"zope.interface" = "*" + +[package.extras] +docs = ["Sphinx", "pylons-sphinx-themes", "repoze.sphinx.autointerface"] +testing = ["WebTest", "pytest", "pytest-cov"] + +[[package]] +name = "pyramid-tm" +version = "2.5" +description = "A package which allows Pyramid requests to join the active transaction" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyramid_tm-2.5-py2.py3-none-any.whl", hash = "sha256:6638721946e809de8b4bf3f405bd2daaaa76d58442cbdf46be30ebc259f1a354"}, + {file = "pyramid_tm-2.5.tar.gz", hash = "sha256:5c81dcecd33770f5e3596687d2be35ffc4f8ce5eda00a31acb00ae35a51430d0"}, +] + +[package.dependencies] +pyramid = ">=1.5" +transaction = ">=2.0" + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "pylons-sphinx-themes (>=1.0.9)"] +testing = ["WebTest", "coverage (>=5.0)", "pytest", "pytest-cov"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sqlalchemy" +version = "1.4.47" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.47-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:dcfb480bfc9e1fab726003ae00a6bfc67a29bad275b63a4e36d17fe7f13a624e"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28fda5a69d6182589892422c5a9b02a8fd1125787aab1d83f1392aa955bf8d0a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win32.whl", hash = "sha256:45e799c1a41822eba6bee4e59b0e38764e1a1ee69873ab2889079865e9ea0e23"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win_amd64.whl", hash = "sha256:10edbb92a9ef611f01b086e271a9f6c1c3e5157c3b0c5ff62310fb2187acbd4a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a4df53472c9030a8ddb1cce517757ba38a7a25699bbcabd57dcc8a5d53f324e"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:511d4abc823152dec49461209607bbfb2df60033c8c88a3f7c93293b8ecbb13d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbe57f39f531c5d68d5594ea4613daa60aba33bb51a8cc42f96f17bbd6305e8d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca8ab6748e3ec66afccd8b23ec2f92787a58d5353ce9624dccd770427ee67c82"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299b5c5c060b9fbe51808d0d40d8475f7b3873317640b9b7617c7f988cf59fda"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win32.whl", hash = "sha256:684e5c773222781775c7f77231f412633d8af22493bf35b7fa1029fdf8066d10"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win_amd64.whl", hash = "sha256:2bba39b12b879c7b35cde18b6e14119c5f1a16bd064a48dd2ac62d21366a5e17"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:795b5b9db573d3ed61fae74285d57d396829e3157642794d3a8f72ec2a5c719b"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:989c62b96596b7938cbc032e39431e6c2d81b635034571d6a43a13920852fb65"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b67bda733da1dcdccaf354e71ef01b46db483a4f6236450d3f9a61efdba35a"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win32.whl", hash = "sha256:9a198f690ac12a3a807e03a5a45df6a30cd215935f237a46f4248faed62e69c8"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win_amd64.whl", hash = "sha256:03be6f3cb66e69fb3a09b5ea89d77e4bc942f3bf84b207dba84666a26799c166"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:16ee6fea316790980779268da47a9260d5dd665c96f225d28e7750b0bb2e2a04"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:557675e0befafa08d36d7a9284e8761c97490a248474d778373fb96b0d7fd8de"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb2797fee8a7914fb2c3dc7de404d3f96eb77f20fc60e9ee38dc6b0ca720f2c2"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28297aa29e035f29cba6b16aacd3680fbc6a9db682258d5f2e7b49ec215dbe40"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win32.whl", hash = "sha256:998e782c8d9fd57fa8704d149ccd52acf03db30d7dd76f467fd21c1c21b414fa"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win_amd64.whl", hash = "sha256:dde4d02213f1deb49eaaf8be8a6425948963a7af84983b3f22772c63826944de"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e98ef1babe34f37f443b7211cd3ee004d9577a19766e2dbacf62fce73c76245a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a3879853208a242b5913f3a17c6ac0eae9dc210ff99c8f10b19d4a1ed8ed9b"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7120a2f72599d4fed7c001fa1cbbc5b4d14929436135768050e284f53e9fbe5e"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048509d7f3ac27b83ad82fd96a1ab90a34c8e906e4e09c8d677fc531d12c23c5"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win32.whl", hash = "sha256:6572d7c96c2e3e126d0bb27bfb1d7e2a195b68d951fcc64c146b94f088e5421a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win_amd64.whl", hash = "sha256:a6c3929df5eeaf3867724003d5c19fed3f0c290f3edc7911616616684f200ecf"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71d4bf7768169c4502f6c2b0709a02a33703544f611810fb0c75406a9c576ee1"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd45c60cc4f6d68c30d5179e2c2c8098f7112983532897566bb69c47d87127d3"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fdbb8e9d4e9003f332a93d6a37bca48ba8095086c97a89826a136d8eddfc455"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f216a51451a0a0466e082e163591f6dcb2f9ec182adb3f1f4b1fd3688c7582c"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win32.whl", hash = "sha256:bd988b3362d7e586ef581eb14771bbb48793a4edb6fcf62da75d3f0f3447060b"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win_amd64.whl", hash = "sha256:32ab09f2863e3de51529aa84ff0e4fe89a2cb1bfbc11e225b6dbc60814e44c94"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:07764b240645627bc3e82596435bd1a1884646bfc0721642d24c26b12f1df194"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e2a42017984099ef6f56438a6b898ce0538f6fadddaa902870c5aa3e1d82583"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b6d807c76c20b4bc143a49ad47782228a2ac98bdcdcb069da54280e138847fc"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a94632ba26a666e7be0a7d7cc3f7acab622a04259a3aa0ee50ff6d44ba9df0d"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win32.whl", hash = "sha256:f80915681ea9001f19b65aee715115f2ad310730c8043127cf3e19b3009892dd"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win_amd64.whl", hash = "sha256:fc700b862e0a859a37faf85367e205e7acaecae5a098794aff52fdd8aea77b12"}, + {file = "SQLAlchemy-1.4.47.tar.gz", hash = "sha256:95fc02f7fc1f3199aaa47a8a757437134cf618e9d994c84effd53f530c38586f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "transaction" +version = "3.1.0" +description = "Transaction management for Python" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "transaction-3.1.0-py2.py3-none-any.whl", hash = "sha256:8376a959aa71821df1bdd7d066858a3f9f34b7f5f1c0a0e1efbd11d626895449"}, + {file = "transaction-3.1.0.tar.gz", hash = "sha256:65d0b1ea92dbe7c4e3b237fb6bd8b41dea23d7459e7bdd8c3880bffdaf912fa4"}, +] + +[package.dependencies] +"zope.interface" = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["mock"] +testing = ["coverage", "mock", "nose"] + +[[package]] +name = "translationstring" +version = "1.4" +description = "Utility library for i18n relied on by various Repoze and Pyramid packages" +optional = false +python-versions = "*" +files = [ + {file = "translationstring-1.4-py2.py3-none-any.whl", hash = "sha256:5f4dc4d939573db851c8d840551e1a0fb27b946afe3b95aafc22577eed2d6262"}, + {file = "translationstring-1.4.tar.gz", hash = "sha256:bf947538d76e69ba12ab17283b10355a9ecfbc078e6123443f43f2107f6376f3"}, +] + +[package.extras] +docs = ["Sphinx (>=1.3.1)", "docutils", "pylons-sphinx-themes"] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "venusian" +version = "3.0.0" +description = "A library for deferring decorator actions" +optional = false +python-versions = ">=3.5" +files = [ + {file = "venusian-3.0.0-py3-none-any.whl", hash = "sha256:06e7385786ad3a15c70740b2af8d30dfb063a946a851dcb4159f9e2a2302578f"}, + {file = "venusian-3.0.0.tar.gz", hash = "sha256:f6842b7242b1039c0c28f6feef29016e7e7dd3caaeb476a193acf737db31ee38"}, +] + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +testing = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "vine" +version = "5.0.0" +description = "Promises, promises, promises." +optional = false +python-versions = ">=3.6" +files = [ + {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"}, + {file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"}, +] + +[[package]] +name = "waitress" +version = "2.1.2" +description = "Waitress WSGI server" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "waitress-2.1.2-py3-none-any.whl", hash = "sha256:7500c9625927c8ec60f54377d590f67b30c8e70ef4b8894214ac6e4cad233d2a"}, + {file = "waitress-2.1.2.tar.gz", hash = "sha256:780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba"}, +] + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] +testing = ["coverage (>=5.0)", "pytest", "pytest-cover"] + +[[package]] +name = "webob" +version = "1.8.7" +description = "WSGI request and response object" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +files = [ + {file = "WebOb-1.8.7-py2.py3-none-any.whl", hash = "sha256:73aae30359291c14fa3b956f8b5ca31960e420c28c1bec002547fb04928cf89b"}, + {file = "WebOb-1.8.7.tar.gz", hash = "sha256:b64ef5141be559cfade448f044fa45c2260351edcb6a8ef6b7e00c7dcef0c323"}, +] + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] +testing = ["coverage", "pytest (>=3.1.0)", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "workspaces" +version = "2.8.2rc1" +description = "SSA Workspaces shared library" +optional = false +python-versions = "^3.10" +files = [] +develop = false + +[package.dependencies] +chevron = "^0.14.0" +cx-oracle = "^8.3.0" +email-validator = "2.0.0" +immutable-views = "^0.6.1" +marshmallow = "^3.19.0" +pendulum = "^2.1.2" +pycapo = "^0.3.1" +requests = "^2.29.0" +sqlalchemy = "1.4.47" +transaction = "^3.1.0" + +[package.source] +type = "directory" +url = "../../shared/workspaces" + +[[package]] +name = "zope-deprecation" +version = "5.0" +description = "Zope Deprecation Infrastructure" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "zope.deprecation-5.0-py3-none-any.whl", hash = "sha256:28c2ee983812efb4676d33c7a8c6ade0df191c1c6d652bbbfe6e2eeee067b2d4"}, + {file = "zope.deprecation-5.0.tar.gz", hash = "sha256:b7c32d3392036b2145c40b3103e7322db68662ab09b7267afe1532a9d93f640f"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx"] +test = ["zope.testrunner"] + +[[package]] +name = "zope-interface" +version = "6.0" +description = "Interfaces for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, + {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, + {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, + {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, + {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, + {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, + {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, + {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, + {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] + +[[package]] +name = "zope-sqlalchemy" +version = "2.0" +description = "Minimal Zope/SQLAlchemy transaction integration" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.sqlalchemy-2.0-py3-none-any.whl", hash = "sha256:39e13e982faeb9494d4e89f301a765bb1ea91093244de821b192ddcab70ca15b"}, + {file = "zope.sqlalchemy-2.0.tar.gz", hash = "sha256:cdf70cd57b8beb0ca9a81754abbf5c80ef0b53e8d8b2d894ac20bfc73870df12"}, +] + +[package.dependencies] +setuptools = "*" +SQLAlchemy = ">=1.1,<1.4.0 || >1.4.0,<1.4.1 || >1.4.1,<1.4.2 || >1.4.2,<1.4.3 || >1.4.3,<1.4.4 || >1.4.4,<1.4.5 || >1.4.5,<1.4.6 || >1.4.6,<2" +transaction = ">=1.6.0" +"zope.interface" = ">=3.6.0" + +[package.extras] +test = ["zope.testing"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "4fc1eea6d18754c3d0bf8ffa6af19a70dfbd34779b7ecd95543d019a0c7460b1" diff --git a/services/capability/prod.ini b/services/capability/prod.ini index 6f6357229616edf15ff7d3524f651067470b76ed..5ac7d2a890b5ec1e30aabf74c0867083947fb486 100644 --- a/services/capability/prod.ini +++ b/services/capability/prod.ini @@ -4,7 +4,7 @@ ### [app:main] -use = egg:ssa-capability +use = call:capability.server:main session.cookie_expires = true session.auto = true diff --git a/services/capability/pyproject.toml b/services/capability/pyproject.toml index 3aa74595c7c4f6ad7f845914e3b510c5c64bfa8c..f2d42d06e65b3ba9c887b96231f393160f13dfab 100644 --- a/services/capability/pyproject.toml +++ b/services/capability/pyproject.toml @@ -1,9 +1,41 @@ [build-system] -requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2"] - -[tool.setuptools_scm] -write_to = "capability/_version.py" -write_to_template = """ -\"\"\"Version information for this package, don't put anything else here.\"\"\" -___version___ = '{version}' -""" +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry] +name = "capability" +version = "2.8.2rc1" +description = "Capability: the Workspaces Capability Service" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +pendulum = "^2.1.2" +pycapo = "^0.3.1" +pyramid = "^2.0.1" +pyramid-retry = "^2.1.1" +pyramid_beaker = "^0.8" +pyramid-tm = "^2.5" +pyOpenSSL = "^23.1.1" +requests = "^2.28.2" +sqlalchemy = "1.4.47" +waitress = "^2.1.2" +"zope.sqlalchemy" = "2.0" +immutable-views = "^0.6.1" +prometheus-client = "0.4.1" +workspaces = {path = "../../shared/workspaces"} +messaging = {path = "../../shared/messaging"} +aat_wrest = {path = "../../apps/cli/utilities/aat_wrest"} +psycopg2 = "^2.9.6" + + +[tool.poetry.group.dev.dependencies] +pyramid-debugtoolbar = "^4.10" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[tool.poetry.scripts] +launch_capability = "capability.capability_launcher:main" diff --git a/services/capability/requirements.txt b/services/capability/requirements.txt index 8641d66193e6288918eadb078907eaaf8fdb3c83..cef3490a54a006bc9ade815ee220086b6ee0f08a 100644 --- a/services/capability/requirements.txt +++ b/services/capability/requirements.txt @@ -1,10 +1,5 @@ -# This file is intended to support the Dockerfile.base, not for actual development -# DO NOT MODIFY THIS FILE, THIS IS FOR DOCKER ONLY! - --e ../packages/shared/schema # do-not-test --e ../packages/shared/messaging # do-not-test --e ../packages/shared/workspaces # do-not-test --e ../packages/apps/cli/utilities/wf_monitor # do-not-test --e ../packages/apps/cli/utilities/contacts_wrest # do-not-test --e ../packages/apps/cli/utilities/aat_wrest # do-not-test --e ../packages/testing # do-not-test +-e ../code/shared/messaging +-e ../code/shared/workspaces +# -e ../code/apps/cli/utilities/wf_monitor +-e ../code/apps/cli/utilities/aat_wrest +-e ../code/apps/cli/utilities/contacts_wrest diff --git a/services/capability/setup.py b/services/capability/setup.py deleted file mode 100644 index a19dfa673f97210b32cf9d9511b5eb389cd40ca7..0000000000000000000000000000000000000000 --- a/services/capability/setup.py +++ /dev/null @@ -1,118 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -"""A setuptools based setup module. - -See: -https://packaging.python.org/en/latest/distributing.html -https://github.com/pypa/sampleproject -""" -# For matching the version string. -import re - -# To use a consistent encoding -from codecs import open -from os import path - -# Always prefer setuptools over distutils -from setuptools import find_packages, setup - -this_module = "capability" -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, "README.md"), encoding="utf-8") as f: - long_description = f.read() - - -def read(*parts): - with open(path.join(here, *parts), "r") as fp: - return fp.read() - - -def find_version(*file_paths): - version_file = read(*file_paths) - version_match = re.search(r"^___version___ = ['\"]([^'\"]*)['\"]", version_file, re.M) - if version_match: - return version_match.group(1) - raise RuntimeError("Unable to find version string.") - - -requires = [ - "pendulum", - "pycapo", - "pyramid", - "pyramid_retry", - "pyramid_beaker", - "pyramid_debugtoolbar", - "pyramid_tm", - "pyopenssl", - "requests", - "ssa-schema", - "sqlalchemy==1.4.46", - "waitress", - "ssa-workspaces", - "zope.sqlalchemy", - "immutable_views", - "sentry-sdk==1.5.10", - "prometheus_client==0.4.1", -] - -setup( - name="ssa-" + this_module, - # Versions should comply with PEP440. For a discussion on single-sourcing - # the version across setup.py and the project code, see - # https://packaging.python.org/en/latest/single_source_version.html - version=find_version(this_module, "_version.py"), - description="Capability: the Workspaces Capability Service", - use_scm_version=True, - setup_requires=["setuptools_scm"], - long_description=long_description, - # Author details - author="Science Support and Archive", - author_email="ssa-announcements@nrao.edu", - # Choose your license - license="GPL", - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - "Development Status :: 4 - Beta", - # Indicate who your project is intended for - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - # Pick your license as you wish (should match "license" above) - "License :: OSI Approved :: GPL License", - # Specify the Python versions you support here. In particular, ensure - # that you indicate whether you support Python 2, Python 3 or both. - "Programming Language :: Python :: 3.6", - ], - install_requires=requires, - tests_require=["ssa-testing", "pytest"], - extras_require={ - "dev": [ - "pyramid_debugtoolbar", - ], - }, - packages=find_packages(), - entry_points={ - "paste.app_factory": ["main = capability.server:main"], - "console_scripts": ["launch_capability = capability.capability_launcher:main"], - }, -) diff --git a/services/capability/test.ini b/services/capability/test.ini index 740aba9a072389f6fd1a0caa391c55d268860534..6827de5f0d76a7b104c963591c4912562eb60251 100644 --- a/services/capability/test.ini +++ b/services/capability/test.ini @@ -1,5 +1,5 @@ [app:main] -use = egg:ssa-capability +use = call:capability.server:main pyramid.includes = pyramid_debugtoolbar pyramid_tm diff --git a/services/capability/test/__init__.py b/services/capability/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/services/capability/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/services/notification/Dockerfile b/services/notification/Dockerfile index 8c31014ae3640cab91dafdccea6df03ab7679a57..5509e01777abbb7143ab8c78019373280ecce178 100644 --- a/services/notification/Dockerfile +++ b/services/notification/Dockerfile @@ -1,38 +1,58 @@ # This is nrao:notification -ARG TAGNAME="tmp" -FROM cache:${TAGNAME} - -# Build arg that sets environment; sets to "dev" if no build arg is given -ARG env=dev -ENV ENV=${env} -# Build arg that sets Workspace version; sets to "unknown-version" if no build arg is given +FROM python:3.10-slim-buster as base ARG WS_VERSION=unknown-version -ENV WS_VERSION=${WS_VERSION} -# Change working directory to /code -WORKDIR /code +ARG DEPLOY_ENV +ENV DEPLOY_ENV=${DEPLOY_ENV} -# set ownership of /code directory to vlapipe:vlapipe -RUN chown vlapipe . && chgrp vlapipe . +ARG ENV_HOST +ENV ENV_HOST=${ENV_HOST} + +# Environment variables +ENV PIP_NO_CACHE_DIR false +ENV CAPO_PROFILE docker +ENV CAPO_PATH /home/ssa/capo + +# Get postgres/mysql development stuff in the image +RUN apt update \ + && apt install -y --no-install-recommends \ + gcc \ + libmariadb-dev-compat \ + libpq-dev \ + && rm -rf /var/lib/apt/lists + +# Create vlapipe group and create vlapipe user placed in vlapipe group +RUN addgroup --gid 6000 vlapipe && \ + useradd --create-home --comment "" --gid 6000 --uid 6000 vlapipe + +# Create almapipe group and create almapipe user placed in almapipe group +RUN addgroup --gid 9233 almapipe && \ + useradd --create-home --comment "" --gid 9233 --uid 9233 almapipe -# Install nano for editing USER root -RUN apt update -y && apt install -y nano +WORKDIR /code/ +RUN chown vlapipe . && chgrp vlapipe . +RUN apt update -y && apt install -y curl -y nano -# Switch to vlapipe +# package installation USER vlapipe +RUN curl -sSL https://install.python-poetry.org | python3 - + +ENV PATH "${PATH}:/home/vlapipe/.local/bin" +COPY --chown=vlapipe:vlapipe ./shared ./shared +COPY --chown=vlapipe:vlapipe ./apps/cli ./apps/cli # Copy service directory to /code in the image # set ownership of content to vlapipe and the vlapipe group -COPY --chown=vlapipe:vlapipe ./services/notification ./ +COPY --chown=vlapipe:vlapipe ./services/notification ./services/notification +WORKDIR /code/services/notification +RUN poetry install -ENV PYTHONPATH "${PYTHONPATH}:/home/vlapipe/.local" -ENV PATH "${PATH}:/home/vlapipe/.local/bin" -RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} python setup.py develop --user +FROM base as prod +ENV PYTHONPATH "${PYTHONPATH}:/home/vlapipe/.local" +CMD poetry run pserve --reload ${DEPLOY_ENV}.ini -# Set Capo for build stage -# Gets reset to proper environment's profile in the deploy stage -ENV CAPO_PROFILE docker +FROM base as dev -CMD pserve --reload ${ENV}.ini +CMD ["poetry", "run", "pserve", "--reload", "dev.ini"] diff --git a/services/notification/Dockerfile.local b/services/notification/Dockerfile.local deleted file mode 100644 index 023bd942ad451468a97fd6113465cd033a97fc7b..0000000000000000000000000000000000000000 --- a/services/notification/Dockerfile.local +++ /dev/null @@ -1,25 +0,0 @@ -# This is nrao:notification -FROM cache:tmp - -# Build arg that sets Workspace version; sets to "unknown-version" if no build arg is given -ARG WS_VERSION=unknown-version -ENV WS_VERSION=${WS_VERSION} - -USER root -RUN apt update -y && apt install -y curl -USER vlapipe - -# Get workflow code into the image -WORKDIR /code - -COPY --chown=vlapipe:vlapipe ./services/notification ./ - -# Python library installation -WORKDIR /code/ -RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} python setup.py develop --user - -# Set Capo -ARG capo_env=docker -ENV CAPO_PROFILE $capo_env - -CMD ["pserve", "--reload", "dev.ini"] diff --git a/services/notification/LICENSE b/services/notification/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/services/notification/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/services/notification/README.md b/services/notification/README.md index 77125a0ed34872ba2e03acd4eb61ec4fae837aec..4cf7a9643893e63ae92202696b023f56997aa277 100644 --- a/services/notification/README.md +++ b/services/notification/README.md @@ -67,3 +67,4 @@ The rendered message (shown below) will be emailed to `dlyons@nrao.edu`: Best regards, NRAO Workspaces + diff --git a/services/notification/bin/config/.coveragerc b/services/notification/bin/config/.coveragerc deleted file mode 100644 index 19b27bfbe6260b1ec3c7749cf09d97a67a1f5854..0000000000000000000000000000000000000000 --- a/services/notification/bin/config/.coveragerc +++ /dev/null @@ -1,8 +0,0 @@ -[paths] -source = - ./services/notification/ - /code/ -[run] -source = - /code/ - /packages/apps/cli diff --git a/services/notification/bin/run-tests.sh b/services/notification/bin/run-tests.sh deleted file mode 100755 index 43caef8ea746b3a51a2561b5d6489a6eeeddfedb..0000000000000000000000000000000000000000 --- a/services/notification/bin/run-tests.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. - -# Set failfast -set -x -e -set -o pipefail - -echo "Happy Testing!" - -# Set path to service unit tests -path_to_test="test" - -# Set skip behavior -skip_arg="--skip-empty" - -# Install testing requirements -init () { - pushd /packages/testing - python setup.py develop --user - popd - -# if exists, remove old .coverage file - if [[ -e .coverage ]]; then - echo "Removing old coverage file..." - rm .coverage - fi -} - -run_tests () { - # Look for lines in requirements.txt starting with "-e" - # to find paths to packages containings tests to be executed. - pkgs+=($((echo "$path_to_test"; sed -n "s|-e ..||p" requirements.txt) | grep -v testing | grep -v do-not-test | tr "\n" " ")) - - for pkg in "${pkgs[@]}" - do - cd "$pkg" || exit - if [[ $# -eq 0 ]]; then - pytest - else - pytestWithCoverage $1 - fi - cd /code/ || exit - done -} - -pytestWithCoverage () { - coverage run --parallel-mode --branch -m pytest - if [ "$1" == "b" ]; then - cd /code/ && coverage combine --rcfile="/code/bin/config/.coveragerc" --append "$pkg" && cd "$pkg" - else - cd /code/ && coverage combine --append "$pkg" && cd "$pkg" - fi -} - -while getopts "cbr:o:" OPTION -do - case $OPTION in - c) - init - run_tests "$OPTION" - coverage report "$skip_arg" --omit="**/test_*.py,**/_version.py,**/conftest.py,**/*interfaces.py" - ;; - b) - init - run_tests "$OPTION" - ;; - r) - echo "The generating coverage report as: $OPTARG" - report_output=$OPTARG - ;; - o) - echo "Naming coverage report: $OPTARG" - report_name=$OPTARG - ;; - \?) - echo "Option not recognized" - exit - ;; - esac -done - -if [[ $# -eq 0 ]] ; then - init - run_tests -fi - -if [[ -n $report_output ]]; then - if [[ -n $report_name ]]; then - coverage "$report_output" -o $report_name.$report_output "$skip_arg" - else - coverage "$report_output" "$skip_arg" - fi -fi - -echo "Tests have finished" diff --git a/services/notification/dev.ini b/services/notification/dev.ini index f7e1ebf0afef1fde0e03f8ab06a72e4fa4490ef7..59f8e13a61ecd66edb2ec7dad51be4b879c6668e 100644 --- a/services/notification/dev.ini +++ b/services/notification/dev.ini @@ -1,5 +1,5 @@ [app:main] -use = egg:ssa-notification +use = call:notification.server:main pyramid.includes = pyramid_debugtoolbar pyramid_tm diff --git a/services/notification/notification/__init__.py b/services/notification/notification/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..38f32116ac82a4ad4f3fbff0c7b076eb0c8f19df 100644 --- a/services/notification/notification/__init__.py +++ b/services/notification/notification/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +The Workspaces notification service +""" +__version__ = "2.8.2rc1" diff --git a/services/notification/notification/_version.py b/services/notification/notification/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/services/notification/notification/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/services/notification/notification/server.py b/services/notification/notification/server.py index e51f3a1de635364d63b31eacd114a68e57e61cde..92765895d98fd5246cfe8a84d2d3dfdf203e3745 100644 --- a/services/notification/notification/server.py +++ b/services/notification/notification/server.py @@ -15,18 +15,11 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import sentry_sdk -import sqlalchemy.orm import transaction import zope.sqlalchemy -from pycapo import CapoConfig from pyramid.config import Configurator -from pyramid.events import NewRequest from pyramid.renderers import JSONP -from pyramid.request import Request -from pyramid.response import Response from pyramid_beaker import BeakerSessionFactoryConfig, session_factory_from_settings -from sentry_sdk.integrations.pyramid import PyramidIntegration from workspaces.notification.services.notification_info import NotificationInfo from workspaces.notification.services.notification_service import NotificationService @@ -92,18 +85,6 @@ def get_tm_session(session_factory, transaction_manager): def main(global_config, **settings): with Configurator(settings=settings) as config: - sentry_key = CapoConfig().settings("edu.nrao.workspaces.SentrySettings").sentry_key - - if sentry_key != "local": - sentry_sdk.init( - dsn=sentry_key, - integrations=[PyramidIntegration()], - # Set traces_sample_rate to 1.0 to capture 100% - # of transactions for performance monitoring. - # We recommend adjusting this value in production. - traces_sample_rate=1.0, - ) - session_factory = session_factory_from_settings(settings) config.set_session_factory(session_factory) config.add_renderer("jsonp", JSONP(param_name="callback")) diff --git a/services/notification/poetry.lock b/services/notification/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..6a1ee265a507063a5e18761f37f0f02efd01d594 --- /dev/null +++ b/services/notification/poetry.lock @@ -0,0 +1,1241 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "beaker" +version = "1.12.1" +description = "A Session and Caching library with WSGI Middleware" +optional = false +python-versions = "*" +files = [ + {file = "Beaker-1.12.1.tar.gz", hash = "sha256:57770b40956e6c5cf1d8221dc59519029e470080ed8d3065c4e6ab36ce7e3c81"}, +] + +[package.extras] +crypto = ["pycryptopp (>=0.5.12)"] +cryptography = ["cryptography"] +pycrypto = ["pycrypto"] +pycryptodome = ["pycryptodome"] +testsuite = ["Mock", "coverage", "cryptography", "pycryptodome", "pylibmc", "pymongo", "pytest", "python-memcached", "redis", "sqlalchemy", "webtest"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "chevron" +version = "0.14.0" +description = "Mustache templating language renderer" +optional = false +python-versions = "*" +files = [ + {file = "chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443"}, + {file = "chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cryptography" +version = "41.0.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, + {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, + {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, + {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "cx-oracle" +version = "8.3.0" +description = "Python interface to Oracle" +optional = false +python-versions = "*" +files = [ + {file = "cx_Oracle-8.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b6a23da225f03f50a81980c61dbd6a358c3575f212ca7f4c22bb65a9faf94f7f"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win32.whl", hash = "sha256:715a8bbda5982af484ded14d184304cc552c1096c82471dd2948298470e88a04"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:07f01608dfb6603a8f2a868fc7c7bdc951480f187df8dbc50f4d48c884874e6a"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4b3afe7a911cebaceda908228d36839f6441cbd38e5df491ec25960562bb01a0"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win32.whl", hash = "sha256:076ffb71279d6b2dcbf7df028f62a01e18ce5bb73d8b01eab582bf14a62f4a61"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b82e4b165ffd807a2bd256259a6b81b0a2452883d39f987509e2292d494ea163"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b902db61dcdcbbf8dd981f5a46d72fef40c5150c7fc0eb0f0698b462d6eb834e"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win32.whl", hash = "sha256:4c82ca74442c298ceec56d207450c192e06ecf8ad52eb4aaad0812e147ceabf7"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:54164974d526b76fdefb0b66a42b68e1fca5df78713d0eeb8c1d0047b83f6bcf"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:410747d542e5f94727f5f0e42e9706c772cf9094fb348ce965ab88b3a9e4d2d8"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win32.whl", hash = "sha256:3baa878597c5fadb2c72f359f548431c7be001e722ce4a4ebdf3d2293a1bb70b"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:de42bdc882abdc5cea54597da27a05593b44143728e5b629ad5d35decb1a2036"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df412238a9948340591beee9ec64fa62a2efacc0d91107034a7023e2991fba97"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win32.whl", hash = "sha256:70d3cf030aefd71f99b45beba77237b2af448adf5e26be0db3d0d3dee6ea4230"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf01ce87edb4ef663b2e5bd604e1e0154d2cc2f12b60301f788b569d9db8a900"}, + {file = "cx_Oracle-8.3.0.tar.gz", hash = "sha256:3b2d215af4441463c97ea469b9cc307460739f89fdfa8ea222ea3518f1a424d9"}, +] + +[[package]] +name = "dnspython" +version = "2.3.0" +description = "DNS toolkit" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, + {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, +] + +[package.extras] +curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] +dnssec = ["cryptography (>=2.6,<40.0)"] +doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] +doq = ["aioquic (>=0.9.20)"] +idna = ["idna (>=2.1,<4.0)"] +trio = ["trio (>=0.14,<0.23)"] +wmi = ["wmi (>=1.5.1,<2.0.0)"] + +[[package]] +name = "email-validator" +version = "2.0.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.7" +files = [ + {file = "email_validator-2.0.0-py3-none-any.whl", hash = "sha256:07c61b62ee446e39274b18204afa8e422baf64570776045272b04d10c02f64f6"}, + {file = "email_validator-2.0.0.tar.gz", hash = "sha256:f4904f4145c11f8de5897afbb8d7db4b465c57f13db1c8c106c16d02bceebd9a"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "hupper" +version = "1.12" +description = "Integrated process monitor for developing and reloading daemons." +optional = false +python-versions = ">=3.7" +files = [ + {file = "hupper-1.12-py3-none-any.whl", hash = "sha256:b8bc41bb75939e816f30f118026d0ba99544af4d6992583df3b4813765af27ef"}, + {file = "hupper-1.12.tar.gz", hash = "sha256:18b1653d9832c9f8e7d3401986c7e7af2ae6783616be0bc406bfe0b14134a5c6"}, +] + +[package.extras] +docs = ["Sphinx", "pylons-sphinx-themes", "setuptools", "watchdog"] +testing = ["mock", "pytest", "pytest-cov", "watchdog"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "immutable-views" +version = "0.6.1" +description = "Immutable views on other collection objects" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "immutable-views-0.6.1.tar.gz", hash = "sha256:48e0543786e8a196667fb8412ce35c4f555ce08f39eab21dcf4b0a23d8d19295"}, + {file = "immutable_views-0.6.1-py2.py3-none-any.whl", hash = "sha256:549dbe1106c53e26da28e1ab0f19f54ff20592cc6590f791ffd060de140c1aff"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "mako" +version = "1.2.4" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "marshmallow" +version = "3.19.0" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.7" +files = [ + {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, + {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pastedeploy" +version = "3.0.1" +description = "Load, configure, and compose WSGI applications and servers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PasteDeploy-3.0.1-py3-none-any.whl", hash = "sha256:6195c921b1c3ed9722e4e3e6aa29b70deebb2429b4ca3ff3d49185c8e80003bb"}, + {file = "PasteDeploy-3.0.1.tar.gz", hash = "sha256:5f4b4d5fddd39b8947ea727161e366bf55b90efc60a4d1dd7976b9031d0b4e5f"}, +] + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] +paste = ["Paste"] +testing = ["Paste", "pytest", "pytest-cov"] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + +[[package]] +name = "plaster" +version = "1.1.2" +description = "A loader interface around multiple config file formats." +optional = false +python-versions = ">=3.7" +files = [ + {file = "plaster-1.1.2-py2.py3-none-any.whl", hash = "sha256:42992ab1f4865f1278e2ad740e8ad145683bb4022e03534265528f0c23c0df2d"}, + {file = "plaster-1.1.2.tar.gz", hash = "sha256:f8befc54bf8c1147c10ab40297ec84c2676fa2d4ea5d6f524d9436a80074ef98"}, +] + +[package.extras] +docs = ["Sphinx", "pylons-sphinx-themes"] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "plaster-pastedeploy" +version = "1.0.1" +description = "A loader implementing the PasteDeploy syntax to be used by plaster." +optional = false +python-versions = ">=3.7" +files = [ + {file = "plaster_pastedeploy-1.0.1-py2.py3-none-any.whl", hash = "sha256:ad3550cc744648969ed3b810f33c9344f515ee8d8a8cec18e8f2c4a643c2181f"}, + {file = "plaster_pastedeploy-1.0.1.tar.gz", hash = "sha256:be262e6d2e41a7264875daa2fe2850cbb0615728bcdc92828fdc72736e381412"}, +] + +[package.dependencies] +PasteDeploy = ">=2.0" +plaster = ">=0.5" + +[package.extras] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "psycopg2" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, + {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, + {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, + {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, + {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, + {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, + {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, + {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, + {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, +] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyopenssl" +version = "23.2.0" +description = "Python wrapper module around the OpenSSL library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyOpenSSL-23.2.0-py3-none-any.whl", hash = "sha256:24f0dc5227396b3e831f4c7f602b950a5e9833d292c8e4a2e06b709292806ae2"}, + {file = "pyOpenSSL-23.2.0.tar.gz", hash = "sha256:276f931f55a452e7dea69c7173e984eb2a4407ce413c918aa34b55f82f9b8bac"}, +] + +[package.dependencies] +cryptography = ">=38.0.0,<40.0.0 || >40.0.0,<40.0.1 || >40.0.1,<42" + +[package.extras] +docs = ["sphinx (!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] +test = ["flaky", "pretend", "pytest (>=3.0.1)"] + +[[package]] +name = "pyramid" +version = "2.0.1" +description = "The Pyramid Web Framework, a Pylons project" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyramid-2.0.1-py3-none-any.whl", hash = "sha256:2f902589405ddc775e908bfdafebc92e836ffd85e1fd2a81dd724832cfae4d81"}, + {file = "pyramid-2.0.1.tar.gz", hash = "sha256:fabfd745039e26ad5b0915fc396e8725c0f8a3d17b941f9611ecd1ed76cfe7da"}, +] + +[package.dependencies] +hupper = ">=1.5" +plaster = "*" +plaster-pastedeploy = "*" +setuptools = "*" +translationstring = ">=0.4" +venusian = ">=1.0" +webob = ">=1.8.3" +"zope.deprecation" = ">=3.5.0" +"zope.interface" = ">=3.8.0" + +[package.extras] +docs = ["Sphinx (>=3.0.0)", "docutils", "pylons-sphinx-latesturl", "pylons-sphinx-themes (>=1.0.8)", "repoze.sphinx.autointerface", "sphinx-copybutton", "sphinxcontrib-autoprogram"] +testing = ["coverage", "pytest (>=5.4.2)", "pytest-cov", "webtest (>=1.3.1)", "zope.component (>=4.0)"] + +[[package]] +name = "pyramid-beaker" +version = "0.8" +description = "Beaker session factory backend for Pyramid" +optional = false +python-versions = "*" +files = [ + {file = "pyramid_beaker-0.8.tar.gz", hash = "sha256:77dc658c2c84c8c384b6c07f60dd9d2ccaa30df97a147c790db43636f1e8d441"}, +] + +[package.dependencies] +beaker = "*" +pyramid = "*" + +[package.extras] +docs = ["Sphinx", "docutils"] +testing = ["coverage", "nose"] + +[[package]] +name = "pyramid-debugtoolbar" +version = "4.10" +description = "A package which provides an interactive HTML debugger for Pyramid application development" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyramid_debugtoolbar-4.10-py3-none-any.whl", hash = "sha256:0cfef31c4b3ffd3208d15a6fd3e91019c9ec1e1d510c6d1c5cbc9c1a9e32ed92"}, + {file = "pyramid_debugtoolbar-4.10.tar.gz", hash = "sha256:cfc8cfaf342609577fbb93e899fbb2290b31e3418c4b68f0dae37cb3b60fe88b"}, +] + +[package.dependencies] +Pygments = "*" +pyramid = ">=1.4" +pyramid-mako = ">=0.3.1" + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes (>=0.3)", "setuptools"] +testing = ["WebTest", "pytest", "pytest-cov", "sqlalchemy", "webob"] + +[[package]] +name = "pyramid-mako" +version = "1.1.0" +description = "Mako template bindings for the Pyramid web framework" +optional = false +python-versions = "*" +files = [ + {file = "pyramid_mako-1.1.0-py2.py3-none-any.whl", hash = "sha256:76104592d292b6974cf7080aa52405c51f396a621535f01e274d7fe546e85a43"}, + {file = "pyramid_mako-1.1.0.tar.gz", hash = "sha256:0066c863441f1c3ddea60cee1ccc50d00a91a317a8052ca44131da1a12a840e2"}, +] + +[package.dependencies] +Mako = ">=1.1.0" +pyramid = "*" + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.8)", "repoze.sphinx.autointerface"] +testing = ["WebTest (>=1.3.1)", "coverage", "nose"] + +[[package]] +name = "pyramid-retry" +version = "2.1.1" +description = "An execution policy for Pyramid that supports retrying requests after certain failure exceptions." +optional = false +python-versions = "*" +files = [ + {file = "pyramid_retry-2.1.1-py2.py3-none-any.whl", hash = "sha256:b5129a60eb9d7409234ea52839006426d2ae887b4a1f0530c75ec336cabf2476"}, + {file = "pyramid_retry-2.1.1.tar.gz", hash = "sha256:baa8276ae68babad09e5f2f94efc4f7421f3b8fb526151df522052f8cd3ec0c9"}, +] + +[package.dependencies] +pyramid = ">=1.9" +"zope.interface" = "*" + +[package.extras] +docs = ["Sphinx", "pylons-sphinx-themes", "repoze.sphinx.autointerface"] +testing = ["WebTest", "pytest", "pytest-cov"] + +[[package]] +name = "pyramid-tm" +version = "2.5" +description = "A package which allows Pyramid requests to join the active transaction" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyramid_tm-2.5-py2.py3-none-any.whl", hash = "sha256:6638721946e809de8b4bf3f405bd2daaaa76d58442cbdf46be30ebc259f1a354"}, + {file = "pyramid_tm-2.5.tar.gz", hash = "sha256:5c81dcecd33770f5e3596687d2be35ffc4f8ce5eda00a31acb00ae35a51430d0"}, +] + +[package.dependencies] +pyramid = ">=1.5" +transaction = ">=2.0" + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "pylons-sphinx-themes (>=1.0.9)"] +testing = ["WebTest", "coverage (>=5.0)", "pytest", "pytest-cov"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sqlalchemy" +version = "1.4.47" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.47-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:dcfb480bfc9e1fab726003ae00a6bfc67a29bad275b63a4e36d17fe7f13a624e"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28fda5a69d6182589892422c5a9b02a8fd1125787aab1d83f1392aa955bf8d0a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win32.whl", hash = "sha256:45e799c1a41822eba6bee4e59b0e38764e1a1ee69873ab2889079865e9ea0e23"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win_amd64.whl", hash = "sha256:10edbb92a9ef611f01b086e271a9f6c1c3e5157c3b0c5ff62310fb2187acbd4a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a4df53472c9030a8ddb1cce517757ba38a7a25699bbcabd57dcc8a5d53f324e"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:511d4abc823152dec49461209607bbfb2df60033c8c88a3f7c93293b8ecbb13d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbe57f39f531c5d68d5594ea4613daa60aba33bb51a8cc42f96f17bbd6305e8d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca8ab6748e3ec66afccd8b23ec2f92787a58d5353ce9624dccd770427ee67c82"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299b5c5c060b9fbe51808d0d40d8475f7b3873317640b9b7617c7f988cf59fda"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win32.whl", hash = "sha256:684e5c773222781775c7f77231f412633d8af22493bf35b7fa1029fdf8066d10"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win_amd64.whl", hash = "sha256:2bba39b12b879c7b35cde18b6e14119c5f1a16bd064a48dd2ac62d21366a5e17"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:795b5b9db573d3ed61fae74285d57d396829e3157642794d3a8f72ec2a5c719b"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:989c62b96596b7938cbc032e39431e6c2d81b635034571d6a43a13920852fb65"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b67bda733da1dcdccaf354e71ef01b46db483a4f6236450d3f9a61efdba35a"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win32.whl", hash = "sha256:9a198f690ac12a3a807e03a5a45df6a30cd215935f237a46f4248faed62e69c8"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win_amd64.whl", hash = "sha256:03be6f3cb66e69fb3a09b5ea89d77e4bc942f3bf84b207dba84666a26799c166"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:16ee6fea316790980779268da47a9260d5dd665c96f225d28e7750b0bb2e2a04"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:557675e0befafa08d36d7a9284e8761c97490a248474d778373fb96b0d7fd8de"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb2797fee8a7914fb2c3dc7de404d3f96eb77f20fc60e9ee38dc6b0ca720f2c2"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28297aa29e035f29cba6b16aacd3680fbc6a9db682258d5f2e7b49ec215dbe40"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win32.whl", hash = "sha256:998e782c8d9fd57fa8704d149ccd52acf03db30d7dd76f467fd21c1c21b414fa"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win_amd64.whl", hash = "sha256:dde4d02213f1deb49eaaf8be8a6425948963a7af84983b3f22772c63826944de"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e98ef1babe34f37f443b7211cd3ee004d9577a19766e2dbacf62fce73c76245a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a3879853208a242b5913f3a17c6ac0eae9dc210ff99c8f10b19d4a1ed8ed9b"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7120a2f72599d4fed7c001fa1cbbc5b4d14929436135768050e284f53e9fbe5e"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048509d7f3ac27b83ad82fd96a1ab90a34c8e906e4e09c8d677fc531d12c23c5"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win32.whl", hash = "sha256:6572d7c96c2e3e126d0bb27bfb1d7e2a195b68d951fcc64c146b94f088e5421a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win_amd64.whl", hash = "sha256:a6c3929df5eeaf3867724003d5c19fed3f0c290f3edc7911616616684f200ecf"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71d4bf7768169c4502f6c2b0709a02a33703544f611810fb0c75406a9c576ee1"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd45c60cc4f6d68c30d5179e2c2c8098f7112983532897566bb69c47d87127d3"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fdbb8e9d4e9003f332a93d6a37bca48ba8095086c97a89826a136d8eddfc455"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f216a51451a0a0466e082e163591f6dcb2f9ec182adb3f1f4b1fd3688c7582c"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win32.whl", hash = "sha256:bd988b3362d7e586ef581eb14771bbb48793a4edb6fcf62da75d3f0f3447060b"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win_amd64.whl", hash = "sha256:32ab09f2863e3de51529aa84ff0e4fe89a2cb1bfbc11e225b6dbc60814e44c94"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:07764b240645627bc3e82596435bd1a1884646bfc0721642d24c26b12f1df194"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e2a42017984099ef6f56438a6b898ce0538f6fadddaa902870c5aa3e1d82583"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b6d807c76c20b4bc143a49ad47782228a2ac98bdcdcb069da54280e138847fc"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a94632ba26a666e7be0a7d7cc3f7acab622a04259a3aa0ee50ff6d44ba9df0d"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win32.whl", hash = "sha256:f80915681ea9001f19b65aee715115f2ad310730c8043127cf3e19b3009892dd"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win_amd64.whl", hash = "sha256:fc700b862e0a859a37faf85367e205e7acaecae5a098794aff52fdd8aea77b12"}, + {file = "SQLAlchemy-1.4.47.tar.gz", hash = "sha256:95fc02f7fc1f3199aaa47a8a757437134cf618e9d994c84effd53f530c38586f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "transaction" +version = "3.1.0" +description = "Transaction management for Python" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "transaction-3.1.0-py2.py3-none-any.whl", hash = "sha256:8376a959aa71821df1bdd7d066858a3f9f34b7f5f1c0a0e1efbd11d626895449"}, + {file = "transaction-3.1.0.tar.gz", hash = "sha256:65d0b1ea92dbe7c4e3b237fb6bd8b41dea23d7459e7bdd8c3880bffdaf912fa4"}, +] + +[package.dependencies] +"zope.interface" = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["mock"] +testing = ["coverage", "mock", "nose"] + +[[package]] +name = "translationstring" +version = "1.4" +description = "Utility library for i18n relied on by various Repoze and Pyramid packages" +optional = false +python-versions = "*" +files = [ + {file = "translationstring-1.4-py2.py3-none-any.whl", hash = "sha256:5f4dc4d939573db851c8d840551e1a0fb27b946afe3b95aafc22577eed2d6262"}, + {file = "translationstring-1.4.tar.gz", hash = "sha256:bf947538d76e69ba12ab17283b10355a9ecfbc078e6123443f43f2107f6376f3"}, +] + +[package.extras] +docs = ["Sphinx (>=1.3.1)", "docutils", "pylons-sphinx-themes"] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "venusian" +version = "3.0.0" +description = "A library for deferring decorator actions" +optional = false +python-versions = ">=3.5" +files = [ + {file = "venusian-3.0.0-py3-none-any.whl", hash = "sha256:06e7385786ad3a15c70740b2af8d30dfb063a946a851dcb4159f9e2a2302578f"}, + {file = "venusian-3.0.0.tar.gz", hash = "sha256:f6842b7242b1039c0c28f6feef29016e7e7dd3caaeb476a193acf737db31ee38"}, +] + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +testing = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "waitress" +version = "2.1.2" +description = "Waitress WSGI server" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "waitress-2.1.2-py3-none-any.whl", hash = "sha256:7500c9625927c8ec60f54377d590f67b30c8e70ef4b8894214ac6e4cad233d2a"}, + {file = "waitress-2.1.2.tar.gz", hash = "sha256:780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba"}, +] + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] +testing = ["coverage (>=5.0)", "pytest", "pytest-cover"] + +[[package]] +name = "webob" +version = "1.8.7" +description = "WSGI request and response object" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +files = [ + {file = "WebOb-1.8.7-py2.py3-none-any.whl", hash = "sha256:73aae30359291c14fa3b956f8b5ca31960e420c28c1bec002547fb04928cf89b"}, + {file = "WebOb-1.8.7.tar.gz", hash = "sha256:b64ef5141be559cfade448f044fa45c2260351edcb6a8ef6b7e00c7dcef0c323"}, +] + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] +testing = ["coverage", "pytest (>=3.1.0)", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "workspaces" +version = "2.8.2rc1" +description = "SSA Workspaces shared library" +optional = false +python-versions = "^3.10" +files = [] +develop = false + +[package.dependencies] +chevron = "^0.14.0" +cx-oracle = "^8.3.0" +email-validator = "2.0.0" +immutable-views = "^0.6.1" +marshmallow = "^3.19.0" +pendulum = "^2.1.2" +pycapo = "^0.3.1" +requests = "^2.29.0" +sqlalchemy = "1.4.47" +transaction = "^3.1.0" + +[package.source] +type = "directory" +url = "../../shared/workspaces" + +[[package]] +name = "zope-deprecation" +version = "5.0" +description = "Zope Deprecation Infrastructure" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "zope.deprecation-5.0-py3-none-any.whl", hash = "sha256:28c2ee983812efb4676d33c7a8c6ade0df191c1c6d652bbbfe6e2eeee067b2d4"}, + {file = "zope.deprecation-5.0.tar.gz", hash = "sha256:b7c32d3392036b2145c40b3103e7322db68662ab09b7267afe1532a9d93f640f"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx"] +test = ["zope.testrunner"] + +[[package]] +name = "zope-interface" +version = "6.0" +description = "Interfaces for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, + {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, + {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, + {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, + {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, + {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, + {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, + {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, + {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] + +[[package]] +name = "zope-sqlalchemy" +version = "2.0" +description = "Minimal Zope/SQLAlchemy transaction integration" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.sqlalchemy-2.0-py3-none-any.whl", hash = "sha256:39e13e982faeb9494d4e89f301a765bb1ea91093244de821b192ddcab70ca15b"}, + {file = "zope.sqlalchemy-2.0.tar.gz", hash = "sha256:cdf70cd57b8beb0ca9a81754abbf5c80ef0b53e8d8b2d894ac20bfc73870df12"}, +] + +[package.dependencies] +setuptools = "*" +SQLAlchemy = ">=1.1,<1.4.0 || >1.4.0,<1.4.1 || >1.4.1,<1.4.2 || >1.4.2,<1.4.3 || >1.4.3,<1.4.4 || >1.4.4,<1.4.5 || >1.4.5,<1.4.6 || >1.4.6,<2" +transaction = ">=1.6.0" +"zope.interface" = ">=3.6.0" + +[package.extras] +test = ["zope.testing"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "cc388d1f9455182960391bd13f3f51a56c375e38f0134b75f5ee0ee614a5c4b1" diff --git a/services/notification/prod.ini b/services/notification/prod.ini index e4d9a2433a28c5c181eae8fd9a01dc47e56441eb..82edc8f9758e77bbb64b9f31c9e52ed776e85e37 100644 --- a/services/notification/prod.ini +++ b/services/notification/prod.ini @@ -4,7 +4,7 @@ ### [app:main] -use = egg:ssa-notification +use = call:notification.server:main session.cookie_expires = true session.auto = true diff --git a/services/notification/pyproject.toml b/services/notification/pyproject.toml index 7592da2546189a91369871bbd33ae073e562c325..59e7c700a36cc30e79403cdcd676c787ff105edc 100644 --- a/services/notification/pyproject.toml +++ b/services/notification/pyproject.toml @@ -1,9 +1,33 @@ +[tool.poetry] +name = "notification" +version = "2.8.2rc1" +description = "The SSA notification service" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +pycapo = "^0.3.1" +pyramid = "^2.0.1" +pyramid-beaker = "^0.8" +pyramid-tm = "^2.5" +pyramid-retry = "^2.1.1" +pyopenssl = "^23.1.1" +requests = "^2.29.0" +waitress = "^2.1.2" +sqlalchemy = "1.4.47" +"zope.sqlalchemy" = "2.0" +workspaces = {path = "../../shared/workspaces"} +psycopg2 = "^2.9.6" + + +[tool.poetry.group.dev.dependencies] +pyramid-debugtoolbar = "^4.10" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + [build-system] -requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2"] - -[tool.setuptools_scm] -write_to = "notification/_version.py" -write_to_template = """ -\"\"\"Version information for this package, don't put anything else here.\"\"\" -___version___ = '{version}' -""" +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/services/notification/requirements.txt b/services/notification/requirements.txt index 11ed6b8dc961e5d5906841f3ac95902e0f0844c6..8b6a0c609fd593472a084c18d94bbbd0f5ad80ff 100644 --- a/services/notification/requirements.txt +++ b/services/notification/requirements.txt @@ -1,9 +1,2 @@ -# This file is intended to support the Dockerfile.base, not for actual development -# DO NOT MODIFY THIS FILE, THIS IS FOR DOCKER ONLY! - --e ../packages/shared/schema # do-not-test --e ../packages/shared/messaging # do-not-test --e ../packages/shared/workspaces # do-not-test --e ../packages/apps/cli/utilities/wf_monitor # do-not-test --e ../packages/apps/cli/executables/pexable/null # do-not-test --e ../packages/testing +-e ../code/shared/messaging +-e ../code/shared/workspaces diff --git a/services/notification/setup.py b/services/notification/setup.py deleted file mode 100644 index 9e230092eb845a476f704a1acaec15f2aee95ec6..0000000000000000000000000000000000000000 --- a/services/notification/setup.py +++ /dev/null @@ -1,115 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -"""A setuptools based setup module. - -See: -https://packaging.python.org/en/latest/distributing.html -https://github.com/pypa/sampleproject -""" -# For matching the version string. -import re - -# To use a consistent encoding -from codecs import open -from os import path - -# Always prefer setuptools over distutils -from setuptools import find_packages, setup - -this_module = "notification" -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, "README.md"), encoding="utf-8") as f: - long_description = f.read() - - -def read(*parts): - with open(path.join(here, *parts), "r") as fp: - return fp.read() - - -def find_version(*file_paths): - version_file = read(*file_paths) - version_match = re.search(r"^___version___ = ['\"]([^'\"]*)['\"]", version_file, re.M) - if version_match: - return version_match.group(1) - raise RuntimeError("Unable to find version string.") - - -requires = [ - "pycapo", - "pyramid", - "pyramid_beaker", - "pyramid_debugtoolbar", - "pyramid_tm", - "pyramid_retry", - "pyopenssl", - "requests", - "ssa-schema", - "sqlalchemy==1.4.46", - "waitress", - "ssa-workspaces", - "zope.sqlalchemy", - "sentry-sdk==1.5.10", -] - -# Setup comment -setup( - name="ssa-" + this_module, - # Versions should comply with PEP440. For a discussion on single-sourcing - # the version across setup.py and the project code, see - # https://packaging.python.org/en/latest/single_source_version.html - version=find_version(this_module, "_version.py"), - use_scm_version=True, - setup_requires=["setuptools_scm"], - description="Notification: the Workspaces Notification Service", - long_description=long_description, - # Author details - author="Science Support and Archive", - author_email="ssa-announcements@nrao.edu", - # Choose your license - license="GPL", - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - "Development Status :: 4 - Beta", - # Indicate who your project is intended for - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - # Pick your license as you wish (should match "license" above) - "License :: OSI Approved :: GPL License", - # Specify the Python versions you support here. In particular, ensure - # that you indicate whether you support Python 2, Python 3 or both. - "Programming Language :: Python :: 3.6", - ], - install_requires=requires, - tests_require=["ssa-testing"], - extras_require={ - "dev": [ - "pyramid_debugtoolbar", - ], - }, - packages=find_packages(), - entry_points={ - "paste.app_factory": ["main = notification.server:main"], - }, -) diff --git a/services/notification/test.ini b/services/notification/test.ini index f7e1ebf0afef1fde0e03f8ab06a72e4fa4490ef7..59f8e13a61ecd66edb2ec7dad51be4b879c6668e 100644 --- a/services/notification/test.ini +++ b/services/notification/test.ini @@ -1,5 +1,5 @@ [app:main] -use = egg:ssa-notification +use = call:notification.server:main pyramid.includes = pyramid_debugtoolbar pyramid_tm diff --git a/services/notification/test/__init__.py b/services/notification/test/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/services/notification/test/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/services/workflow/Dockerfile b/services/workflow/Dockerfile index f1766f743fc4af906bdf9ae6226281661b2bcdc5..937408b75b99c55f89d40de24b35f0e2cfc29ec4 100644 --- a/services/workflow/Dockerfile +++ b/services/workflow/Dockerfile @@ -1,17 +1,77 @@ # This is nrao:workflow -ARG TAGNAME="tmp" -FROM cache:${TAGNAME} - -# Build arg that sets environment; sets to "dev" if no build arg is given -ARG env=dev -ENV ENV=${env} -# Build arg that sets Workspace version; sets to "unknown-version" if no build arg is given +ARG LOCAL_OR_SERVER_PEX=local-pex +FROM python:3.10-slim-buster as base ARG WS_VERSION=unknown-version -ENV WS_VERSION=${WS_VERSION} +ARG DEPLOY_ENV +ENV DEPLOY_ENV=${DEPLOY_ENV} + +ARG ENV_HOST +ENV ENV_HOST=${ENV_HOST} +ARG API_TOKEN + +# Environment variables +ENV PIP_NO_CACHE_DIR false +ENV CAPO_PROFILE docker +ENV CAPO_PATH /home/ssa/capo + +# Get postgres/mysql development stuff in the image +RUN apt update \ + && apt install -y --no-install-recommends \ + gcc \ + libmariadb-dev-compat \ + libpq-dev \ + jq \ + curl \ + && rm -rf /var/lib/apt/lists + +# Create vlapipe group and create vlapipe user placed in vlapipe group +RUN addgroup --gid 6000 vlapipe && \ + useradd --create-home --comment "" --gid 6000 --uid 6000 vlapipe + +# Create almapipe group and create almapipe user placed in almapipe group +RUN addgroup --gid 9233 almapipe && \ + useradd --create-home --comment "" --gid 9233 --uid 9233 almapipe + +# needed for unit tests +USER vlapipe +WORKDIR /home/ssa/capo +COPY --chown=vlapipe:vlapipe docker.properties docker.properties + + +USER root +WORKDIR /code/ +RUN chown vlapipe . && chgrp vlapipe . + +# Switch to appuser and set ownership of docker.properties to vlapipe and the vlapipe group +USER vlapipe +RUN curl -sSL https://install.python-poetry.org | python3 - + +ENV PATH "${PATH}:/home/vlapipe/.local/bin" +COPY --chown=vlapipe:vlapipe ./shared ./shared +COPY --chown=vlapipe:vlapipe ./apps/cli ./apps/cli +RUN pip install --upgrade pip + +FROM base as local-pex +COPY --chown=vlapipe:vlapipe ./services/workflow/requirements.txt ./requirements.txt +COPY --chown=vlapipe:vlapipe ./test-requirements.txt ./test-requirements.txt +RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} pip install --user -r requirements.txt +RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} pip install --user -r test-requirements.txt + +FROM base as server-pex USER root +COPY --chown=vlapipe:vlapipe ./services/workflow/gitlab-requirements.txt ./requirements.txt +COPY --chown=vlapipe:vlapipe ./test-requirements.txt ./test-requirements.txt +RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} pip install --user -r requirements.txt --extra-index-url https://${API_TOKEN}@gitlab.nrao.edu/api/v4/projects/621/packages/pypi/simple +RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} pip install --user -r test-requirements.txt + +#COPY --chown=vlapipe:vlapipe ./services/workflow/bin/install-pexes.sh ./install-pexes.sh +#RUN . ./install-pexes.sh + +FROM ${LOCAL_OR_SERVER_PEX} as pex-base # HTCondor install +USER root RUN apt update && apt install -y curl gnupg apt-transport-https RUN curl -fsSL https://research.cs.wisc.edu/htcondor/repo/keys/HTCondor-9.0-Key | apt-key add - RUN echo "deb [arch=amd64] https://research.cs.wisc.edu/htcondor/repo/debian/9.0 buster main" > /etc/apt/sources.list.d/htcondor.list @@ -20,32 +80,42 @@ RUN apt update && apt install -y procps htcondor nano # HTCondor setup # Copy over HTCondor submit node config -COPY ./config/htcondor/00-htcondor-9.0.config /etc/condor/config.d/00-htcondor-9.0.config -COPY ./config/htcondor/submit/99-workspaces-submit.${ENV}.conf /etc/condor/config.d/99-workspaces-submit.${ENV}.conf -COPY ./config/htcondor/submit/nrao-nofile.conf /etc/security/limits.d/nrao-nofile.conf - -# Change working directory to /code -WORKDIR /code +# 00-htcondor-9.0.config is environment specific, copy handled later +COPY /config/htcondor/submit/99-workspaces-submit.${DEPLOY_ENV}.conf /etc/condor/config.d/99-workspaces-submit.${DEPLOY_ENV}.conf +COPY /config/htcondor/submit/nrao-nofile.conf /etc/security/limits.d/nrao-nofile.conf # set ownership of /code directory to vlapipe:vlapipe +WORKDIR /code RUN chown vlapipe . && chgrp vlapipe . -# Switch to vlapipe -USER vlapipe - # Copy service directory to /code in the image # set ownership of content to vlapipe and the vlapipe group -COPY --chown=vlapipe:vlapipe ./services/workflow ./ +USER vlapipe +COPY --chown=vlapipe:vlapipe ./services/workflow ./services/workflow +WORKDIR /code/services/workflow +RUN poetry install + +# Needed for nraorsync to work with the RADIAL cluster +COPY /config/htcondor/submit/condor_ssh_config /home/vlapipe/.ssh/condor_ssh_config +FROM pex-base as prod +ARG WS_VERSION=unknown-version ENV PYTHONPATH "${PYTHONPATH}:/home/vlapipe/.local" ENV PATH "${PATH}:/home/vlapipe/.local/bin" -RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} python setup.py develop --user +USER root +COPY /config/htcondor/00-htcondor-9.0.config /etc/condor/config.d/00-htcondor-9.0.config -# Set Capo for build stage -# Gets reset to proper environment's profile in the deploy stage -ENV CAPO_PROFILE docker +CMD /code/services/workflow/bin/boot-condor-and-workflow.sh + +FROM pex-base as dev +ARG WS_VERSION=unknown-version +ENV PYTHONPATH "${PYTHONPATH}:/home/vlapipe/.local" +ENV PATH "${PATH}:/home/vlapipe/.local/bin" +ENV PATH $PATH:/lustre/aoc/pipeline/$CAPO_PROFILE/workflow USER root +COPY /config/htcondor/00-htcondor-9.0.local.config /etc/condor/config.d/00-htcondor-9.0.config -CMD /code/bin/boot-condor-and-workflow.sh +RUN condor_master +CMD /code/services/workflow/bin/boot-condor-and-workflow.sh diff --git a/services/workflow/Dockerfile.local b/services/workflow/Dockerfile.local deleted file mode 100644 index d7bef48ba6c840cee10231e5ad889de9541b2ed5..0000000000000000000000000000000000000000 --- a/services/workflow/Dockerfile.local +++ /dev/null @@ -1,54 +0,0 @@ -# Workflow service layer -# This is nrao:workflow -ARG TAGNAME="tmp" -FROM cache:${TAGNAME} - - - - -# Build arg that sets Workspace version; sets to "unknown-version" if no build arg is given -ARG WS_VERSION=unknown-version -ENV WS_VERSION=${WS_VERSION} - -USER root - -# HTCondor install -RUN apt update && apt install -y curl gnupg apt-transport-https -RUN curl -fsSL https://research.cs.wisc.edu/htcondor/repo/keys/HTCondor-9.0-Key | apt-key add - -RUN echo "deb [arch=amd64] https://research.cs.wisc.edu/htcondor/repo/debian/9.0 buster main" > /etc/apt/sources.list.d/htcondor.list -RUN echo "deb-src https://research.cs.wisc.edu/htcondor/repo/debian/9.0 buster main" >> /etc/apt/sources.list.d/htcondor.list -RUN apt update && apt install -y procps htcondor - -# HTCondor setup -# Copy the local env HTCondor config file -COPY ./config/htcondor/00-htcondor-9.0.local.config /etc/condor/config.d/00-htcondor-9.0.config -# Copy over HTCondor submit node config -COPY ./config/htcondor/submit/99-workspaces-submit.conf /etc/condor/config.d/99-workspaces-submit.conf -COPY ./config/htcondor/submit/nrao-nofile.conf /etc/security/limits.d/nrao-nofile.conf - -# Get workflow code into the image -WORKDIR /code - -# set ownership of /code directory to vlapipe:vlapipe -RUN chown vlapipe . && chgrp vlapipe . - -# Switch to vlapipe -USER vlapipe - -# Copy service directory to /code in the image -# set ownership of content to vlapipe and the vlapipe group -COPY --chown=vlapipe:vlapipe ./services/workflow ./ - -# Python library installation -RUN SETUPTOOLS_SCM_PRETEND_VERSION=${WS_VERSION} python setup.py develop --user - - -# Set Capo -ENV CAPO_PROFILE docker -ENV PATH $PATH:/lustre/aoc/pipeline/$CAPO_PROFILE/workflow - -USER root - -RUN condor_master - -CMD /code/bin/boot-condor-and-workflow.sh diff --git a/services/workflow/Dockerfile.oracle.local b/services/workflow/Dockerfile.oracle.local deleted file mode 100644 index a16c30548cc175e2169eaae7f5c216ccb56d07f3..0000000000000000000000000000000000000000 --- a/services/workflow/Dockerfile.oracle.local +++ /dev/null @@ -1,45 +0,0 @@ -# FROM python:3.8-slim-buster -FROM ssa-containers.aoc.nrao.edu/ops/base:workspaces - -# Installing Oracle instant client -WORKDIR /opt/oracle -RUN apt-get update && apt-get install -y libaio1 wget unzip \ - && wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip \ - && unzip instantclient-basiclite-linuxx64.zip \ - && rm -f instantclient-basiclite-linuxx64.zip \ - && cd /opt/oracle/instantclient* \ - && rm -f *jdbc* *occi* *mysql* *README *jar uidrvci genezi adrci \ - && echo /opt/oracle/instantclient* > /etc/ld.so.conf.d/oracle-instantclient.conf \ - && ldconfig - -# Set Capo -ARG capo_env=dsoc-dev -ENV CAPO_PROFILE $capo_env - -# Get workflow code into the image -WORKDIR /packages/ -COPY ./shared ./shared -COPY ./apps/cli ./apps/cli -COPY ./testing ./testing - -WORKDIR /code - -COPY ./services/workflow ./ - -RUN pip3 install pipenv -RUN pipenv install -EXPOSE 8000 - -RUN pip install -r requirements.txt \ - && python setup.py develop - -# For this statement to work you need to add the next two lines into Pipfilefile -# [scripts] -# server = "python manage.py runserver 0.0.0.0:8000" -# ENTRYPOINT ["pipenv", "run", "server"] - -WORKDIR /packages/apps/cli/executables/productfetcher/tests -RUN pytest -# RUN python setup.py develop - -CMD ["pserve", "--reload", "/code/dev.ini"] diff --git a/services/workflow/LICENSE b/services/workflow/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/services/workflow/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/services/workflow/README.md b/services/workflow/README.md index 0d6fe60fddc26df6d88f16a3cc04b2dbb4ba8626..62563bdd3dca90ae1f1d0822d837fc44b37d09c6 100644 --- a/services/workflow/README.md +++ b/services/workflow/README.md @@ -21,3 +21,4 @@ To see available workflows: To view the metadata of a workflow request: - localhost:4444/workflows/std_calibration/requests/{workflow_request_id} + diff --git a/services/workflow/bin/boot-condor-and-workflow.sh b/services/workflow/bin/boot-condor-and-workflow.sh index 24e76c031effbd19ffde28181f044182c8967068..16a563b5dbe2591d67bb8a2ac2b83bb48e326a18 100755 --- a/services/workflow/bin/boot-condor-and-workflow.sh +++ b/services/workflow/bin/boot-condor-and-workflow.sh @@ -55,15 +55,19 @@ mkdir -p "$STORAGE_DIR" # Copy wf_framework shell scripts to workflow dir echo "Copying wf_framework shell scripts to /lustre/aoc/cluster/pipeline/${CAPO_PROFILE}/workspaces/sbin" -cp -a /packages/apps/cli/executables/wf_framework/sh/. "$WORKFLOW_DIR" -cp -a /packages/apps/cli/executables/wf_framework/ingest_requirements/. "$WORKFLOW_DIR" -cp -R /packages/apps/cli/executables/wf_framework/casa_requirements/.matplotlib "$WORKFLOW_DIR" +cp -a /code/apps/cli/executables/wf_framework/sh/. "$WORKFLOW_DIR" +cp -a /code/apps/cli/executables/wf_framework/ingest_requirements/. "$WORKFLOW_DIR" +cp -R /code/apps/cli/executables/wf_framework/casa_requirements/.matplotlib "$WORKFLOW_DIR" + # Make the locations accessible with vlapipe echo "Handling vlapipe permissions" chown root:vlapipe "$WORKFLOW_DIR" chown root:vlapipe "$WORKFLOW_DIR"/* +# Can't deploy ingest from Archive if owned by root, WS is no longer building this pex +chown vlapipe:vlapipe "$WORKFLOW_DIR"/ingest +chown vlapipe:vlapipe "$WORKFLOW_DIR"/curator chown vlapipe:vlapipe "$SPOOL_DIR" chown vlapipe:vlapipe "$QA_DIR" chown vlapipe:vlapipe "$WEBLOG_DIR" @@ -75,4 +79,4 @@ chmod 777 "$WORKFLOW_DIR" chmod 777 "$WORKFLOW_DIR"/* echo "Starting workflow service" -su vlapipe -c "/code/bin/boot-workflow.sh" +su vlapipe -c "/code/services/workflow/bin/boot-workflow.sh" diff --git a/services/workflow/bin/boot-workflow.sh b/services/workflow/bin/boot-workflow.sh index 36dd3f8a9de7186cef0548b1c9b5aad28a9aed56..b6b0a6ebed44522aeb790c9dc0c136c1581bd046 100755 --- a/services/workflow/bin/boot-workflow.sh +++ b/services/workflow/bin/boot-workflow.sh @@ -22,11 +22,11 @@ set -e set -o pipefail # Return to base /code directory -cd /code +cd /code/services/workflow # Start Pyramid server if [ "${CAPO_PROFILE}" = "dsoc-prod" ]; then - pserve --reload prod.ini + poetry run pserve --reload prod.ini else - pserve --reload dev.ini + poetry run pserve --reload dev.ini fi diff --git a/services/workflow/bin/config/.coveragerc b/services/workflow/bin/config/.coveragerc deleted file mode 100644 index 2e457e73ea93fe9a73de87d5162b6762570f9c03..0000000000000000000000000000000000000000 --- a/services/workflow/bin/config/.coveragerc +++ /dev/null @@ -1,8 +0,0 @@ -[paths] -source = - ./services/workflow/ - /code/ -[run] -source = - /code/ - /packages/apps/cli diff --git a/services/workflow/bin/run-tests.sh b/services/workflow/bin/run-tests.sh deleted file mode 100755 index 811540de601d5749ced7b21ae5235ae4cfeb42c4..0000000000000000000000000000000000000000 --- a/services/workflow/bin/run-tests.sh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/bash -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. - -# Set failfast -set -e -set -o pipefail - -echo "Happy Testing!" - -# Set path to service unit tests -path_to_test="test" - -# Set skip behavior -skip_arg="--skip-empty" - -# Install testing requirements -init () { - pushd /packages/testing - python setup.py develop --user - popd - -# if exists, remove old .coverage file - if [[ -e .coverage ]]; then - echo "Removing old coverage file..." - rm .coverage - fi -} - -run_tests () { - # Look for lines in requirements.txt starting with "-e" - # to find paths to packages containing tests to be executed. - pkgs+=($((echo "$path_to_test"; sed -n "s|-e ..||p" requirements.txt) | grep -v testing | grep -v do-not-test | tr "\n" " ")) - - for pkg in "${pkgs[@]}" - do - cd "$pkg" || exit - if [[ $# -eq 0 ]]; then - pytest - else - pytestWithCoverage $1 - fi - cd /code/ || exit - done -} - -pytestWithCoverage () { - coverage run --parallel-mode --branch -m pytest - if [ "$1" == "b" ]; then - cd /code/ && coverage combine --rcfile="/code/bin/config/.coveragerc" --append "$pkg" && cd "$pkg" - else - cd /code/ && coverage combine --append "$pkg" && cd "$pkg" - fi -} - -while getopts "cbr:o:" OPTION -do - case $OPTION in - c) - init - run_tests "$OPTION" - coverage report "$skip_arg" --omit="**/test_*.py,**/_version.py,**/conftest.py,**/*interfaces.py" - ;; - b) - init - run_tests "$OPTION" - ;; - r) - echo "Generating coverage report as: $OPTARG" - report_output=$OPTARG - ;; - o) - echo "Naming coverage report: $OPTARG" - report_name=$OPTARG - ;; - \?) - echo "Option not recognized" - exit - ;; - esac -done - -if [[ $# -eq 0 ]] ; then - init - run_tests -fi - -if [[ -n $report_output ]]; then - if [[ -n $report_name ]]; then - coverage "$report_output" -o $report_name.$report_output "$skip_arg" - else - coverage "$report_output" "$skip_arg" - fi -fi - -echo "Tests have finished." diff --git a/services/workflow/dev.ini b/services/workflow/dev.ini index 216dfbe6db545f3036d747aa08e90d56a3a05870..d1cb611112687586b2398f9ae5b0681e97d2a9cc 100644 --- a/services/workflow/dev.ini +++ b/services/workflow/dev.ini @@ -1,5 +1,5 @@ [app:main] -use = egg:ssa-workflow +use = call:workflow.server:main pyramid.includes = pyramid_debugtoolbar pyramid_tm diff --git a/services/workflow/gitlab-requirements.txt b/services/workflow/gitlab-requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..603faf0e1d3c336eb1211c49feab8f623e110625 --- /dev/null +++ b/services/workflow/gitlab-requirements.txt @@ -0,0 +1,14 @@ +# Pex requirements pulled from gitlab +carta-envoy==2.8.2rc1 +casa-envoy==2.8.2rc1 +conveyor==2.8.2rc1 +deliver==2.8.2rc1 +ingest-envoy==2.8.2rc1 +mediator==2.8.2rc1 +null==2.8.2rc1 +productfetcher==2.8.2rc1 +update-stage==2.8.2rc1 +vela==2.8.2rc1 +wf-inspector==2.8.2rc1 +ws-annihilator==2.8.2rc1 +ws-metrics==2.8.2rc1 \ No newline at end of file diff --git a/services/workflow/poetry.lock b/services/workflow/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..ec7d48f14ead2ba68e2f3b0780f5fab3fb1f4543 --- /dev/null +++ b/services/workflow/poetry.lock @@ -0,0 +1,1192 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "amqp" +version = "5.1.1" +description = "Low-level AMQP client for Python (fork of amqplib)." +optional = false +python-versions = ">=3.6" +files = [ + {file = "amqp-5.1.1-py3-none-any.whl", hash = "sha256:6f0956d2c23d8fa6e7691934d8c3930eadb44972cbbd1a7ae3a520f735d43359"}, + {file = "amqp-5.1.1.tar.gz", hash = "sha256:2c1b13fecc0893e946c65cbd5f36427861cffa4ea2201d8f6fca22e2a373b5e2"}, +] + +[package.dependencies] +vine = ">=5.0.0" + +[[package]] +name = "beaker" +version = "1.12.1" +description = "A Session and Caching library with WSGI Middleware" +optional = false +python-versions = "*" +files = [ + {file = "Beaker-1.12.1.tar.gz", hash = "sha256:57770b40956e6c5cf1d8221dc59519029e470080ed8d3065c4e6ab36ce7e3c81"}, +] + +[package.extras] +crypto = ["pycryptopp (>=0.5.12)"] +cryptography = ["cryptography"] +pycrypto = ["pycrypto"] +pycryptodome = ["pycryptodome"] +testsuite = ["Mock", "coverage", "cryptography", "pycryptodome", "pylibmc", "pymongo", "pytest", "python-memcached", "redis", "sqlalchemy", "webtest"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "chevron" +version = "0.14.0" +description = "Mustache templating language renderer" +optional = false +python-versions = "*" +files = [ + {file = "chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443"}, + {file = "chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cx-oracle" +version = "8.3.0" +description = "Python interface to Oracle" +optional = false +python-versions = "*" +files = [ + {file = "cx_Oracle-8.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b6a23da225f03f50a81980c61dbd6a358c3575f212ca7f4c22bb65a9faf94f7f"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win32.whl", hash = "sha256:715a8bbda5982af484ded14d184304cc552c1096c82471dd2948298470e88a04"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:07f01608dfb6603a8f2a868fc7c7bdc951480f187df8dbc50f4d48c884874e6a"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4b3afe7a911cebaceda908228d36839f6441cbd38e5df491ec25960562bb01a0"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win32.whl", hash = "sha256:076ffb71279d6b2dcbf7df028f62a01e18ce5bb73d8b01eab582bf14a62f4a61"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b82e4b165ffd807a2bd256259a6b81b0a2452883d39f987509e2292d494ea163"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b902db61dcdcbbf8dd981f5a46d72fef40c5150c7fc0eb0f0698b462d6eb834e"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win32.whl", hash = "sha256:4c82ca74442c298ceec56d207450c192e06ecf8ad52eb4aaad0812e147ceabf7"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:54164974d526b76fdefb0b66a42b68e1fca5df78713d0eeb8c1d0047b83f6bcf"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:410747d542e5f94727f5f0e42e9706c772cf9094fb348ce965ab88b3a9e4d2d8"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win32.whl", hash = "sha256:3baa878597c5fadb2c72f359f548431c7be001e722ce4a4ebdf3d2293a1bb70b"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:de42bdc882abdc5cea54597da27a05593b44143728e5b629ad5d35decb1a2036"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df412238a9948340591beee9ec64fa62a2efacc0d91107034a7023e2991fba97"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win32.whl", hash = "sha256:70d3cf030aefd71f99b45beba77237b2af448adf5e26be0db3d0d3dee6ea4230"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf01ce87edb4ef663b2e5bd604e1e0154d2cc2f12b60301f788b569d9db8a900"}, + {file = "cx_Oracle-8.3.0.tar.gz", hash = "sha256:3b2d215af4441463c97ea469b9cc307460739f89fdfa8ea222ea3518f1a424d9"}, +] + +[[package]] +name = "dnspython" +version = "2.3.0" +description = "DNS toolkit" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, + {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, +] + +[package.extras] +curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] +dnssec = ["cryptography (>=2.6,<40.0)"] +doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] +doq = ["aioquic (>=0.9.20)"] +idna = ["idna (>=2.1,<4.0)"] +trio = ["trio (>=0.14,<0.23)"] +wmi = ["wmi (>=1.5.1,<2.0.0)"] + +[[package]] +name = "email-validator" +version = "2.0.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.7" +files = [ + {file = "email_validator-2.0.0-py3-none-any.whl", hash = "sha256:07c61b62ee446e39274b18204afa8e422baf64570776045272b04d10c02f64f6"}, + {file = "email_validator-2.0.0.tar.gz", hash = "sha256:f4904f4145c11f8de5897afbb8d7db4b465c57f13db1c8c106c16d02bceebd9a"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "hupper" +version = "1.12" +description = "Integrated process monitor for developing and reloading daemons." +optional = false +python-versions = ">=3.7" +files = [ + {file = "hupper-1.12-py3-none-any.whl", hash = "sha256:b8bc41bb75939e816f30f118026d0ba99544af4d6992583df3b4813765af27ef"}, + {file = "hupper-1.12.tar.gz", hash = "sha256:18b1653d9832c9f8e7d3401986c7e7af2ae6783616be0bc406bfe0b14134a5c6"}, +] + +[package.extras] +docs = ["Sphinx", "pylons-sphinx-themes", "setuptools", "watchdog"] +testing = ["mock", "pytest", "pytest-cov", "watchdog"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "immutable-views" +version = "0.6.1" +description = "Immutable views on other collection objects" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "immutable-views-0.6.1.tar.gz", hash = "sha256:48e0543786e8a196667fb8412ce35c4f555ce08f39eab21dcf4b0a23d8d19295"}, + {file = "immutable_views-0.6.1-py2.py3-none-any.whl", hash = "sha256:549dbe1106c53e26da28e1ab0f19f54ff20592cc6590f791ffd060de140c1aff"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "kombu" +version = "5.3.1" +description = "Messaging library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "kombu-5.3.1-py3-none-any.whl", hash = "sha256:48ee589e8833126fd01ceaa08f8a2041334e9f5894e5763c8486a550454551e9"}, + {file = "kombu-5.3.1.tar.gz", hash = "sha256:fbd7572d92c0bf71c112a6b45163153dea5a7b6a701ec16b568c27d0fd2370f2"}, +] + +[package.dependencies] +amqp = ">=5.1.1,<6.0.0" +vine = "*" + +[package.extras] +azureservicebus = ["azure-servicebus (>=7.10.0)"] +azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] +confluentkafka = ["confluent-kafka (==2.1.1)"] +consul = ["python-consul2"] +librabbitmq = ["librabbitmq (>=2.0.0)"] +mongodb = ["pymongo (>=4.1.1)"] +msgpack = ["msgpack"] +pyro = ["pyro4"] +qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] +redis = ["redis (>=4.5.2)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] +sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=2.8.0)"] + +[[package]] +name = "mako" +version = "1.2.4" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, + {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "marshmallow" +version = "3.19.0" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.7" +files = [ + {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, + {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "messaging" +version = "2.8.2rc1" +description = "SSA Messaging is an AMQP-based asynchronous messaging system based on passing simple Python objects as JSON." +optional = false +python-versions = "^3.10" +files = [] +develop = false + +[package.dependencies] +kombu = "^5.2.4" +pycapo = "^0.3.1" + +[package.source] +type = "directory" +url = "../../shared/messaging" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pastedeploy" +version = "3.0.1" +description = "Load, configure, and compose WSGI applications and servers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "PasteDeploy-3.0.1-py3-none-any.whl", hash = "sha256:6195c921b1c3ed9722e4e3e6aa29b70deebb2429b4ca3ff3d49185c8e80003bb"}, + {file = "PasteDeploy-3.0.1.tar.gz", hash = "sha256:5f4b4d5fddd39b8947ea727161e366bf55b90efc60a4d1dd7976b9031d0b4e5f"}, +] + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] +paste = ["Paste"] +testing = ["Paste", "pytest", "pytest-cov"] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + +[[package]] +name = "plaster" +version = "1.1.2" +description = "A loader interface around multiple config file formats." +optional = false +python-versions = ">=3.7" +files = [ + {file = "plaster-1.1.2-py2.py3-none-any.whl", hash = "sha256:42992ab1f4865f1278e2ad740e8ad145683bb4022e03534265528f0c23c0df2d"}, + {file = "plaster-1.1.2.tar.gz", hash = "sha256:f8befc54bf8c1147c10ab40297ec84c2676fa2d4ea5d6f524d9436a80074ef98"}, +] + +[package.extras] +docs = ["Sphinx", "pylons-sphinx-themes"] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "plaster-pastedeploy" +version = "1.0.1" +description = "A loader implementing the PasteDeploy syntax to be used by plaster." +optional = false +python-versions = ">=3.7" +files = [ + {file = "plaster_pastedeploy-1.0.1-py2.py3-none-any.whl", hash = "sha256:ad3550cc744648969ed3b810f33c9344f515ee8d8a8cec18e8f2c4a643c2181f"}, + {file = "plaster_pastedeploy-1.0.1.tar.gz", hash = "sha256:be262e6d2e41a7264875daa2fe2850cbb0615728bcdc92828fdc72736e381412"}, +] + +[package.dependencies] +PasteDeploy = ">=2.0" +plaster = ">=0.5" + +[package.extras] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prometheus-client" +version = "0.4.1" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = "*" +files = [ + {file = "prometheus_client-0.4.1.tar.gz", hash = "sha256:2c0ddba8b9dc5e06de7578a7b25e4becafd6880e6d727bc0a73f8d826c1b0112"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "psycopg2" +version = "2.9.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "psycopg2-2.9.6-cp310-cp310-win32.whl", hash = "sha256:f7a7a5ee78ba7dc74265ba69e010ae89dae635eea0e97b055fb641a01a31d2b1"}, + {file = "psycopg2-2.9.6-cp310-cp310-win_amd64.whl", hash = "sha256:f75001a1cbbe523e00b0ef896a5a1ada2da93ccd752b7636db5a99bc57c44494"}, + {file = "psycopg2-2.9.6-cp311-cp311-win32.whl", hash = "sha256:53f4ad0a3988f983e9b49a5d9765d663bbe84f508ed655affdb810af9d0972ad"}, + {file = "psycopg2-2.9.6-cp311-cp311-win_amd64.whl", hash = "sha256:b81fcb9ecfc584f661b71c889edeae70bae30d3ef74fa0ca388ecda50b1222b7"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win32.whl", hash = "sha256:11aca705ec888e4f4cea97289a0bf0f22a067a32614f6ef64fcf7b8bfbc53744"}, + {file = "psycopg2-2.9.6-cp36-cp36m-win_amd64.whl", hash = "sha256:36c941a767341d11549c0fbdbb2bf5be2eda4caf87f65dfcd7d146828bd27f39"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win32.whl", hash = "sha256:869776630c04f335d4124f120b7fb377fe44b0a7645ab3c34b4ba42516951889"}, + {file = "psycopg2-2.9.6-cp37-cp37m-win_amd64.whl", hash = "sha256:a8ad4a47f42aa6aec8d061fdae21eaed8d864d4bb0f0cade5ad32ca16fcd6258"}, + {file = "psycopg2-2.9.6-cp38-cp38-win32.whl", hash = "sha256:2362ee4d07ac85ff0ad93e22c693d0f37ff63e28f0615a16b6635a645f4b9214"}, + {file = "psycopg2-2.9.6-cp38-cp38-win_amd64.whl", hash = "sha256:d24ead3716a7d093b90b27b3d73459fe8cd90fd7065cf43b3c40966221d8c394"}, + {file = "psycopg2-2.9.6-cp39-cp39-win32.whl", hash = "sha256:1861a53a6a0fd248e42ea37c957d36950da00266378746588eab4f4b5649e95f"}, + {file = "psycopg2-2.9.6-cp39-cp39-win_amd64.whl", hash = "sha256:ded2faa2e6dfb430af7713d87ab4abbfc764d8d7fb73eafe96a24155f906ebf5"}, + {file = "psycopg2-2.9.6.tar.gz", hash = "sha256:f15158418fd826831b28585e2ab48ed8df2d0d98f502a2b4fe619e7d5ca29011"}, +] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyramid" +version = "2.0.1" +description = "The Pyramid Web Framework, a Pylons project" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyramid-2.0.1-py3-none-any.whl", hash = "sha256:2f902589405ddc775e908bfdafebc92e836ffd85e1fd2a81dd724832cfae4d81"}, + {file = "pyramid-2.0.1.tar.gz", hash = "sha256:fabfd745039e26ad5b0915fc396e8725c0f8a3d17b941f9611ecd1ed76cfe7da"}, +] + +[package.dependencies] +hupper = ">=1.5" +plaster = "*" +plaster-pastedeploy = "*" +setuptools = "*" +translationstring = ">=0.4" +venusian = ">=1.0" +webob = ">=1.8.3" +"zope.deprecation" = ">=3.5.0" +"zope.interface" = ">=3.8.0" + +[package.extras] +docs = ["Sphinx (>=3.0.0)", "docutils", "pylons-sphinx-latesturl", "pylons-sphinx-themes (>=1.0.8)", "repoze.sphinx.autointerface", "sphinx-copybutton", "sphinxcontrib-autoprogram"] +testing = ["coverage", "pytest (>=5.4.2)", "pytest-cov", "webtest (>=1.3.1)", "zope.component (>=4.0)"] + +[[package]] +name = "pyramid-beaker" +version = "0.8" +description = "Beaker session factory backend for Pyramid" +optional = false +python-versions = "*" +files = [ + {file = "pyramid_beaker-0.8.tar.gz", hash = "sha256:77dc658c2c84c8c384b6c07f60dd9d2ccaa30df97a147c790db43636f1e8d441"}, +] + +[package.dependencies] +beaker = "*" +pyramid = "*" + +[package.extras] +docs = ["Sphinx", "docutils"] +testing = ["coverage", "nose"] + +[[package]] +name = "pyramid-debugtoolbar" +version = "4.10" +description = "A package which provides an interactive HTML debugger for Pyramid application development" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyramid_debugtoolbar-4.10-py3-none-any.whl", hash = "sha256:0cfef31c4b3ffd3208d15a6fd3e91019c9ec1e1d510c6d1c5cbc9c1a9e32ed92"}, + {file = "pyramid_debugtoolbar-4.10.tar.gz", hash = "sha256:cfc8cfaf342609577fbb93e899fbb2290b31e3418c4b68f0dae37cb3b60fe88b"}, +] + +[package.dependencies] +Pygments = "*" +pyramid = ">=1.4" +pyramid-mako = ">=0.3.1" + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes (>=0.3)", "setuptools"] +testing = ["WebTest", "pytest", "pytest-cov", "sqlalchemy", "webob"] + +[[package]] +name = "pyramid-mako" +version = "1.1.0" +description = "Mako template bindings for the Pyramid web framework" +optional = false +python-versions = "*" +files = [ + {file = "pyramid_mako-1.1.0-py2.py3-none-any.whl", hash = "sha256:76104592d292b6974cf7080aa52405c51f396a621535f01e274d7fe546e85a43"}, + {file = "pyramid_mako-1.1.0.tar.gz", hash = "sha256:0066c863441f1c3ddea60cee1ccc50d00a91a317a8052ca44131da1a12a840e2"}, +] + +[package.dependencies] +Mako = ">=1.1.0" +pyramid = "*" + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.8)", "repoze.sphinx.autointerface"] +testing = ["WebTest (>=1.3.1)", "coverage", "nose"] + +[[package]] +name = "pyramid-retry" +version = "2.1.1" +description = "An execution policy for Pyramid that supports retrying requests after certain failure exceptions." +optional = false +python-versions = "*" +files = [ + {file = "pyramid_retry-2.1.1-py2.py3-none-any.whl", hash = "sha256:b5129a60eb9d7409234ea52839006426d2ae887b4a1f0530c75ec336cabf2476"}, + {file = "pyramid_retry-2.1.1.tar.gz", hash = "sha256:baa8276ae68babad09e5f2f94efc4f7421f3b8fb526151df522052f8cd3ec0c9"}, +] + +[package.dependencies] +pyramid = ">=1.9" +"zope.interface" = "*" + +[package.extras] +docs = ["Sphinx", "pylons-sphinx-themes", "repoze.sphinx.autointerface"] +testing = ["WebTest", "pytest", "pytest-cov"] + +[[package]] +name = "pyramid-tm" +version = "2.5" +description = "A package which allows Pyramid requests to join the active transaction" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyramid_tm-2.5-py2.py3-none-any.whl", hash = "sha256:6638721946e809de8b4bf3f405bd2daaaa76d58442cbdf46be30ebc259f1a354"}, + {file = "pyramid_tm-2.5.tar.gz", hash = "sha256:5c81dcecd33770f5e3596687d2be35ffc4f8ce5eda00a31acb00ae35a51430d0"}, +] + +[package.dependencies] +pyramid = ">=1.5" +transaction = ">=2.0" + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "pylons-sphinx-themes (>=1.0.9)"] +testing = ["WebTest", "coverage (>=5.0)", "pytest", "pytest-cov"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sqlalchemy" +version = "1.4.47" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.47-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:dcfb480bfc9e1fab726003ae00a6bfc67a29bad275b63a4e36d17fe7f13a624e"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28fda5a69d6182589892422c5a9b02a8fd1125787aab1d83f1392aa955bf8d0a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win32.whl", hash = "sha256:45e799c1a41822eba6bee4e59b0e38764e1a1ee69873ab2889079865e9ea0e23"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win_amd64.whl", hash = "sha256:10edbb92a9ef611f01b086e271a9f6c1c3e5157c3b0c5ff62310fb2187acbd4a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a4df53472c9030a8ddb1cce517757ba38a7a25699bbcabd57dcc8a5d53f324e"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:511d4abc823152dec49461209607bbfb2df60033c8c88a3f7c93293b8ecbb13d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbe57f39f531c5d68d5594ea4613daa60aba33bb51a8cc42f96f17bbd6305e8d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca8ab6748e3ec66afccd8b23ec2f92787a58d5353ce9624dccd770427ee67c82"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299b5c5c060b9fbe51808d0d40d8475f7b3873317640b9b7617c7f988cf59fda"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win32.whl", hash = "sha256:684e5c773222781775c7f77231f412633d8af22493bf35b7fa1029fdf8066d10"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win_amd64.whl", hash = "sha256:2bba39b12b879c7b35cde18b6e14119c5f1a16bd064a48dd2ac62d21366a5e17"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:795b5b9db573d3ed61fae74285d57d396829e3157642794d3a8f72ec2a5c719b"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:989c62b96596b7938cbc032e39431e6c2d81b635034571d6a43a13920852fb65"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b67bda733da1dcdccaf354e71ef01b46db483a4f6236450d3f9a61efdba35a"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win32.whl", hash = "sha256:9a198f690ac12a3a807e03a5a45df6a30cd215935f237a46f4248faed62e69c8"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win_amd64.whl", hash = "sha256:03be6f3cb66e69fb3a09b5ea89d77e4bc942f3bf84b207dba84666a26799c166"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:16ee6fea316790980779268da47a9260d5dd665c96f225d28e7750b0bb2e2a04"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:557675e0befafa08d36d7a9284e8761c97490a248474d778373fb96b0d7fd8de"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb2797fee8a7914fb2c3dc7de404d3f96eb77f20fc60e9ee38dc6b0ca720f2c2"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28297aa29e035f29cba6b16aacd3680fbc6a9db682258d5f2e7b49ec215dbe40"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win32.whl", hash = "sha256:998e782c8d9fd57fa8704d149ccd52acf03db30d7dd76f467fd21c1c21b414fa"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win_amd64.whl", hash = "sha256:dde4d02213f1deb49eaaf8be8a6425948963a7af84983b3f22772c63826944de"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e98ef1babe34f37f443b7211cd3ee004d9577a19766e2dbacf62fce73c76245a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a3879853208a242b5913f3a17c6ac0eae9dc210ff99c8f10b19d4a1ed8ed9b"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7120a2f72599d4fed7c001fa1cbbc5b4d14929436135768050e284f53e9fbe5e"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048509d7f3ac27b83ad82fd96a1ab90a34c8e906e4e09c8d677fc531d12c23c5"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win32.whl", hash = "sha256:6572d7c96c2e3e126d0bb27bfb1d7e2a195b68d951fcc64c146b94f088e5421a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win_amd64.whl", hash = "sha256:a6c3929df5eeaf3867724003d5c19fed3f0c290f3edc7911616616684f200ecf"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71d4bf7768169c4502f6c2b0709a02a33703544f611810fb0c75406a9c576ee1"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd45c60cc4f6d68c30d5179e2c2c8098f7112983532897566bb69c47d87127d3"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fdbb8e9d4e9003f332a93d6a37bca48ba8095086c97a89826a136d8eddfc455"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f216a51451a0a0466e082e163591f6dcb2f9ec182adb3f1f4b1fd3688c7582c"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win32.whl", hash = "sha256:bd988b3362d7e586ef581eb14771bbb48793a4edb6fcf62da75d3f0f3447060b"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win_amd64.whl", hash = "sha256:32ab09f2863e3de51529aa84ff0e4fe89a2cb1bfbc11e225b6dbc60814e44c94"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:07764b240645627bc3e82596435bd1a1884646bfc0721642d24c26b12f1df194"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e2a42017984099ef6f56438a6b898ce0538f6fadddaa902870c5aa3e1d82583"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b6d807c76c20b4bc143a49ad47782228a2ac98bdcdcb069da54280e138847fc"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a94632ba26a666e7be0a7d7cc3f7acab622a04259a3aa0ee50ff6d44ba9df0d"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win32.whl", hash = "sha256:f80915681ea9001f19b65aee715115f2ad310730c8043127cf3e19b3009892dd"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win_amd64.whl", hash = "sha256:fc700b862e0a859a37faf85367e205e7acaecae5a098794aff52fdd8aea77b12"}, + {file = "SQLAlchemy-1.4.47.tar.gz", hash = "sha256:95fc02f7fc1f3199aaa47a8a757437134cf618e9d994c84effd53f530c38586f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "transaction" +version = "3.1.0" +description = "Transaction management for Python" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "transaction-3.1.0-py2.py3-none-any.whl", hash = "sha256:8376a959aa71821df1bdd7d066858a3f9f34b7f5f1c0a0e1efbd11d626895449"}, + {file = "transaction-3.1.0.tar.gz", hash = "sha256:65d0b1ea92dbe7c4e3b237fb6bd8b41dea23d7459e7bdd8c3880bffdaf912fa4"}, +] + +[package.dependencies] +"zope.interface" = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["mock"] +testing = ["coverage", "mock", "nose"] + +[[package]] +name = "translationstring" +version = "1.4" +description = "Utility library for i18n relied on by various Repoze and Pyramid packages" +optional = false +python-versions = "*" +files = [ + {file = "translationstring-1.4-py2.py3-none-any.whl", hash = "sha256:5f4dc4d939573db851c8d840551e1a0fb27b946afe3b95aafc22577eed2d6262"}, + {file = "translationstring-1.4.tar.gz", hash = "sha256:bf947538d76e69ba12ab17283b10355a9ecfbc078e6123443f43f2107f6376f3"}, +] + +[package.extras] +docs = ["Sphinx (>=1.3.1)", "docutils", "pylons-sphinx-themes"] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "venusian" +version = "3.0.0" +description = "A library for deferring decorator actions" +optional = false +python-versions = ">=3.5" +files = [ + {file = "venusian-3.0.0-py3-none-any.whl", hash = "sha256:06e7385786ad3a15c70740b2af8d30dfb063a946a851dcb4159f9e2a2302578f"}, + {file = "venusian-3.0.0.tar.gz", hash = "sha256:f6842b7242b1039c0c28f6feef29016e7e7dd3caaeb476a193acf737db31ee38"}, +] + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +testing = ["coverage", "pytest", "pytest-cov"] + +[[package]] +name = "vine" +version = "5.0.0" +description = "Promises, promises, promises." +optional = false +python-versions = ">=3.6" +files = [ + {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"}, + {file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e"}, +] + +[[package]] +name = "waitress" +version = "2.1.2" +description = "Waitress WSGI server" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "waitress-2.1.2-py3-none-any.whl", hash = "sha256:7500c9625927c8ec60f54377d590f67b30c8e70ef4b8894214ac6e4cad233d2a"}, + {file = "waitress-2.1.2.tar.gz", hash = "sha256:780a4082c5fbc0fde6a2fcfe5e26e6efc1e8f425730863c04085769781f51eba"}, +] + +[package.extras] +docs = ["Sphinx (>=1.8.1)", "docutils", "pylons-sphinx-themes (>=1.0.9)"] +testing = ["coverage (>=5.0)", "pytest", "pytest-cover"] + +[[package]] +name = "webob" +version = "1.8.7" +description = "WSGI request and response object" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*" +files = [ + {file = "WebOb-1.8.7-py2.py3-none-any.whl", hash = "sha256:73aae30359291c14fa3b956f8b5ca31960e420c28c1bec002547fb04928cf89b"}, + {file = "WebOb-1.8.7.tar.gz", hash = "sha256:b64ef5141be559cfade448f044fa45c2260351edcb6a8ef6b7e00c7dcef0c323"}, +] + +[package.extras] +docs = ["Sphinx (>=1.7.5)", "pylons-sphinx-themes"] +testing = ["coverage", "pytest (>=3.1.0)", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "workspaces" +version = "2.8.2rc1" +description = "SSA Workspaces shared library" +optional = false +python-versions = "^3.10" +files = [] +develop = false + +[package.dependencies] +chevron = "^0.14.0" +cx-oracle = "^8.3.0" +email-validator = "2.0.0" +immutable-views = "^0.6.1" +marshmallow = "^3.19.0" +pendulum = "^2.1.2" +pycapo = "^0.3.1" +requests = "^2.29.0" +sqlalchemy = "1.4.47" +transaction = "^3.1.0" + +[package.source] +type = "directory" +url = "../../shared/workspaces" + +[[package]] +name = "zope-deprecation" +version = "5.0" +description = "Zope Deprecation Infrastructure" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "zope.deprecation-5.0-py3-none-any.whl", hash = "sha256:28c2ee983812efb4676d33c7a8c6ade0df191c1c6d652bbbfe6e2eeee067b2d4"}, + {file = "zope.deprecation-5.0.tar.gz", hash = "sha256:b7c32d3392036b2145c40b3103e7322db68662ab09b7267afe1532a9d93f640f"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx"] +test = ["zope.testrunner"] + +[[package]] +name = "zope-interface" +version = "6.0" +description = "Interfaces for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, + {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, + {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, + {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, + {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, + {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, + {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, + {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, + {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] + +[[package]] +name = "zope-sqlalchemy" +version = "2.0" +description = "Minimal Zope/SQLAlchemy transaction integration" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.sqlalchemy-2.0-py3-none-any.whl", hash = "sha256:39e13e982faeb9494d4e89f301a765bb1ea91093244de821b192ddcab70ca15b"}, + {file = "zope.sqlalchemy-2.0.tar.gz", hash = "sha256:cdf70cd57b8beb0ca9a81754abbf5c80ef0b53e8d8b2d894ac20bfc73870df12"}, +] + +[package.dependencies] +setuptools = "*" +SQLAlchemy = ">=1.1,<1.4.0 || >1.4.0,<1.4.1 || >1.4.1,<1.4.2 || >1.4.2,<1.4.3 || >1.4.3,<1.4.4 || >1.4.4,<1.4.5 || >1.4.5,<1.4.6 || >1.4.6,<2" +transaction = ">=1.6.0" +"zope.interface" = ">=3.6.0" + +[package.extras] +test = ["zope.testing"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "d7ad3ca6f57737f1b18e350b15663cb08907fdd65d41353f02018850d517caec" diff --git a/services/workflow/prod.ini b/services/workflow/prod.ini index ced82b19830a9972ff5e6f2113a59160d8adf2a1..751e996c3baba0f63d876408e7049404669af7ad 100644 --- a/services/workflow/prod.ini +++ b/services/workflow/prod.ini @@ -4,7 +4,7 @@ ### [app:main] -use = egg:ssa-workflow +use = call:workflow.server:main session.cookie_expires = true session.auto = true diff --git a/services/workflow/pyproject.toml b/services/workflow/pyproject.toml index 64b445e7adcd949b6992f3020714f21e805a4a3c..15f28d33c86c354eecbbb5cd432e33914201e0a4 100644 --- a/services/workflow/pyproject.toml +++ b/services/workflow/pyproject.toml @@ -1,9 +1,35 @@ +[tool.poetry] +name = "workflow" +version = "2.8.2rc1" +description = "Workflow: the Workspaces Workflow Service" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +pycapo = "^0.3.1" +pyramid = "^2.0.1" +pyramid-beaker = "^0.8" +pyramid-tm = "^2.5" +pyramid-retry = "^2.1.1" +requests = "^2.29.0" +sqlalchemy = "1.4.47" +waitress = "^2.1.2" +workspaces = {path = "../../shared/workspaces"} +messaging = {path = "../../shared/messaging"} +"zope.sqlalchemy" = "2.0" +immutable-views = "^0.6.1" +prometheus-client = "0.4.1" +psycopg2 = "^2.9.6" + + +[tool.poetry.group.dev.dependencies] +pyramid-debugtoolbar = "^4.10" + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + [build-system] -requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2"] - -[tool.setuptools_scm] -write_to = "workflow/_version.py" -write_to_template = """ -\"\"\"Version information for this package, don't put anything else here.\"\"\" -___version___ = '{version}' -""" +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/services/workflow/requirements.txt b/services/workflow/requirements.txt index c4e454e6b0c77412bd089c3c2676de229d17b654..ec6b80199d368fc65ab34a61b842dd961647c229 100644 --- a/services/workflow/requirements.txt +++ b/services/workflow/requirements.txt @@ -1,20 +1,3 @@ -# This file is intended to support the Dockerfile.base, not for actual development -# DO NOT MODIFY THIS FILE, THIS IS FOR DOCKER ONLY! - --e ../packages/shared/schema --e ../packages/shared/messaging --e ../packages/shared/workspaces --e ../packages/apps/cli/utilities/wf_monitor --e ../packages/apps/cli/utilities/aat_wrest --e ../packages/apps/cli/utilities/contacts_wrest --e ../packages/apps/cli/executables/pexable/mediator --e ../packages/apps/cli/executables/pexable/productfetcher --e ../packages/apps/cli/executables/pexable/deliver --e ../packages/apps/cli/executables/pexable/casa_envoy --e ../packages/apps/cli/executables/pexable/carta_envoy --e ../packages/apps/cli/executables/pexable/ingest_envoy --e ../packages/apps/cli/executables/pexable/conveyor --e ../packages/apps/cli/executables/pexable/null --e ../packages/apps/cli/executables/pexable/vela --e ../packages/apps/cli/executables/pexable/ws_metrics --e ../packages/testing +-e ../code/apps/cli/utilities/wf_monitor +-e ../code/apps/cli/utilities/aat_wrest +-e ../code/apps/cli/utilities/contacts_wrest diff --git a/services/workflow/setup.py b/services/workflow/setup.py deleted file mode 100644 index f4a9f2b6b323f13ec3076a28f6f8b14894d9f71f..0000000000000000000000000000000000000000 --- a/services/workflow/setup.py +++ /dev/null @@ -1,116 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -"""A setuptools based setup module. - -See: -https://packaging.python.org/en/latest/distributing.html -https://github.com/pypa/sampleproject -""" -# For matching the version string. -import re - -# To use a consistent encoding -from codecs import open -from os import path - -# Always prefer setuptools over distutils -from setuptools import find_packages, setup - -this_module = "workflow" -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, "README.md"), encoding="utf-8") as f: - long_description = f.read() - - -def read(*parts): - with open(path.join(here, *parts), "r") as fp: - return fp.read() - - -def find_version(*file_paths): - version_file = read(*file_paths) - version_match = re.search(r"^___version___ = ['\"]([^'\"]*)['\"]", version_file, re.M) - if version_match: - return version_match.group(1) - raise RuntimeError("Unable to find version string.") - - -requires = [ - "pycapo", - "pyramid", - "pyramid_beaker", - "pyramid_debugtoolbar", - "pyramid_tm", - "pyramid_retry", - "requests", - "ssa-schema", - "sqlalchemy==1.4.46", - "waitress", - "ssa-workspaces", - "zope.sqlalchemy", - "immutable_views", - "sentry-sdk==1.5.10", - "prometheus_client==0.4.1", -] - -# Setup comment -setup( - name="ssa-" + this_module, - # Versions should comply with PEP440. For a discussion on single-sourcing - # the version across setup.py and the project code, see - # https://packaging.python.org/en/latest/single_source_version.html - version=find_version(this_module, "_version.py"), - use_scm_version=True, - setup_requires=["setuptools_scm"], - description="Workflow: the Workspaces Workflow Service", - long_description=long_description, - # Author details - author="Science Support and Archive", - author_email="ssa-announcements@nrao.edu", - # Choose your license - license="GPL", - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - "Development Status :: 4 - Beta", - # Indicate who your project is intended for - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - # Pick your license as you wish (should match "license" above) - "License :: OSI Approved :: GPL License", - # Specify the Python versions you support here. In particular, ensure - # that you indicate whether you support Python 2, Python 3 or both. - "Programming Language :: Python :: 3.6", - ], - install_requires=requires, - tests_require=["ssa-testing"], - extras_require={ - "dev": [ - "pyramid_debugtoolbar", - ], - }, - packages=find_packages(), - entry_points={ - "paste.app_factory": ["main = workflow.server:main"], - }, -) diff --git a/services/workflow/workflow/__init__.py b/services/workflow/workflow/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..ad31cdb90f21811059cbcc6ada4c1b20aaf43d86 100644 --- a/services/workflow/workflow/__init__.py +++ b/services/workflow/workflow/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +Workflow: the Workspaces Workflow Service +""" +__version__ = "2.8.2rc1" diff --git a/services/workflow/workflow/_version.py b/services/workflow/workflow/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/services/workflow/workflow/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/services/workflow/workflow/server.py b/services/workflow/workflow/server.py index 594bfb8ae202c0fb24c447aca30a21bbcd04e1ee..937807a3a6d9d01061c73c2b65fc3fc05dadf66e 100644 --- a/services/workflow/workflow/server.py +++ b/services/workflow/workflow/server.py @@ -26,7 +26,6 @@ from json import JSONDecodeError from pathlib import Path import prometheus_client -import sentry_sdk import transaction import zope.sqlalchemy from pycapo import CapoConfig @@ -37,7 +36,6 @@ from pyramid.response import FileResponse, Response from pyramid.view import view_config, view_defaults from pyramid.wsgi import wsgiapp from pyramid_beaker import session_factory_from_settings -from sentry_sdk.integrations.pyramid import PyramidIntegration from workspaces.system.schema import get_engine, get_session_factory from workspaces.workflow.schema import Workflow, WorkflowRequest, WorkflowRequestFile @@ -153,7 +151,9 @@ class WorkflowWorkingDirRestService: :return: None """ - requested_workflow = self.request.info.lookup_workflow_request(self.request.matchdict["request_id"]) + requested_workflow = self.request.info.lookup_workflow_request( + self.request.matchdict["request_id"] + ) results_path = requested_workflow.results_dir parent_paths = [requested_workflow.results_dir] @@ -171,11 +171,15 @@ class WorkflowWorkingDirRestService: @view_config(request_method="GET", route_name="serve_weblog", renderer="json") def serve_weblog(self): - requested_workflow = self.request.info.lookup_workflow_request(self.request.matchdict["request_id"]) + requested_workflow = self.request.info.lookup_workflow_request( + self.request.matchdict["request_id"] + ) results_path = Path(requested_workflow.results_dir) index_path_list = list(results_path.glob("products/pipeline-*/html/index.html")) - failed_weblog_path_list = list(results_path.glob("working/pipeline-*/html/index.html")) + failed_weblog_path_list = list( + results_path.glob("working/pipeline-*/html/index.html") + ) if index_path_list and len(index_path_list) == 1: index_path = index_path_list[0] elif failed_weblog_path_list and len(failed_weblog_path_list) == 1: @@ -195,10 +199,14 @@ class WorkflowWorkingDirRestService: @view_config(request_method="GET", route_name="get_qa_notes", renderer="json") def get_qa_notes(self): - requested_workflow = self.request.info.lookup_workflow_request(self.request.matchdict["request_id"]) + requested_workflow = self.request.info.lookup_workflow_request( + self.request.matchdict["request_id"] + ) results_path = Path(requested_workflow.results_dir) - qa_notes_list = list(results_path.glob("products/pipeline-*/html/qa_notes.html")) + qa_notes_list = list( + results_path.glob("products/pipeline-*/html/qa_notes.html") + ) if qa_notes_list and len(qa_notes_list) == 1: qa_notes_path = qa_notes_list[0] else: @@ -213,14 +221,20 @@ class WorkflowWorkingDirRestService: with open(qa_notes_path, "r") as qa_notes: qa_notes_text = qa_notes.read() - return Response(status_int=http.HTTPStatus.OK, json_body={"resp": f"{qa_notes_text}"}) + return Response( + status_int=http.HTTPStatus.OK, json_body={"resp": f"{qa_notes_text}"} + ) @view_config(request_method="POST", route_name="get_qa_notes", renderer="json") def save_qa_notes(self): - requested_workflow = self.request.info.lookup_workflow_request(self.request.matchdict["request_id"]) + requested_workflow = self.request.info.lookup_workflow_request( + self.request.matchdict["request_id"] + ) results_path = Path(requested_workflow.results_dir) - qa_notes_list = list(results_path.glob("products/pipeline-*/html/qa_notes.html")) + qa_notes_list = list( + results_path.glob("products/pipeline-*/html/qa_notes.html") + ) if qa_notes_list and len(qa_notes_list) == 1: qa_notes_path = qa_notes_list[0] else: @@ -235,15 +249,21 @@ class WorkflowWorkingDirRestService: # sanitize input before writing/persisting # \\u0000 is an invalid character that is incompatible with postgres json columns # from StackOverflow: https://stackoverflow.com/questions/63092267/how-to-handle-api-responsesjson-containing-x00-or-u0000-in-its-data-and-s - edits = json.loads(json.dumps(self.request.json_body["edits"])).replace("\\u0000", "") + edits = json.loads(json.dumps(self.request.json_body["edits"])).replace( + "\\u0000", "" + ) qa_notes.write(edits) return Response( status_int=http.HTTPStatus.OK, - json_body={"resp": f"Edits made to QA notes file in workflow {self.request.matchdict['request_id']}."}, + json_body={ + "resp": f"Edits made to QA notes file in workflow {self.request.matchdict['request_id']}." + }, ) - @view_config(request_method="GET", route_name="serve_carta_wrapper", renderer="json") + @view_config( + request_method="GET", route_name="serve_carta_wrapper", renderer="json" + ) def serve_carta_wrapper(self): """ Dish up some HTML containing the CARTA URL in a frame. @@ -251,9 +271,13 @@ class WorkflowWorkingDirRestService: :return: """ - path = Path(f"/lustre/aoc/cluster/pipeline/docker/workspaces/html/{self.request.matchdict['request_id']}") + path = Path( + f"/lustre/aoc/cluster/pipeline/docker/workspaces/html/{self.request.matchdict['request_id']}" + ) carta_html_file = list(path.iterdir())[0] - return FileResponse(carta_html_file, request=self.request, content_type="text/html") + return FileResponse( + carta_html_file, request=self.request, content_type="text/html" + ) @view_config(route_name="get_healthcheck", renderer="json") def get_healthcheck(self) -> Response: @@ -263,7 +287,10 @@ class WorkflowWorkingDirRestService: :return: """ return Response( - status=http.HTTPStatus.OK, json_body={"healthcheck": f"Workflow service returned {http.HTTPStatus.OK}"} + status=http.HTTPStatus.OK, + json_body={ + "healthcheck": f"Workflow service returned {http.HTTPStatus.OK}" + }, ) def generate_working_directory_dict(self, results_path, parent_paths) -> dict: @@ -290,7 +317,13 @@ class WorkflowWorkingDirRestService: # check if url needs a slash to divide paths divider = ("/", "")[self.request.current_route_url().endswith("/")] - content_key.update({key.name: {"url": self.request.current_route_url() + divider + key.name}}) + content_key.update( + { + key.name: { + "url": self.request.current_route_url() + divider + key.name + } + } + ) # add full path for content content_key[key.name].update({"full_path": key.absolute().__str__()}) @@ -306,7 +339,9 @@ class WorkflowWorkingDirRestService: # if it is a directory, create a json object workdir_json = json.dumps(workdir_dict, indent=2) # create response with the json object as the body - response = Response(body=workdir_json, request=self.request, content_type="text/json") + response = Response( + body=workdir_json, request=self.request, content_type="text/json" + ) else: # if it is not a directory, serve the static file response = FileResponse( @@ -317,11 +352,15 @@ class WorkflowWorkingDirRestService: def generate_url_from_path(self, root_path, results_path): current_url = self.request.current_route_url() - return current_url.replace("/weblog", "/dir") + root_path.replace(results_path, "") + return current_url.replace("/weblog", "/dir") + root_path.replace( + results_path, "" + ) def generate_qa_notes_path(self, root_path, results_path): current_url = self.request.current_route_url() - return current_url.replace("/qa_notes", "/dir") + root_path.replace(results_path, "") + return current_url.replace("/qa_notes", "/dir") + root_path.replace( + results_path, "" + ) @view_defaults(route_name="workflow_request", renderer="json") @@ -353,7 +392,9 @@ class WorkflowRequestRestService: # Most common case: Empty body for simple requests, continue with an empty dict argument_body = {} - return self.request.info.create_workflow_request(self.request.context.workflow_name, argument_body) + return self.request.info.create_workflow_request( + self.request.context.workflow_name, argument_body + ) @view_config(request_method="POST", route_name="submit_workflow_request") def submit_workflow(self): @@ -393,7 +434,11 @@ class WorkflowRequestRestService: file = lookup_file(request=self.request) # 2. create ingestion workflow request - ingest_type = "ingest_cal" if "calibration" in self.request.matchdict["name"] else "ingest_image" + ingest_type = ( + "ingest_cal" + if "calibration" in self.request.matchdict["name"] + else "ingest_image" + ) ingest_request = self.request.info.create_workflow_request( workflow=ingest_type, argument={"parent_wf_request_id": self.request.matchdict["request_id"]}, @@ -419,7 +464,9 @@ class WorkflowRequestRestService: argument=self.request.json_body, ) self.request.workflows.execute(ingestion_request) - return Response(status_code=http.HTTPStatus.OK, json_body=ingestion_request.__json__()) + return Response( + status_code=http.HTTPStatus.OK, json_body=ingestion_request.__json__() + ) @view_config(request_method="POST", route_name="abort_workflow_request") def abort(self): @@ -500,10 +547,16 @@ class WorkflowRequestRestService: """ body = self.request.json_body - identifier = int(body["request_id"]) if "request_id" in body else body["project_code"] + identifier = ( + int(body["request_id"]) if "request_id" in body else body["project_code"] + ) msg_type = self.request.matchdict["msg_type"] - additional = body["project_code"] if "project_code" in body and identifier != body["project_code"] else None + additional = ( + body["project_code"] + if "project_code" in body and identifier != body["project_code"] + else None + ) self.request.workflows.message_archive(identifier, msg_type, additional) return Response( @@ -538,16 +591,22 @@ class WorkflowRequestRestService: request_id = self.request.matchdict["request_id"] self.request.workflows.send_forced_fail(request_id) - @view_config(request_method="GET", route_name="workflow_request_htcondor_id", renderer="json") + @view_config( + request_method="GET", route_name="workflow_request_htcondor_id", renderer="json" + ) def get_request_htcondor_id(self): """ Pyramid view that gives back the HTCondor job ID for a given workflow request :return: HTTP response with HTCondor job ID in the body """ - requested_workflow = self.request.info.lookup_workflow_request(self.request.matchdict["request_id"]) + requested_workflow = self.request.info.lookup_workflow_request( + self.request.matchdict["request_id"] + ) - return Response(json_body={"htcondor_job_id": str(requested_workflow.htcondor_job_id)}) + return Response( + json_body={"htcondor_job_id": str(requested_workflow.htcondor_job_id)} + ) @view_config(request_method="GET", route_name="list_stale_requests") def get_stale_requests(self): @@ -688,20 +747,23 @@ def get_tm_session(session_factory, transaction_manager): http_requests = None + def prometheus_route_timing_factory(handler, registry): # if timing support is enabled, return a wrapper global http_requests # Prometheus logging - http_requests = prometheus_client.Summary("http_request_timing", "HTTP Requests", ["status_code", "route_name"]) + http_requests = prometheus_client.Summary( + "http_request_timing", "HTTP Requests", ["status_code", "route_name"] + ) def prometheus_route_timer(request): start = time.time() response = handler(request) end = time.time() if request.matched_route: - http_requests.labels(status_code=response.status_code, route_name=request.matched_route.name).observe( - end - start - ) + http_requests.labels( + status_code=response.status_code, route_name=request.matched_route.name + ).observe(end - start) return response return prometheus_route_timer @@ -716,18 +778,6 @@ def prometheus_route_timing_factory(handler, registry): def main(global_config, **settings): with Configurator(settings=settings) as config: - sentry_key = CapoConfig().settings("edu.nrao.workspaces.SentrySettings").sentry_key - - if sentry_key != "local": - sentry_sdk.init( - dsn=sentry_key, - integrations=[PyramidIntegration()], - # Set traces_sample_rate to 1.0 to capture 100% - # of transactions for performance monitoring. - # We recommend adjusting this value in production. - traces_sample_rate=1.0, - ) - session_factory = session_factory_from_settings(settings) config.set_session_factory(session_factory) config.add_renderer("jsonp", JSONP(param_name="callback")) @@ -745,7 +795,9 @@ def main(global_config, **settings): # we need to build a workflow_info here for the message handler, but # we won't use it anywhere else, we will make new ones per-request - workflow_info = WorkflowInfo(get_tm_session(session_factory, transaction.manager)) + workflow_info = WorkflowInfo( + get_tm_session(session_factory, transaction.manager) + ) message_handler = WorkflowMessageHandler(workflow_info) workflow_recover = MonitorRecover(workflow_info) @@ -757,7 +809,9 @@ def main(global_config, **settings): # make workflow_service available for use in Pyramid config.add_request_method( - lambda r: WorkflowService(r.info, message_handler, workflow_recover), "workflows", reify=True + lambda r: WorkflowService(r.info, message_handler, workflow_recover), + "workflows", + reify=True, ) # GET /workflows <- list of workflows diff --git a/shared/messaging/messaging/__init__.py b/shared/messaging/messaging/__init__.py index 19998b2d7509750613b988efe61fa7ff724e5e66..34dcb7c479a058ec77214cfc87be50703a417801 100644 --- a/shared/messaging/messaging/__init__.py +++ b/shared/messaging/messaging/__init__.py @@ -16,8 +16,7 @@ # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. """ -SSA Messaging is an AMQP-based asynchronous messaging system based on passing -simple Python objects as JSON. +SSA Messaging is an AMQP-based asynchronous messaging system based on passing simple Python objects as JSON. """ __version__ = "1.0.0rc1" diff --git a/shared/messaging/poetry.lock b/shared/messaging/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..ddabec9f267fe66dc829804b158ad336f0e78e47 --- /dev/null +++ b/shared/messaging/poetry.lock @@ -0,0 +1,45 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + +[[package]] +name = "amqp" +version = "5.1.1" +description = "Low-level AMQP client for Python (fork of amqplib)." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + { file = "amqp-5.1.1-py3-none-any.whl", hash = "sha256:6f0956d2c23d8fa6e7691934d8c3930eadb44972cbbd1a7ae3a520f735d43359" }, + { file = "amqp-5.1.1.tar.gz", hash = "sha256:2c1b13fecc0893e946c65cbd5f36427861cffa4ea2201d8f6fca22e2a373b5e2" }, +] + +[package.dependencies] +vine = ">=5.0.0" + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + { file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35" }, + { file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f" }, +] + +[[package]] +name = "vine" +version = "5.0.0" +description = "Promises, promises, promises." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + { file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30" }, + { file = "vine-5.0.0.tar.gz", hash = "sha256:7d3b1624a953da82ef63462013bbd271d3eb75751489f9807598e8f340bd637e" }, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "17461bacfabc0f59fbc47194789a96bd56f12ee8fe281844d17fd0579d714320" diff --git a/shared/messaging/pyproject.toml b/shared/messaging/pyproject.toml index 8d4d594ab2ae4305b012779f0afd9562e4f46f42..57d1a2741244c0502d9966bea485001c47d5368b 100644 --- a/shared/messaging/pyproject.toml +++ b/shared/messaging/pyproject.toml @@ -1,18 +1,19 @@ -[build-system] -requires = ["flit_core >=3.2,<4"] -build-backend = "flit_core.buildapi" - -[project] -name = "ssa-messaging" -authors = [{name = "SSA Team", email = "dms-ssa@nrao.edu"}] +[tool.poetry] +name = "messaging" +version = "2.8.2rc1" +description = "SSA Messaging is an AMQP-based asynchronous messaging system based on passing simple Python objects as JSON." +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" readme = "README.md" -license = {file = "LICENSE"} -classifiers = ["License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)"] -dynamic = ["version", "description"] -dependencies = ["kombu", "pycapo"] -[project.urls] -Home = "https://ssa.gitlab-pages.nrao.edu/messaging" +[tool.poetry.dependencies] +python = "^3.10" +kombu = "^5.2.4" +pycapo = "^0.3.1" -[tool.flit.module] -name = "messaging" \ No newline at end of file +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/shared/schema/build/lib/schema/__init__.py b/shared/schema/build/lib/schema/__init__.py deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/shared/schema/pyproject.toml b/shared/schema/pyproject.toml deleted file mode 100644 index 197846986af38ab7b6f9f3ef688829bdc523d67c..0000000000000000000000000000000000000000 --- a/shared/schema/pyproject.toml +++ /dev/null @@ -1,9 +0,0 @@ -[build-system] -requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2"] - -[tool.setuptools_scm] -write_to = "schema/_version.py" -write_to_template = """ -\"\"\"Version information for this package, don't put anything else here.\"\"\" -___version___ = '{version}' -""" diff --git a/shared/schema/schema/__init__.py b/shared/schema/schema/__init__.py deleted file mode 100644 index f3eaaf3e2da081ab38902fb74b49c71ad5c6083d..0000000000000000000000000000000000000000 --- a/shared/schema/schema/__init__.py +++ /dev/null @@ -1,125 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# publish our behavior-enhanced table classes -import sqlalchemy -from pycapo import CapoConfig -from sqlalchemy.orm import sessionmaker -from sqlalchemy.sql import ClauseElement - -from .model import * - -INSTRUMENT_CAPO_PREFIXES = { - "SDM": "metadataDatabase.jdbc", - "VLBA": "metadataDatabase.jdbc", - "ALMA": "almaMetadataDatabase.jdbc", - "OPT": "evlaopt.nrao.jdbc.", - "PST": "my.nrao.jdbc.", - "NGAS": "ngasDatabase.jdbc", - "NGAS_NAASC": "almaMetadataDatabase.jdbc", - "VLASS": "edu.nrao.vlass.config.VlassMngrSettings.jdbc", - "LEGACY": "oracleMetadataDatabase.jdbc", -} - - -def create_engine(instrument, **kwargs): - config = CapoConfig(profile=kwargs["profile"]) if "profile" in kwargs else CapoConfig() - - prefix = INSTRUMENT_CAPO_PREFIXES[instrument] - - user = config[prefix + "Username"] - passwd = config[prefix + "Password"] - url = config[prefix + "Url"] - - if "oracle" in url: - hostport, service_name = url.split("/")[-2:] - if instrument == "LEGACY": - archiveurl = "oracle://{}:{}@{}/{}".format(user, passwd, hostport, service_name) - else: - host, port = hostport.split(":") - import cx_Oracle - - dsn = cx_Oracle.makedsn(host, port, service_name=service_name) - archiveurl = "oracle://{}:{}@{}".format(user, passwd, dsn) - else: - archiveurl = url.replace("jdbc:", "").replace("://", "://" + user + ":" + passwd + "@") - - return sqlalchemy.create_engine(archiveurl) - - -def create_session(instrument, **kwargs): - engine = create_engine(instrument, **kwargs) - session_mkr = sessionmaker(engine) - session = session_mkr() - return session - - -def create_model_instance(session, model, defaults=None, commit=True, **kwargs): - params = dict((k, v) for k, v in kwargs.items() if not isinstance(v, ClauseElement)) - params.update(defaults or {}) - instance = model(**params) - session.add(instance) - if commit: - session.commit() - # Need to read it back to get the new PK, etc. - session.refresh(instance) - return instance - - -def get_or_create_model_instance(session, model, defaults=None, commit=True, **kwargs): - instance = session.query(model).filter_by(**kwargs).first() - if instance: - return instance, False - else: - instance = create_model_instance(session, model, defaults=defaults, commit=commit, **kwargs) - return instance, True - - -class ArchiveDBSession: - """A class to create context manager around an archive connection.""" - - def __init__(self, instrument, **kwargs): - config = CapoConfig(profile=kwargs["profile"]) if "profile" in kwargs else CapoConfig() - - prefix = INSTRUMENT_CAPO_PREFIXES[instrument] - - user = config[prefix + "Username"] - passwd = config[prefix + "Password"] - url = config[prefix + "Url"] - - if "oracle" in url: - hostport, service_name = url.split("/")[-2:] - if instrument == "LEGACY": - self.archiveurl = "oracle://{}:{}@{}/{}".format(user, passwd, hostport, service_name) - else: - host, port = hostport.split(":") - import cx_Oracle - - dsn = cx_Oracle.makedsn(host, port, service_name=service_name) - self.archiveurl = "oracle://{}:{}@{}".format(user, passwd, dsn) - else: - self.archiveurl = url.replace("jdbc:", "").replace("://", "://" + user + ":" + passwd + "@") - self.session = None - - def __enter__(self): - engine = sqlalchemy.create_engine(self.archiveurl) - session_mkr = sessionmaker(engine) - self.session = session_mkr(bind=engine) - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.session.close() diff --git a/shared/schema/schema/_version.py b/shared/schema/schema/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/shared/schema/schema/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/shared/schema/schema/almamodel.py b/shared/schema/schema/almamodel.py deleted file mode 100644 index dd7cfc00f78729eb3fb090b88c57920e17fb9221..0000000000000000000000000000000000000000 --- a/shared/schema/schema/almamodel.py +++ /dev/null @@ -1,6713 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - Column, - DateTime, - Float, - ForeignKey, - Index, - LargeBinary, - Numeric, - String, - Table, - Text, - text, -) -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship -from sqlalchemy.sql.sqltypes import NullType - -Base = declarative_base() -metadata = Base.metadata - - -t_SLOG_ENTRY_ATTR_bak = Table( - "SLOG_ENTRY_ATTR_bak", - metadata, - Column("slog_attr_id", Numeric(19, 0, asdecimal=False), nullable=False), - Column("slog_attr_type", Numeric(10, 0, asdecimal=False), nullable=False), - Column("slog_attr_value", String(256)), - Column("slog_se_id", Numeric(19, 0, asdecimal=False)), - schema="ALMA", -) - - -class Aaa6(Base): - __tablename__ = "aaa6" - __table_args__ = {"schema": "ALMA"} - - ccc = Column(String(100), primary_key=True) - - -t_aaa7 = Table("aaa7", metadata, Column("ddd", String(100)), schema="ALMA") - - -class Account(Base): - __tablename__ = "account" - __table_args__ = {"schema": "ALMA"} - - account_id = Column(String(32), primary_key=True) - request_handler_id = Column(Numeric(22, 0, asdecimal=False), unique=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - password_digest = Column(String(256)) - firstname = Column(String(256), nullable=False) - lastname = Column(String(256), nullable=False) - initials = Column(String(256)) - creationtimestamp = Column(String(32)) - modificationtimestamp = Column(String(32)) - preferredarc = Column(String(32)) - email = Column(String(256), unique=True) - executive = Column(String(5)) - aliases = Column(String(256)) - inst_no = Column(ForeignKey("ALMA.institution.inst_no"), nullable=False) - active = Column(String(1), nullable=False, server_default=text("'T' ")) - account_id_merged_to = Column(ForeignKey("ALMA.account.account_id")) - merge_time = Column(DateTime) - receiveemails = Column(String(1), nullable=False) - passwordtimestamp = Column(DateTime) - provides_user_demographics = Column(String(1)) - - parent = relationship("Account", remote_side=[account_id]) - institution = relationship("Institution") - nodes = relationship("DrmNode", secondary="ALMA.drm_data_reducer") - role = relationship("Role", secondary="ALMA.account_role") - - -class AccountDelegation(Base): - __tablename__ = "account_delegation" - __table_args__ = ( - Index("account_del_unique", "pi_rh_id", "project_code", "delegee_rh_id", "delegation_type", unique=True), - {"schema": "ALMA"}, - ) - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - pi_rh_id = Column(ForeignKey("ALMA.account.request_handler_id"), nullable=False) - project_code = Column(String(18), nullable=False) - delegee_rh_id = Column(ForeignKey("ALMA.account.request_handler_id"), nullable=False) - delegation_type = Column(String(10), nullable=False, index=True, server_default=text("'DATA' ")) - - delegee_rh = relationship("Account", primaryjoin="AccountDelegation.delegee_rh_id == Account.request_handler_id") - pi_rh = relationship("Account", primaryjoin="AccountDelegation.pi_rh_id == Account.request_handler_id") - - -t_account_role = Table( - "account_role", - metadata, - Column("role_no", ForeignKey("ALMA.role.role_no"), primary_key=True, nullable=False), - Column("account_id", ForeignKey("ALMA.account.account_id"), primary_key=True, nullable=False), - schema="ALMA", -) - - -t_alma_alarms = Table( - "alma_alarms", - metadata, - Column("descriptor", Numeric(10, 0, asdecimal=False)), - Column("user_timestamp_secs", Numeric(20, 0, asdecimal=False)), - Column("user_timestamp_ms", Numeric(20, 0, asdecimal=False)), - Column("activated_by_backup", Numeric(1, 0, asdecimal=False)), - Column("terminated_by_backup", Numeric(1, 0, asdecimal=False)), - Column("family", String(100)), - Column("member", String(100)), - Column("code", Numeric(10, 0, asdecimal=False)), - Column("user_properties", String(1000)), - Column("source_name", String(100)), - Column("source_hostname", String(100)), - Column("source_timestamp_sec", Numeric(20, 0, asdecimal=False)), - Column("source_timestamp_ms", Numeric(20, 0, asdecimal=False)), - Column("backup", Numeric(1, 0, asdecimal=False)), - Column("version", String(100)), - schema="ALMA", -) - - -class AquaAttachment(Base): - __tablename__ = "aqua_attachment" - __table_args__ = (Index("aqua_attachment_uni", "name", "ttimestamp", unique=True), {"schema": "ALMA"}) - - attachmentid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - ttimestamp = Column(DateTime) - name = Column(String(256), nullable=False) - contents = Column(LargeBinary, nullable=False) - - aqua_session = relationship("AquaSession", secondary="ALMA.aqua_session_attachment") - aqua_execblock = relationship("AquaExecblock", secondary="ALMA.aqua_execblock_attachment") - - -class AquaComment(Base): - __tablename__ = "aqua_comment" - __table_args__ = (Index("aqua_comment_uni", "author", "ttimestamp", unique=True), {"schema": "ALMA"}) - - commentid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - author = Column(String(32), nullable=False) - ttimestamp = Column(DateTime, nullable=False) - ccomment = Column(Text) - - aqua_session = relationship("AquaSession", secondary="ALMA.aqua_session_comment") - aqua_execblock = relationship("AquaExecblock", secondary="ALMA.aqua_execblock_comment") - - -class AquaExecblock(Base): - __tablename__ = "aqua_execblock" - __table_args__ = {"schema": "ALMA"} - - execblockid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - execblockuid = Column(String(32), nullable=False, unique=True) - sessionid = Column(ForeignKey("ALMA.aqua_session.sessionid"), nullable=False) - qa0status = Column(String(32), nullable=False, index=True) - starttime = Column(DateTime) - endtime = Column(DateTime) - finalcommentid = Column(ForeignKey("ALMA.aqua_comment.commentid"), unique=True) - schedblockuid = Column(String(32)) - obsprojectcode = Column(String(25)) - obsprojectname = Column(String(256)) - obsprojectuid = Column(String(32)) - location = Column(String(32)) - correlatortype = Column(String(4)) - execfraction = Column(Numeric(5, 3), nullable=False, server_default=text("0 ")) - - aqua_comment = relationship("AquaComment") - aqua_session = relationship("AquaSession") - - -t_aqua_execblock_attachment = Table( - "aqua_execblock_attachment", - metadata, - Column("attachmentid", ForeignKey("ALMA.aqua_attachment.attachmentid"), primary_key=True), - Column("execblockid", ForeignKey("ALMA.aqua_execblock.execblockid"), nullable=False), - schema="ALMA", -) - - -t_aqua_execblock_comment = Table( - "aqua_execblock_comment", - metadata, - Column("commentid", ForeignKey("ALMA.aqua_comment.commentid"), primary_key=True), - Column("execblockid", ForeignKey("ALMA.aqua_execblock.execblockid")), - schema="ALMA", -) - - -class AquaExecblockEtlDatum(Base): - __tablename__ = "aqua_execblock_etl_data" - __table_args__ = (Index("eb_type_unique", "execblockid", "etl_data_type", unique=True), {"schema": "ALMA"}) - - etl_data_id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - execblockid = Column(ForeignKey("ALMA.aqua_execblock.execblockid")) - etl_data_type = Column(String(16)) - etl_schema_version = Column(Numeric(3, 0, asdecimal=False)) - etl_data = Column(Text) - - aqua_execblock = relationship("AquaExecblock") - - -class AquaOu(Base): - __tablename__ = "aqua_ous" - __table_args__ = (Index("aqua_ous_uni", "obsunitsetuid", "obsunitsetpartid", unique=True), {"schema": "ALMA"}) - - obsunitsetid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - obsunitsetuid = Column(String(32), nullable=False) - qa2status = Column(String(8), nullable=False) - finalcommentid = Column(ForeignKey("ALMA.aqua_comment.commentid"), unique=True) - obsunitsetpartid = Column(String(32), nullable=False) - qa2semipassreason = Column(String(11)) - qa2statustime = Column(DateTime) - achievedsens = Column(Numeric(6, 2)) - achievedresol = Column(Numeric(6, 2)) - qa2plcalstatus = Column(String(8)) - qa2mancalstatus = Column(String(8)) - plcalfinalcommentid = Column(Numeric(10, 0, asdecimal=False)) - mcalfinalcommentid = Column(Numeric(10, 0, asdecimal=False)) - casatickets = Column(String(128)) - analyst = Column(String(32)) - execfraction = Column(Numeric(5, 3), nullable=False, server_default=text("0 ")) - plimgfinalcommentid = Column(Numeric(10, 0, asdecimal=False)) - mimgfinalcommentid = Column(Numeric(10, 0, asdecimal=False)) - rmsatbandwidth = Column(NullType) - rmscontinuum = Column(NullType) - beamsemimajor = Column(NullType) - beamsemiminor = Column(NullType) - beamposangle = Column(NullType) - ous_status_entity_id = Column(String(64)) - - aqua_comment = relationship("AquaComment") - - -class AquaOusAttachment(Base): - __tablename__ = "aqua_ous_attachment" - __table_args__ = {"schema": "ALMA"} - - attachmentid = Column(ForeignKey("ALMA.aqua_attachment.attachmentid"), primary_key=True, nullable=False) - obsunitsetid = Column(ForeignKey("ALMA.aqua_ous.obsunitsetid"), primary_key=True, nullable=False) - attachment_section = Column(String(8)) - - aqua_attachment = relationship("AquaAttachment") - aqua_ou = relationship("AquaOu") - - -class AquaOusFlag(Base): - __tablename__ = "aqua_ous_flag" - __table_args__ = ( - Index("unique_ous_flag", "ous_status_entity_id", "flag_name", unique=True), - Index("idx_aqua_ous_flag_val", "flag_name", "flag_value"), - {"schema": "ALMA"}, - ) - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(4, 0, asdecimal=False), nullable=False) - ous_status_entity_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id"), nullable=False, index=True) - flag_name = Column(String(32), nullable=False) - flag_value = Column(String(2000)) - update_account_id = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - update_timestamp = Column(DateTime, nullable=False) - - ous_status_entity = relationship("ObsUnitSetStatu") - update_account = relationship("Account") - - -class AquaOusFlagHistory(Base): - __tablename__ = "aqua_ous_flag_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - ous_status_entity_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id"), nullable=False) - flag_name = Column(String(32), nullable=False) - flag_value = Column(String(2000)) - update_account_id = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - update_timestamp = Column(DateTime, nullable=False) - - ous_status_entity = relationship("ObsUnitSetStatu") - update_account = relationship("Account") - - -class AquaPipelineRun(Base): - __tablename__ = "aqua_pipeline_run" - __table_args__ = (Index("uk_mous_uid_timestamp", "mous_uid", "timestamp", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - gous_uid = Column(String(32)) - mous_uid = Column(String(32)) - report = Column(Text) - sous_uid = Column(String(32)) - timestamp = Column(String(32)) - version = Column(Numeric(10, 0, asdecimal=False)) - pipeline_run_dir_id = Column(ForeignKey("ALMA.aqua_pipeline_run_directory.id")) - weblog_id = Column(ForeignKey("ALMA.aqua_weblog.id")) - - pipeline_run_dir = relationship("AquaPipelineRunDirectory") - weblog = relationship("AquaWeblog") - - -class AquaPipelineRunDirectory(Base): - __tablename__ = "aqua_pipeline_run_directory" - __table_args__ = (Index("uk_project_code_timestamp", "project_code", "timestamp", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - remark = Column(String(2000)) - last_op_timestamp = Column(String(32)) - pathname = Column(String(512)) - project_code = Column(String(32)) - status = Column(String(32)) - timestamp = Column(String(32)) - version = Column(Numeric(10, 0, asdecimal=False)) - last_op_account = Column(String(32)) - products_sub_dir = Column(String(512)) - region = Column(String(32)) - upload_timestamp = Column(String(32)) - data_reduction_type = Column(String(32)) - - -class AquaQa2EcHistory(Base): - __tablename__ = "aqua_qa2_ec_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - ttimestamp = Column(DateTime, nullable=False) - entityuid = Column(String(32), nullable=False) - author = Column(String(32), nullable=False) - ec = Column(NullType) - - -class AquaQa2FailReason(Base): - __tablename__ = "aqua_qa2_fail_reason" - __table_args__ = {"schema": "ALMA"} - - qa2reasonid = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - obsunitsetid = Column(ForeignKey("ALMA.aqua_ous.obsunitsetid"), nullable=False) - qa2failreason = Column(String(20), nullable=False) - - aqua_ou = relationship("AquaOu") - - -class AquaQa2ImagingHistory(Base): - __tablename__ = "aqua_qa2_imaging_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - ttimestamp = Column(DateTime, nullable=False) - entityuid = Column(String(32), nullable=False) - author = Column(String(32), nullable=False) - rmsatbandwidth = Column(NullType) - rmscontinuum = Column(NullType) - beamsemimajor = Column(NullType) - beamsemiminor = Column(NullType) - beamposangle = Column(NullType) - - -class AquaSensitivity(Base): - __tablename__ = "aqua_sensitivity" - __table_args__ = {"schema": "ALMA"} - - asdmuid = Column(String(32), primary_key=True, nullable=False) - spwid = Column(Numeric(38, 0, asdecimal=False), primary_key=True, nullable=False) - mediantsys = Column(NullType) - - -class AquaSession(Base): - __tablename__ = "aqua_session" - __table_args__ = (Index("aqua_session_uni", "sessionuid", "sessionpartid", unique=True), {"schema": "ALMA"}) - - sessionid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - sessionuid = Column(String(32), nullable=False) - schedblockuid = Column(String(32), nullable=False) - schedblockname = Column(String(128)) - projectcode = Column(String(64)) - qlfocussummuid = Column(String(32)) - qlpointsummuid = Column(String(32)) - qlphasesummuid = Column(String(32)) - qlatmsummuid = Column(String(32)) - qa1status = Column(String(5), nullable=False) - starttime = Column(DateTime, nullable=False) - endtime = Column(DateTime) - finalcommentid = Column(ForeignKey("ALMA.aqua_comment.commentid"), unique=True) - sessionpartid = Column(String(32), nullable=False) - location = Column(String(32)) - tmcdbconfigurationname = Column(String(128)) - correlatortype = Column(String(4)) - - aqua_comment = relationship("AquaComment") - - -t_aqua_session_attachment = Table( - "aqua_session_attachment", - metadata, - Column("attachmentid", ForeignKey("ALMA.aqua_attachment.attachmentid"), primary_key=True), - Column("sessionid", ForeignKey("ALMA.aqua_session.sessionid"), nullable=False), - schema="ALMA", -) - - -t_aqua_session_comment = Table( - "aqua_session_comment", - metadata, - Column("commentid", ForeignKey("ALMA.aqua_comment.commentid"), primary_key=True), - Column("sessionid", ForeignKey("ALMA.aqua_session.sessionid")), - schema="ALMA", -) - - -class AquaStatusHistory(Base): - __tablename__ = "aqua_status_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - entityuid = Column(String(32), nullable=False) - author = Column(String(32), nullable=False) - ttimestamp = Column(DateTime, nullable=False) - qastatus = Column(String(32), nullable=False) - qastatustype = Column(String(32), nullable=False) - ccomment = Column(Text) - - -t_aqua_v_execblock = Table( - "aqua_v_execblock", - metadata, - Column("execblockid", Numeric(10, 0, asdecimal=False), nullable=False), - Column("execblockuid", String(32), nullable=False), - Column("execfraction", Numeric(5, 3), nullable=False), - Column("qa0status", String(32), nullable=False), - Column("finalcommentid", Numeric(10, 0, asdecimal=False)), - Column("sessionid", Numeric(10, 0, asdecimal=False), nullable=False), - Column("sessionuid", String(32)), - Column("sessionpartid", String(32)), - Column("starttime", DateTime), - Column("endtime", DateTime), - Column("schedblockuid", String(32)), - Column("schedblockname", String(128)), - Column("obsprojectcode", String(128)), - Column("obsprojectname", String(256)), - Column("obsprojectpi", String(20)), - Column("obsprojectversion", String(20)), - Column("location", String(32)), - Column("status", String(32)), - Column("archivingstatus", String(32)), - Column("bandname", String(10)), - Column("representativefrequency", Numeric(15, 10)), - Column("almabuild", String(70)), - Column("arrayname", String(10)), - Column("arraystart", DateTime), - Column("arrayend", DateTime), - Column("correlatortype", String(4)), - Column("arrayfamily", String(11)), - Column("arraytype", String(9)), - Column("photonicreferencename", String(18)), - Column("obsprojectuid", String(32)), - schema="ALMA", -) - - -class AquaWeblog(Base): - __tablename__ = "aqua_weblog" - __table_args__ = (Index("uk_ous_uid_timestamp", "ous_uid", "timestamp", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - cached = Column(String(1)) - last_access = Column(String(32)) - ous_uid = Column(String(32)) - timestamp = Column(String(32)) - version = Column(Numeric(10, 0, asdecimal=False)) - last_op_account = Column(String(32)) - remark = Column(String(2000)) - last_op_timestamp = Column(String(32)) - ngas_file_id = Column(String(128)) - status = Column(String(32)) - - -class AsaBibliography(Base): - __tablename__ = "asa_bibliography" - __table_args__ = {"schema": "ALMA"} - - bibcode = Column(String(30), nullable=False, unique=True) - publication_year = Column(Numeric(4, 0, asdecimal=False)) - journal = Column(String(100), nullable=False) - title = Column(String(255), nullable=False, index=True) - first_author = Column(String(255), nullable=False) - volume = Column(Numeric(8, 0, asdecimal=False)) - pages = Column(String(100)) - abstract = Column(String(4000)) - authors = Column(String(4000)) - keywords = Column(String(4000)) - bib_id = Column(Numeric(30, 0, asdecimal=False), primary_key=True) - - -t_asa_bibliography_temp = Table( - "asa_bibliography_temp", - metadata, - Column("bibcode", String(30), nullable=False), - Column("publication_year", Numeric(4, 0, asdecimal=False)), - Column("journal", String(100), nullable=False), - Column("title", String(255), nullable=False), - Column("first_author", String(255), nullable=False), - Column("volume", Numeric(8, 0, asdecimal=False)), - Column("pages", String(100)), - Column("abstract", String(4000)), - Column("authors", String(4000)), - Column("keywords", String(4000)), - Column("bib_id", Numeric(30, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -class AsaColumn(Base): - __tablename__ = "asa_columns" - __table_args__ = (Index("asa_columns_unique", "table_name", "column_name", unique=True), {"schema": "ALMA"}) - - column_name = Column(String(128), nullable=False) - table_name = Column(String(128), nullable=False) - description = Column(String(1024)) - tooltip = Column(String(256)) - unit = Column(String(32)) - dimensions = Column(String(32)) - scale = Column(Float) - ucd = Column(String(128)) - utype = Column(String(512)) - datatype = Column(String(32)) - type_size = Column(Numeric(11, 0, asdecimal=False)) - principal = Column(Numeric(1, 0, asdecimal=False), nullable=False) - indexed = Column(Numeric(1, 0, asdecimal=False), nullable=False) - std = Column(Numeric(1, 0, asdecimal=False), nullable=False) - is_enum = Column(Numeric(1, 0, asdecimal=False), nullable=False) - enum_table = Column(String(128)) - examples = Column(String(1024)) - is_queriable = Column(String(1), nullable=False) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - - -class AsaDeliveryAsdmOu(Base): - __tablename__ = "asa_delivery_asdm_ous" - __table_args__ = (Index("dp_delao_ad_unq", "asdm_uid", "deliverable_name", unique=True), {"schema": "ALMA"}) - - asdm_uid = Column(ForeignKey("ALMA.xml_asdm_entities.archive_uid"), index=True) - ous_status_id = Column(String(33), index=True) - deliverable_name = Column(String(64), nullable=False, index=True) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - delivery_id = Column(ForeignKey("ALMA.asa_delivery_status.id"), nullable=False) - - xml_asdm_entity = relationship("XmlAsdmEntity") - delivery = relationship("AsaDeliveryStatu") - - -class AsaDeliveryStatu(Base): - __tablename__ = "asa_delivery_status" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - delivery_id = Column(String(64), nullable=False, unique=True) - pi_account_id = Column(Numeric(22, 0, asdecimal=False), nullable=False) - qa2_passed = Column(String(1), nullable=False) - notification_date = Column(DateTime) - original_release_date = Column(DateTime) - release_date = Column(DateTime, server_default=text("to_date('3000-01-01', 'YYYY-MM-DD')")) - release_date_comment = Column(String(4000)) - delivery_name = Column(String(64), nullable=False) - - -class AsaEnergy(Base): - __tablename__ = "asa_energy" - __table_args__ = {"schema": "ALMA"} - - asa_energy_id = Column(String(128), primary_key=True) - asa_dataset_id = Column(ForeignKey("ALMA.asa_science.dataset_id"), index=True) - frequency_min = Column(NullType, nullable=False) - frequency_max = Column(NullType, nullable=False) - resolution_min = Column(NullType, nullable=False) - resolution_max = Column(NullType, nullable=False) - channel_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - channel_width_min = Column(NullType, nullable=False) - channel_width_max = Column(NullType, nullable=False) - resolving_power_min = Column(NullType, nullable=False) - resolving_power_max = Column(NullType, nullable=False) - spectral_window_uid = Column(String(64)) - bandwidth = Column(NullType) - pol_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - pol_product = Column(String(64), nullable=False) - exptimtp = Column(NullType) - exptim7 = Column(NullType) - exptim12 = Column(NullType) - restfreq = Column(NullType) - chanrms = Column(NullType) - crval3 = Column(NullType) - crpix3 = Column(NullType) - crval4 = Column(NullType) - crpix4 = Column(NullType) - cdelt4 = Column(NullType) - parent_asa_energy_ids = Column(String(256)) - spw_num = Column(Numeric(38, 0, asdecimal=False)) - spw_id_original = Column(Numeric(38, 0, asdecimal=False)) - spw_id_orig_list = Column(String(64)) - spectral_window_name = Column(String(64)) - asa_energy_product_id = Column(String(128)) - asdm_spw_id = Column(Numeric(38, 0, asdecimal=False)) - ms_spw_id = Column(Numeric(38, 0, asdecimal=False)) - sensitivity_channel = Column(NullType) - sensitivity_10kms = Column(NullType) - sensitivity_bandwidth = Column(NullType) - line_id = Column(String(256)) - rest_frequency_max = Column(NullType) - rest_frequency_min = Column(NullType) - rest_frequency_resolution_min = Column(NullType) - rest_frequency_resolution_max = Column(NullType) - rest_resolving_power_min = Column(NullType) - rest_resolving_power_max = Column(NullType) - rest_channel_width_min = Column(NullType) - rest_channel_width_max = Column(NullType) - rest_bandwidth = Column(NullType) - parent_energy_id = Column(String(128)) - - asa_dataset = relationship("AsaScience") - - -class AsaEnergyTemp(Base): - __tablename__ = "asa_energy_temp" - __table_args__ = {"schema": "ALMA"} - - asa_energy_id = Column(String(128), primary_key=True) - asa_dataset_id = Column(String(128), index=True) - frequency_min = Column(NullType, nullable=False) - frequency_max = Column(NullType, nullable=False) - resolution_min = Column(NullType, nullable=False) - resolution_max = Column(NullType, nullable=False) - channel_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - channel_width_min = Column(NullType, nullable=False) - channel_width_max = Column(NullType, nullable=False) - resolving_power_min = Column(NullType, nullable=False) - resolving_power_max = Column(NullType, nullable=False) - spectral_window_uid = Column(String(64)) - bandwidth = Column(NullType) - pol_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - pol_product = Column(String(64), nullable=False) - exptimtp = Column(NullType) - exptim7 = Column(NullType) - exptim12 = Column(NullType) - restfreq = Column(NullType) - chanrms = Column(NullType) - crval3 = Column(NullType) - crpix3 = Column(NullType) - crval4 = Column(NullType) - crpix4 = Column(NullType) - cdelt4 = Column(NullType) - parent_asa_energy_ids = Column(String(256)) - spw_num = Column(Numeric(38, 0, asdecimal=False)) - spw_id_original = Column(Numeric(38, 0, asdecimal=False)) - spw_id_orig_list = Column(String(64)) - spectral_window_name = Column(String(64)) - asa_energy_product_id = Column(String(128), index=True) - asdm_spw_id = Column(Numeric(38, 0, asdecimal=False), index=True) - ms_spw_id = Column(Numeric(38, 0, asdecimal=False)) - sensitivity_channel = Column(NullType) - sensitivity_10kms = Column(NullType) - sensitivity_bandwidth = Column(NullType) - line_id = Column(String(256)) - rest_frequency_max = Column(NullType) - rest_frequency_min = Column(NullType) - rest_frequency_resolution_min = Column(NullType) - rest_frequency_resolution_max = Column(NullType) - rest_resolving_power_min = Column(NullType) - rest_resolving_power_max = Column(NullType) - rest_channel_width_min = Column(NullType) - rest_channel_width_max = Column(NullType) - rest_bandwidth = Column(NullType) - parent_energy_id = Column(String(128)) - - -class AsaMailTemplate(Base): - __tablename__ = "asa_mail_templates" - __table_args__ = {"schema": "ALMA"} - - templatename = Column(String(100), primary_key=True, nullable=False) - application = Column(String(100), primary_key=True, nullable=False) - templatecontent = Column(Text, nullable=False) - - -class AsaOu(Base): - __tablename__ = "asa_ous" - __table_args__ = {"schema": "ALMA"} - - asa_ous_id = Column(String(64), primary_key=True) - asa_project_code = Column(String(64)) - sg_ous_uid = Column(String(64)) - group_ous_uid = Column(String(64)) - member_ous_uid = Column(String(64)) - member_num = Column(Numeric(10, 0, asdecimal=False)) - completed = Column(Numeric(1, 0, asdecimal=False)) - xml_scipiperesults_archive_uid = Column(ForeignKey("ALMA.xml_scipiperesults_entities.archive_uid")) - individual_files = Column(Numeric(1, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - - xml_scipiperesults_entity = relationship("XmlScipiperesultsEntity") - - -class AsaOusRedshift(Base): - __tablename__ = "asa_ous_redshift" - __table_args__ = {"schema": "ALMA"} - - group_ous_uid = Column(String(64), primary_key=True, nullable=False) - member_ous_uid = Column(String(64), primary_key=True, nullable=False) - source_name = Column(String(256), primary_key=True, nullable=False) - best_source_redshift = Column(NullType) - - -class AsaOusTemp(Base): - __tablename__ = "asa_ous_temp" - __table_args__ = {"schema": "ALMA"} - - asa_ous_id = Column(String(64), primary_key=True) - asa_project_code = Column(String(64)) - sg_ous_uid = Column(String(64)) - group_ous_uid = Column(String(64)) - member_ous_uid = Column(String(64)) - member_num = Column(Numeric(10, 0, asdecimal=False)) - completed = Column(Numeric(1, 0, asdecimal=False)) - xml_scipiperesults_archive_uid = Column(String(33)) - individual_files = Column(Numeric(1, 0, asdecimal=False), nullable=False) - - -class AsaProductFile(Base): - __tablename__ = "asa_product_files" - __table_args__ = {"schema": "ALMA"} - - ngas_file_id = Column(String(220), primary_key=True, nullable=False) - asa_ous_id = Column(ForeignKey("ALMA.asa_ous.asa_ous_id"), primary_key=True, nullable=False) - asa_science_id = Column(ForeignKey("ALMA.asa_science.dataset_id")) - asa_energy_id = Column(ForeignKey("ALMA.asa_energy.asa_energy_id")) - stored_size = Column(Numeric(20, 0, asdecimal=False), nullable=False) - subdirectory = Column(String(128), nullable=False) - file_class = Column(String(64)) - file_type = Column(String(64)) - pack = Column(Numeric(1, 0, asdecimal=False), nullable=False) - vo = Column(Numeric(1, 0, asdecimal=False)) - creation_date = Column(DateTime, nullable=False) - naxis = Column(Numeric(38, 0, asdecimal=False)) - naxis1 = Column(Numeric(38, 0, asdecimal=False)) - naxis2 = Column(Numeric(38, 0, asdecimal=False)) - naxis3 = Column(Numeric(38, 0, asdecimal=False)) - naxis4 = Column(Numeric(38, 0, asdecimal=False)) - parent_product_files_id = Column(String(64)) - main_product_source = Column(Numeric(1, 0, asdecimal=False)) - main_product_spw = Column(Numeric(1, 0, asdecimal=False)) - origin = Column(String(32)) - user_id = Column(String(32)) - processing_recipe = Column(String(7), nullable=False, server_default=text("'CAL+IMG' ")) - - asa_energy = relationship("AsaEnergy") - asa_ous = relationship("AsaOu") - asa_science = relationship("AsaScience") - - -class AsaProject(Base): - __tablename__ = "asa_project" - __table_args__ = {"schema": "ALMA"} - - code = Column(String(20), primary_key=True) - project_uid = Column(String(32), nullable=False, unique=True) - proposal_uid = Column(ForeignKey("ALMA.xml_obsproposal_entities.archive_uid"), nullable=False) - pi_name = Column(String(256), nullable=False) - pi_userid = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - coi_name = Column(String(2000)) - title = Column(String(256)) - type = Column(String(16), nullable=False) - associated_arc = Column(String(8), nullable=False) - proposal_cycle = Column(String(6), nullable=False) - proposed_start_date = Column(String(128)) - proposed_end_date = Column(String(128)) - first_obs_start = Column(String(128)) - first_obs_end = Column(String(128)) - last_obs_start = Column(String(128)) - last_obs_end = Column(String(128)) - arc_release = Column(String(128)) - scientific_category = Column(String(200)) - science_keyword = Column(String(200)) - proposal_abstract = Column(String(4000)) - - account = relationship("Account") - xml_obsproposal_entity = relationship("XmlObsproposalEntity") - - def __repr__(self): - return '<AsaProject#{code} "{title}" start={first_obs_start} end={last_obs_end}>'.format(**self.__dict__) - - -class AsaProjectBibliography(Base): - __tablename__ = "asa_project_bibliography" - __table_args__ = (Index("bibprojectcode_pk", "bibcode", "project_code", unique=True), {"schema": "ALMA"}) - - bibcode = Column(String(30), nullable=False) - project_code = Column(ForeignKey("ALMA.asa_project.code"), primary_key=True, nullable=False) - bib_id = Column(ForeignKey("ALMA.asa_bibliography.bib_id"), primary_key=True, nullable=False) - - bib = relationship("AsaBibliography") - asa_project = relationship("AsaProject") - - -t_asa_project_bibliography_temp = Table( - "asa_project_bibliography_temp", - metadata, - Column("bibcode", String(30), nullable=False), - Column("project_code", String(20), nullable=False), - Column("bib_id", Numeric(30, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -class AsaProjectTemp(Base): - __tablename__ = "asa_project_temp" - __table_args__ = {"schema": "ALMA"} - - code = Column(String(20), primary_key=True) - project_uid = Column(String(32), nullable=False) - proposal_uid = Column(String(32), nullable=False) - pi_name = Column(String(256), nullable=False) - pi_userid = Column(String(256), nullable=False) - coi_name = Column(String(2000)) - title = Column(String(256)) - type = Column(String(16), nullable=False) - associated_arc = Column(String(8), nullable=False) - proposal_cycle = Column(String(6), nullable=False) - proposed_start_date = Column(String(128)) - proposed_end_date = Column(String(128)) - first_obs_start = Column(String(128)) - first_obs_end = Column(String(128)) - last_obs_start = Column(String(128)) - last_obs_end = Column(String(128)) - arc_release = Column(String(128)) - scientific_category = Column(String(200)) - science_keyword = Column(String(200)) - proposal_abstract = Column(String(4000)) - - -class AsaScience(Base): - __tablename__ = "asa_science" - __table_args__ = {"schema": "ALMA"} - - dataset_id = Column(String(128), primary_key=True) - asdm_uid = Column(String(32), index=True) - field_uid = Column(String(32)) - spectral_window_uid = Column(String(32)) - project_uid = Column(ForeignKey("ALMA.asa_project.project_uid")) - schedblock_uid = Column(String(32)) - execblock_uid = Column(String(32)) - ra = Column(NullType, nullable=False) - dec = Column(NullType, nullable=False) - ra_source = Column(NullType, nullable=False) - dec_source = Column(NullType, nullable=False) - cx = Column(NullType) - cy = Column(NullType) - cz = Column(NullType) - az_min = Column(NullType, nullable=False) - az_max = Column(NullType, nullable=False) - elevation_min = Column(NullType, nullable=False) - elevation_max = Column(NullType, nullable=False) - wcs_cd1_1 = Column(NullType) - wcs_cd1_2 = Column(NullType) - wcs_cd2_1 = Column(NullType) - wcs_cd2_2 = Column(NullType) - wcs_crpix1 = Column(NullType) - wcs_crpix2 = Column(NullType) - wcs_crval1 = Column(NullType) - wcs_crval2 = Column(NullType) - spatial_scale_min = Column(NullType, nullable=False) - spatial_scale_max = Column(NullType, nullable=False) - gal_longitude = Column(NullType, nullable=False) - gal_latitude = Column(NullType, nullable=False) - ecliptic_longitude = Column(NullType, nullable=False) - ecliptic_latitude = Column(NullType, nullable=False) - footprint = Column(String(2048)) - fov = Column(NullType, nullable=False) - bounding_box = Column(String(2048)) - source_name = Column(String(256)) - source_is_in_simbad = Column(String(1), nullable=False, server_default=text("'N' ")) - source_class = Column(String(128)) - source_redshift = Column(NullType) - source_alma_catalog_id = Column(Numeric(22, 0, asdecimal=False)) - start_date = Column(DateTime, nullable=False) - end_date = Column(DateTime, nullable=False) - int_time = Column(Numeric(10, 3), nullable=False) - time_resolution = Column(Numeric(8, 4), nullable=False) - frequency = Column(NullType) - frequency_resolution = Column(NullType) - velocity_resolution = Column(NullType) - resolving_power = Column(NullType) - bandwidth = Column(NullType) - rest_frequency = Column(NullType) - rest_frequency_min = Column(NullType) - rest_frequency_max = Column(NullType) - rest_frequency_resolution = Column(NullType) - rest_velocity_resolution = Column(NullType, nullable=False) - rest_resolving_power = Column(NullType, nullable=False) - rest_frequency_support = Column(String(512), nullable=False) - channel_num = Column(Numeric(scale=0, asdecimal=False)) - spectral_window_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - continuum_window_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - obs_unitset_id = Column(String(32), nullable=False) - science_goal_ouss_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id")) - group_ouss_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id")) - member_ouss_id = Column(ForeignKey("ALMA.obs_unit_set_status.status_entity_id")) - sensitivity = Column(Numeric(22, 0, asdecimal=False)) - flux_min = Column(NullType) - flux_max = Column(NullType) - uv_coverage_param1 = Column(NullType) - uv_coverage_param2 = Column(NullType) - pol_num = Column(Numeric(scale=0, asdecimal=False)) - pol_products = Column(String(64)) - airmass = Column(NullType) - pwv = Column(NullType) - temperature = Column(NullType) - windspeed = Column(NullType) - winddirection = Column(NullType) - antennas = Column(String(660)) - baseline_max = Column(NullType, nullable=False) - baseline_min = Column(NullType, nullable=False) - scan_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - project_code = Column(ForeignKey("ALMA.asa_project.code"), nullable=False, index=True) - schedblock_name = Column(String(128)) - observation_category = Column(String(128), nullable=False) - scan_intent = Column(String(256)) - access_format = Column(String(10), nullable=False) - processing_level = Column(Numeric(scale=0, asdecimal=False), nullable=False) - frequency_support = Column(String(4000)) - spatial_resolution = Column(NullType, nullable=False, server_default=text("-1.0 ")) - spatres = Column(NullType) - mineltp = Column(NullType) - minel12 = Column(NullType) - minel7 = Column(NullType) - max_angscale = Column(NullType) - obs_mode = Column(String(80)) - pipver = Column(String(80)) - asdm_list = Column(String(200)) - ant_tp_num = Column(Numeric(3, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - ant_num = Column(Numeric(3, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - ant_main_num = Column(Numeric(3, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - ant_aca_num = Column(Numeric(3, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - frequency_max = Column(NullType, nullable=False, server_default=text("-1. ")) - frequency_min = Column(NullType, nullable=False, server_default=text("-1. ")) - requestedarray = Column(String(8)) - asa_ous_id = Column(ForeignKey("ALMA.asa_ous.asa_ous_id")) - band_list = Column(String(30)) - antenna_string = Column(String(30)) - product_type = Column(String(10)) - dataset_product_id = Column(String(128)) - rms = Column(NullType) - is_mosaic = Column(String(1), nullable=False, server_default=text("'N' ")) - best_source_redshift = Column(NullType) - redshift_provenance = Column(String(1)) - cont_sensitivity_channel = Column(NullType) - cont_sensitivity_10kms = Column(NullType) - cont_sensitivity_bandwidth = Column(NullType) - parent_dataset_id = Column(String(128)) - - asa_ous = relationship("AsaOu") - group_ouss = relationship( - "ObsUnitSetStatu", primaryjoin="AsaScience.group_ouss_id == ObsUnitSetStatu.status_entity_id" - ) - member_ouss = relationship( - "ObsUnitSetStatu", primaryjoin="AsaScience.member_ouss_id == ObsUnitSetStatu.status_entity_id" - ) - asa_project = relationship("AsaProject", primaryjoin="AsaScience.project_code == AsaProject.code") - asa_project1 = relationship("AsaProject", primaryjoin="AsaScience.project_uid == AsaProject.project_uid") - science_goal_ouss = relationship( - "ObsUnitSetStatu", primaryjoin="AsaScience.science_goal_ouss_id == ObsUnitSetStatu.status_entity_id" - ) - - -class AsaScienceKeyword(Base): - __tablename__ = "asa_science_keyword" - __table_args__ = {"schema": "ALMA"} - - keyword = Column(String(100), nullable=False) - category_id = Column(ForeignKey("ALMA.asa_science_keyword_category.id"), nullable=False, index=True) - id = Column(Numeric(asdecimal=False), primary_key=True) - - category = relationship("AsaScienceKeywordCategory") - - -class AsaScienceKeywordCategory(Base): - __tablename__ = "asa_science_keyword_category" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(4, 0, asdecimal=False), primary_key=True) - catg_name = Column(String(100), nullable=False) - - -class AsaScienceTemp(Base): - __tablename__ = "asa_science_temp" - __table_args__ = ( - Index("asa_tmp_idx3", "source_name", "member_ouss_id"), - Index("asa_tmp_idx2", "source_name", "group_ouss_id"), - {"schema": "ALMA"}, - ) - - dataset_id = Column(String(128), primary_key=True) - asdm_uid = Column(String(32)) - field_uid = Column(String(32)) - spectral_window_uid = Column(String(32)) - project_uid = Column(String(32)) - schedblock_uid = Column(String(32)) - execblock_uid = Column(String(32)) - ra = Column(NullType, nullable=False) - dec = Column(NullType, nullable=False) - ra_source = Column(NullType, nullable=False) - dec_source = Column(NullType, nullable=False) - cx = Column(NullType) - cy = Column(NullType) - cz = Column(NullType) - az_min = Column(NullType, nullable=False) - az_max = Column(NullType, nullable=False) - elevation_min = Column(NullType, nullable=False) - elevation_max = Column(NullType, nullable=False) - wcs_cd1_1 = Column(NullType) - wcs_cd1_2 = Column(NullType) - wcs_cd2_1 = Column(NullType) - wcs_cd2_2 = Column(NullType) - wcs_crpix1 = Column(NullType) - wcs_crpix2 = Column(NullType) - wcs_crval1 = Column(NullType) - wcs_crval2 = Column(NullType) - spatial_scale_min = Column(NullType, nullable=False) - spatial_scale_max = Column(NullType, nullable=False) - gal_longitude = Column(NullType, nullable=False) - gal_latitude = Column(NullType, nullable=False) - ecliptic_longitude = Column(NullType, nullable=False) - ecliptic_latitude = Column(NullType, nullable=False) - footprint = Column(String(2048)) - fov = Column(NullType, nullable=False) - bounding_box = Column(String(2048)) - source_name = Column(String(256)) - source_is_in_simbad = Column(String(1), nullable=False) - source_class = Column(String(128)) - source_redshift = Column(NullType) - source_alma_catalog_id = Column(Numeric(22, 0, asdecimal=False)) - start_date = Column(DateTime, nullable=False) - end_date = Column(DateTime, nullable=False) - int_time = Column(Numeric(10, 3), nullable=False) - time_resolution = Column(Numeric(8, 4), nullable=False) - frequency = Column(NullType) - band = Column(Numeric(scale=0, asdecimal=False)) - frequency_resolution = Column(NullType) - velocity_resolution = Column(NullType) - resolving_power = Column(NullType) - bandwidth = Column(NullType) - rest_frequency = Column(NullType) - rest_frequency_min = Column(NullType) - rest_frequency_max = Column(NullType) - rest_frequency_resolution = Column(NullType) - rest_velocity_resolution = Column(NullType, nullable=False) - rest_resolving_power = Column(NullType, nullable=False) - rest_frequency_support = Column(String(512), nullable=False) - channel_num = Column(Numeric(scale=0, asdecimal=False)) - spectral_window_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - continuum_window_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - obs_unitset_id = Column(String(32), nullable=False) - science_goal_ouss_id = Column(String(32)) - group_ouss_id = Column(String(32)) - member_ouss_id = Column(String(32)) - sensitivity = Column(Numeric(22, 0, asdecimal=False)) - flux_min = Column(NullType) - flux_max = Column(NullType) - uv_coverage_param1 = Column(NullType) - uv_coverage_param2 = Column(NullType) - pol_num = Column(Numeric(scale=0, asdecimal=False)) - pol_products = Column(String(64)) - airmass = Column(NullType) - pwv = Column(NullType) - temperature = Column(NullType) - windspeed = Column(NullType) - winddirection = Column(NullType) - antennas = Column(String(660)) - baseline_max = Column(NullType, nullable=False) - baseline_min = Column(NullType, nullable=False) - scan_num = Column(Numeric(scale=0, asdecimal=False), nullable=False) - project_code = Column(String(20), nullable=False) - schedblock_name = Column(String(128)) - observation_category = Column(String(128), nullable=False) - scan_intent = Column(String(256)) - access_format = Column(String(10), nullable=False) - processing_level = Column(Numeric(scale=0, asdecimal=False), nullable=False) - frequency_support = Column(String(4000)) - spatial_resolution = Column(NullType, nullable=False) - spatres = Column(NullType) - mineltp = Column(NullType) - minel12 = Column(NullType) - minel7 = Column(NullType) - max_angscale = Column(NullType) - obs_mode = Column(String(80)) - pipver = Column(String(80)) - asdm_list = Column(String(200)) - ant_tp_num = Column(Numeric(3, 0, asdecimal=False), nullable=False) - ant_num = Column(Numeric(3, 0, asdecimal=False), nullable=False) - ant_main_num = Column(Numeric(3, 0, asdecimal=False), nullable=False) - ant_aca_num = Column(Numeric(3, 0, asdecimal=False), nullable=False) - frequency_max = Column(NullType, nullable=False) - frequency_min = Column(NullType, nullable=False) - requestedarray = Column(String(8)) - asa_ous_id = Column(String(64)) - band_list = Column(String(30)) - antenna_string = Column(String(30)) - product_type = Column(String(10)) - dataset_product_id = Column(String(128)) - rms = Column(NullType) - is_mosaic = Column(String(1), nullable=False) - best_source_redshift = Column(NullType) - redshift_provenance = Column(String(1)) - cont_sensitivity_channel = Column(NullType) - cont_sensitivity_10kms = Column(NullType) - cont_sensitivity_bandwidth = Column(NullType) - parent_dataset_id = Column(String(128)) - - -class AsaTable(Base): - __tablename__ = "asa_tables" - __table_args__ = (Index("asa_tables_unique", "schema_name", "table_name", unique=True), {"schema": "ALMA"}) - - schema_name = Column(String(128), nullable=False) - table_name = Column(String(128), nullable=False) - table_type = Column(String(5), nullable=False) - description = Column(String(1024)) - utype = Column(String(512)) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - - -class AsaTablesKey(Base): - __tablename__ = "asa_tables_keys" - __table_args__ = {"schema": "ALMA"} - - key_id = Column(String(128), primary_key=True) - from_table = Column(String(128), nullable=False) - target_table = Column(String(128), nullable=False) - description = Column(String(1024), nullable=False) - utype = Column(String(512)) - - -class AsaTablesKeysColumn(Base): - __tablename__ = "asa_tables_keys_columns" - __table_args__ = {"schema": "ALMA"} - - key_id = Column(String(128), primary_key=True) - from_column = Column(String(128), nullable=False) - target_column = Column(String(128), nullable=False) - - -class AsaTapSchema(Base): - __tablename__ = "asa_tap_schemas" - __table_args__ = {"schema": "ALMA"} - - schema_name = Column(String(128), nullable=False, unique=True) - description = Column(String(1024)) - utype = Column(String(512)) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - - -t_asp_accounts = Table( - "asp_accounts", - metadata, - Column("account_id", String(32), nullable=False), - Column("provides_user_demographics", String(1)), - Column("last_demographics_page_visit", DateTime), - schema="ALMA", -) - - -t_asp_obs_proposal = Table( - "asp_obs_proposal", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("cycle", String(32)), - Column("code", String(64), nullable=False), - Column("priority", String(2)), - Column("title", String(256)), - Column("pi_id", String(32)), - Column("affiliation", String(64)), - Column("executive", String(32)), - Column("qa0passcount", Numeric(asdecimal=False)), - Column("final_scientific_category", String(32)), - Column("project_state", String(32)), - schema="ALMA", -) - - -t_asp_obs_proposal_author = Table( - "asp_obs_proposal_author", - metadata, - Column("proposal_archive_uid", String(255), nullable=False), - Column("author_index", Numeric(scale=0, asdecimal=False), nullable=False), - Column("account_id", String(32), nullable=False), - Column("firstname", String(256), nullable=False), - Column("initials", String(256)), - Column("lastname", String(256), nullable=False), - schema="ALMA", -) - - -t_assignment = Table( - "assignment", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("participant_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("score", Float), - Column("proposal_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("state_change_date", DateTime), - Column("status", String(32)), - Column("assignment_type", String(32)), - Column("conflict", String(32)), - Column("normalized_score", Float), - Column("vote_score", Float), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("rejection_type", String(32)), - Column("normalized_vote_score", Numeric(asdecimal=False)), - Column("assignment_comment", String(4000)), - Column("reason_for_rejection", String(4000)), - Column("comment_to_sa", String(4000)), - Column("comment_to_phase2", String(4000)), - Column("resurrection_justification", String(4000)), - schema="ALMA", -) - - -t_assignment_view = Table( - "assignment_view", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("proposal_code", String(64)), - Column("cycle_code", String(32)), - Column("title", String(256)), - Column("pi_userid", String(32)), - Column("abstract_text", Text), - Column("scientific_category", String(32)), - Column("new_scientific_category", String(16)), - Column("overridden_sci_cat", String(32)), - Column("proposal_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("feasible", String(8)), - Column("arp_avg_score", Float), - Column("arp_std_dev_scores", Float), - Column("arp_score", Float), - Column("arp_prop_strength", String(4000)), - Column("arp_prop_weakness", String(4000)), - Column("arp_prop_improvement", String(4000)), - Column("arp_prop_evaluation", String(4000)), - Column("arp_comment", String(4000)), - Column("aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("aprc_letter_grade", String(1)), - Column("aprc_prop_strength", String(4000)), - Column("aprc_prop_weakness", String(4000)), - Column("aprc_prop_improvement", String(4000)), - Column("aprc_prop_evaluation", String(4000)), - Column("aprc_comment", String(4000)), - Column("dc_letter_grade", String(1)), - Column("assignment_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("status", String(32)), - Column("conflict", String(32)), - Column("assignment_type", String(32)), - Column("assignment_comment", String(4000)), - Column("comment_to_sa", String(4000)), - Column("comment_to_phase2", String(4000)), - Column("score", Float), - Column("normalized_score", Float), - Column("reason_for_rejection", String(4000)), - Column("assessor_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("participant_type", String(64), nullable=False), - Column("assessor_userid", String(32), nullable=False), - Column("assessor_first_name", String(256)), - Column("assessor_last_name", String(256)), - Column("assessor_email", String(256)), - Column("arp_id", Numeric(38, 0, asdecimal=False)), - Column("panel_name", String(255)), - Column("role_on_panel", String(255)), - schema="ALMA", -) - - -class BmmvObsproject(Base): - __tablename__ = "bmmv_obsproject" - __table_args__ = {"schema": "ALMA"} - - prj_archive_uid = Column(String(33), primary_key=True) - deleted = Column(Numeric(1, 0, asdecimal=False), index=True) - pi = Column(String(64), index=True) - prj_name = Column(String(256)) - title = Column(String(256)) - array = Column(String(64)) - prj_code = Column(String(64), nullable=False) - code = Column(String(64), index=True) - prj_time_of_creation = Column(String(23)) - prj_scientific_rank = Column(Numeric(8, 0, asdecimal=False)) - prj_version = Column(String(32)) - prj_assigned_priority = Column(Numeric(asdecimal=False)) - prj_letter_grade = Column(String(2)) - p2g_attention = Column(String(5), index=True) - p2g_attention_reasons = Column(String(4000)) - manual_mode = Column(String(5)) - - -class BmmvObsproposal(Base): - __tablename__ = "bmmv_obsproposal" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - deleted = Column(Numeric(1, 0, asdecimal=False)) - abstract_text = Column(Text) - scientific_category = Column(String(32)) - proposal_type = Column(String(32)) - pi_userid = Column(String(32)) - associatedexec = Column(String(32)) - datereceived = Column(String(32)) - obsproject_archive_uid = Column(String(32), nullable=False, index=True) - projectuid = Column(String(32), nullable=False, index=True) - pi_fullname = Column(String(64)) - organization = Column(String(64)) - email = Column(String(64)) - cycle = Column(String(32), index=True) - keyword1 = Column(String(128)) - keyword2 = Column(String(128)) - keywordcode1 = Column(String(128)) - keywordcode2 = Column(String(128)) - studentproject = Column(String(32)) - - -class BmmvObsproposalAuthor(Base): - __tablename__ = "bmmv_obsproposal_authors" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), nullable=False, index=True) - deleted = Column(Numeric(1, 0, asdecimal=False)) - cycle = Column(String(32), nullable=False) - project_archive_uid = Column(String(33), nullable=False) - userid = Column(String(32), nullable=False) - organisation = Column(String(32)) - executive = Column(String(32)) - authtype = Column(String(4), nullable=False) - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - organisation_id = Column(Numeric(38, 0, asdecimal=False)) - - -class BmmvObsproposalFeedback(Base): - __tablename__ = "bmmv_obsproposal_feedback" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - nonalmaexectimefraction = Column(String(16)) - chileexectimefraction = Column(String(16)) - eaexectimefraction = Column(String(16)) - euexectimefraction = Column(String(16)) - naexectimefraction = Column(String(16)) - integration_time = Column(String(64)) - integration_time_unit = Column(String(64)) - receiverband01time = Column(Numeric(asdecimal=False)) - receiverband02time = Column(Numeric(asdecimal=False)) - receiverband03time = Column(Numeric(asdecimal=False)) - receiverband04time = Column(Numeric(asdecimal=False)) - receiverband05time = Column(Numeric(asdecimal=False)) - receiverband06time = Column(Numeric(asdecimal=False)) - receiverband07time = Column(Numeric(asdecimal=False)) - receiverband08time = Column(Numeric(asdecimal=False)) - receiverband09time = Column(Numeric(asdecimal=False)) - receiverband10time = Column(Numeric(asdecimal=False)) - receiverbanduntime = Column(Numeric(asdecimal=False)) - array_time_alma = Column(Numeric(asdecimal=False)) - array_time_unit_alma = Column(String(8)) - array_time_aca = Column(Numeric(asdecimal=False)) - array_time_unit_aca = Column(String(8)) - array_time_twelve_m = Column(Numeric(asdecimal=False)) - array_time_unit_twelve_m = Column(String(8)) - array_time_seven_m = Column(Numeric(asdecimal=False)) - array_time_unit_seven_m = Column(String(8)) - array_time_tp_array = Column(Numeric(asdecimal=False)) - array_time_unit_tp_array = Column(String(8)) - max_data_rate_twelve_m = Column(Numeric(asdecimal=False)) - max_data_rate_unit_twelve_m = Column(String(8)) - data_volume_twelve_m = Column(Numeric(asdecimal=False)) - data_volume_unit_twelve_m = Column(String(8)) - max_data_rate_seven_m = Column(Numeric(asdecimal=False)) - max_data_rate_unit_seven_m = Column(String(8)) - data_volume_seven_m = Column(Numeric(asdecimal=False)) - data_volume_unit_seven_m = Column(String(8)) - max_data_rate_tp_array = Column(Numeric(asdecimal=False)) - max_data_rate_unit_tp_array = Column(String(8)) - data_volume_tp_array = Column(Numeric(asdecimal=False)) - data_volume_unit_tp_array = Column(String(8)) - - -class BmmvObsproposalTarget(Base): - __tablename__ = "bmmv_obsproposal_target" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - prop_archive_uid = Column(String(33), nullable=False, index=True) - science_goal_name = Column(String(1000)) - source_coord_system = Column(String(10)) - target_longitude = Column(Numeric(asdecimal=False)) - target_longitude_unit = Column(String(10)) - target_latitude = Column(Numeric(asdecimal=False)) - target_latitude_unit = Column(String(10)) - desired_sensitivity = Column(Numeric(asdecimal=False)) - desired_sensitivity_unit = Column(String(10)) - desired_angular_resolution = Column(Numeric(asdecimal=False)) - desired_ang_res_unit = Column(String(10)) - spectral_resolution = Column(Numeric(asdecimal=False)) - spectral_resolution_unit = Column(String(10)) - center_frequency = Column(Numeric(asdecimal=False)) - center_frequency_unit = Column(String(10)) - band_width = Column(Numeric(asdecimal=False)) - band_width_unit = Column(String(10)) - is_sky_frequency = Column(String(5)) - group_index = Column(Numeric(asdecimal=False)) - science_goal_index = Column(Numeric(asdecimal=False)) - start_frequency = Column(Numeric(asdecimal=False)) - start_frequency_unit = Column(String(10)) - end_frequency = Column(Numeric(asdecimal=False)) - end_frequency_unit = Column(String(10)) - - -class BmmvObsunitset(Base): - __tablename__ = "bmmv_obsunitset" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - archive_uid = Column(String(32), nullable=False, index=True) - partid = Column(String(64)) - name = Column(String(256)) - scienceprocessingscript = Column(String(1024)) - runsciencepipeline = Column(String(32)) - numberschedblocks = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - ousstatusref = Column(String(32)) - requestedarray = Column(String(8)) - is_resubmission = Column(String(5)) - resubmission_of_name = Column(String(1000)) - resolution_option = Column(String(32)) - solar_system_object = Column(String(32)) - sg_mode = Column(String(16)) - - -class BmmvProjTimeConstraint(Base): - __tablename__ = "bmmv_proj_time_constraint" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - prj_archive_uid = Column(String(33), nullable=False, index=True) - deleted = Column(Numeric(1, 0, asdecimal=False)) - time_constraint_type = Column(String(32)) - start_time = Column(String(32)) - end_time = Column(String(32)) - allowed_margin = Column(String(32)) - allowed_margin_unit = Column(String(5)) - required_delay = Column(String(32)) - required_delay_unit = Column(String(5)) - visit_id = Column(String(32)) - previous_visit_id = Column(String(32)) - monitoring_length = Column(String(32)) - monitoring_length_unit = Column(String(5)) - - -class BmmvQuicklook(Base): - __tablename__ = "bmmv_quicklook" - __table_args__ = ( - Index("bmmv_quicklook_uni", "ousstatus_uid", "ousstatus_part_id", unique=True), - {"schema": "ALMA"}, - ) - - archive_uid = Column(String(33), primary_key=True) - schedblock_uid = Column(String(64)) - qlfocussummary_uid = Column(String(64)) - qlpointingsummary_uid = Column(String(64)) - qlatmospheresummary_uid = Column(String(64)) - ousstatus_uid = Column(String(64), nullable=False) - ousstatus_part_id = Column(String(64), nullable=False) - qlphasesummary_uid = Column(String(64)) - - -class BmmvSchedblock(Base): - __tablename__ = "bmmv_schedblock" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - prj_ref = Column(String(32), index=True) - receiver_band = Column(String(32)) - frequency = Column(String(32)) - ref_ra = Column(String(32)) - ref_dec = Column(String(32)) - sb_name = Column(String(32)) - time_string = Column(String(32)) - time_units = Column(String(32)) - receiverband = Column(String(32)) - refra = Column(String(32)) - refdec = Column(String(32)) - sbname = Column(String(32)) - totalestimatedasstring = Column(String(32)) - totalestimatedtimeunits = Column(String(32)) - status = Column(String(32)) - totalestimatedtime = Column(String(32)) - execution_count = Column(String(32)) - requestedarray = Column(String(8)) - minacceptableangresolution = Column(Float) - maxacceptableangresolution = Column(Float) - representativefrequency = Column(Float) - nominalconfiguration = Column(String(32)) - gous_status_uid = Column(String(32)) - mous_status_uid = Column(String(32)) - sgous_status_uid = Column(String(32)) - - -class BmmvSchedblockPolarisation(Base): - __tablename__ = "bmmv_schedblock_polarisation" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - archive_uid = Column(String(33), nullable=False, index=True) - products = Column(String(32), nullable=False) - - -class BmmvSchedblockSource(Base): - __tablename__ = "bmmv_schedblock_sources" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - archive_uid = Column(String(33), nullable=False, index=True) - field_source_name = Column(String(32), nullable=False) - - -class Country(Base): - __tablename__ = "country" - __table_args__ = {"schema": "ALMA"} - - country_id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - country_name = Column(String(256), nullable=False, unique=True) - executive = Column(String(32), nullable=False) - - -t_cycle = Table( - "cycle", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("code", String(255), nullable=False), - Column("cycle_step", String(64), nullable=False), - Column("total_hours", Numeric(8, 0, asdecimal=False)), - Column("ea_percent", Numeric(8, 2)), - Column("eu_percent", Numeric(8, 2)), - Column("na_percent", Numeric(8, 2)), - Column("cl_percent", Numeric(8, 2)), - Column("other_percent", Numeric(8, 2)), - Column("percent_marker_1", Numeric(8, 0, asdecimal=False)), - Column("percent_marker_2", Numeric(8, 0, asdecimal=False)), - Column("percent_marker_3", Numeric(8, 0, asdecimal=False)), - Column("scientific_categories", String(255)), - Column("start_date", DateTime), - Column("end_date", DateTime), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("triage_std_dev_factor", Numeric(8, 2)), - Column("triage_percent", Numeric(8, 2)), - Column("ddt", String(1)), - Column("active", String(1)), - Column("eu_triage_percent", Numeric(8, 2)), - Column("na_triage_percent", Numeric(8, 2)), - Column("ea_triage_percent", Numeric(8, 2)), - Column("cl_triage_percent", Numeric(8, 2)), - Column("duplication_arc_seconds", Numeric(8, 2)), - Column("keyword_codes", String(4000)), - Column("score_mean", Numeric(8, 6)), - Column("score_std_dev", Numeric(8, 6)), - schema="ALMA", -) - - -t_dbmaintain_scripts = Table( - "dbmaintain_scripts", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_account = Table( - "dbmaintain_scripts_account", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_apdm = Table( - "dbmaintain_scripts_apdm", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_asa = Table( - "dbmaintain_scripts_asa", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_ph1m = Table( - "dbmaintain_scripts_ph1m", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_protrack = Table( - "dbmaintain_scripts_protrack", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -t_dbmaintain_scripts_version = Table( - "dbmaintain_scripts_version", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -class DpCacheAsdmInfo(Base): - __tablename__ = "dp_cache_asdm_info" - __table_args__ = {"schema": "ALMA"} - - asdm_id = Column(String(64), primary_key=True) - tar_size_bytes = Column(Numeric(12, 0, asdecimal=False)) - - -class DpCacheXmlInfo(Base): - __tablename__ = "dp_cache_xml_info" - __table_args__ = {"schema": "ALMA"} - - xml_id = Column(String(64), primary_key=True) - size_bytes = Column(Numeric(9, 0, asdecimal=False)) - - -t_dp_delegation = Table( - "dp_delegation", - metadata, - Column("id", Numeric(22, 0, asdecimal=False), nullable=False), - Column("pi_rh_id", Numeric(22, 0, asdecimal=False), nullable=False), - Column("project_code", String(18), nullable=False), - Column("delegee_rh_id", Numeric(22, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -t_dp_delegation_backup = Table( - "dp_delegation_backup", - metadata, - Column("id", Numeric(22, 0, asdecimal=False), nullable=False), - Column("pi_rh_id", Numeric(22, 0, asdecimal=False), nullable=False), - Column("project_code", String(18), nullable=False), - Column("delegee_rh_id", Numeric(22, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -t_dp_delivery_asdm_ous_bkp = Table( - "dp_delivery_asdm_ous_bkp", - metadata, - Column("asdm_uid", String(33)), - Column("ous_status_id", String(33)), - Column("deliverable_name", String(64), nullable=False), - Column("id", Numeric(22, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -t_drm_data_reducer = Table( - "drm_data_reducer", - metadata, - Column("dr_user_id", ForeignKey("ALMA.account.account_id"), primary_key=True), - Column("node_id", ForeignKey("ALMA.drm_node.id")), - schema="ALMA", -) - - -class DrmDrHistory(Base): - __tablename__ = "drm_dr_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - author = Column(String(32)) - entityuid = Column(String(32), nullable=False) - datareducer = Column(String(32)) - ttimestamp = Column(DateTime, nullable=False) - arc = Column(String(8)) - - -class DrmDrQualification(Base): - __tablename__ = "drm_dr_qualification" - __table_args__ = {"schema": "ALMA"} - - dr_user_id = Column(ForeignKey("ALMA.account.account_id"), primary_key=True, nullable=False) - qualification = Column(String(32), primary_key=True, nullable=False) - - dr_user = relationship("Account") - - -class DrmNode(Base): - __tablename__ = "drm_node" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(3, 0, asdecimal=False), primary_key=True) - arc = Column(String(8), nullable=False) - node = Column(String(32)) - - -t_email_template = Table( - "email_template", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("name", String(255), nullable=False), - Column("content_type", String(64)), - Column("subject", String(255)), - Column("body", Text), - Column("query", Text), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("system_email", String(1)), - schema="ALMA", -) - - -class ErrorLog(Base): - __tablename__ = "error_log" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(22, 0, asdecimal=False), primary_key=True) - archive_uid = Column(String(32)) - table_name = Column(String(30)) - ora_error_code = Column(Numeric(scale=0, asdecimal=False)) - ora_error_message = Column(String(4000)) - ora_backtrace = Column(Text) - ora_callstack = Column(Text) - created_on = Column(DateTime) - created_by = Column(String(30)) - - -class Eu1(Base): - __tablename__ = "eu1" - __table_args__ = {"schema": "ALMA"} - - data1 = Column(String(100), primary_key=True) - - -class Institution(Base): - __tablename__ = "institution" - __table_args__ = ( - Index("institution_name_unique", "name1", "name2", "name3", "country_id", "state", unique=True), - {"schema": "ALMA"}, - ) - - inst_no = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - sibling_no = Column(ForeignKey("ALMA.institution.inst_no")) - name1 = Column(String(2048), nullable=False) - name2 = Column(String(256)) - name3 = Column(String(256)) - altnames = Column(String(256)) - city = Column(String(64)) - postcode = Column(String(32)) - executive = Column(String(5), nullable=False) - state = Column(String(32)) - email = Column(String(256)) - url = Column(String(256)) - phone = Column(String(128)) - fax = Column(String(128)) - recorder = Column(String(256)) - superseding_no = Column(Numeric(38, 0, asdecimal=False)) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False, server_default=text("0 ")) - country_id = Column(ForeignKey("ALMA.country.country_id")) - user_defined = Column(String(1), server_default=text("'F'")) - ignored = Column(String(1), server_default=text("'F'")) - address1 = Column(String(512)) - address2 = Column(String(512)) - address3 = Column(String(512)) - - country = relationship("Country") - parent = relationship("Institution", remote_side=[inst_no]) - - -t_mv_obsproject = Table( - "mv_obsproject", - metadata, - Column("prj_archive_uid", String(33), nullable=False), - Column("pi", String(32)), - Column("prj_name", String(256)), - Column("array", String(64)), - Column("prj_code", String(64), nullable=False), - Column("prj_time_of_creation", String(23)), - Column("prj_scientific_rank", Numeric(8, 0, asdecimal=False)), - Column("prj_version", String(32)), - Column("prj_assigned_priority", Numeric(asdecimal=False)), - Column("prj_letter_grade", String(2)), - Column("ph1m_priority_grade", String(2)), - Column("pi_fullname", String(64)), - Column("organization", String(64)), - Column("email", String(64)), - Column("cycle", String(32)), - Column("executive", String(32)), - Column("p2g_attention", String(5)), - Column("p2g_attention_reasons", String(4000)), - schema="ALMA", -) - - -t_mv_obsproject_derived = Table( - "mv_obsproject_derived", - metadata, - Column("prj_archive_uid", String(33), nullable=False), - Column("total_time", Numeric(asdecimal=False)), - Column("used_time", Numeric(asdecimal=False)), - schema="ALMA", -) - - -t_mv_obsproposal = Table( - "mv_obsproposal", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("deleted", Numeric(1, 0, asdecimal=False)), - Column("title", String(256)), - Column("code", String(64)), - Column("cycle", String(32)), - Column("abstract_text", Text), - Column("scientific_category", String(32)), - Column("proposal_type", String(32)), - Column("pi_userid", String(32)), - Column("obsproject_archive_uid", String(32), nullable=False), - Column("pi_executive", String(32)), - Column("datereceived", String(32)), - Column("keyword1", String(128)), - Column("keyword2", String(128)), - Column("keywordcode1", String(128)), - Column("keywordcode2", String(128)), - Column("studentproject", String(32)), - Column("nonalmaexectimefraction", String(16)), - Column("chileexectimefraction", String(16)), - Column("eaexectimefraction", String(16)), - Column("euexectimefraction", String(16)), - Column("naexectimefraction", String(16)), - Column("integration_time", Numeric(asdecimal=False)), - Column("integration_time_unit", String(8)), - Column("receiverband01time", Numeric(asdecimal=False)), - Column("receiverband02time", Numeric(asdecimal=False)), - Column("receiverband03time", Numeric(asdecimal=False)), - Column("receiverband04time", Numeric(asdecimal=False)), - Column("receiverband05time", Numeric(asdecimal=False)), - Column("receiverband06time", Numeric(asdecimal=False)), - Column("receiverband07time", Numeric(asdecimal=False)), - Column("receiverband08time", Numeric(asdecimal=False)), - Column("receiverband09time", Numeric(asdecimal=False)), - Column("receiverband10time", Numeric(asdecimal=False)), - Column("receiverbanduntime", Numeric(asdecimal=False)), - Column("array_time_alma", Numeric(asdecimal=False)), - Column("array_time_unit_alma", String(8)), - Column("array_time_twelve_m", Numeric(asdecimal=False)), - Column("array_time_unit_twelve_m", String(8)), - Column("array_time_aca", Numeric(asdecimal=False)), - Column("array_time_unit_aca", String(8)), - Column("array_time_seven_m", Numeric(asdecimal=False)), - Column("array_time_unit_seven_m", String(8)), - Column("array_time_tp_array", Numeric(asdecimal=False)), - Column("array_time_unit_tp_array", String(8)), - Column("max_data_rate_twelve_m", Numeric(asdecimal=False)), - Column("max_data_rate_unit_twelve_m", String(8)), - Column("data_volume_twelve_m", Numeric(asdecimal=False)), - Column("data_volume_unit_twelve_m", String(8)), - Column("max_data_rate_seven_m", Numeric(asdecimal=False)), - Column("max_data_rate_unit_seven_m", String(8)), - Column("data_volume_seven_m", Numeric(asdecimal=False)), - Column("data_volume_unit_seven_m", String(8)), - Column("max_data_rate_tp_array", Numeric(asdecimal=False)), - Column("max_data_rate_unit_tp_array", String(8)), - Column("data_volume_tp_array", Numeric(asdecimal=False)), - Column("data_volume_unit_tp_array", String(8)), - Column("domain_entity_state", String(32), nullable=False), - Column("status_entity_id", String(64), nullable=False), - schema="ALMA", -) - - -t_mv_obsproposal_authors = Table( - "mv_obsproposal_authors", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("prj_code", String(64), nullable=False), - Column("deleted", Numeric(1, 0, asdecimal=False)), - Column("cycle", String(32), nullable=False), - Column("project_archive_uid", String(33), nullable=False), - Column("userid", String(32), nullable=False), - Column("organisation", String(32)), - Column("organisation_id", Numeric(38, 0, asdecimal=False)), - Column("executive", String(32)), - Column("authtype", String(4), nullable=False), - schema="ALMA", -) - - -t_mv_obsproposal_target = Table( - "mv_obsproposal_target", - metadata, - Column("id", Numeric(asdecimal=False), nullable=False), - Column("prop_archive_uid", String(33), nullable=False), - Column("cycle", String(32)), - Column("code", String(64)), - Column("scientific_category", String(32)), - Column("new_scientific_category", String(16)), - Column("science_goal_name", String(1000)), - Column("source_coord_system", String(10)), - Column("target_longitude", Numeric(asdecimal=False)), - Column("target_longitude_unit", String(10)), - Column("target_latitude", Numeric(asdecimal=False)), - Column("target_latitude_unit", String(10)), - Column("desired_sensitivity", Numeric(asdecimal=False)), - Column("desired_sensitivity_unit", String(10)), - Column("desired_angular_resolution", Numeric(asdecimal=False)), - Column("desired_ang_res_unit", String(10)), - Column("spectral_resolution", Numeric(asdecimal=False)), - Column("spectral_resolution_unit", String(10)), - Column("center_frequency", Numeric(asdecimal=False)), - Column("center_frequency_unit", String(10)), - Column("band_width", Numeric(asdecimal=False)), - Column("band_width_unit", String(10)), - Column("is_sky_frequency", String(4)), - Column("group_index", Numeric(asdecimal=False)), - Column("aprc_letter_grade", String(1)), - Column("dc_letter_grade", String(1)), - Column("science_goal_index", Numeric(asdecimal=False)), - Column("project_status", String(32), nullable=False), - Column("start_frequency", Numeric(asdecimal=False)), - Column("start_frequency_unit", String(10)), - Column("end_frequency", Numeric(asdecimal=False)), - Column("end_frequency_unit", String(10)), - schema="ALMA", -) - - -t_mv_obsunitset = Table( - "mv_obsunitset", - metadata, - Column("archive_uid", String(32), nullable=False), - Column("partid", String(64)), - Column("name", String(256)), - Column("scienceprocessingscript", String(1024)), - Column("runsciencepipeline", String(32)), - Column("numberschedblocks", String(32)), - Column("requestedarray", String(8)), - Column("ousstatusref", String(32)), - Column("is_resubmission", String(5)), - Column("resubmission_of_name", String(1000)), - Column("resolution_option", String(32)), - Column("solar_system_object", String(32)), - Column("sg_mode", String(16)), - schema="ALMA", -) - - -t_mv_proj_time_constraint = Table( - "mv_proj_time_constraint", - metadata, - Column("id", Numeric(asdecimal=False), nullable=False), - Column("prj_archive_uid", String(33), nullable=False), - Column("deleted", Numeric(1, 0, asdecimal=False)), - Column("time_constraint_type", String(32)), - Column("start_time", String(32)), - Column("end_time", String(32)), - Column("allowed_margin", String(32)), - Column("allowed_margin_unit", String(5)), - Column("required_delay", String(32)), - Column("required_delay_unit", String(5)), - Column("visit_id", String(32)), - Column("previous_visit_id", String(32)), - Column("monitoring_length", String(32)), - Column("monitoring_length_unit", String(5)), - schema="ALMA", -) - - -t_mv_quicklook = Table( - "mv_quicklook", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("schedblock_uid", String(64)), - Column("qlfocussummary_uid", String(64)), - Column("qlpointingsummary_uid", String(64)), - Column("qlatmospheresummary_uid", String(64)), - schema="ALMA", -) - - -t_mv_schedblock = Table( - "mv_schedblock", - metadata, - Column("sb_archive_uid", String(33), nullable=False), - Column("prj_ref", String(32)), - Column("receiver_band", String(32)), - Column("frequency", String(32)), - Column("ref_ra", String(32)), - Column("ref_dec", String(32)), - Column("sb_name", String(32)), - Column("requested_array", String(8)), - Column("minacceptableangresolution", Float), - Column("maxacceptableangresolution", Float), - Column("representativefrequency", Float), - Column("status", String(32), nullable=False), - Column("used_time", Numeric(asdecimal=False)), - Column("time_string", String(32)), - Column("time_units", String(32)), - Column("execution_count", String(32)), - Column("nominalconfiguration", String(32)), - Column("time", Numeric(asdecimal=False)), - Column("phase1_flag", Numeric(asdecimal=False)), - schema="ALMA", -) - - -t_mv_schedblock_sourcename = Table( - "mv_schedblock_sourcename", - metadata, - Column("id", Numeric(asdecimal=False), nullable=False), - Column("archive_uid", String(33), nullable=False), - Column("sourcename", String(32), nullable=False), - schema="ALMA", -) - - -class ObsProjectStatu(Base): - __tablename__ = "obs_project_status" - __table_args__ = {"schema": "ALMA"} - - status_entity_id = Column(String(64), primary_key=True) - domain_entity_id = Column(String(64), nullable=False, index=True) - domain_entity_state = Column(String(32), nullable=False, index=True) - obs_project_status_id = Column(String(64), nullable=False) - obs_program_status_id = Column(String(64), nullable=False) - obs_project_id = Column(ForeignKey("ALMA.xml_obsproject_entities.archive_uid"), nullable=False, unique=True) - project_was_timed_out = Column(DateTime) - xml = Column(NullType) - flags = Column(String(200), index=True) - - obs_project = relationship("XmlObsprojectEntity") - - -class ObsUnitSetStatu(Base): - __tablename__ = "obs_unit_set_status" - __table_args__ = (Index("ous_status_project_entity_idx", "obs_project_id", "domain_entity_id"), {"schema": "ALMA"}) - - status_entity_id = Column(String(64), primary_key=True) - domain_entity_id = Column(String(64)) - domain_entity_state = Column(String(32), nullable=False) - parent_obs_unit_set_status_id = Column(String(64)) - obs_project_status_id = Column(String(64), nullable=False) - obs_project_id = Column(ForeignKey("ALMA.xml_obsproject_entities.archive_uid"), nullable=False) - total_required_time_in_sec = Column(Numeric(scale=0, asdecimal=False), nullable=False) - total_used_time_in_sec = Column(Numeric(scale=0, asdecimal=False), nullable=False) - xml = Column(NullType) - flags = Column(String(200), index=True) - - obs_project = relationship("XmlObsprojectEntity") - - -class OcdObservingCycle(Base): - __tablename__ = "ocd_observing_cycle" - __table_args__ = {"schema": "ALMA"} - - observingcycleid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - cycle = Column(String(32), nullable=False, unique=True) - description = Column(String(256)) - clfraction = Column(Numeric(8, 2)) - eafraction = Column(Numeric(8, 2)) - eufraction = Column(Numeric(8, 2)) - nafraction = Column(Numeric(8, 2)) - otherfraction = Column(Numeric(8, 2)) - - -class OcdObservingSession(Base): - __tablename__ = "ocd_observing_session" - __table_args__ = ( - Index("ocd_obssession_uni", "observingcycleid", "blocknumber", "startdate", unique=True), - {"schema": "ALMA"}, - ) - - sessionid = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - observingcycleid = Column(ForeignKey("ALMA.ocd_observing_cycle.observingcycleid"), nullable=False) - blocknumber = Column(Numeric(8, 0, asdecimal=False), nullable=False) - startdate = Column(DateTime, nullable=False) - enddate = Column(DateTime, nullable=False) - comments = Column(String(256)) - - ocd_observing_cycle = relationship("OcdObservingCycle") - - -t_old_dbmaintain_scripts = Table( - "old_dbmaintain_scripts", - metadata, - Column("file_name", String(150)), - Column("file_last_modified_at", Numeric(scale=0, asdecimal=False)), - Column("checksum", String(50)), - Column("executed_at", String(20)), - Column("succeeded", Numeric(scale=0, asdecimal=False)), - schema="ALMA", -) - - -class OusOperation(Base): - __tablename__ = "ous_operations" - __table_args__ = {"schema": "ALMA"} - - obs_unit_set_id = Column(String(64), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - data_reducer_account_id = Column(ForeignKey("ALMA.account.account_id")) - data_reducer_executive = Column(String(64)) - qa2recipients = Column(String(512)) - drm_account_id = Column(ForeignKey("ALMA.account.account_id")) - - data_reducer_account = relationship( - "Account", primaryjoin="OusOperation.data_reducer_account_id == Account.account_id" - ) - drm_account = relationship("Account", primaryjoin="OusOperation.drm_account_id == Account.account_id") - - -t_panel = Table( - "panel", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("panel_name", String(255), nullable=False), - Column("minutes", Text), - Column("panel_type", String(32), nullable=False), - Column("scientific_category", String(32)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - schema="ALMA", -) - - -t_panel_member = Table( - "panel_member", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("participant_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("panel_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("role_on_panel", String(255)), - Column("package_downloaded", DateTime), - schema="ALMA", -) - - -t_participant = Table( - "participant", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("package_downloaded", DateTime), - Column("userid", String(32), nullable=False), - Column("participant_type", String(64), nullable=False), - Column("alma_location", String(32)), - Column("keyword_codes", String(256)), - Column("score_mean", Numeric(8, 6)), - Column("score_std_dev", Numeric(8, 6)), - schema="ALMA", -) - - -class Ph1mAssignment(Base): - __tablename__ = "ph1m_assignment" - __table_args__ = (Index("assignment_unique", "proposal_id", "participant_id", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - participant_id = Column(ForeignKey("ALMA.ph1m_participant.id"), nullable=False, index=True) - score = Column(Float) - proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id"), nullable=False, index=True) - state_change_date = Column(DateTime) - status = Column(String(32)) - assignment_type = Column(String(32)) - conflict = Column(String(32)) - normalized_score = Column(Float) - vote_score = Column(Float) - update_date = Column(DateTime) - update_userid = Column(String(32)) - rejection_type = Column(String(32)) - normalized_vote_score = Column(Numeric(asdecimal=False)) - assignment_comment = Column(String(4000)) - reason_for_rejection = Column(String(4000)) - comment_to_sa = Column(String(4000)) - comment_to_phase2 = Column(String(4000)) - resurrection_justification = Column(String(4000)) - - participant = relationship("Ph1mParticipant") - proposal = relationship("Ph1mProposal") - - -class Ph1mAutosave(Base): - __tablename__ = "ph1m_autosave" - __table_args__ = {"schema": "ALMA"} - - table_name = Column(String(32), primary_key=True, nullable=False) - column_name = Column(String(32), primary_key=True, nullable=False) - row_id = Column(Numeric(38, 0, asdecimal=False), primary_key=True, nullable=False) - user_id = Column(String(32), primary_key=True, nullable=False) - update_date = Column(DateTime, nullable=False) - saved_text = Column(Text, nullable=False) - - -class Ph1mCycle(Base): - __tablename__ = "ph1m_cycle" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - code = Column(String(255), nullable=False, unique=True) - cycle_step = Column(String(64), nullable=False) - total_hours = Column(Numeric(8, 0, asdecimal=False)) - ea_percent = Column(Numeric(8, 2)) - eu_percent = Column(Numeric(8, 2)) - na_percent = Column(Numeric(8, 2)) - cl_percent = Column(Numeric(8, 2)) - other_percent = Column(Numeric(8, 2)) - percent_marker_1 = Column(Numeric(8, 0, asdecimal=False)) - percent_marker_2 = Column(Numeric(8, 0, asdecimal=False)) - percent_marker_3 = Column(Numeric(8, 0, asdecimal=False)) - scientific_categories = Column(String(255)) - start_date = Column(DateTime) - end_date = Column(DateTime) - update_date = Column(DateTime) - update_userid = Column(String(32)) - triage_std_dev_factor = Column(Numeric(8, 2)) - triage_percent = Column(Numeric(8, 2)) - ddt = Column(String(1), server_default=text("'F'")) - active = Column(String(1), server_default=text("'T'")) - eu_triage_percent = Column(Numeric(8, 2), server_default=text("70")) - na_triage_percent = Column(Numeric(8, 2), server_default=text("70")) - ea_triage_percent = Column(Numeric(8, 2), server_default=text("70")) - cl_triage_percent = Column(Numeric(8, 2), server_default=text("70")) - duplication_arc_seconds = Column(Numeric(8, 2), server_default=text("120")) - keyword_codes = Column(String(4000)) - score_mean = Column(Numeric(8, 6)) - score_std_dev = Column(Numeric(8, 6)) - triage_oversub_percent = Column( - Numeric(8, 2), - server_default=text( - """\ -300 - """ - ), - ) - - -class Ph1mEmailTemplate(Base): - __tablename__ = "ph1m_email_template" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - name = Column(String(255), nullable=False, unique=True) - content_type = Column(String(64)) - subject = Column(String(255)) - body = Column(Text) - query = Column(Text) - update_date = Column(DateTime) - update_userid = Column(String(32)) - system_email = Column( - String(1), - server_default=text( - """\ -'F' - """ - ), - ) - - -class Ph1mPanel(Base): - __tablename__ = "ph1m_panel" - __table_args__ = (Index("unique_panel_name", "cycle_id", "panel_name", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - cycle_id = Column(ForeignKey("ALMA.ph1m_cycle.id"), nullable=False) - panel_name = Column(String(255), nullable=False) - minutes = Column(Text) - panel_type = Column(String(32), nullable=False) - scientific_category = Column(String(32)) - update_date = Column(DateTime) - update_userid = Column(String(32)) - - cycle = relationship("Ph1mCycle") - proposals = relationship("Ph1mProposal", secondary="ALMA.ph1m_panel_proposal") - - -class Ph1mPanelMember(Base): - __tablename__ = "ph1m_panel_member" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - participant_id = Column(ForeignKey("ALMA.ph1m_participant.id"), nullable=False) - panel_id = Column(ForeignKey("ALMA.ph1m_panel.id"), nullable=False) - role_on_panel = Column(String(255)) - package_downloaded = Column(DateTime) - - panel = relationship("Ph1mPanel") - participant = relationship("Ph1mParticipant") - - -t_ph1m_panel_proposal = Table( - "ph1m_panel_proposal", - metadata, - Column("panel_id", ForeignKey("ALMA.ph1m_panel.id"), primary_key=True, nullable=False), - Column("proposal_id", ForeignKey("ALMA.ph1m_proposal.id"), primary_key=True, nullable=False), - schema="ALMA", -) - - -class Ph1mParticipant(Base): - __tablename__ = "ph1m_participant" - __table_args__ = (Index("participant_unique", "userid", "cycle_id", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - cycle_id = Column(ForeignKey("ALMA.ph1m_cycle.id"), nullable=False) - package_downloaded = Column(DateTime) - userid = Column(String(32), nullable=False, index=True) - participant_type = Column(String(64), nullable=False) - alma_location = Column(String(32)) - keyword_codes = Column(String(256)) - score_mean = Column(Numeric(8, 6)) - score_std_dev = Column(Numeric(8, 6)) - max_workload = Column(Numeric(3, 0, asdecimal=False)) - - cycle = relationship("Ph1mCycle") - - -class Ph1mProposal(Base): - __tablename__ = "ph1m_proposal" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - cycle_id = Column(ForeignKey("ALMA.ph1m_cycle.id"), nullable=False) - archive_uid = Column(String(255), nullable=False, unique=True) - panel_id_back = Column(Numeric(38, 0, asdecimal=False), index=True) - cancelled = Column(String(1), server_default=text("'F'")) - new_integration_time_hours = Column(Numeric(8, 2), server_default=text("0")) - new_scientific_category = Column(String(16)) - needs_more_time = Column(String(1), server_default=text("'F'")) - arp_score = Column(Float) - arp_avg_score = Column(Float) - arp_std_dev_scores = Column(Float) - aprc_letter_grade = Column(String(1)) - aprc_rank = Column(Numeric(scale=0, asdecimal=False)) - aprc_original_rank = Column(Numeric(scale=0, asdecimal=False)) - arp_work_progress = Column(String(10)) - aprc_work_progress = Column(String(10), server_default=text("'NOT_SEEN'")) - feasible = Column(String(8)) - dc_score = Column(Float) - dc_letter_grade = Column(String(1)) - dc_rank = Column(Numeric(scale=0, asdecimal=False)) - dc_original_rank = Column(Numeric(scale=0, asdecimal=False)) - dc_rank_changed = Column(String(1), server_default=text("'F'")) - dc_work_progress = Column(String(10), server_default=text("'NOT_SEEN'")) - arp_rank = Column(Numeric(scale=0, asdecimal=False)) - update_date = Column(DateTime) - update_userid = Column(String(32)) - triage_flag = Column(String(1), server_default=text("'A'")) - arp_vote_avg = Column(Float) - arp_vote_std_dev = Column(Float) - arp_nr_votes = Column(Numeric(scale=0, asdecimal=False), server_default=text("0")) - arp_original_rank = Column(Numeric(scale=0, asdecimal=False)) - arp_rank_manually_changed = Column(String(1), server_default=text("'F'")) - aprc_rank_manually_changed = Column(String(1), server_default=text("'F'")) - arp_score_normalized = Column(Float, server_default=text("999999")) - arp_rank_normalized = Column(Float, server_default=text("999999")) - duplication_flags = Column(String(250)) - arp_comment = Column(String(4000)) - aprc_comment = Column(String(4000)) - new_time_set_by_sg_descope = Column(String(1)) - arp_prop_strength = Column(String(4000)) - arp_prop_weakness = Column(String(4000)) - arp_prop_improvement = Column(String(4000)) - arp_prop_evaluation = Column(String(4000)) - aprc_prop_strength = Column(String(4000)) - aprc_prop_weakness = Column(String(4000)) - aprc_prop_improvement = Column(String(4000)) - aprc_prop_evaluation = Column(String(4000)) - ta_comment_to_pi = Column(String(4000)) - arp_grouping_flag = Column(Numeric(2, 0, asdecimal=False)) - non_standard_twelve_m_hours = Column(Numeric(8, 2)) - manual_flag = Column(String(255)) - new_keywordcode1 = Column(String(4)) - new_keywordcode2 = Column(String(4)) - - cycle = relationship("Ph1mCycle") - - -class Ph1mProposalAuthor(Base): - __tablename__ = "ph1m_proposal_author" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id"), nullable=False, index=True) - sequence = Column(Numeric(scale=0, asdecimal=False), nullable=False) - userid = Column(String(32), nullable=False, index=True) - institution_id = Column(Numeric(asdecimal=False)) - author_type = Column(String(4)) - - proposal = relationship("Ph1mProposal") - - -class Ph1mProposalScienceGoal(Base): - __tablename__ = "ph1m_proposal_science_goal" - __table_args__ = (Index("ph1m_psg_unique", "proposal_id", "sg_name", unique=True), {"schema": "ALMA"}) - - id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(19, 0, asdecimal=False), nullable=False) - proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id"), nullable=False, index=True) - sg_name = Column(String(512), nullable=False) - sg_mode = Column(String(10), nullable=False) - sg_12m_hours = Column(Numeric(8, 2)) - sg_aca_hours = Column(Numeric(8, 2)) - sg_7m_hours = Column(Numeric(8, 2)) - sg_tp_hours = Column(Numeric(8, 2)) - - proposal = relationship("Ph1mProposal") - - -class Ph1mRecommScienceGoal(Base): - __tablename__ = "ph1m_recomm_science_goal" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - recommendation_id = Column(ForeignKey("ALMA.ph1m_recommendation.id"), nullable=False) - science_goal_name = Column(String(512)) - descope = Column(String(1)) - proposal_science_goal_id = Column(ForeignKey("ALMA.ph1m_proposal_science_goal.id"), index=True) - - proposal_science_goal = relationship("Ph1mProposalScienceGoal") - recommendation = relationship("Ph1mRecommendation") - - -class Ph1mRecommendation(Base): - __tablename__ = "ph1m_recommendation" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - recommendation_type = Column(String(32), nullable=False) - aprc_flag = Column(String(1), server_default=text("null")) - dc_flag = Column(String(1), server_default=text("'F'")) - proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id")) - update_date = Column(DateTime) - update_userid = Column(String(32)) - duplicate_proposal_id = Column(ForeignKey("ALMA.ph1m_proposal.id")) - arc_seconds = Column(Numeric(8, 2)) - text = Column(String(4000)) - text_from_aprc = Column(String(4000)) - prop_recom_uid = Column(Numeric(19, 0, asdecimal=False)) - - duplicate_proposal = relationship( - "Ph1mProposal", primaryjoin="Ph1mRecommendation.duplicate_proposal_id == Ph1mProposal.id" - ) - proposal = relationship("Ph1mProposal", primaryjoin="Ph1mRecommendation.proposal_id == Ph1mProposal.id") - - -t_piv_account = Table( - "piv_account", - metadata, - Column("account_id", String(32), nullable=False), - Column("request_handler_id", Numeric(22, 0, asdecimal=False)), - Column("firstname", String(256), nullable=False), - Column("lastname", String(256), nullable=False), - Column("initials", String(256)), - Column("preferredarc", String(32)), - Column("email", String(256)), - Column("executive", String(5), nullable=False), - Column("instno", Numeric(38, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -t_piv_execblock = Table( - "piv_execblock", - metadata, - Column("execblockuid", String(32), nullable=False), - Column("qa0status", String(32), nullable=False), - Column("aquastarttime", DateTime), - Column("aquaendtime", DateTime), - Column("starttime", DateTime), - Column("endtime", DateTime), - Column("schedblockuid", String(32)), - Column("obsprojectpi", String(20)), - Column("representativefrequency", Numeric(15, 10)), - Column("obsprojectuid", String(32)), - schema="ALMA", -) - - -t_piv_obs_project = Table( - "piv_obs_project", - metadata, - Column("code", String(64)), - Column("pi", String(64)), - Column("contact_account_id", String(64)), - Column("firstname", String(256)), - Column("lastname", String(256)), - Column("contact_firstname", String(256)), - Column("contact_lastname", String(256)), - Column("title", String(256)), - Column("prj_version", String(32)), - Column("prj_letter_grade", String(2)), - Column("prj_grade", String(1)), - Column("rank", Numeric(8, 0, asdecimal=False)), - Column("obs_project_id", String(64), nullable=False), - Column("domain_entity_state", String(32), nullable=False), - schema="ALMA", -) - - -t_piv_obs_proposals = Table( - "piv_obs_proposals", - metadata, - Column("code", String(64)), - Column("title", String(256)), - Column("creation_date", String(23)), - Column("priority_flag", String(2)), - Column("associatedexec", String(32)), - Column("scientific_category", String(32)), - Column("scientific_category_string", String(4000)), - Column("abstract_text", Text), - Column("cycle", String(32)), - Column("proposal_type", String(32)), - Column("projectuid", String(32), nullable=False), - Column("archiveuid", String(33), nullable=False), - Column("consensus_report", String(4000)), - Column("consensus_report1", String(4000)), - Column("project_state", String(32), nullable=False), - schema="ALMA", -) - - -t_piv_obs_unit_set = Table( - "piv_obs_unit_set", - metadata, - Column("obs_project_id", String(64), nullable=False), - Column("status_entity_id", String(64), nullable=False), - Column("parent_obs_unit_set_status_id", String(64)), - Column("domain_entity_state", String(32), nullable=False), - Column("partid", String(64)), - Column("name", String(256)), - Column("requestedarray", String(8)), - Column("qa2status", String(8)), - schema="ALMA", -) - - -t_piv_proposal_authors = Table( - "piv_proposal_authors", - metadata, - Column("account_id", String(32), nullable=False), - Column("firstname", String(256), nullable=False), - Column("lastname", String(256), nullable=False), - Column("initials", String(256)), - Column("sequence", Numeric(22, 0, asdecimal=False), nullable=False), - Column("author_type", String(4), nullable=False), - Column("project_uid", String(32), nullable=False), - schema="ALMA", -) - - -t_piv_sched_block = Table( - "piv_sched_block", - metadata, - Column("obs_project_id", String(64), nullable=False), - Column("status_entity_id", String(64), nullable=False), - Column("parent_obs_unit_set_status_id", String(64), nullable=False), - Column("domain_entity_state", String(32), nullable=False), - Column("flags", String(200)), - Column("sched_block_uid", String(64), nullable=False), - Column("sb_name", String(32)), - Column("totalestimatedtime", String(32)), - Column("totalestimatedtimeunits", String(32)), - Column("ref_ra", String(32)), - Column("ref_dec", String(32)), - Column("execution_count", String(32)), - Column("qa2status", String(8)), - Column("nominalconfiguration", String(32)), - schema="ALMA", -) - - -t_piv_science_goal = Table( - "piv_science_goal", - metadata, - Column("project_uid", String(33), nullable=False), - Column("project_code", String(64)), - Column("science_goal_name", String(256)), - Column("ous_part_id", String(256)), - Column("ous_status_uid", String(64)), - Column("sb_uid", String(64)), - schema="ALMA", -) - - -t_piv_science_goal_ous_subview = Table( - "piv_science_goal_ous_subview", - metadata, - Column("ous_status_uid", String(64), nullable=False), - Column("project_uid", String(64), nullable=False), - Column("ous_part_id", String(64)), - Column("sb_uid", String(64), nullable=False), - schema="ALMA", -) - - -t_piv_science_goal_subview = Table( - "piv_science_goal_subview", - metadata, - Column("project_uid", String(33), nullable=False), - Column("project_code", String(64)), - Column("science_goal_name", String(256)), - Column("ous_part_id", String(256)), - schema="ALMA", -) - - -t_piv_state_changes = Table( - "piv_state_changes", - metadata, - Column("state_changes_id", Numeric(32, 0, asdecimal=False), nullable=False), - Column("status_entity_id", String(64), nullable=False), - Column("domain_entity_id", String(64), nullable=False), - Column("domain_entity_state", String(32), nullable=False), - Column("timestamp", DateTime, nullable=False), - Column("entity_type", String(3), nullable=False), - Column("domain_part_id", String(64)), - Column("child_sb_uid", String(64)), - schema="ALMA", -) - - -class PrjAttachment(Base): - __tablename__ = "prj_attachment" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - obs_project_archive_uid = Column(String(64), nullable=False) - auth_account_id = Column(String(64), nullable=False) - created = Column(DateTime, nullable=False) - filename = Column(String(256), nullable=False) - contents = Column(LargeBinary, nullable=False) - - -class PrjComment(Base): - __tablename__ = "prj_comment" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - obs_project_archive_uid = Column(String(64), nullable=False) - auth_account_id = Column(String(64), nullable=False) - created = Column(DateTime, nullable=False) - updated = Column(DateTime) - comment_text = Column(String(3500), nullable=False) - - -class PrjOperation(Base): - __tablename__ = "prj_operations" - __table_args__ = {"schema": "ALMA"} - - obs_project_archive_uid = Column(String(64), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - p2g_account_id = Column(String(64)) - contact_account_id = Column(String(64)) - scops_ticket = Column(String(8)) - recipients = Column(String(512)) - helpdesk_ticket = Column(String(8)) - - -class ProjectCode(Base): - __tablename__ = "project_codes" - __table_args__ = {"schema": "ALMA"} - - year = Column(String(4), primary_key=True, nullable=False) - period = Column(String(64), primary_key=True, nullable=False) - sequence = Column(Numeric(asdecimal=False), nullable=False) - type_code = Column(String(3), primary_key=True, nullable=False) - - -t_project_codes_bkp = Table( - "project_codes_bkp", - metadata, - Column("year", String(4), nullable=False), - Column("period", String(64), nullable=False), - Column("sequence", Numeric(asdecimal=False), nullable=False), - Column("type_code", String(3), nullable=False), - schema="ALMA", -) - - -t_proposal = Table( - "proposal", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("archive_uid", String(255), nullable=False), - Column("panel_id_back", Numeric(38, 0, asdecimal=False)), - Column("cancelled", String(1)), - Column("new_integration_time_hours", Numeric(8, 2)), - Column("new_scientific_category", String(16)), - Column("needs_more_time", String(1)), - Column("arp_score", Float), - Column("arp_avg_score", Float), - Column("arp_std_dev_scores", Float), - Column("aprc_letter_grade", String(1)), - Column("aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("aprc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_work_progress", String(10)), - Column("aprc_work_progress", String(10)), - Column("feasible", String(8)), - Column("dc_score", Float), - Column("dc_letter_grade", String(1)), - Column("dc_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_rank_changed", String(1)), - Column("dc_work_progress", String(10)), - Column("arp_rank", Numeric(scale=0, asdecimal=False)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("triage_flag", String(1)), - Column("arp_vote_avg", Float), - Column("arp_vote_std_dev", Float), - Column("arp_nr_votes", Numeric(scale=0, asdecimal=False)), - Column("arp_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_rank_manually_changed", String(1)), - Column("aprc_rank_manually_changed", String(1)), - Column("arp_score_normalized", Float), - Column("arp_rank_normalized", Float), - Column("duplication_flags", String(250)), - Column("arp_comment", String(4000)), - Column("aprc_comment", String(4000)), - Column("new_time_set_by_sg_descope", String(1)), - Column("arp_prop_strength", String(4000)), - Column("arp_prop_weakness", String(4000)), - Column("arp_prop_improvement", String(4000)), - Column("arp_prop_evaluation", String(4000)), - Column("aprc_prop_strength", String(4000)), - Column("aprc_prop_weakness", String(4000)), - Column("aprc_prop_improvement", String(4000)), - Column("aprc_prop_evaluation", String(4000)), - Column("ta_comment_to_pi", String(4000)), - Column("arp_grouping_flag", Numeric(2, 0, asdecimal=False)), - Column("non_standard_twelve_m_hours", Numeric(8, 2)), - schema="ALMA", -) - - -t_proposal12_back = Table( - "proposal12_back", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("archive_uid", String(255), nullable=False), - Column("alma_review_panel_id", Numeric(38, 0, asdecimal=False)), - Column("cancelled", String(1)), - Column("new_integration_time_hours", Numeric(8, 2)), - Column("new_scientific_category", String(16)), - Column("needs_more_time", String(1)), - Column("arp_score", Float), - Column("arp_comment", Text), - Column("arp_avg_score", Float), - Column("arp_std_dev_scores", Float), - Column("aprc_comment", Text), - Column("aprc_letter_grade", String(1)), - Column("aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("aprc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_work_progress", String(10)), - Column("aprc_work_progress", String(10)), - Column("feasible", String(8)), - Column("dc_score", Float), - Column("dc_letter_grade", String(1)), - Column("dc_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_rank_changed", String(1)), - Column("dc_work_progress", String(10)), - Column("arp_rank", Numeric(scale=0, asdecimal=False)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("triage_flag", String(1)), - Column("arp_vote_avg", Float), - Column("arp_vote_std_dev", Float), - Column("arp_nr_votes", Numeric(scale=0, asdecimal=False)), - Column("arp_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_rank_manually_changed", String(1)), - Column("aprc_rank_manually_changed", String(1)), - Column("arp_score_normalized", Float), - Column("arp_rank_normalized", Float), - Column("duplication_flags", String(250)), - schema="ALMA", -) - - -t_proposal_author = Table( - "proposal_author", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("proposal_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("sequence", Numeric(scale=0, asdecimal=False), nullable=False), - Column("userid", String(32), nullable=False), - Column("institution_id", Numeric(asdecimal=False)), - schema="ALMA", -) - - -t_proposal_cycle2_backup = Table( - "proposal_cycle2_backup", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("cycle_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("archive_uid", String(255), nullable=False), - Column("alma_review_panel_id", Numeric(38, 0, asdecimal=False)), - Column("cancelled", String(1)), - Column("new_integration_time_hours", Numeric(8, 2)), - Column("new_scientific_category", String(16)), - Column("needs_more_time", String(1)), - Column("arp_score", Float), - Column("arp_comment", Text), - Column("arp_avg_score", Float), - Column("arp_std_dev_scores", Float), - Column("aprc_comment", Text), - Column("aprc_letter_grade", String(1)), - Column("aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("aprc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_work_progress", String(10)), - Column("aprc_work_progress", String(10)), - Column("feasible", String(8)), - Column("dc_score", Float), - Column("dc_letter_grade", String(1)), - Column("dc_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_original_rank", Numeric(scale=0, asdecimal=False)), - Column("dc_rank_changed", String(1)), - Column("dc_work_progress", String(10)), - Column("arp_rank", Numeric(scale=0, asdecimal=False)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("triage_flag", String(1)), - Column("arp_vote_avg", Float), - Column("arp_vote_std_dev", Float), - Column("arp_nr_votes", Numeric(scale=0, asdecimal=False)), - Column("arp_original_rank", Numeric(scale=0, asdecimal=False)), - Column("arp_rank_manually_changed", String(1)), - Column("aprc_rank_manually_changed", String(1)), - Column("arp_score_normalized", Float), - Column("arp_rank_normalized", Float), - Column("duplication_flags", String(250)), - schema="ALMA", -) - - -t_recommendation = Table( - "recommendation", - metadata, - Column("id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("version", Numeric(38, 0, asdecimal=False), nullable=False), - Column("recommendation_type", String(32), nullable=False), - Column("aprc_flag", String(1)), - Column("dc_flag", String(1)), - Column("proposal_id", Numeric(38, 0, asdecimal=False)), - Column("update_date", DateTime), - Column("update_userid", String(32)), - Column("duplicate_proposal_id", Numeric(38, 0, asdecimal=False)), - Column("arc_seconds", Numeric(8, 2)), - Column("text", String(4000)), - Column("text_from_aprc", String(4000)), - schema="ALMA", -) - - -class Role(Base): - __tablename__ = "role" - __table_args__ = (Index("role_name_unique", "application", "name", unique=True), {"schema": "ALMA"}) - - role_no = Column(Numeric(38, 0, asdecimal=False), primary_key=True) - version = Column(Numeric(38, 0, asdecimal=False), nullable=False) - application = Column(String(32), nullable=False) - name = Column(String(32), nullable=False) - parent_role = Column(ForeignKey("ALMA.role.role_no")) - - parent = relationship("Role", remote_side=[role_no]) - - -class SchedBlockStatu(Base): - __tablename__ = "sched_block_status" - __table_args__ = (Index("sched_block_status_idx", "obs_project_id", "domain_entity_id"), {"schema": "ALMA"}) - - status_entity_id = Column(String(64), primary_key=True) - domain_entity_id = Column(ForeignKey("ALMA.xml_schedblock_entities.archive_uid"), nullable=False, index=True) - domain_entity_state = Column(String(32), nullable=False) - parent_obs_unit_set_status_id = Column(String(64), nullable=False, index=True) - obs_project_status_id = Column(String(64), nullable=False) - obs_project_id = Column(ForeignKey("ALMA.xml_obsproject_entities.archive_uid"), nullable=False) - total_required_time_in_sec = Column(Numeric(scale=0, asdecimal=False), nullable=False) - total_used_time_in_sec = Column(Numeric(scale=0, asdecimal=False), nullable=False) - xml = Column(NullType) - flags = Column(String(200), index=True) - - domain_entity = relationship("XmlSchedblockEntity") - obs_project = relationship("XmlObsprojectEntity") - - -class SchemaVersion(Base): - __tablename__ = "schema_version" - __table_args__ = {"schema": "ALMA"} - - name = Column(String(32), primary_key=True) - value = Column(String(32), nullable=False) - - -class ShiftlogEntry(Base): - __tablename__ = "shiftlog_entries" - __table_args__ = {"schema": "ALMA"} - - se_id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - se_type = Column(Numeric(10, 0, asdecimal=False), nullable=False, index=True) - se_subject = Column(String(256)) - se_timestamp = Column(DateTime, nullable=False, unique=True) - se_author = Column(String(32)) - se_start = Column(DateTime, index=True) - se_project_code = Column(String(128), index=True) - se_sb_code = Column(String(128)) - se_sb_id = Column(String(32), index=True) - se_eb_uid = Column(String(32)) - se_location = Column(String(32), index=True) - se_status = Column(String(32)) - se_calibration = Column(String(1)) - se_qa0flag = Column(String(32)) - se_archiving_status = Column(String(32)) - se_test_activity = Column(String(64)) - se_ispowercut = Column(String(1)) - se_pcrecoveryend = Column(DateTime) - se_pcrecoverystart = Column(DateTime) - se_wrecoveryend12m = Column(DateTime) - se_wrecoveryend7m = Column(DateTime) - se_wrecoveryendtp = Column(DateTime) - se_wrecoverystart12m = Column(DateTime) - se_wrecoverystart7m = Column(DateTime) - se_wrecoverystarttp = Column(DateTime) - se_arrayentry_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id")) - se_arrayname = Column(String(10)) - se_arraytype = Column(String(9)) - se_arrayfamily = Column(String(11)) - se_correlatortype = Column(String(4)) - se_photonicreferencename = Column(String(18)) - se_almabuild = Column(String(70)) - se_downtimetype = Column(String(9)) - se_mainactivity = Column(String(100)) - se_mainantennaname = Column(String(50)) - se_mainresponsible = Column(String(50)) - se_bandname = Column(String(10)) - se_executive = Column(String(23)) - se_obsprojectname = Column(String(256)) - se_obsprojectpi = Column(String(20)) - se_obsprojectversion = Column(String(20)) - se_acsversion = Column(String(12)) - se_shiftactivity = Column(String(11)) - se_dashboardantennasavailable = Column(String(2)) - se_dashboardantennasdelivered = Column(String(2)) - se_dashboardantennaspresent = Column(String(2)) - se_pwv = Column(Numeric(18, 10)) - se_reprfrequency = Column(Numeric(15, 10)) - se_test = Column(String(1)) - - se_arrayentry = relationship("ShiftlogEntry", remote_side=[se_id]) - - -t_shiftlog_entries_bak = Table( - "shiftlog_entries_bak", - metadata, - Column("se_id", Numeric(19, 0, asdecimal=False)), - Column("se_type", Numeric(10, 0, asdecimal=False), nullable=False), - Column("se_subject", String(256)), - Column("se_timestamp", DateTime, nullable=False), - Column("se_author", String(32)), - Column("se_start", DateTime), - Column("se_project_code", String(128)), - Column("se_sb_code", String(128)), - Column("se_sb_id", String(32)), - Column("se_eb_uid", String(32)), - Column("se_location", String(32)), - Column("se_status", String(32)), - Column("se_calibration", String(1)), - Column("se_qa0flag", String(10)), - Column("se_archiving_status", String(32)), - Column("se_test_activity", String(64)), - Column("se_ispowercut", String(1)), - Column("se_pcrecoveryend", DateTime), - Column("se_pcrecoverystart", DateTime), - Column("se_wrecoveryend12m", DateTime), - Column("se_wrecoveryend7m", DateTime), - Column("se_wrecoveryendtp", DateTime), - Column("se_wrecoverystart12m", DateTime), - Column("se_wrecoverystart7m", DateTime), - Column("se_wrecoverystarttp", DateTime), - Column("se_arrayentry_id", Numeric(10, 0, asdecimal=False)), - Column("se_arrayname", String(10)), - Column("se_arraytype", String(9)), - Column("se_arrayfamily", String(11)), - Column("se_correlatortype", String(4)), - Column("se_photonicreferencename", String(18)), - Column("se_almabuild", String(70)), - Column("se_downtimetype", String(9)), - Column("se_mainactivity", String(100)), - Column("se_mainantennaname", String(50)), - Column("se_mainresponsible", String(50)), - Column("se_bandname", String(10)), - Column("se_executive", String(20)), - Column("se_obsprojectname", String(256)), - Column("se_obsprojectpi", String(20)), - Column("se_obsprojectversion", String(20)), - Column("se_acsversion", String(12)), - Column("se_shiftactivity", String(11)), - Column("se_dashboardantennasavailable", String(2)), - Column("se_dashboardantennasdelivered", String(2)), - Column("se_dashboardantennaspresent", String(2)), - Column("se_pwv", Numeric(18, 10)), - Column("se_reprfrequency", Numeric(15, 10)), - schema="ALMA", -) - - -class ShiftlogReply(Base): - __tablename__ = "shiftlog_reply" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - reply_comment = Column(Text) - timestamp = Column(DateTime) - author = Column(String(32)) - entry_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id"), nullable=False, index=True) - - entry = relationship("ShiftlogEntry") - - -t_shiftlog_reply_bak = Table( - "shiftlog_reply_bak", - metadata, - Column("id", Numeric(19, 0, asdecimal=False)), - Column("reply_comment", Text), - Column("timestamp", DateTime), - Column("author", String(32)), - Column("entry_id", Numeric(19, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -class ShiftlogSbUsedTime(Base): - __tablename__ = "shiftlog_sb_used_time" - __table_args__ = {"schema": "ALMA"} - - sb_uid = Column(String(33), primary_key=True) - used_time = Column(Numeric(asdecimal=False), nullable=False) - - -t_shiftlog_sb_used_time_bak = Table( - "shiftlog_sb_used_time_bak", - metadata, - Column("sb_uid", String(33), nullable=False), - Column("used_time", Numeric(asdecimal=False), nullable=False), - schema="ALMA", -) - - -class SlogAllocatedTimeInterval(Base): - __tablename__ = "slog_allocated_time_interval" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(10, 0, asdecimal=False), primary_key=True) - entry_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id"), nullable=False) - arrayfamily = Column(String(11), nullable=False) - starttime = Column(DateTime, nullable=False) - endtime = Column(DateTime) - - entry = relationship("ShiftlogEntry") - - -class SlogEntryAttach(Base): - __tablename__ = "slog_entry_attach" - __table_args__ = {"schema": "ALMA"} - - slog_attach_id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - slog_attach_name = Column(String(256)) - slog_attach_contents = Column(LargeBinary) - slog_se_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id"), nullable=False, index=True) - - slog_se = relationship("ShiftlogEntry") - - -t_slog_entry_attach_bak = Table( - "slog_entry_attach_bak", - metadata, - Column("slog_attach_id", Numeric(19, 0, asdecimal=False)), - Column("slog_attach_name", String(256)), - Column("slog_attach_contents", LargeBinary), - Column("slog_se_id", Numeric(19, 0, asdecimal=False), nullable=False), - schema="ALMA", -) - - -class SlogEntryAttr(Base): - __tablename__ = "slog_entry_attr" - __table_args__ = {"schema": "ALMA"} - - slog_attr_id = Column(Numeric(19, 0, asdecimal=False), primary_key=True) - slog_attr_type = Column(Numeric(10, 0, asdecimal=False), nullable=False) - slog_attr_value = Column(String(256)) - slog_se_id = Column(ForeignKey("ALMA.shiftlog_entries.se_id"), index=True) - - slog_se = relationship("ShiftlogEntry") - - -t_slog_entry_attr_bak = Table( - "slog_entry_attr_bak", - metadata, - Column("slog_attr_id", Numeric(19, 0, asdecimal=False), nullable=False), - Column("slog_attr_type", Numeric(10, 0, asdecimal=False), nullable=False), - Column("slog_attr_value", String(256)), - Column("slog_se_id", Numeric(19, 0, asdecimal=False)), - schema="ALMA", -) - - -class StateChange(Base): - __tablename__ = "state_changes" - __table_args__ = (Index("id_perf_schs", "status_entity_id", "domain_entity_state"), {"schema": "ALMA"}) - - state_changes_id = Column(Numeric(32, 0, asdecimal=False), primary_key=True) - status_entity_id = Column(String(64), nullable=False, index=True) - domain_entity_id = Column(String(64), nullable=False, index=True) - domain_entity_state = Column(String(32), nullable=False) - timestamp = Column(DateTime, nullable=False, index=True) - location = Column(String(3), nullable=False) - user_id = Column(String(64), nullable=False) - subsystem = Column(String(32), nullable=False) - info = Column(String(2000)) - entity_type = Column(String(3), nullable=False) - domain_part_id = Column(String(64)) - flags = Column(String(200), index=True) - - -t_submission_service_account = Table( - "submission_service_account", - metadata, - Column("account_id", String(32), nullable=False), - Column("password_digest", String(256)), - schema="ALMA", -) - - -t_submission_service_roles = Table( - "submission_service_roles", metadata, Column("account_id", String(32)), Column("name", String(66)), schema="ALMA" -) - - -t_submission_service_roles_orig = Table( - "submission_service_roles_orig", - metadata, - Column("account_id", String(32), nullable=False), - Column("name", String(66)), - schema="ALMA", -) - - -t_test_23 = Table("test_23", metadata, Column("a", Numeric(scale=0, asdecimal=False)), schema="ALMA") - - -t_test_24 = Table("test_24", metadata, Column("a", Numeric(scale=0, asdecimal=False)), schema="ALMA") - - -class TrustedAccount(Base): - __tablename__ = "trusted_accounts" - __table_args__ = ( - Index("trustedacc_unique", "alma_account_id", "trusted_account_id", "trusted_institution", unique=True), - {"schema": "ALMA"}, - ) - - id = Column(Numeric(asdecimal=False), primary_key=True) - alma_account_id = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - trusted_account_id = Column(String(32), nullable=False) - trusted_institution = Column(String(10), nullable=False) - - alma_account = relationship("Account") - - -t_uid_lookup = Table( - "uid_lookup", metadata, Column("archive_uid", String(33)), Column("schemaname", String(30)), schema="ALMA" -) - - -class UserDemographic(Base): - __tablename__ = "user_demographics" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - version = Column(Numeric(asdecimal=False)) - account_id = Column(ForeignKey("ALMA.account.account_id"), nullable=False) - observing_mm_submm = Column(String(32), nullable=False) - observing_ir = Column(String(32), nullable=False) - observing_radio = Column(String(32), nullable=False) - observing_theory_modeling = Column(String(32), nullable=False) - observing_xray = Column(String(32), nullable=False) - professional_status = Column(String(32), nullable=False) - techniques_interferometry = Column(String(32), nullable=False) - techniques_total_power = Column(String(32), nullable=False) - year_of_phd = Column(Numeric(scale=0, asdecimal=False), nullable=False) - last_update = Column(DateTime, nullable=False) - observing_uv_optical = Column(String(32), nullable=False) - - account = relationship("Account") - - -t_v_region_props = Table( - "v_region_props", - metadata, - Column("v_proposal_id", Numeric(38, 0, asdecimal=False), nullable=False), - Column("v_pi_executive", String(32)), - Column("v_aprc_letter_grade", String(1)), - Column("v_aprc_rank", Numeric(scale=0, asdecimal=False)), - Column("v_arp_score", Float), - Column("regional_rank", Numeric(asdecimal=False)), - Column("nr_props_region", Numeric(asdecimal=False)), - schema="ALMA", -) - - -t_v_schedblock_polarisation = Table( - "v_schedblock_polarisation", - metadata, - Column("archive_uid", String(33), nullable=False), - Column("products", String(32), nullable=False), - schema="ALMA", -) - - -t_watchdog = Table("watchdog", metadata, Column("field", DateTime), Column("site", String(5)), schema="ALMA") - - -class XmlAcapolarizationEntity(Base): - __tablename__ = "xml_acapolarization_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAccummodeEntity(Base): - __tablename__ = "xml_accummode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcsalarmmessageEntity(Base): - __tablename__ = "xml_acsalarmmessage_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcscommandcenterpEntity(Base): - __tablename__ = "xml_acscommandcenterp_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcscommandcentertEntity(Base): - __tablename__ = "xml_acscommandcentert_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcserrorEntity(Base): - __tablename__ = "xml_acserror_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAcslogtsEntity(Base): - __tablename__ = "xml_acslogts_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAddressEntity(Base): - __tablename__ = "xml_address_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAlarmsystemstatsEntity(Base): - __tablename__ = "xml_alarmsystemstats_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAlmaradiometertabEntity(Base): - __tablename__ = "xml_almaradiometertab_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAnnotationtableEntity(Base): - __tablename__ = "xml_annotationtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAntennamakeEntity(Base): - __tablename__ = "xml_antennamake_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAntennamotionpattEntity(Base): - __tablename__ = "xml_antennamotionpatt_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAntennatableEntity(Base): - __tablename__ = "xml_antennatable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAntennatypeEntity(Base): - __tablename__ = "xml_antennatype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAsdmEntity(Base): - __tablename__ = "xml_asdm_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAsdmbinarytableEntity(Base): - __tablename__ = "xml_asdmbinarytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAsiconfigurationEntity(Base): - __tablename__ = "xml_asiconfiguration_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAsimessageEntity(Base): - __tablename__ = "xml_asimessage_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAssociatedcalnatuEntity(Base): - __tablename__ = "xml_associatedcalnatu_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAssociatedfieldnaEntity(Base): - __tablename__ = "xml_associatedfieldna_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAtmphasecorrectioEntity(Base): - __tablename__ = "xml_atmphasecorrectio_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlAxisnameEntity(Base): - __tablename__ = "xml_axisname_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBasebandnameEntity(Base): - __tablename__ = "xml_basebandname_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBaselinereferenceEntity(Base): - __tablename__ = "xml_baselinereference_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBeamtableEntity(Base): - __tablename__ = "xml_beamtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBinarydataflagsEntity(Base): - __tablename__ = "xml_binarydataflags_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlBulktestEntity(Base): - __tablename__ = "xml_bulktest_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalamplitableEntity(Base): - __tablename__ = "xml_calamplitable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalappphasetableEntity(Base): - __tablename__ = "xml_calappphasetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalatmospheretablEntity(Base): - __tablename__ = "xml_calatmospheretabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalbandpasstableEntity(Base): - __tablename__ = "xml_calbandpasstable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalcurvetableEntity(Base): - __tablename__ = "xml_calcurvetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalcurvetypeEntity(Base): - __tablename__ = "xml_calcurvetype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaldataoriginEntity(Base): - __tablename__ = "xml_caldataorigin_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaldatatableEntity(Base): - __tablename__ = "xml_caldatatable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaldelaytableEntity(Base): - __tablename__ = "xml_caldelaytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaldevicetableEntity(Base): - __tablename__ = "xml_caldevicetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalfluxtableEntity(Base): - __tablename__ = "xml_calfluxtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalfocusmodeltablEntity(Base): - __tablename__ = "xml_calfocusmodeltabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalfocustableEntity(Base): - __tablename__ = "xml_calfocustable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalgaintableEntity(Base): - __tablename__ = "xml_calgaintable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalholographytablEntity(Base): - __tablename__ = "xml_calholographytabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationconfigEntity(Base): - __tablename__ = "xml_calibrationconfig_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationdeviceEntity(Base): - __tablename__ = "xml_calibrationdevice_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationfunctiEntity(Base): - __tablename__ = "xml_calibrationfuncti_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationmodeEntity(Base): - __tablename__ = "xml_calibrationmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalibrationsetEntity(Base): - __tablename__ = "xml_calibrationset_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalphasetableEntity(Base): - __tablename__ = "xml_calphasetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalpointingmodeltEntity(Base): - __tablename__ = "xml_calpointingmodelt_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalpointingtableEntity(Base): - __tablename__ = "xml_calpointingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalpositiontableEntity(Base): - __tablename__ = "xml_calpositiontable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalprimarybeamtabEntity(Base): - __tablename__ = "xml_calprimarybeamtab_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalqueryparameterEntity(Base): - __tablename__ = "xml_calqueryparameter_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalreductiontableEntity(Base): - __tablename__ = "xml_calreductiontable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalseeingtableEntity(Base): - __tablename__ = "xml_calseeingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCaltypeEntity(Base): - __tablename__ = "xml_caltype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCalwvrtableEntity(Base): - __tablename__ = "xml_calwvrtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCommonentityEntity(Base): - __tablename__ = "xml_commonentity_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCommontypesEntity(Base): - __tablename__ = "xml_commontypes_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlConfigdescriptionEntity(Base): - __tablename__ = "xml_configdescription_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelationbitEntity(Base): - __tablename__ = "xml_correlationbit_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelationmodeEntity(Base): - __tablename__ = "xml_correlationmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelatorcalibraEntity(Base): - __tablename__ = "xml_correlatorcalibra_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelatormodetabEntity(Base): - __tablename__ = "xml_correlatormodetab_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelatornameEntity(Base): - __tablename__ = "xml_correlatorname_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlCorrelatortypeEntity(Base): - __tablename__ = "xml_correlatortype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDatacontentEntity(Base): - __tablename__ = "xml_datacontent_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDatadescriptiontaEntity(Base): - __tablename__ = "xml_datadescriptionta_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDatascaleEntity(Base): - __tablename__ = "xml_datascale_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDelaymodelfixedpaEntity(Base): - __tablename__ = "xml_delaymodelfixedpa_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDelaymodeltableEntity(Base): - __tablename__ = "xml_delaymodeltable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDelaymodelvariablEntity(Base): - __tablename__ = "xml_delaymodelvariabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDetectorbandtypeEntity(Base): - __tablename__ = "xml_detectorbandtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDifferencetypeEntity(Base): - __tablename__ = "xml_differencetype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDirectionreferencEntity(Base): - __tablename__ = "xml_directionreferenc_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDopplerreferencecEntity(Base): - __tablename__ = "xml_dopplerreferencec_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDopplertableEntity(Base): - __tablename__ = "xml_dopplertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlDopplertrackingmoEntity(Base): - __tablename__ = "xml_dopplertrackingmo_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlEphemeristableEntity(Base): - __tablename__ = "xml_ephemeristable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlExecblocktableEntity(Base): - __tablename__ = "xml_execblocktable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlExecconfigEntity(Base): - __tablename__ = "xml_execconfig_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFeedtableEntity(Base): - __tablename__ = "xml_feedtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFieldcodeEntity(Base): - __tablename__ = "xml_fieldcode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFieldtableEntity(Base): - __tablename__ = "xml_fieldtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFiltermodeEntity(Base): - __tablename__ = "xml_filtermode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFlagcmdtableEntity(Base): - __tablename__ = "xml_flagcmdtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFlagtableEntity(Base): - __tablename__ = "xml_flagtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFluxcalibrationmeEntity(Base): - __tablename__ = "xml_fluxcalibrationme_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFocusmethodEntity(Base): - __tablename__ = "xml_focusmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFocusmodeltableEntity(Base): - __tablename__ = "xml_focusmodeltable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFocustableEntity(Base): - __tablename__ = "xml_focustable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFreqoffsettableEntity(Base): - __tablename__ = "xml_freqoffsettable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlFrequencyreferencEntity(Base): - __tablename__ = "xml_frequencyreferenc_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlGaintrackingtableEntity(Base): - __tablename__ = "xml_gaintrackingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlHistorytableEntity(Base): - __tablename__ = "xml_historytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlHolographychannelEntity(Base): - __tablename__ = "xml_holographychannel_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlHolographytableEntity(Base): - __tablename__ = "xml_holographytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlIdentifierrangeEntity(Base): - __tablename__ = "xml_identifierrange_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlInvalidatingcondiEntity(Base): - __tablename__ = "xml_invalidatingcondi_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlLoggingmiEntity(Base): - __tablename__ = "xml_loggingmi_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlMaintableEntity(Base): - __tablename__ = "xml_maintable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlMetaHistory(Base): - __tablename__ = "xml_meta_history" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True, nullable=False) - timestamp = Column(DateTime, primary_key=True, nullable=False) - metacolumn = Column(Numeric(16, 0, asdecimal=False), primary_key=True, nullable=False) - newvalue = Column(String(64)) - - -t_xml_metainfo = Table( - "xml_metainfo", metadata, Column("name", String(32)), Column("value", String(128)), schema="ALMA" -) - - -t_xml_metainfo_backup = Table( - "xml_metainfo_backup", metadata, Column("name", String(32)), Column("value", String(128)), schema="ALMA" -) - - -class XmlNamespace(Base): - __tablename__ = "xml_namespaces" - __table_args__ = {"schema": "ALMA"} - - prefix = Column(String(16), primary_key=True) - namespace = Column(String(128)) - - -class XmlNetsidebandEntity(Base): - __tablename__ = "xml_netsideband_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObsattachmentEntity(Base): - __tablename__ = "xml_obsattachment_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObservationtableEntity(Base): - __tablename__ = "xml_observationtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObservingcontrolsEntity(Base): - __tablename__ = "xml_observingcontrols_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObservingmodeEntity(Base): - __tablename__ = "xml_observingmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObsprojectEntity(Base): - __tablename__ = "xml_obsproject_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObsproposalEntity(Base): - __tablename__ = "xml_obsproposal_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObsreviewEntity(Base): - __tablename__ = "xml_obsreview_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlObstooluserprefsEntity(Base): - __tablename__ = "xml_obstooluserprefs_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlOtconfigurationEntity(Base): - __tablename__ = "xml_otconfiguration_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlOusstatusEntity(Base): - __tablename__ = "xml_ousstatus_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPointingmethodEntity(Base): - __tablename__ = "xml_pointingmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPointingmodelmodeEntity(Base): - __tablename__ = "xml_pointingmodelmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPointingmodeltablEntity(Base): - __tablename__ = "xml_pointingmodeltabl_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPointingtableEntity(Base): - __tablename__ = "xml_pointingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPolarizationtableEntity(Base): - __tablename__ = "xml_polarizationtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPolarizationtypeEntity(Base): - __tablename__ = "xml_polarizationtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPositionmethodEntity(Base): - __tablename__ = "xml_positionmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPositionreferenceEntity(Base): - __tablename__ = "xml_positionreference_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPreferencesEntity(Base): - __tablename__ = "xml_preferences_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPrimarybeamdescriEntity(Base): - __tablename__ = "xml_primarybeamdescri_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPrimitivedatatypeEntity(Base): - __tablename__ = "xml_primitivedatatype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlProcessorsubtypeEntity(Base): - __tablename__ = "xml_processorsubtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlProcessortableEntity(Base): - __tablename__ = "xml_processortable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlProcessortypeEntity(Base): - __tablename__ = "xml_processortype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlProjectstatusEntity(Base): - __tablename__ = "xml_projectstatus_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPsetEntity(Base): - __tablename__ = "xml_pset_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlPsetdefEntity(Base): - __tablename__ = "xml_psetdef_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlalarmsEntity(Base): - __tablename__ = "xml_qlalarms_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlatmospheresummaEntity(Base): - __tablename__ = "xml_qlatmospheresumma_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlfocussummaryEntity(Base): - __tablename__ = "xml_qlfocussummary_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlphasesummaryEntity(Base): - __tablename__ = "xml_qlphasesummary_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQlpointingsummaryEntity(Base): - __tablename__ = "xml_qlpointingsummary_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQuicklookdisplayEntity(Base): - __tablename__ = "xml_quicklookdisplay_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQuicklookdisplayxEntity(Base): - __tablename__ = "xml_quicklookdisplayx_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQuicklookresultEntity(Base): - __tablename__ = "xml_quicklookresult_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlQuicklooksummaryEntity(Base): - __tablename__ = "xml_quicklooksummary_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlRadialvelocityrefEntity(Base): - __tablename__ = "xml_radialvelocityref_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlReceiverbandEntity(Base): - __tablename__ = "xml_receiverband_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlReceiversidebandEntity(Base): - __tablename__ = "xml_receiversideband_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlReceivertableEntity(Base): - __tablename__ = "xml_receivertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlRole(Base): - __tablename__ = "xml_roles" - __table_args__ = {"schema": "ALMA"} - - rolename = Column(String(64), primary_key=True) - - -class XmlSbstatusEntity(Base): - __tablename__ = "xml_sbstatus_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSbsummarytableEntity(Base): - __tablename__ = "xml_sbsummarytable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSbtypeEntity(Base): - __tablename__ = "xml_sbtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlScaletableEntity(Base): - __tablename__ = "xml_scaletable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlScanintentEntity(Base): - __tablename__ = "xml_scanintent_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlScantableEntity(Base): - __tablename__ = "xml_scantable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchedblockEntity(Base): - __tablename__ = "xml_schedblock_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False), index=True) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchedulermodeEntity(Base): - __tablename__ = "xml_schedulermode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchedulingpolicyEntity(Base): - __tablename__ = "xml_schedulingpolicy_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchemaEntity(Base): - __tablename__ = "xml_schema_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - schemaname = Column(String(32), nullable=False) - version = Column(Numeric(16, 0, asdecimal=False), nullable=False) - timestamp = Column(DateTime, nullable=False) - xml = Column(Text) - schemauid = Column(String(33)) - owner = Column(String(128)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(128)) - writepermissions = Column(String(128)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSchemanamespace(Base): - __tablename__ = "xml_schemanamespaces" - __table_args__ = {"schema": "ALMA"} - - schemauid = Column(String(33), primary_key=True, nullable=False) - prefix = Column(String(16), primary_key=True, nullable=False) - - -class XmlScipiperequestEntity(Base): - __tablename__ = "xml_scipiperequest_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlScipiperesultsEntity(Base): - __tablename__ = "xml_scipiperesults_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSdmdataheaderEntity(Base): - __tablename__ = "xml_sdmdataheader_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSeeingtableEntity(Base): - __tablename__ = "xml_seeingtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSidebandprocessinEntity(Base): - __tablename__ = "xml_sidebandprocessin_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSourcemodelEntity(Base): - __tablename__ = "xml_sourcemodel_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSourcetableEntity(Base): - __tablename__ = "xml_sourcetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSpecialsbEntity(Base): - __tablename__ = "xml_specialsb_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSpectralresolutioEntity(Base): - __tablename__ = "xml_spectralresolutio_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSpectralwindowtabEntity(Base): - __tablename__ = "xml_spectralwindowtab_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False, index=True) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSquarelawdetectorEntity(Base): - __tablename__ = "xml_squarelawdetector_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStatetableEntity(Base): - __tablename__ = "xml_statetable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStationtableEntity(Base): - __tablename__ = "xml_stationtable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStationtypeEntity(Base): - __tablename__ = "xml_stationtype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStokesparameterEntity(Base): - __tablename__ = "xml_stokesparameter_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlStylesheet(Base): - __tablename__ = "xml_stylesheets" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemaname = Column(String(32), nullable=False) - schemauid = Column(String(33), nullable=False) - version_from = Column(Numeric(16, 0, asdecimal=False)) - version_to = Column(Numeric(16, 0, asdecimal=False)) - alma_release = Column(String(32), nullable=False) - - -class XmlSubscanfieldsourcEntity(Base): - __tablename__ = "xml_subscanfieldsourc_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSubscanintentEntity(Base): - __tablename__ = "xml_subscanintent_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSubscanspectralspEntity(Base): - __tablename__ = "xml_subscanspectralsp_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSubscantableEntity(Base): - __tablename__ = "xml_subscantable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSwitchcycletableEntity(Base): - __tablename__ = "xml_switchcycletable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSwitchingmodeEntity(Base): - __tablename__ = "xml_switchingmode_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSynthprofEntity(Base): - __tablename__ = "xml_synthprof_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSyscalmethodEntity(Base): - __tablename__ = "xml_syscalmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSyscaltableEntity(Base): - __tablename__ = "xml_syscaltable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlSyspowertableEntity(Base): - __tablename__ = "xml_syspowertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestobsprojectEntity(Base): - __tablename__ = "xml_testobsproject_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestobsproposalEntity(Base): - __tablename__ = "xml_testobsproposal_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestprojectEntity(Base): - __tablename__ = "xml_testproject_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestschedblockEntity(Base): - __tablename__ = "xml_testschedblock_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTestvaluetypesEntity(Base): - __tablename__ = "xml_testvaluetypes_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTimesamplingEntity(Base): - __tablename__ = "xml_timesampling_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTimescaleEntity(Base): - __tablename__ = "xml_timescale_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlTotalpowertableEntity(Base): - __tablename__ = "xml_totalpowertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlUpdate(Base): - __tablename__ = "xml_updates" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(asdecimal=False), primary_key=True) - asdm_uid = Column(ForeignKey("ALMA.xml_asdm_entities.archive_uid"), nullable=False) - timestamp = Column(DateTime, nullable=False) - modified_by = Column(String(32), nullable=False) - hostname = Column(String(32), nullable=False) - elaboration = Column(String(4000), nullable=False) - delta_version = Column(Numeric(5, 0, asdecimal=False), nullable=False) - - xml_asdm_entity = relationship("XmlAsdmEntity") - - -class XmlUserEntity(Base): - __tablename__ = "xml_user_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlUserrole(Base): - __tablename__ = "xml_userroles" - __table_args__ = {"schema": "ALMA"} - - username = Column(String(64), primary_key=True, nullable=False) - rolename = Column(String(64), primary_key=True, nullable=False) - - -class XmlUser(Base): - __tablename__ = "xml_users" - __table_args__ = {"schema": "ALMA"} - - username = Column(String(64), primary_key=True) - - -class XmlValuetypesEntity(Base): - __tablename__ = "xml_valuetypes_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWeathertableEntity(Base): - __tablename__ = "xml_weathertable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWeighttypeEntity(Base): - __tablename__ = "xml_weighttype_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWindowfunctionEntity(Base): - __tablename__ = "xml_windowfunction_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWvmcaltableEntity(Base): - __tablename__ = "xml_wvmcaltable_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class XmlWvrmethodEntity(Base): - __tablename__ = "xml_wvrmethod_entities" - __table_args__ = {"schema": "ALMA"} - - archive_uid = Column(String(33), primary_key=True) - timestamp = Column(DateTime, nullable=False) - xml = Column(NullType) - schemauid = Column(String(33), nullable=False) - owner = Column(String(32)) - deleted = Column(Numeric(1, 0, asdecimal=False)) - readpermissions = Column(String(8)) - writepermissions = Column(String(8)) - hidden = Column(Numeric(1, 0, asdecimal=False)) - dirty = Column(Numeric(1, 0, asdecimal=False)) - virtual = Column(Numeric(1, 0, asdecimal=False)) - - -class Xslt(Base): - __tablename__ = "xslt" - __table_args__ = {"schema": "ALMA"} - - id = Column(Numeric(3, 0, asdecimal=False), primary_key=True) - t_xsl = Column(NullType) - - -class AquaOusComment(AquaComment): - __tablename__ = "aqua_ous_comment" - __table_args__ = {"schema": "ALMA"} - - commentid = Column(ForeignKey("ALMA.aqua_comment.commentid"), primary_key=True) - obsunitsetid = Column(ForeignKey("ALMA.aqua_ous.obsunitsetid")) - comment_section = Column(String(8)) - - aqua_ou = relationship("AquaOu") - - -class AquaQa2ReasonHistory(AquaStatusHistory): - __tablename__ = "aqua_qa2_reason_history" - __table_args__ = {"schema": "ALMA"} - - id = Column(ForeignKey("ALMA.aqua_status_history.id"), primary_key=True) - qa2reason = Column(String(500)) - - -class NgasFiles(Base): - __tablename__ = "NGAS_FILES" - __table_args__ = {"schema": "NGAS"} - - file_id = Column(String(220), primary_key=True) - file_size = Column(Numeric(11, 0, asdecimal=True)) diff --git a/shared/schema/schema/legacy_model.py b/shared/schema/schema/legacy_model.py deleted file mode 100644 index 36104179127b9066f9c7af40ca7933384dd1427a..0000000000000000000000000000000000000000 --- a/shared/schema/schema/legacy_model.py +++ /dev/null @@ -1,1935 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- -""" -An incomplete declarative base model of the legacy archive -Author: Richard Falardeau <rfalarde@nrao.edu> -""" -from sqlalchemy import ( - CHAR, - VARCHAR, - Column, - DateTime, - Float, - Index, - Integer, - Numeric, - String, - Table, - text, -) -from sqlalchemy.dialects.oracle import NUMBER -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.sql.sqltypes import NullType - -# pylint: disable=invalid-name -Base = declarative_base() -metadata = Base.metadata - - -# pylint: disable=too-few-public-methods -class LegacyProject(Base): - r"""The model of the project table in the legacy db""" - __tablename__ = "project" - - project_code = Column(String(16), primary_key=True) - observer = Column(String(48)) - observer_id = Column(Numeric) - starttime = Column(Numeric, primary_key=True) - stoptime = Column(Numeric, primary_key=True) - proprietary = Column(Numeric) - telescope = Column(String(12)) - telescope_config = Column(String(36)) - obs_bands = Column(String(24)) - total_obs_time = Column(Numeric) - num_segments = Column(Numeric) - arch_files = Column(Numeric) - row_date = Column(Numeric) - raw_project_code = Column(String(16)) - project_lock = Column(String(8)) - unlock_expire = Column(Numeric) - grant_access = Column(String(12)) - proprietary_duration = Column(Numeric) - warned = Column(Numeric) - project_id = Column(Numeric) - - def __repr__(self): - r"""Return the string representation of this class. - - :return: The string representation of self. - """ - repr_str_list = ["{c}("] - temp = ["{0}={{s.{0}}}".format(key) for key in vars(self) if not key.startswith("_")] - self_list = ", ".join(temp) - repr_str_list.append(self_list) - repr_str_list.append(")") - - return "".join(repr_str_list).format(c=self.__class__.__name__, s=self) - - -t_afl_safe = Table( - "afl_safe", - metadata, - Column("site_code", VARCHAR(8), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("root_directory", VARCHAR(128), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("mimetype", VARCHAR(80)), - Column("common_file_id", VARCHAR(64)), - Column("ngas_host", VARCHAR(64)), - schema="E2EMGR", -) - - -class Alia(Base): - __tablename__ = "alias" - __table_args__ = {"schema": "E2EMGR"} - - source_id = Column(VARCHAR(12), server_default=text("' '")) - jsource_id = Column(VARCHAR(12), nullable=False) - prog_code = Column(VARCHAR(8), server_default=text("' '")) - pk = Column(Integer, primary_key=True) - - -t_alltables_columns = Table( - "alltables_columns", - metadata, - Column("column_name", VARCHAR(32), nullable=False, index=True), - Column("table_name", VARCHAR(256), nullable=False), - Column("description", VARCHAR(128), nullable=False), - Column("unit", VARCHAR(16), nullable=False), - Column("ucd", VARCHAR(64), nullable=False), - Column("utype", VARCHAR(64), nullable=False), - Column("datatype", VARCHAR(32), nullable=False), - Column("varsize", NUMBER(asdecimal=False), nullable=False), - Column("primary", VARCHAR(16), nullable=False), - Column("indexed", VARCHAR(16), nullable=False), - Column("std", VARCHAR(16), nullable=False), - Column("catagory", VARCHAR(32), nullable=False), - Column("example", VARCHAR(128), nullable=False), - schema="E2EMGR", -) - - -t_antenna = Table( - "antenna", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("antenna_id", NUMBER(asdecimal=False), nullable=False), - Column("name", VARCHAR(12), nullable=False), - Column("station", VARCHAR(18), nullable=False), - Column("mount", VARCHAR(8), nullable=False), - Column("dish_diameter", NUMBER(asdecimal=False), nullable=False), - Column("antenna_type", VARCHAR(14), nullable=False), - Column("axis_off", NUMBER(asdecimal=False), nullable=False), - Column("frame", VARCHAR(12), nullable=False), - Index("antenna_idx", "project_code", "arch_file_id", "antenna_id"), - schema="E2EMGR", -) - - -t_archfileloc_ngas_migration = Table( - "archfileloc_ngas_migration", - metadata, - Column("site_code", VARCHAR(8), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("root_directory", VARCHAR(128), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("mimetype", VARCHAR(80)), - Column("common_file_id", VARCHAR(64)), - Column("ngas_host", VARCHAR(64)), - schema="E2EMGR", -) - - -t_archfilelocation = Table( - "archfilelocation", - metadata, - Column("site_code", VARCHAR(8), nullable=False, index=True), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("root_directory", VARCHAR(128), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False, index=True), - Column("mimetype", VARCHAR(80)), - Column("common_file_id", VARCHAR(64)), - Column("ngas_host", VARCHAR(64)), - schema="E2EMGR", -) - - -t_archfilelocationgbt = Table( - "archfilelocationgbt", - metadata, - Column("site_code", VARCHAR(8), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("root_directory", VARCHAR(128), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("mimetype", VARCHAR(80)), - Column("common_file_id", VARCHAR(64)), - Column("ngas_host", VARCHAR(64)), - schema="E2EMGR", -) - - -t_archive = Table( - "archive", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("segment", VARCHAR(4), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("arch_format", VARCHAR(8), nullable=False), - Column("data_type", VARCHAR(12), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("arch_file", VARCHAR(128), nullable=False, index=True), - Column("arch_file_date", NUMBER(asdecimal=False), nullable=False), - Column("catalog_date", NUMBER(asdecimal=False), nullable=False), - Column("file_size", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False, index=True), - Column("annex1_id", NUMBER(asdecimal=False), nullable=False), - Column("obs_bands", VARCHAR(24), nullable=False), - Column("project_id", NUMBER(19, 0, False), server_default=text("0")), - Column("sb_id", NUMBER(19, 0, False), server_default=text("0")), - Column("eb_id", NUMBER(19, 0, False), server_default=text("0")), - Column("datamsg", VARCHAR(128), server_default=text("'none'")), - Column("datalevel", NUMBER(8, 0, False), server_default=text("0")), - Column("sb_type", VARCHAR(32), server_default=text("'none'")), - Index("archive3_idx", "starttime", "stoptime"), - schema="E2EMGR", -) - - -t_archivegbt = Table( - "archivegbt", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("arch_format", VARCHAR(8), nullable=False), - Column("data_type", VARCHAR(12), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("arch_file_date", NUMBER(asdecimal=False), nullable=False), - Column("catalog_date", NUMBER(asdecimal=False), nullable=False), - Column("file_size", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("annex1_id", NUMBER(asdecimal=False), nullable=False), - Column("obs_bands", VARCHAR(16), nullable=False), - Column("project_id", NUMBER(19, 0, False), server_default=text("0")), - Column("sb_id", NUMBER(19, 0, False), server_default=text("0")), - Column( - "eb_id", - NUMBER(19, 0, False), - server_default=text( - """\ -0 -""" - ), - ), - Column("datamsg", VARCHAR(128), server_default=text("'none'")), - Column("datalevel", NUMBER(8, 0, False), server_default=text("0")), - Column("sb_type", VARCHAR(32), nullable=False, server_default=text("'none' ")), - schema="E2EMGR", -) - - -t_archivegbtold = Table( - "archivegbtold", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("arch_format", VARCHAR(8), nullable=False), - Column("data_type", VARCHAR(12), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False), - Column("arch_file_date", NUMBER(asdecimal=False), nullable=False), - Column("catalog_date", NUMBER(asdecimal=False), nullable=False), - Column("file_size", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("annex1_id", NUMBER(asdecimal=False), nullable=False), - Column("obs_bands", VARCHAR(16), nullable=False), - Column("project_id", NUMBER(19, 0, False), server_default=text("0")), - Column("sb_id", NUMBER(19, 0, False), server_default=text("0")), - Column("eb_id", NUMBER(19, 0, False), server_default=text("0")), - Column("datamsg", VARCHAR(128), server_default=text("'none'")), - Column("datalevel", NUMBER(8, 0, False), server_default=text("0")), - Column( - "sb_type", - VARCHAR(32), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_archivesites = Table( - "archivesites", - metadata, - Column("site_code", VARCHAR(8), nullable=False, index=True), - Column("host", VARCHAR(24), nullable=False), - Column("root_directory", VARCHAR(64), nullable=False), - Column("ftp_directory", VARCHAR(64), nullable=False), - Column("site_name", VARCHAR(64), nullable=False), - schema="E2EMGR", -) - - -t_archvla = Table( - "archvla", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - schema="E2EMGR", -) - - -t_asa_columns = Table( - "asa_columns", - metadata, - Column("column_name", VARCHAR(32), index=True, server_default=text("'none'")), - Column("table_name", VARCHAR(32), server_default=text("'none'")), - Column("description", VARCHAR(64), server_default=text("'none'")), - Column("unit", VARCHAR(16), server_default=text("'none'")), - Column("ucd", VARCHAR(64), server_default=text("'none'")), - Column("utype", VARCHAR(64), server_default=text("'none'")), - Column("datatype", VARCHAR(32), server_default=text("'none'")), - Column("varsize", NUMBER(asdecimal=False), server_default=text("0")), - Column("primary", VARCHAR(16), server_default=text("'none'")), - Column("indexed", VARCHAR(16), server_default=text("'none'")), - Column("std", VARCHAR(16), server_default=text("'none'")), - Column("tooltip", VARCHAR(128), server_default=text("'none'")), - Column( - "examples", - VARCHAR(128), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_asa_project = Table( - "asa_project", - metadata, - Column("project_code", VARCHAR(64), server_default=text("'none'")), - Column("project_uid", VARCHAR(64), server_default=text("'none'")), - Column("proposal_uid", VARCHAR(64), server_default=text("'none'")), - Column("pi_name", VARCHAR(64), server_default=text("'none'")), - Column("pi_id", VARCHAR(64), server_default=text("'none'")), - Column("coi_name", VARCHAR(64), server_default=text("'none'")), - Column("title", VARCHAR(64), server_default=text("'none'")), - Column("type", VARCHAR(64), server_default=text("'none'")), - Column("associated_arc", VARCHAR(64), server_default=text("'none'")), - Column("proposal_cycle", VARCHAR(64), server_default=text("'none'")), - Column("proposal_abstract", VARCHAR(64), server_default=text("'none'")), - Column("proposed_start_date", VARCHAR(64), server_default=text("'none'")), - Column("proposed_end_date", VARCHAR(64), server_default=text("'none'")), - Column("first_obs_start", VARCHAR(64), server_default=text("'none'")), - Column("first_obs_end", VARCHAR(64), server_default=text("'none'")), - Column("last_obs_start", VARCHAR(64), server_default=text("'none'")), - Column("last_obs_end", VARCHAR(64), server_default=text("'none'")), - Column( - "arc_release", - VARCHAR(64), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_asa_projects = Table( - "asa_projects", - metadata, - Column("project_code", VARCHAR(64), server_default=text("'none'")), - Column("project_uid", VARCHAR(64), server_default=text("'none'")), - Column("proposal_uid", VARCHAR(64), server_default=text("'none'")), - Column("pi_name", VARCHAR(64), server_default=text("'none'")), - Column("pi_id", VARCHAR(64), server_default=text("'none'")), - Column("coi_name", VARCHAR(64), server_default=text("'none'")), - Column("title", VARCHAR(64), server_default=text("'none'")), - Column("type", VARCHAR(64), server_default=text("'none'")), - Column("associated_arc", VARCHAR(64), server_default=text("'none'")), - Column("proposal_cycle", VARCHAR(64), server_default=text("'none'")), - Column("proposal_abstract", VARCHAR(64), server_default=text("'none'")), - Column("proposed_start_date", VARCHAR(64), server_default=text("'none'")), - Column("proposed_end_date", VARCHAR(64), server_default=text("'none'")), - Column("first_obs_start", VARCHAR(64), server_default=text("'none'")), - Column("first_obs_end", VARCHAR(64), server_default=text("'none'")), - Column("last_obs_start", VARCHAR(64), server_default=text("'none'")), - Column("last_obs_end", VARCHAR(64), server_default=text("'none'")), - Column( - "arc_release", - VARCHAR(64), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_asa_science = Table( - "asa_science", - metadata, - Column("dataset_id", VARCHAR(64), server_default=text("'none'")), - Column("asdm_uid", VARCHAR(64), server_default=text("'none'")), - Column("field_uid", VARCHAR(64), server_default=text("'none'")), - Column("spectral_window_uid", VARCHAR(64), server_default=text("'none'")), - Column("project_uid", VARCHAR(64), server_default=text("'none'")), - Column("schedblock_uid", VARCHAR(64), server_default=text("'none'")), - Column("execblock_uid", VARCHAR(64), server_default=text("'none'")), - Column("ra", NUMBER(16, 0, False), server_default=text("0.0")), - Column("dec", NUMBER(16, 0, False), server_default=text("0.0")), - Column("ra_source", NUMBER(16, 0, False), server_default=text("0.0")), - Column("dec_source", NUMBER(16, 0, False), server_default=text("0.0")), - Column("cx", NUMBER(16, 0, False), server_default=text("0.0")), - Column("cy", NUMBER(16, 0, False), server_default=text("0.0")), - Column("cz", NUMBER(16, 0, False), server_default=text("0.0")), - Column("az_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("az_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("elevation_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("elevation_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_cd1_1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_cd1_2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_cd2_1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_cd2_2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_crpix1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_crpix2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_crval1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("wcs_crval2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("spatial_scale_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("spatial_scale_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("gal_longitude", NUMBER(16, 0, False), server_default=text("0.0")), - Column("gal_latitude", NUMBER(16, 0, False), server_default=text("0.0")), - Column("ecliptic_longitude", NUMBER(16, 0, False), server_default=text("0.0")), - Column("ecliptic_latitude", NUMBER(16, 0, False), server_default=text("0.0")), - Column("footprint", NUMBER(16, 0, False), server_default=text("0.0")), - Column("fov", NUMBER(16, 0, False), server_default=text("0.0")), - Column("bounding_box", NUMBER(16, 0, False), server_default=text("0.0")), - Column("source_name", VARCHAR(64), server_default=text("'none'")), - Column("source_is_in_simbad", VARCHAR(64), server_default=text("'none'")), - Column("source_class", VARCHAR(64), server_default=text("'none'")), - Column("source_redshift", NUMBER(16, 0, False), server_default=text("0.0")), - Column("source_alma_catalog_id", NUMBER(16, 0, False), server_default=text("0.0")), - Column("start_date", VARCHAR(64), server_default=text("'none'")), - Column("end_date", VARCHAR(64), server_default=text("'none'")), - Column("int_time", NUMBER(16, 0, False), server_default=text("0.0")), - Column("time_resolution", NUMBER(16, 0, False), server_default=text("0.0")), - Column("frequency", NUMBER(16, 0, False), server_default=text("0.0")), - Column("frequency_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("frequency_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("frequency_resolution", NUMBER(16, 0, False), server_default=text("0.0")), - Column("bandwidth", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_frequency", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_frequency_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_frequency_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_frequency_resolution", NUMBER(16, 0, False), server_default=text("0.0")), - Column("rest_bandwidth", NUMBER(16, 0, False), server_default=text("0.0")), - Column("band", VARCHAR(64), server_default=text("'none'")), - Column("frequency_support", VARCHAR(128), server_default=text("'none'")), - Column("rest_frequency_support", VARCHAR(128), server_default=text("'none'")), - Column("velocity_resolution", NUMBER(16, 10, True), server_default=text("0.0")), - Column("resolving_power", NUMBER(16, 10, True), server_default=text("0.0")), - Column("rest_velocity_resolution", NUMBER(16, 10, True), server_default=text("0.0")), - Column("rest_resolving_power", NUMBER(16, 10, True), server_default=text("0.0")), - Column("channel_num", VARCHAR(32), server_default=text("'none'")), - Column("spectral_window_num", VARCHAR(32), server_default=text("'none'")), - Column("continuum_window_num", VARCHAR(32), server_default=text("'none'")), - Column("obs_unitset_id", VARCHAR(128), server_default=text("'none'")), - Column("science_goal_ouss_id", VARCHAR(128), server_default=text("'none'")), - Column("group_ouss_id", VARCHAR(128), server_default=text("'none'")), - Column("member_ouss_id", VARCHAR(128), server_default=text("'none'")), - Column("sensitivity", NUMBER(16, 0, False), server_default=text("0.0")), - Column("flux_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("flux_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("uv_coverage_param1", NUMBER(16, 0, False), server_default=text("0.0")), - Column("uv_coverage_param2", NUMBER(16, 0, False), server_default=text("0.0")), - Column("pol_num", NUMBER(16, 0, False), server_default=text("0")), - Column("pol_products", VARCHAR(128), server_default=text("'none'")), - Column("airmass", NUMBER(16, 0, False), server_default=text("0.0")), - Column("pwv", NUMBER(16, 0, False), server_default=text("0.0")), - Column("temperature", NUMBER(16, 0, False), server_default=text("0.0")), - Column("windspeed", NUMBER(16, 0, False), server_default=text("0.0")), - Column("winddirection", NUMBER(16, 0, False), server_default=text("0.0")), - Column("ant_num", NUMBER(16, 0, False), server_default=text("0")), - Column("ant_aca_num", NUMBER(16, 0, False), server_default=text("0")), - Column("ant_main_num", NUMBER(16, 0, False), server_default=text("0")), - Column("antennas", VARCHAR(128), server_default=text("'none'")), - Column("baseline_max", NUMBER(16, 0, False), server_default=text("0.0")), - Column("baseline_min", NUMBER(16, 0, False), server_default=text("0.0")), - Column("scan_num", NUMBER(6, 0, False), server_default=text("0")), - Column("project_code", VARCHAR(64), server_default=text("'none'")), - Column("schedblock_name", VARCHAR(64), server_default=text("'none'")), - Column("observation_category", VARCHAR(64), server_default=text("'none'")), - Column("scan_intent", VARCHAR(64), server_default=text("'none'")), - Column("access_format", VARCHAR(64), server_default=text("'none'")), - Column( - "processing_level", - NUMBER(6, 0, False), - server_default=text( - """\ -0 -""" - ), - ), - schema="E2EMGR", -) - - -t_calib_parm_pos = Table( - "calib_parm_pos", - metadata, - Column("jsource_id", VARCHAR(10), nullable=False), - Column("epoch", DateTime), - Column("rarad", NUMBER(12, 8, True), server_default=text("0")), - Column("decrad", NUMBER(12, 8, True), server_default=text("0")), - Column("raerr", NUMBER(10, 8, True), server_default=text("0")), - Column("decerr", NUMBER(10, 6, True), server_default=text("0")), - Column("telescope", VARCHAR(5), nullable=False), - Column("config", VARCHAR(5), server_default=text("' '")), - Column("obs_freq", Float, server_default=text("0")), - Column("freq_min", Float, server_default=text("0")), - Column("freq_max", Float, server_default=text("0")), - Column("uv_min", NUMBER(12, 6, True), server_default=text("0")), - Column("uv_max", NUMBER(12, 6, True), server_default=text("0")), - Column("flux", NUMBER(8, 4, True), server_default=text("0")), - Column("resolution", NUMBER(6, 4, True), server_default=text("0")), - Column("variability", NUMBER(6, 4, True), server_default=text("0")), - Column("cdvlba", CHAR(2), server_default=text("' '")), - Column("cd_vla", CHAR(2), server_default=text("' '")), - Column("entry_date", DateTime), - Column("parm_remarks", VARCHAR(64), server_default=text("' '")), - schema="E2EMGR", -) - - -class CalibSrcPo(Base): - __tablename__ = "calib_src_pos" - __table_args__ = {"schema": "E2EMGR"} - - remarks = Column(VARCHAR(200), nullable=False) - ssize = Column(NUMBER(10, 0, False), server_default=text("0")) - flux = Column(NUMBER(10, 6, True), server_default=text("0")) - mfreq = Column(NUMBER(asdecimal=False), server_default=text("0")) - ufreq = Column(NUMBER(asdecimal=False), server_default=text("0")) - lfreq = Column(NUMBER(asdecimal=False), server_default=text("0")) - distance = Column(NUMBER(asdecimal=False), server_default=text("0")) - ddec = Column(NUMBER(10, 6, True), server_default=text("0")) - dra = Column(NUMBER(10, 6, True), server_default=text("0")) - repoch = Column(DateTime) - parallax = Column(NUMBER(8, 6, True), server_default=text("0")) - decerr = Column(NUMBER(12, 8, True), server_default=text("0")) - raerr = Column(NUMBER(12, 8, True), server_default=text("0")) - decrad = Column(NUMBER(12, 8, True), server_default=text("0")) - rarad = Column(NUMBER(12, 8, True), server_default=text("0")) - epoch = Column(DateTime) - calcode = Column(CHAR(6), server_default=text("' '")) - prog_code = Column(VARCHAR(6), server_default=text("' '")) - dqualifier = Column(Integer, server_default=text("0")) - cqualifier = Column(Integer, server_default=text("0")) - uqualifier = Column(Integer, server_default=text("0")) - entrydate = Column(DateTime) - jsource_id = Column(VARCHAR(12), nullable=False) - pk = Column(Integer, primary_key=True) - - -t_config = Table( - "config", - metadata, - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - schema="E2EMGR", -) - - -t_datadesc = Table( - "datadesc", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("segment", VARCHAR(4), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("data_desc_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("sub_desc_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("if_band", VARCHAR(4), nullable=False), - Column("if_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("pol1", NUMBER(asdecimal=False), nullable=False), - Column("pol2", NUMBER(asdecimal=False), nullable=False), - Column("pol3", NUMBER(asdecimal=False), nullable=False), - Column("pol4", NUMBER(asdecimal=False), nullable=False), - Column("if_conv_chain", NUMBER(asdecimal=False), nullable=False), - Column("sub_chan_id", NUMBER(asdecimal=False), nullable=False), - Column("sub_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("sub_bandw", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol1", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol2", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol3", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol4", NUMBER(asdecimal=False), nullable=False), - Column("sub_net_sideband", NUMBER(asdecimal=False), nullable=False), - Column("sub_num_chans", NUMBER(asdecimal=False), nullable=False), - Column("corr_mode", VARCHAR(24)), - Column("if_chan", VARCHAR(8)), - Column( - "backend_id", - VARCHAR(24), - server_default=text( - """\ -'none' - """ - ), - ), - Column("receiver_id", VARCHAR(24), nullable=False, server_default=text("'none' ")), - Column("veldef", VARCHAR(24), server_default=text("'none'")), - Column("version", VARCHAR(16), server_default=text("'none'")), - Column("velocity", NUMBER(asdecimal=False), server_default=text("0.0")), - schema="E2EMGR", -) - - -t_datadescgbt = Table( - "datadescgbt", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("data_desc_id", NUMBER(asdecimal=False), nullable=False), - Column("sub_desc_id", NUMBER(asdecimal=False), nullable=False), - Column("if_band", VARCHAR(4), nullable=False), - Column("if_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("pol1", NUMBER(asdecimal=False), nullable=False), - Column("pol2", NUMBER(asdecimal=False), nullable=False), - Column("pol3", NUMBER(asdecimal=False), nullable=False), - Column("pol4", NUMBER(asdecimal=False), nullable=False), - Column("if_conv_chain", NUMBER(asdecimal=False), nullable=False), - Column("sub_chan_id", NUMBER(asdecimal=False), nullable=False), - Column("sub_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("sub_bandw", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol1", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol2", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol3", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol4", NUMBER(asdecimal=False), nullable=False), - Column("sub_net_sideband", NUMBER(asdecimal=False), nullable=False), - Column("sub_num_chans", NUMBER(asdecimal=False), nullable=False), - Column("corr_mode", VARCHAR(24), nullable=False), - Column("if_chan", VARCHAR(8), nullable=False), - Column("receiver_id", VARCHAR(24), server_default=text("'none'")), - Column("backend_id", VARCHAR(24), server_default=text("'none'")), - Column("velocity", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("veldef", VARCHAR(24), server_default=text("'none'")), - Column( - "version", - VARCHAR(16), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_dataproblems = Table( - "dataproblems", - metadata, - Column("error_code", VARCHAR(16), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("if_bands", VARCHAR(24), nullable=False), - Column("error_status", VARCHAR(12), nullable=False), - Column("description", VARCHAR(64), nullable=False), - Column("doc_link", VARCHAR(64), nullable=False), - Column("severity", NUMBER(asdecimal=False), nullable=False, server_default=text("0 ")), - Index("dataproblems1_idx", "starttime", "stoptime"), - schema="E2EMGR", -) - - -t_dataproblink = Table( - "dataproblink", - metadata, - Column("error_code", VARCHAR(16), nullable=False, index=True), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - schema="E2EMGR", -) - - -t_downloadlog = Table( - "downloadlog", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("download_date", DateTime, nullable=False, index=True), - Column("email_addr", VARCHAR(48), nullable=False, index=True), - Column("ip_addr", VARCHAR(24), nullable=False), - Column("status", VARCHAR(16), nullable=False), - Column("sources", VARCHAR(64), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("arch_file", VARCHAR(128), nullable=False, index=True), - Column("out_file", VARCHAR(128), nullable=False), - Column("result", VARCHAR(32), nullable=False), - Column("file_size", NUMBER(asdecimal=False)), - Column("code", VARCHAR(12)), - schema="E2EMGR", -) - - -t_emailaddr = Table( - "emailaddr", - metadata, - Column("userlastname", VARCHAR(48), nullable=False), - Column("userinitials", VARCHAR(24)), - Column("emailaddr", VARCHAR(64)), - Index("emailaddr1_idx", "userlastname", "userinitials"), - schema="E2EMGR", -) - - -t_file_set_properties = Table( - "file_set_properties", - metadata, - Column("file_set_id", VARCHAR(128), server_default=text("'none'")), - Column("file_set_alias", VARCHAR(128), server_default=text("'none'")), - Column("file_set_category", VARCHAR(32), server_default=text("'none'")), - Column("category_key", VARCHAR(48), server_default=text("'none'")), - Column("starttime", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("stoptime", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("telescope", VARCHAR(32), server_default=text("'none'")), - Column("telescope_config", VARCHAR(48), server_default=text("'none'")), - Column("obs_bands", VARCHAR(48), server_default=text("'none'")), - Column("processing_history", VARCHAR(128), server_default=text("'none'")), - Column("collection", VARCHAR(48), server_default=text("'none'")), - Column("calib_level", NUMBER(asdecimal=False), server_default=text("0")), - Column( - "n_file_subsets", - NUMBER(asdecimal=False), - server_default=text( - """\ -0 - """ - ), - ), - Index("set_properties_indx", "file_set_id", "category_key"), - schema="E2EMGR", -) - - -class FirstImage(Base): - __tablename__ = "first_image" - __table_args__ = {"schema": "E2EMGR"} - - id = Column(VARCHAR(32), primary_key=True) - obs_id = Column(VARCHAR(32), server_default=text("null")) - archive_id = Column(VARCHAR(128), nullable=False) - htm_id = Column(NUMBER(14, 0, False), server_default=text("0")) - preview_id = Column(VARCHAR(128), nullable=False) - access_format = Column(VARCHAR(32), nullable=False) - access_estsize = Column(NUMBER(14, 0, False), server_default=text("0")) - dataproduct_type = Column(VARCHAR(16), server_default=text("null")) - dataproduct_subtype = Column(VARCHAR(32), server_default=text("null")) - calib_level = Column(NUMBER(6, 0, False), server_default=text("0")) - dataset_length = Column(NUMBER(14, 0, False), server_default=text("0")) - im_nsubarrays = Column(NUMBER(8, 0, False), server_default=text("1")) - im_naxes = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis1 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis2 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis3 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis4 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_pixtype = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes1 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes2 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes3 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes4 = Column(VARCHAR(16), server_default=text("null")) - im_ra1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_scale = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - obs_title = Column(VARCHAR(128), server_default=text("null")) - obs_creator_name = Column(VARCHAR(32), server_default=text("null")) - obs_collection = Column(VARCHAR(32), server_default=text("null")) - obs_creator_did = Column(VARCHAR(160), server_default=text("null")) - obs_publisher_did = Column(VARCHAR(160), server_default=text("null")) - obs_dataset_did = Column(VARCHAR(160), server_default=text("null")) - obs_release_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_type = Column(VARCHAR(16), server_default=text("null")) - facility_name = Column(VARCHAR(20), server_default=text("null")) - instrument_name = Column(VARCHAR(20), server_default=text("null")) - obs_bandpass = Column(VARCHAR(20), server_default=text("null")) - obs_datasource = Column(VARCHAR(20), server_default=text("null")) - proposal_id = Column(VARCHAR(20), server_default=text("null")) - target_name = Column(VARCHAR(20), server_default=text("null")) - target_class = Column(VARCHAR(20), server_default=text("null")) - s_ra = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_dec = Column(NUMBER(asdecimal=False), index=True, server_default=text("0.0")) - s_fov = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_region = Column(VARCHAR(128), server_default=text("null")) - s_calib_status = Column(VARCHAR(32), server_default=text("'none'")) - s_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_respower = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_exptime = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - o_ucd = Column(VARCHAR(20), server_default=text("null")) - o_unit = Column(VARCHAR(32), server_default=text("'none'")) - pol_states = Column(VARCHAR(20), server_default=text("null")) - project_code = Column(VARCHAR(24), server_default=text("null")) - obs_session = Column(VARCHAR(24), server_default=text("null")) - file_id = Column(VARCHAR(64), server_default=text("null")) - file_set_id = Column(VARCHAR(128), server_default=text("null")) - file_subset_id = Column(VARCHAR(128), server_default=text("null")) - dataset = Column(VARCHAR(128), server_default=text("null")) - image_file = Column(VARCHAR(128), server_default=text("null")) - obs_file_id = Column(VARCHAR(64), server_default=text("null")) - cal_file_id = Column(VARCHAR(64), server_default=text("null")) - root_dir = Column(VARCHAR(128), server_default=text("null")) - file_dir = Column( - VARCHAR(128), - server_default=text( - """\ -null -""" - ), - ) - - -t_firstcatalog = Table( - "firstcatalog", - metadata, - Column("rarad", NUMBER(asdecimal=False), nullable=False), - Column("decrad", NUMBER(asdecimal=False), nullable=False), - Column("warn", VARCHAR(2), nullable=False), - Column("pflux", NUMBER(asdecimal=False), nullable=False), - Column("flux", NUMBER(asdecimal=False), nullable=False), - Column("rms", NUMBER(asdecimal=False), nullable=False), - Column("majorax", NUMBER(asdecimal=False), nullable=False), - Column("minorax", NUMBER(asdecimal=False), nullable=False), - Column("posangle", NUMBER(asdecimal=False), nullable=False), - Column("fmajorax", NUMBER(asdecimal=False), nullable=False), - Column("fminorax", NUMBER(asdecimal=False), nullable=False), - Column("fposangle", NUMBER(asdecimal=False), nullable=False), - Column("field", VARCHAR(14), nullable=False), - Column("name", VARCHAR(16)), - schema="E2EMGR", -) - - -t_image = Table( - "image", - metadata, - Column("identity", VARCHAR(16), nullable=False, index=True), - Column("telescope", VARCHAR(12), nullable=False), - Column("teleconfig", VARCHAR(8), nullable=False), - Column("instrument", VARCHAR(24), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("projectcode", VARCHAR(16), nullable=False), - Column("fieldname", VARCHAR(24), nullable=False), - Column("naxes", NUMBER(asdecimal=False), nullable=False), - Column("imagemax", NUMBER(asdecimal=False), nullable=False), - Column("imagemin", NUMBER(asdecimal=False), nullable=False), - Column("imagesens", NUMBER(asdecimal=False), nullable=False), - Column("imagescale", NUMBER(asdecimal=False), nullable=False), - Column("imagezero", NUMBER(asdecimal=False), nullable=False), - Column("imageunits", VARCHAR(16), nullable=False), - Column("restoremaj", NUMBER(asdecimal=False), nullable=False), - Column("restoremin", NUMBER(asdecimal=False), nullable=False), - Column("restorepa", NUMBER(asdecimal=False), nullable=False), - Column("firsttime", NUMBER(asdecimal=False), nullable=False), - Column("midobstime", NUMBER(asdecimal=False), nullable=False), - Column("exposure", NUMBER(asdecimal=False), nullable=False), - Column("imagedate", NUMBER(asdecimal=False), nullable=False), - Column("coordframe", VARCHAR(16), nullable=False), - Column("projection", VARCHAR(16), nullable=False), - Column("equinox", NUMBER(asdecimal=False), nullable=False), - Column("region", VARCHAR(16), nullable=False), - Column("racenter", NUMBER(asdecimal=False), nullable=False), - Column("deccenter", NUMBER(asdecimal=False), nullable=False), - Column("ramin", NUMBER(asdecimal=False), nullable=False), - Column("ramax", NUMBER(asdecimal=False), nullable=False), - Column("decmin", NUMBER(asdecimal=False), nullable=False), - Column("decmax", NUMBER(asdecimal=False), nullable=False), - Column("rarefpix", NUMBER(asdecimal=False), nullable=False), - Column("raref", NUMBER(asdecimal=False), nullable=False), - Column("radelt", NUMBER(asdecimal=False), nullable=False), - Column("rapixels", NUMBER(asdecimal=False), nullable=False), - Column("decrefpix", NUMBER(asdecimal=False), nullable=False), - Column("decref", NUMBER(asdecimal=False), nullable=False), - Column("decdelt", NUMBER(asdecimal=False), nullable=False), - Column("decpixels", NUMBER(asdecimal=False), nullable=False), - Column("rotangle", NUMBER(asdecimal=False), nullable=False), - Column("obsband", VARCHAR(8), nullable=False), - Column("frequency", NUMBER(asdecimal=False), nullable=False), - Column("bandwd", NUMBER(asdecimal=False), nullable=False), - Column("nspect", NUMBER(asdecimal=False), nullable=False), - Column("reffreqpix", NUMBER(asdecimal=False), nullable=False), - Column("reffreq", NUMBER(asdecimal=False), nullable=False), - Column("freqincre", NUMBER(asdecimal=False), nullable=False), - Column("npolar", NUMBER(asdecimal=False), nullable=False), - Column("polpixels", VARCHAR(12), nullable=False), - Column("imagequal", VARCHAR(6), nullable=False), - Column("photoerr", NUMBER(asdecimal=False), nullable=False), - Column("raerr", NUMBER(asdecimal=False), nullable=False), - Column("decerr", NUMBER(asdecimal=False), nullable=False), - Column("specterr", NUMBER(asdecimal=False), nullable=False), - Column("imagefile", VARCHAR(128), nullable=False), - Column("imageformat", VARCHAR(24), nullable=False), - Column("rootdirectory", VARCHAR(128), nullable=False), - Column("refurl", VARCHAR(128), nullable=False), - Column("collection", VARCHAR(24)), - Column("filesize", NUMBER(asdecimal=False)), - Column("arch_file_id", NUMBER(asdecimal=False)), - Column("common_file_id", VARCHAR(80)), - Index("image1_idx", "racenter", "deccenter"), - schema="E2EMGR", -) - - -t_ingest_stats = Table( - "ingest_stats", - metadata, - Column("ingestion_date", VARCHAR(24), server_default=text("'none'")), - Column("ingestion_total", NUMBER(20, 0, False), server_default=text("0")), - Column("telescope", VARCHAR(12), server_default=text("'none'")), - Column("data_type", VARCHAR(24), server_default=text("'none'")), - Column("root_dir", VARCHAR(128), server_default=text("'none'")), - Column( - "ngas_host", - VARCHAR(64), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_logfiles = Table( - "logfiles", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("dynamic_tag", VARCHAR(16), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("sched_type", VARCHAR(16), nullable=False), - Column("site_code", VARCHAR(8), nullable=False), - Column("root_directory", VARCHAR(64), nullable=False), - Column("file_name", VARCHAR(64), nullable=False), - Column("mimetype", VARCHAR(80), nullable=False), - Column("obsfiles", VARCHAR(128), nullable=False), - schema="E2EMGR", -) - - -class NgasCache(Base): - __tablename__ = "ngas_cache" - __table_args__ = {"schema": "E2EMGR"} - - disk_id = Column(VARCHAR(128), primary_key=True, nullable=False) - file_id = Column(VARCHAR(64), primary_key=True, nullable=False) - file_version = Column(Integer, primary_key=True, nullable=False) - cache_time = Column(NUMBER(16, 6, True), nullable=False) - cache_delete = Column(Integer, nullable=False) - - -t_ngas_file_sets = Table( - "ngas_file_sets", - metadata, - Column("file_id", VARCHAR(64), nullable=False), - Column("file_version", NUMBER(12, 0, False), server_default=text("1")), - Column("file_set_id", VARCHAR(64), nullable=False), - Column("entity_type_name", VARCHAR(48), nullable=False), - Column("entity_id", VARCHAR(48), nullable=False), - Column("format", VARCHAR(48), server_default=text("'none'")), - Column("file_id_alias", VARCHAR(128), server_default=text("'none'")), - Column("native_ext", VARCHAR(24), server_default=text("'none'")), - Column("file_subset_id", VARCHAR(48), server_default=text("'none'")), - Index("ngas_file_sets_indx", "file_id", "file_version", "file_set_id"), - schema="E2EMGR", -) - - -class NgasMirroringBookkeeping(Base): - __tablename__ = "ngas_mirroring_bookkeeping" - __table_args__ = ( - Index("nmb_thost_status_shost_idx", "target_cluster", "target_host", "status", "source_host"), - Index("nmb_iter_status_idx", "iteration", "status"), - {"schema": "E2EMGR"}, - ) - - file_id = Column(VARCHAR(64), primary_key=True, nullable=False) - file_version = Column(NUMBER(22, 0, False), primary_key=True, nullable=False) - file_size = Column(NUMBER(20, 0, False)) - disk_id = Column(VARCHAR(128)) - host_id = Column(VARCHAR(32)) - format = Column(VARCHAR(32)) - status = Column(CHAR(8), nullable=False) - target_cluster = Column(VARCHAR(64)) - target_host = Column(VARCHAR(64)) - archive_command = Column(VARCHAR(118)) - source_host = Column(VARCHAR(64), nullable=False) - retrieve_command = Column(VARCHAR(118)) - ingestion_date = Column(VARCHAR(23)) - ingestion_time = Column(Float) - iteration = Column(NUMBER(22, 0, False), primary_key=True, nullable=False) - checksum = Column(VARCHAR(64), nullable=False) - staging_file = Column(VARCHAR(256)) - attempt = Column(NUMBER(4, 0, False)) - downloaded_bytes = Column(NUMBER(22, 0, False)) - - -class NgasMirroringHist(Base): - __tablename__ = "ngas_mirroring_hist" - __table_args__ = {"schema": "E2EMGR"} - - instance_id = Column(VARCHAR(32), nullable=False) - file_id = Column(VARCHAR(64), primary_key=True, nullable=False) - file_version = Column(Integer, primary_key=True, nullable=False) - ingestion_date = Column(VARCHAR(23), nullable=False) - srv_list_id = Column(Integer, nullable=False) - xml_file_info = Column(VARCHAR(2000), nullable=False) - status = Column(Integer, nullable=False) - message = Column(VARCHAR(2000)) - last_activity_time = Column(VARCHAR(23), nullable=False) - scheduling_time = Column(VARCHAR(23), nullable=False) - - -class NgasMirroringQueue(Base): - __tablename__ = "ngas_mirroring_queue" - __table_args__ = {"schema": "E2EMGR"} - - instance_id = Column(VARCHAR(32), nullable=False) - file_id = Column(VARCHAR(64), primary_key=True, nullable=False) - file_version = Column(Integer, primary_key=True, nullable=False) - ingestion_date = Column(VARCHAR(23), nullable=False) - srv_list_id = Column(Integer, nullable=False) - xml_file_info = Column(VARCHAR(2000), nullable=False) - status = Column(Integer, nullable=False) - message = Column(VARCHAR(2000)) - last_activity_time = Column(VARCHAR(23), nullable=False) - scheduling_time = Column(VARCHAR(23), nullable=False) - - -class NgasSrvList(Base): - __tablename__ = "ngas_srv_list" - __table_args__ = {"schema": "E2EMGR"} - - srv_list_id = Column(Integer, primary_key=True) - srv_list = Column(VARCHAR(255), nullable=False) - creation_date = Column(VARCHAR(23), nullable=False) - - -class Nvsscatalog(Base): - __tablename__ = "nvsscatalog" - __table_args__ = {"schema": "E2EMGR"} - - rarad = Column(NUMBER(asdecimal=False), primary_key=True, nullable=False) - decrad = Column(NUMBER(asdecimal=False), primary_key=True, nullable=False) - raerror = Column(NUMBER(asdecimal=False), nullable=False) - decerror = Column(NUMBER(asdecimal=False), nullable=False) - flux = Column(NUMBER(asdecimal=False), nullable=False) - fluxerror = Column(NUMBER(asdecimal=False), nullable=False) - majorsym = Column(VARCHAR(4), nullable=False) - majorax = Column(NUMBER(asdecimal=False), nullable=False) - majorerr = Column(NUMBER(asdecimal=False), nullable=False) - minorsym = Column(VARCHAR(4), nullable=False) - minorax = Column(NUMBER(asdecimal=False), nullable=False) - minorerr = Column(NUMBER(asdecimal=False), nullable=False) - posangle = Column(NUMBER(asdecimal=False), nullable=False) - paerror = Column(NUMBER(asdecimal=False), nullable=False) - rescode = Column(VARCHAR(4), nullable=False) - reserror = Column(NUMBER(asdecimal=False), nullable=False) - pflux = Column(NUMBER(asdecimal=False), nullable=False) - pfluxerror = Column(NUMBER(asdecimal=False), nullable=False) - pangle = Column(NUMBER(asdecimal=False), nullable=False) - pangleerror = Column(NUMBER(asdecimal=False), nullable=False) - field = Column(VARCHAR(10), nullable=False) - centerx = Column(NUMBER(asdecimal=False), nullable=False) - centery = Column(NUMBER(asdecimal=False), nullable=False) - name = Column(VARCHAR(10)) - - -t_observation = Table( - "observation", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("segment", VARCHAR(4), nullable=False), - Column("obs_type", VARCHAR(24), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("source_id", VARCHAR(24), nullable=False, index=True), - Column("source_type", VARCHAR(8), nullable=False), - Column("calib_type", VARCHAR(8), nullable=False), - Column("corr_mode", VARCHAR(16), nullable=False), - Column("ra2000", NUMBER(asdecimal=False), nullable=False), - Column("dec2000", NUMBER(asdecimal=False), nullable=False), - Column("frame", VARCHAR(20), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("data_desc_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False, index=True), - Column("exposure", NUMBER(asdecimal=False), nullable=False), - Column("interval", NUMBER(asdecimal=False), nullable=False), - Column("uv_min", NUMBER(asdecimal=False), nullable=False), - Column("uv_max", NUMBER(asdecimal=False), nullable=False), - Column("sub_desc_id", NullType), - Column("elev_min", NUMBER(asdecimal=False), nullable=False), - Column("elev_max", NUMBER(asdecimal=False), nullable=False), - Column("n_ants", NUMBER(asdecimal=False)), - Column("ra_epoch", NUMBER(asdecimal=False)), - Column("dec_epoch", NUMBER(asdecimal=False)), - Column("bdf_file", VARCHAR(64)), - Column("config_desc_id", VARCHAR(48), server_default=text("'none'")), - Column("scan", NUMBER(19, 0, False), server_default=text("0")), - Column("subscan", NUMBER(19, 0, False), server_default=text("0")), - Column("scan_intent", VARCHAR(256), server_default=text("'none'")), - Column("procname", VARCHAR(24), server_default=text("'none'")), - Column("proctype", VARCHAR(24), server_default=text("'none'")), - Column("gbtobstype", VARCHAR(24), server_default=text("'none'")), - Column("msgflag", VARCHAR(128), server_default=text("'none'")), - Column("msglevel", NUMBER(8, 0, False), server_default=text("0")), - Index("observation4_idx", "starttime", "stoptime"), - Index("observation5_idx", "ra2000", "dec2000"), - schema="E2EMGR", -) - - -t_observationgbt = Table( - "observationgbt", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("obs_type", VARCHAR(24), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("source_id", VARCHAR(16), nullable=False), - Column("source_type", VARCHAR(8), nullable=False), - Column("calib_type", VARCHAR(8), nullable=False), - Column("corr_mode", VARCHAR(16), nullable=False), - Column("ra2000", NUMBER(asdecimal=False), nullable=False), - Column("dec2000", NUMBER(asdecimal=False), nullable=False), - Column("frame", VARCHAR(20), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("data_desc_id", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("exposure", NUMBER(asdecimal=False), nullable=False), - Column("interval", NUMBER(asdecimal=False), nullable=False), - Column("uv_min", NUMBER(asdecimal=False), nullable=False), - Column("uv_max", NUMBER(asdecimal=False), nullable=False), - Column("sub_desc_id", NullType), - Column("elev_min", NUMBER(asdecimal=False), nullable=False), - Column("elev_max", NUMBER(asdecimal=False), nullable=False), - Column("n_ants", NUMBER(asdecimal=False), nullable=False), - Column("ra_epoch", NUMBER(asdecimal=False), nullable=False), - Column("dec_epoch", NUMBER(asdecimal=False), nullable=False), - Column("bdf_file", VARCHAR(64), server_default=text("'none'")), - Column("config_desc_id", VARCHAR(48), server_default=text("'none'")), - Column("scan", NUMBER(19, 0, False), server_default=text("0")), - Column("subscan", NUMBER(19, 0, False), server_default=text("0")), - Column("scan_intent", VARCHAR(256), server_default=text("'none'")), - Column("procname", VARCHAR(24), server_default=text("'none'")), - Column("proctype", VARCHAR(24), server_default=text("'none'")), - Column("gbtobstype", VARCHAR(24), server_default=text("'none'")), - Column( - "msgflag", - VARCHAR(128), - server_default=text( - """\ -'none' -""" - ), - ), - Column("msglevel", NUMBER(8, 0, False), server_default=text("0")), - schema="E2EMGR", -) - - -t_obsscripts = Table( - "obsscripts", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("dynamic_tag", VARCHAR(16), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("sched_type", VARCHAR(16), nullable=False), - Column("site_code", VARCHAR(8), nullable=False), - Column("root_directory", VARCHAR(64), nullable=False), - Column("file_name", VARCHAR(64), nullable=False), - Column("mimetype", VARCHAR(80), nullable=False), - schema="E2EMGR", -) - - -t_obsset = Table( - "obsset", - metadata, - Column("dataproduct_type", VARCHAR(24), nullable=False), - Column("dataproduct_subtype", VARCHAR(24), nullable=False), - Column("calib_level", NUMBER(asdecimal=False), server_default=text("0")), - Column("target_name", VARCHAR(48), nullable=False), - Column("target_class", VARCHAR(24), nullable=False), - Column("obs_id", VARCHAR(64), nullable=False), - Column("obs_title", VARCHAR(24), nullable=False), - Column("obs_collection", VARCHAR(48), nullable=False), - Column("obs_creation_date", VARCHAR(24), nullable=False), - Column("obs_creator_name", VARCHAR(48), nullable=False), - Column("obs_creator_did", VARCHAR(48), nullable=False), - Column("obs_release_date", VARCHAR(24), nullable=False), - Column("obs_publisher_did", VARCHAR(64), nullable=False), - Column("publisher_id", VARCHAR(24), nullable=False), - Column("bib_reference", VARCHAR(24), nullable=False), - Column("data_rights", VARCHAR(24), nullable=False), - Column("access_url", VARCHAR(128), nullable=False), - Column("access_format", VARCHAR(24), nullable=False), - Column("access_estsize", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_ra", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_dec", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_fov", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_region", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_resolution", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_ucd", VARCHAR(48), nullable=False), - Column("s_unit", VARCHAR(24), nullable=False), - Column("s_resolution_min", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_resolution_max", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("s_calib_status", VARCHAR(48), nullable=False), - Column("s_stat_error", NUMBER(asdecimal=False), server_default=text("0")), - Column("t_min", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("t_max", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("t_exptime", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("t_resolution", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("t_calib_status", VARCHAR(48), nullable=False), - Column("t_stat_error", NUMBER(asdecimal=False), server_default=text("0")), - Column("em_ucd", VARCHAR(48), nullable=False), - Column("em_unit", VARCHAR(24), nullable=False), - Column("em_calib_status", VARCHAR(48), nullable=False), - Column("em_min", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("em_max", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("em_res_power", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("em_res_power_min", NUMBER(asdecimal=False), server_default=text("0")), - Column("em_res_power_max", NUMBER(asdecimal=False), server_default=text("0")), - Column("em_resolution", NUMBER(asdecimal=False), server_default=text("0")), - Column("em_stat_error", NUMBER(asdecimal=False), server_default=text("0")), - Column("o_ucd", VARCHAR(128), nullable=False), - Column("o_unit", VARCHAR(24), nullable=False), - Column("o_calib_status", VARCHAR(24), nullable=False), - Column("o_stat_error", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("pol_states", VARCHAR(24), nullable=False), - Column("facility_name", VARCHAR(48), nullable=False), - Column("instrument_name", VARCHAR(48), nullable=False), - Column("proposal_id", VARCHAR(48), nullable=False), - Column("project_code", VARCHAR(24), nullable=False), - Column("obs_session", VARCHAR(24), nullable=False), - Column("file_id", VARCHAR(64), nullable=False), - Column("file_set_id", VARCHAR(128), nullable=False), - Column("file_subset_id", VARCHAR(128), nullable=False), - Column("dataset", VARCHAR(128), nullable=False), - Column("image_file", VARCHAR(128), nullable=False), - Column( - "arch_file_id", - NUMBER(asdecimal=False), - server_default=text( - """\ -0 -""" - ), - ), - Index("obsset_indx", "file_set_id", "file_id", "arch_file_id"), - schema="E2EMGR", -) - - -t_obssummary = Table( - "obssummary", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("source_id", VARCHAR(24), nullable=False, index=True), - Column("if_band", VARCHAR(4), nullable=False), - Column("sub_ref_freq", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("exposure", NUMBER(asdecimal=False), nullable=False), - Column("sub_bandw", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(8), nullable=False), - Column("sub_num_chans", NUMBER(asdecimal=False), nullable=False), - Column("ra2000", NUMBER(asdecimal=False), nullable=False), - Column("dec2000", NUMBER(asdecimal=False), nullable=False), - Column("project_lock", VARCHAR(8), nullable=False), - Column("sub_pol1", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol2", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol3", NUMBER(asdecimal=False), nullable=False), - Column("sub_pol4", NUMBER(asdecimal=False), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("corr_mode", VARCHAR(8), nullable=False), - Column("if_chan", VARCHAR(8), nullable=False), - Column("n_ants", NUMBER(asdecimal=False), nullable=False), - Column("arch_file_id", NUMBER(asdecimal=False), nullable=False), - Column("sub_chan_id", NUMBER(asdecimal=False), nullable=False), - Column("n_images", NUMBER(asdecimal=False), nullable=False), - Column("obssummary_uid", VARCHAR(48), nullable=False, index=True), - Column("file_set_id", VARCHAR(64), nullable=False), - Column("radeg", NUMBER(asdecimal=False)), - Column("decdeg", NUMBER(asdecimal=False)), - Column("distance", NUMBER(asdecimal=False)), - Column("rms", NUMBER(asdecimal=False)), - Column("resol", NUMBER(asdecimal=False)), - Column("fov", NUMBER(asdecimal=False)), - Column("polar", VARCHAR(16)), - Index("obssummary2_idx", "ra2000", "dec2000"), - Index("obssummary4_idx", "starttime", "stoptime"), - Index("obssummary6_idx", "radeg", "decdeg"), - schema="E2EMGR", -) - - -t_obssummary_columns = Table( - "obssummary_columns", - metadata, - Column("column_name", VARCHAR(32), nullable=False, index=True), - Column("table_name", VARCHAR(32), nullable=False), - Column("description", VARCHAR(64), nullable=False), - Column("unit", VARCHAR(16), nullable=False), - Column("ucd", VARCHAR(64), nullable=False), - Column("utype", VARCHAR(64), nullable=False), - Column("datatype", VARCHAR(32), nullable=False), - Column("varsize", NUMBER(asdecimal=False), nullable=False), - Column("primary", VARCHAR(16), nullable=False), - Column("indexed", VARCHAR(16), nullable=False), - Column("std", VARCHAR(16), nullable=False), - schema="E2EMGR", -) - - -t_omsstnsched = Table( - "omsstnsched", - metadata, - Column("proposal", VARCHAR(5), nullable=False, index=True), - Column("segment", VARCHAR(2), nullable=False), - Column("staid", VARCHAR(5), nullable=False), - Column("start_time", DateTime, nullable=False), - Column("stop_time", DateTime, nullable=False), - Column("mjdstart", NUMBER(16, 8, True)), - Column("mjdstop", NUMBER(16, 8, True)), - Index("omsstnsched2_idx", "mjdstart", "mjdstop"), - schema="E2EMGR", -) - - -t_pidum = Table( - "pidum", - metadata, - Column("proposal", VARCHAR(16), nullable=False), - Column("pi_lastname", VARCHAR(48), nullable=False), - Column("pi_firstname", VARCHAR(48), nullable=False), - Column("pi_name", VARCHAR(64), nullable=False), - Column("peoplekey", NUMBER(asdecimal=False), nullable=False), - schema="E2EMGR", -) - - -t_pipequeue = Table( - "pipequeue", - metadata, - Column("project_code", VARCHAR(16), server_default=text("'none'")), - Column("arch_file_id", NUMBER(asdecimal=False), server_default=text("0")), - Column("arch_file", VARCHAR(128), server_default=text("'none'")), - Column("file_set_type", VARCHAR(16), server_default=text("'RAW'")), - Column("sb_type", VARCHAR(32), server_default=text("'none'")), - Column("queuedate", VARCHAR(23), server_default=text("'none'")), - Column( - "status", - VARCHAR(16), - server_default=text( - """\ -'none' -""" - ), - ), - Column("submitdate", VARCHAR(23), server_default=text("'none'")), - schema="E2EMGR", -) - - -t_pipequeuetemp = Table( - "pipequeuetemp", - metadata, - Column("project_code", VARCHAR(16), server_default=text("'none'")), - Column("arch_file_id", NUMBER(asdecimal=False), server_default=text("0")), - Column("arch_file", VARCHAR(128), server_default=text("'none'")), - Column("file_set_type", VARCHAR(16), server_default=text("'RAW'")), - Column("sb_type", VARCHAR(32), server_default=text("'none'")), - Column("queuedate", DateTime, server_default=text("sysdate")), - Column( - "status", - VARCHAR(16), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -t_project = Table( - "project", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("observer", VARCHAR(48), nullable=False, index=True), - Column("observer_id", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False, index=True), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(36), nullable=False), - Column("obs_bands", VARCHAR(24), nullable=False), - Column("total_obs_time", NUMBER(asdecimal=False), nullable=False), - Column("num_segments", NUMBER(asdecimal=False), nullable=False), - Column("arch_files", NUMBER(asdecimal=False), nullable=False), - Column("row_date", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False, index=True), - Column("project_lock", VARCHAR(8), nullable=False, index=True), - Column("unlock_expire", NUMBER(asdecimal=False), nullable=False), - Column("grant_access", VARCHAR(12), nullable=False), - Column("proprietary_duration", NUMBER(asdecimal=False), nullable=False), - Column("warned", NUMBER(asdecimal=False), server_default=text("0.0")), - Column("project_id", NUMBER(asdecimal=False), server_default=text("0")), - Index("project2_idx", "starttime", "stoptime"), - schema="E2EMGR", -) - - -t_projectgbt = Table( - "projectgbt", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("observer_id", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(24), nullable=False), - Column("obs_bands", VARCHAR(24), nullable=False), - Column("total_obs_time", NUMBER(asdecimal=False), nullable=False), - Column("num_segments", NUMBER(asdecimal=False), nullable=False), - Column("arch_files", NUMBER(asdecimal=False), nullable=False), - Column("row_date", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("project_lock", VARCHAR(8), nullable=False), - Column("unlock_expire", NUMBER(asdecimal=False), nullable=False), - Column("grant_access", VARCHAR(12), nullable=False), - Column("proprietary_duration", NUMBER(asdecimal=False), nullable=False), - Column("warned", NUMBER(asdecimal=False), server_default=text("0.0")), - Column( - "project_id", - NUMBER(asdecimal=False), - server_default=text( - """\ -0 - """ - ), - ), - schema="E2EMGR", -) - - -t_projectgbtold = Table( - "projectgbtold", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("observer", VARCHAR(48), nullable=False), - Column("observer_id", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(24), nullable=False), - Column("obs_bands", VARCHAR(24), nullable=False), - Column("total_obs_time", NUMBER(asdecimal=False), nullable=False), - Column("num_segments", NUMBER(asdecimal=False), nullable=False), - Column("arch_files", NUMBER(asdecimal=False), nullable=False), - Column("row_date", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("project_lock", VARCHAR(8), nullable=False), - Column("unlock_expire", NUMBER(asdecimal=False), nullable=False), - Column("grant_access", VARCHAR(12), nullable=False), - Column("proprietary_duration", NUMBER(asdecimal=False), nullable=False), - Column("warned", NUMBER(asdecimal=False), server_default=text("0.0")), - Column( - "project_id", - NUMBER(asdecimal=False), - server_default=text( - """\ -0 - """ - ), - ), - schema="E2EMGR", -) - - -t_proposal = Table( - "proposal", - metadata, - Column("project_code", VARCHAR(16), nullable=False, index=True), - Column("pi_name", VARCHAR(48), nullable=False, index=True), - Column("pi_email", VARCHAR(64), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False, index=True), - schema="E2EMGR", -) - - -t_proprietary = Table( - "proprietary", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("observer", VARCHAR(24), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False), - Column("keyword", VARCHAR(12), nullable=False), - Column("date_expires", NUMBER(asdecimal=False), nullable=False), - Column("entry_date", NUMBER(asdecimal=False), nullable=False), - Column("email_addr", VARCHAR(64), nullable=False), - Index("proprietary_idx", "project_code", "observer"), - schema="E2EMGR", -) - - -t_segment = Table( - "segment", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4), nullable=False), - Column("observer", VARCHAR(36), nullable=False, index=True), - Column("observer_id", NUMBER(asdecimal=False), nullable=False), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("proprietary", NUMBER(asdecimal=False), nullable=False), - Column("telescope", VARCHAR(12), nullable=False), - Column("telescope_config", VARCHAR(24), nullable=False), - Column("obs_bands", VARCHAR(16), nullable=False), - Column("total_obs_time", NUMBER(asdecimal=False), nullable=False), - Column("num_scans", NUMBER(asdecimal=False), nullable=False), - Column("arch_files", NUMBER(asdecimal=False), nullable=False), - Column("row_date", NUMBER(asdecimal=False), nullable=False), - Column("raw_project_code", VARCHAR(16), nullable=False, index=True), - Column("project_lock", VARCHAR(8), nullable=False), - Column("unlock_expire", NUMBER(asdecimal=False), nullable=False), - Column("grant_access", VARCHAR(12), nullable=False), - Column("proprietary_duration", NUMBER(asdecimal=False), nullable=False), - Index("segment1_idx", "project_code", "segment"), - Index("segment2_idx", "starttime", "stoptime"), - schema="E2EMGR", -) - - -t_shiporders = Table( - "shiporders", - metadata, - Column("file_set_id", VARCHAR(96), nullable=False), - Column("order_id", NUMBER(asdecimal=False), nullable=False), - Column("user_id", NUMBER(asdecimal=False), nullable=False), - Column("emailaddr", VARCHAR(48), server_default=text("'none'")), - Column("submission_date", VARCHAR(48), server_default=text("'none'")), - Column( - "status", - VARCHAR(24), - server_default=text( - """\ -'none' -""" - ), - ), - Column( - "useros", - VARCHAR(24), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -class Siav2image(Base): - __tablename__ = "siav2image" - __table_args__ = {"schema": "E2EMGR"} - - id = Column(VARCHAR(32), primary_key=True) - obs_id = Column(VARCHAR(32), server_default=text("null")) - archive_id = Column(VARCHAR(128), nullable=False) - htm_id = Column(NUMBER(14, 0, False), server_default=text("0")) - preview_id = Column(VARCHAR(128), nullable=False) - access_format = Column(VARCHAR(32), nullable=False) - access_estsize = Column(NUMBER(14, 0, False), server_default=text("0")) - dataproduct_type = Column(VARCHAR(16), server_default=text("null")) - dataproduct_subtype = Column(VARCHAR(32), server_default=text("null")) - calib_level = Column(NUMBER(6, 0, False), server_default=text("0")) - dataset_length = Column(NUMBER(14, 0, False), server_default=text("0")) - im_nsubarrays = Column(NUMBER(8, 0, False), server_default=text("1")) - im_naxes = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis1 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis2 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis3 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis4 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_pixtype = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes1 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes2 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes3 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes4 = Column(VARCHAR(16), server_default=text("null")) - im_ra1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_scale = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - obs_title = Column(VARCHAR(128), server_default=text("null")) - obs_creator_name = Column(VARCHAR(32), server_default=text("null")) - obs_collection = Column(VARCHAR(32), server_default=text("null")) - obs_creator_did = Column(VARCHAR(160), server_default=text("null")) - obs_publisher_did = Column(VARCHAR(160), server_default=text("null")) - obs_dataset_did = Column(VARCHAR(160), server_default=text("null")) - obs_release_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_type = Column(VARCHAR(16), server_default=text("null")) - facility_name = Column(VARCHAR(20), server_default=text("null")) - instrument_name = Column(VARCHAR(20), server_default=text("null")) - obs_bandpass = Column(VARCHAR(20), server_default=text("null")) - obs_datasource = Column(VARCHAR(20), server_default=text("null")) - proposal_id = Column(VARCHAR(20), server_default=text("null")) - target_name = Column(VARCHAR(20), server_default=text("null")) - target_class = Column(VARCHAR(20), server_default=text("null")) - s_ra = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_dec = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_fov = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_region = Column(VARCHAR(128), server_default=text("null")) - s_calib_status = Column(VARCHAR(32), server_default=text("'none'")) - s_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_respower = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_exptime = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - o_ucd = Column(VARCHAR(20), server_default=text("null")) - o_unit = Column(VARCHAR(32), server_default=text("'none'")) - pol_states = Column(VARCHAR(20), server_default=text("null")) - project_code = Column(VARCHAR(24), server_default=text("null")) - obs_session = Column(VARCHAR(24), server_default=text("null")) - file_id = Column(VARCHAR(64), server_default=text("null")) - file_set_id = Column(VARCHAR(128), server_default=text("null")) - file_subset_id = Column(VARCHAR(128), server_default=text("null")) - dataset = Column(VARCHAR(128), server_default=text("null")) - image_file = Column(VARCHAR(128), server_default=text("null")) - obs_file_id = Column(NUMBER(asdecimal=False), server_default=text("0")) - cal_file_id = Column(NUMBER(asdecimal=False), server_default=text("0")) - root_dir = Column(VARCHAR(128), server_default=text("null")) - file_dir = Column( - VARCHAR(128), - server_default=text( - """\ -null -""" - ), - ) - - -t_subarray = Table( - "subarray", - metadata, - Column("project_code", VARCHAR(16), nullable=False), - Column("segment", VARCHAR(4)), - Column("starttime", NUMBER(asdecimal=False), nullable=False), - Column("stoptime", NUMBER(asdecimal=False), nullable=False), - Column("subarray_id", NUMBER(asdecimal=False), nullable=False), - Column("antenna_id", NUMBER(asdecimal=False), nullable=False), - Index("subarray_idx", "project_code", "starttime", "stoptime", "subarray_id"), - schema="E2EMGR", -) - - -t_sumlist = Table( - "sumlist", - metadata, - Column("programid", VARCHAR(8), nullable=False, index=True), - Column("sourcename", VARCHAR(16), nullable=False, index=True), - Column("qualifier", VARCHAR(2), nullable=False), - Column("observerid", NUMBER(asdecimal=False), nullable=False), - Column("observername", VARCHAR(20), nullable=False), - Column("centerofbw1", NUMBER(asdecimal=False), nullable=False), - Column("centerofbw2", NUMBER(asdecimal=False), nullable=False), - Column("centerofbw3", NUMBER(asdecimal=False), nullable=False), - Column("centerofbw4", NUMBER(asdecimal=False), nullable=False), - Column("bandwidth1", NUMBER(asdecimal=False), nullable=False), - Column("bandwidth2", NUMBER(asdecimal=False), nullable=False), - Column("bandwidth3", NUMBER(asdecimal=False), nullable=False), - Column("bandwidth4", NUMBER(asdecimal=False), nullable=False), - Column("netsideband1", VARCHAR(2), nullable=False), - Column("netsideband2", VARCHAR(2), nullable=False), - Column("netsideband3", VARCHAR(2), nullable=False), - Column("netsideband4", VARCHAR(2), nullable=False), - Column("obsmode", VARCHAR(3), nullable=False), - Column("calcode", VARCHAR(3), nullable=False), - Column("correlator", VARCHAR(4), nullable=False), - Column("planetary", VARCHAR(2), nullable=False), - Column("subarrayid", VARCHAR(2), nullable=False), - Column("epoch", VARCHAR(5), nullable=False), - Column("ra1950", NUMBER(asdecimal=False), nullable=False), - Column("dec1950", NUMBER(asdecimal=False), nullable=False), - Column("ra2000", NUMBER(asdecimal=False), nullable=False), - Column("dec2000", NUMBER(asdecimal=False), nullable=False), - Column("mjad", DateTime, nullable=False, index=True), - Column("antennae", NUMBER(asdecimal=False), nullable=False), - Column("starttimelst", NUMBER(asdecimal=False), nullable=False), - Column("starttimeiat", NUMBER(asdecimal=False), nullable=False), - Column("stoptimelst", NUMBER(asdecimal=False), nullable=False), - Column("stoptimeiat", NUMBER(asdecimal=False), nullable=False), - Column("timeonsource", NUMBER(asdecimal=False), nullable=False), - Column("arrayconfig", VARCHAR(6), nullable=False), - Column("numchan1", NUMBER(asdecimal=False), nullable=False), - Column("numchan2", NUMBER(asdecimal=False), nullable=False), - Column("numchan3", NUMBER(asdecimal=False), nullable=False), - Column("numchan4", NUMBER(asdecimal=False), nullable=False), - Column("inttime", NUMBER(asdecimal=False), nullable=False), - Column("velocity1", NUMBER(asdecimal=False), nullable=False), - Column("velocity2", NUMBER(asdecimal=False), nullable=False), - Column("velocity3", NUMBER(asdecimal=False), nullable=False), - Column("velocity4", NUMBER(asdecimal=False), nullable=False), - Column("restfreq1", NUMBER(asdecimal=False), nullable=False), - Column("restfreq2", NUMBER(asdecimal=False), nullable=False), - Column("restfreq3", NUMBER(asdecimal=False), nullable=False), - Column("restfreq4", NUMBER(asdecimal=False), nullable=False), - Column("velsyscode", VARCHAR(10), nullable=False), - Column("apoptions", VARCHAR(2), nullable=False), - Column("dataselect1", NUMBER(asdecimal=False), nullable=False), - Column("dataselect2", NUMBER(asdecimal=False), nullable=False), - Column("dataselect3", NUMBER(asdecimal=False), nullable=False), - Column("dataselect4", NUMBER(asdecimal=False), nullable=False), - Column("chansep1", NUMBER(asdecimal=False), nullable=False), - Column("chansep2", NUMBER(asdecimal=False), nullable=False), - Column("chansep3", NUMBER(asdecimal=False), nullable=False), - Column("chansep4", NUMBER(asdecimal=False), nullable=False), - Column("oldtapenum", VARCHAR(8), nullable=False), - Column("newtapenum", VARCHAR(8), nullable=False), - Column("filenumber", NUMBER(asdecimal=False), nullable=False), - Index("sumlist4_idx", "starttimeiat", "stoptimeiat"), - Index("sumlist5_idx", "newtapenum", "filenumber"), - Index("sumlist3_idx", "ra2000", "dec2000"), - schema="E2EMGR", -) - - -t_validity_chk = Table( - "validity_chk", - metadata, - Column("arch_file_id", NUMBER(asdecimal=False), server_default=text("0")), - Column("file_type", VARCHAR(16), server_default=text("'none'")), - Column("last_checked", DateTime, server_default=text("sysdate")), - Column( - "status", - VARCHAR(16), - server_default=text( - """\ -'none' -""" - ), - ), - schema="E2EMGR", -) - - -class VlapipeImage(Base): - __tablename__ = "vlapipe_image" - __table_args__ = {"schema": "E2EMGR"} - - id = Column(VARCHAR(32), primary_key=True) - obs_id = Column(VARCHAR(32), server_default=text("null")) - archive_id = Column(VARCHAR(128), nullable=False) - htm_id = Column(NUMBER(14, 0, False), server_default=text("0")) - preview_id = Column(VARCHAR(128), nullable=False) - access_format = Column(VARCHAR(32), nullable=False) - access_estsize = Column(NUMBER(14, 0, False), server_default=text("0")) - dataproduct_type = Column(VARCHAR(16), server_default=text("null")) - dataproduct_subtype = Column(VARCHAR(32), server_default=text("null")) - calib_level = Column(NUMBER(6, 0, False), server_default=text("0")) - dataset_length = Column(NUMBER(14, 0, False), server_default=text("0")) - im_nsubarrays = Column(NUMBER(8, 0, False), server_default=text("1")) - im_naxes = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis1 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis2 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis3 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_naxis4 = Column(NUMBER(8, 0, False), server_default=text("0")) - im_pixtype = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes1 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes2 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes3 = Column(VARCHAR(16), server_default=text("null")) - im_wcsaxes4 = Column(VARCHAR(16), server_default=text("null")) - im_ra1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec1 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec2 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec3 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_ra4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_dec4 = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - im_scale = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - obs_title = Column(VARCHAR(128), server_default=text("null")) - obs_creator_name = Column(VARCHAR(32), server_default=text("null")) - obs_collection = Column(VARCHAR(32), server_default=text("null")) - obs_creator_did = Column(VARCHAR(160), server_default=text("null")) - obs_publisher_did = Column(VARCHAR(160), server_default=text("null")) - obs_dataset_did = Column(VARCHAR(160), server_default=text("null")) - obs_release_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_date = Column(VARCHAR(20), server_default=text("null")) - obs_creation_type = Column(VARCHAR(16), server_default=text("null")) - facility_name = Column(VARCHAR(20), server_default=text("null")) - instrument_name = Column(VARCHAR(20), server_default=text("null")) - obs_bandpass = Column(VARCHAR(20), server_default=text("null")) - obs_datasource = Column(VARCHAR(20), server_default=text("null")) - proposal_id = Column(VARCHAR(20), server_default=text("null")) - target_name = Column(VARCHAR(20), server_default=text("null")) - target_class = Column(VARCHAR(20), server_default=text("null")) - s_ra = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_dec = Column(NUMBER(asdecimal=False), index=True, server_default=text("0.0")) - s_fov = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - s_region = Column(VARCHAR(128), server_default=text("null")) - s_calib_status = Column(VARCHAR(32), server_default=text("'none'")) - s_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - em_respower = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_min = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_max = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_exptime = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - t_resolution = Column(NUMBER(asdecimal=False), server_default=text("0.0")) - o_ucd = Column(VARCHAR(20), server_default=text("null")) - o_unit = Column(VARCHAR(32), server_default=text("'none'")) - pol_states = Column(VARCHAR(20), server_default=text("null")) - project_code = Column(VARCHAR(24), server_default=text("null")) - obs_session = Column(VARCHAR(24), server_default=text("null")) - file_id = Column(VARCHAR(64), server_default=text("null")) - file_set_id = Column(VARCHAR(128), server_default=text("null")) - file_subset_id = Column(VARCHAR(128), server_default=text("null")) - dataset = Column(VARCHAR(128), server_default=text("null")) - image_file = Column(VARCHAR(128), server_default=text("null")) - obs_file_id = Column(VARCHAR(64), server_default=text("null")) - cal_file_id = Column(VARCHAR(64), server_default=text("null")) - root_dir = Column(VARCHAR(128), server_default=text("null")) - file_dir = Column( - VARCHAR(128), - server_default=text( - """\ -null -""" - ), - ) - - -t_weather = Table( - "weather", - metadata, - Column("telescope", VARCHAR(8), nullable=False, index=True), - Column("timestamp", NUMBER(12, 6, True), nullable=False, index=True, comment="MJD (decimal)"), - Column("pressure", NUMBER(7, 2, True), nullable=False, comment="millibars"), - Column("temp", NUMBER(7, 2, True), nullable=False, comment="degrees C"), - Column("dewtemp", NUMBER(7, 2, True), nullable=False, comment="degrees C"), - Column("windspeed", NUMBER(6, 2, True), nullable=False, comment="m/sec"), - Column("winddir", NUMBER(6, 1, True), nullable=False, comment="degrees from North"), - schema="E2EMGR", -) - - -class Wensscatalog(Base): - __tablename__ = "wensscatalog" - __table_args__ = {"schema": "E2EMGR"} - - wensscode = Column(VARCHAR(3), nullable=False) - name = Column(VARCHAR(13), primary_key=True, nullable=False) - raradb = Column(NUMBER(asdecimal=False), nullable=False) - decradb = Column(NUMBER(asdecimal=False), nullable=False) - raradj = Column(NUMBER(asdecimal=False), primary_key=True, nullable=False) - decradj = Column(NUMBER(asdecimal=False), primary_key=True, nullable=False) - srctype = Column(VARCHAR(1), nullable=False) - warn = Column(VARCHAR(1), nullable=False) - pflux = Column(NUMBER(asdecimal=False), nullable=False) - flux = Column(NUMBER(asdecimal=False), nullable=False) - majorax = Column(NUMBER(asdecimal=False), nullable=False) - minorax = Column(NUMBER(asdecimal=False), nullable=False) - posangle = Column(NUMBER(asdecimal=False), nullable=False) - rms = Column(NUMBER(asdecimal=False), nullable=False) - field = Column(VARCHAR(9), nullable=False) - survey = Column(VARCHAR(10), nullable=False) - rarad = Column(NUMBER(asdecimal=False)) - decrad = Column(NUMBER(asdecimal=False)) diff --git a/shared/schema/schema/logs.py b/shared/schema/schema/logs.py deleted file mode 100644 index b5703d35452ff9b039192feb908493ac98d1b8ad..0000000000000000000000000000000000000000 --- a/shared/schema/schema/logs.py +++ /dev/null @@ -1,43 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -import pendulum - -from . import create_session -from .model import t_logs as logs - -session = create_session("SDM") - - -def since(time): - query = logs.select().where(logs.c.timestamp > time).order_by("timestamp") - return [dict(r) for r in session.execute(query)] - - -def for_request(request_id): - query = ( - logs.select().where(logs.c.properties["requestId"].astext == str(request_id)).order_by("timestamp").limit(100) - ) - return list(dict(r) for r in session.execute(query)) - - -if __name__ == "__main__": - print("since:") - print(since(pendulum.now().subtract(hours=1))) - print() - print("for 13099859:") - print(for_request(13099859)) diff --git a/shared/schema/schema/model.py b/shared/schema/schema/model.py deleted file mode 100644 index fa2242ea59e4e4a32c3dce9fcb4282d2416dcf1b..0000000000000000000000000000000000000000 --- a/shared/schema/schema/model.py +++ /dev/null @@ -1,1240 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - JSON, - BigInteger, - Boolean, - CheckConstraint, - Column, - Date, - DateTime, - Float, - ForeignKey, - ForeignKeyConstraint, - Integer, - Numeric, - String, - Table, - Text, - UniqueConstraint, - text, -) -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import backref, relationship - -Base = declarative_base() -metadata = Base.metadata - - -class Account(Base): - __tablename__ = "account" - __table_args__ = (UniqueConstraint("provider", "provider_principal"),) - - account_id = Column(String, primary_key=True) - request_handler_id = Column(Numeric) - version = Column(Numeric, nullable=False, server_default=text("1")) - password_digest = Column(String) - firstname = Column(String, nullable=False) - lastname = Column(String, nullable=False) - initials = Column(String) - creationtimestamp = Column(String) - modificationtimestamp = Column(String) - preferredarc = Column(String) - email = Column(String) - executive = Column(String, nullable=False, server_default=text("'na'::character varying")) - aliases = Column(String) - inst_no = Column(Numeric, nullable=False, server_default=text("1")) - provider = Column(String) - provider_principal = Column(String) - - role = relationship("Role", secondary="account_role") - - -t_account_role = Table( - "account_role", - metadata, - Column("role_no", ForeignKey("role.role_no"), nullable=False), - Column("account_id", ForeignKey("account.account_id"), nullable=False), -) - - -class AlmaOusType(Base): - __tablename__ = "alma_ous_types" - - ous_type = Column(String, primary_key=True) - description = Column(String) - - -t_alma_ous_view = Table( - "alma_ous_view", - metadata, - Column("project_code", String), - Column("sous", String), - Column("gous", String), - Column("mous", String), - Column("schedblock_name", String), -) - - -class AlmaOus(Base): - __tablename__ = "alma_ouses" - - alma_ous_id = Column(String, primary_key=True) - parent_ous_id = Column(ForeignKey("alma_ouses.alma_ous_id")) - project_code = Column(ForeignKey("projects.project_code")) - ous_type = Column(ForeignKey("alma_ous_types.ous_type"), nullable=False) - schedblock_name = Column(String) - - alma_ous_type = relationship("AlmaOusType") - parent_ous = relationship( - "AlmaOus", remote_side=[alma_ous_id], backref=backref("children_ouses", cascade="all, delete-orphan") - ) - calibrations = relationship("Calibration") - execution_blocks = relationship("ExecutionBlock") - project = relationship("Project") - - -class AlmaSourceDatum(Base): - __tablename__ = "alma_source_data" - - alma_ous_id = Column(String, primary_key=True, nullable=False) - field_name = Column(String, primary_key=True, nullable=False) - ra = Column(Float(53)) - dec = Column(Float(53)) - integration_time = Column(Float(53)) - angular_resolution = Column(Float(53)) - largest_angular_scale = Column(Float(53)) - science_field = Column(Boolean, server_default=text("false")) - - spectral_windows = relationship("AlmaSpwDatum", secondary="alma_spw_sources", back_populates="sources") - - def __repr__(self): - return "<AlmaSourceDatum#{alma_ous_id} {field_name} {ra} {dec} {integration_time} {angular_resolution} {largest_angular_scale}>".format( - **self.__dict__ - ) - - -class AlmaSpwDatum(Base): - __tablename__ = "alma_spw_data" - - alma_ous_id = Column(String, primary_key=True, nullable=False) - spw_name = Column(String, primary_key=True, nullable=False) - min_frequency = Column(Float(53)) - max_frequency = Column(Float(53)) - bandwidth = Column(Float(53)) - num_channels = Column(Integer) - spectral_resolution = Column(Float(53)) - - sources = relationship("AlmaSourceDatum", secondary="alma_spw_sources", back_populates="spectral_windows") - - def __repr__(self): - return "<AlmaSpwDatum#{alma_ous_id} {spw_name} {min_frequency} {max_frequency} {bandwidth} {num_channels} {spectral_resolution}>".format( - **self.__dict__ - ) - - -t_alma_spw_sources = Table( - "alma_spw_sources", - metadata, - Column("alma_ous_id", String, primary_key=True, nullable=False), - Column("spw_name", String, primary_key=True, nullable=False), - Column("field_name", String, primary_key=True, nullable=False), - ForeignKeyConstraint( - ["alma_ous_id", "field_name"], ["alma_source_data.alma_ous_id", "alma_source_data.field_name"] - ), - ForeignKeyConstraint(["alma_ous_id", "spw_name"], ["alma_spw_data.alma_ous_id", "alma_spw_data.spw_name"]), -) - - -t_alma_project_codes = Table("alma_project_codes", metadata, Column("code", String), Column("uid", String)) - - -class AlmaReingestionQueue(Base): - __tablename__ = "alma_reingestion_queue" - - asdm_uid = Column(String, primary_key=True) - observation_finished = Column(DateTime(True), nullable=False) - last_updated = Column(DateTime(True), nullable=False, server_default=text("now()")) - state = Column(String, nullable=False, server_default=text("'WAITING'::character varying")) - - -# class AlmaSourceDatum(Base): -# __tablename__ = 'alma_source_data' -# -# alma_ous_id = Column(String, primary_key=True, nullable=False) -# field_name = Column(String, primary_key=True, nullable=False) -# ra = Column(Float(53)) -# dec = Column(Float(53)) -# integration_time = Column(Float(53)) -# angular_resolution = Column(Float(53)) -# largest_angular_scale = Column(Float(53)) -# -# alma_ouss = relationship('AlmaSpwDatum', secondary='alma_spw_sources') - - -# class AlmaSpwDatum(Base): -# __tablename__ = 'alma_spw_data' -# -# alma_ous_id = Column(String, primary_key=True, nullable=False) -# spw_number = Column(Integer, primary_key=True, nullable=False) -# min_frequency = Column(Float(53)) -# max_frequency = Column(Float(53)) -# bandwidth = Column(Float(53)) -# num_channels = Column(Integer) -# spectral_resolution = Column(Float(53)) - - -# t_alma_spw_sources = Table( -# 'alma_spw_sources', metadata, -# Column('alma_ous_id', String, primary_key=True, nullable=False), -# Column('spw_number', Integer, primary_key=True, nullable=False), -# Column('field_name', String, primary_key=True, nullable=False), -# ForeignKeyConstraint(['alma_ous_id', 'field_name'], ['alma_source_data.alma_ous_id', 'alma_source_data.field_name']), -# ForeignKeyConstraint(['alma_ous_id', 'spw_number'], ['alma_spw_data.alma_ous_id', 'alma_spw_data.spw_number']) -# ) - - -class AncillaryProduct(Base): - __tablename__ = "ancillary_products" - - ancillary_product_locator = Column(String, primary_key=True) - ancillary_product_type = Column(String, nullable=False) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id"), nullable=False) - product_group_id = Column(ForeignKey("product_groups.product_group_id")) - science_product_locator = Column(ForeignKey("science_products.science_product_locator")) - - filegroup = relationship("Filegroup") - product_group = relationship("ProductGroup") - science_product = relationship("ScienceProduct", backref=backref("ancillary_products")) - - @property - def locator(self): - return self.ancillary_product_locator - - @property - def subdirectory(self): - return "" - - -class Archive(Base): - __tablename__ = "archive" - - id = Column(Numeric, primary_key=True) - name = Column(String(10), nullable=False) - - -class ArchiveLog(Base): - __tablename__ = "archive_log" - __table_args__ = (UniqueConstraint("request_id", "dataset_name"),) - - log_id = Column(Numeric, primary_key=True, server_default=text("nextval('log_sequence'::regclass)")) - ip = Column(String) - host_name = Column(String) - account_id = Column(Numeric) - country = Column(String) - local_host_name = Column(String) - user_agent = Column(String) - start_date = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP")) - program = Column(String, nullable=False) - version = Column(String) - resource_name = Column(String) - query = Column(String) - size_lines = Column(Numeric) - size_bytes_wire = Column(Numeric) - size_bytes_uncompressed = Column(Numeric) - duration = Column(Numeric) - medium = Column(String) - user_category = Column(Numeric) - pi_request = Column(String(1)) - member_state = Column(String(1)) - eso_user = Column(String(1)) - error_code = Column(Numeric) - error_string = Column(String) - file_id = Column(String) - archive_class = Column(String) - service_type = Column(String) - dataset_name = Column(String) - request_id = Column(Numeric) - archive_id = Column(ForeignKey("archive.id")) - - archive = relationship("Archive") - - -class Author(Base): - __tablename__ = "authors" - - author_id = Column(Integer, primary_key=True, server_default=text("nextval('authors_author_id_seq'::regclass)")) - project_code = Column(ForeignKey("projects.project_code", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - username = Column(String, nullable=False) - firstname = Column(String, nullable=False) - lastname = Column(String, nullable=False) - pst_person_id = Column(String) - is_pi = Column(Boolean, nullable=False) - - project = relationship("Project") - - def __repr__(self): - return "<Author#{author_id} {username} '{firstname} {lastname}'>".format(**self.__dict__) - - -class CalibrationStatusValue(Base): - __tablename__ = "calibration_status_values" - - status = Column(String, primary_key=True) - description = Column(String, nullable=False) - - -class Calibration(Base): - __tablename__ = "calibrations" - - calibration_id = Column( - Integer, primary_key=True, server_default=text("nextval('calibrations_calibration_id_seq'::regclass)") - ) - alma_ous_id = Column(ForeignKey("alma_ouses.alma_ous_id")) - project_code = Column(ForeignKey("projects.project_code"), nullable=False) - execution_block_id = Column(ForeignKey("execution_blocks.execution_block_id")) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id"), nullable=False) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), unique=True) - - alma_ous = relationship("AlmaOus") - execution_block = relationship("ExecutionBlock") - filegroup = relationship("Filegroup") - project = relationship("Project") - science_product = relationship("ScienceProduct", uselist=False) - - def __repr__(self): - return ( - "<Calibration#{calibration_id} {execution_block_id} '{alma_ous_id} {filegroup_id} {project_code}'>".format( - **self.__dict__ - ) - ) - - -class VLASSCalibration(Calibration): - __tablename__ = "VLASS_calibrations" - - calibration_id = Column(ForeignKey("calibrations.calibration_id"), primary_key=True) - - -class Catalog(Base): - __tablename__ = "catalogs" - - catalog_id = Column(Integer, primary_key=True, server_default=text("nextval('catalogs_catalog_id_seq'::regclass)")) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), nullable=False) - - science_product = relationship("ScienceProduct") - - -class VlassCatalog(Catalog): - __tablename__ = "vlass_catalogs" - - catalog_id = Column(ForeignKey("catalogs.catalog_id"), primary_key=True) - tile = Column(String) - type = Column(String) - - -class Configuration(Base): - __tablename__ = "configurations" - - configuration_id = Column( - Integer, primary_key=True, server_default=text("nextval('configurations_configuration_id_seq'::regclass)") - ) - configuration = Column(Integer, nullable=False) - execution_block_id = Column( - ForeignKey("execution_blocks.execution_block_id", ondelete="CASCADE", onupdate="CASCADE"), - nullable=False, - index=True, - ) - - execution_block = relationship("ExecutionBlock") - - def __repr__(self): - return "<Configuration#{configuration_id}>".format(**self.__dict__) - - -class DataDescription(Base): - __tablename__ = "data_descriptions" - - data_description_id = Column( - Integer, primary_key=True, server_default=text("nextval('data_descriptions_data_description_id_seq'::regclass)") - ) - bandwidth = Column(Float(53), nullable=False) - frequency = Column(Float(53), nullable=False) - polarization_id = Column(ForeignKey("polarizations.polarization_id"), nullable=False) - configuration_id = Column( - ForeignKey("configurations.configuration_id", ondelete="CASCADE", onupdate="CASCADE"), - nullable=False, - index=True, - ) - - configuration = relationship("Configuration") - polarization = relationship("Polarization") - subscans = relationship("Subscan", secondary="subscan_data_descriptions") - - def __repr__(self): - return "<DataDescription#{data_description_id} Freq={frequency} BW={bandwidth}>".format(**self.__dict__) - - -class Databasechangelog(Base): - __tablename__ = "databasechangelog" - - id = Column(String(63), primary_key=True, nullable=False) - author = Column(String(63), primary_key=True, nullable=False) - filename = Column(String(200), primary_key=True, nullable=False) - dateexecuted = Column(DateTime(True), nullable=False) - orderexecuted = Column(Integer, nullable=False) - exectype = Column(String(10), nullable=False) - md5sum = Column(String(35)) - description = Column(String(255)) - comments = Column(String(255)) - tag = Column(String(255)) - liquibase = Column(String(20)) - contexts = Column(String(255)) - labels = Column(String(255)) - deployment_id = Column(String(10)) - - -class Databasechangeloglock(Base): - __tablename__ = "databasechangeloglock" - - id = Column(Integer, primary_key=True) - locked = Column(Boolean, nullable=False) - lockgranted = Column(DateTime(True)) - lockedby = Column(String(255)) - - -class Event(Base): - __tablename__ = "events" - - id = Column(Integer, primary_key=True, server_default=text("nextval('events_id_seq'::regclass)")) - application = Column(String, nullable=False) - user = Column(String) - request = Column(String) - message = Column(String, nullable=False) - log_data = Column(JSON) - version = Column(Float(53), nullable=False) - timestamp = Column(DateTime(True), nullable=False) - - def __repr__(self): - return "<Event#{id} app={application} user={user} request={request} timestamp={timestamp}>".format( - **self.__dict__ - ) - - -t_execblock_start_stop = Table( - "execblock_start_stop", - metadata, - Column("execution_block_id", Integer), - Column("starttime", Float(53)), - Column("endtime", Float(53)), -) - - -class ExecutionBlock(Base): - __tablename__ = "execution_blocks" - __table_args__ = ( - CheckConstraint( - "(((telescope)::text = 'EVLA'::text) AND (ngas_fileset_id IS NOT NULL)) OR ((telescope)::text <> 'EVLA'::text)" - ), - ) - - execution_block_id = Column( - Integer, primary_key=True, server_default=text("nextval('execution_blocks_execution_block_id_seq'::regclass)") - ) - ost_exec_block_id = Column(Integer) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - calibration_level = Column(String, nullable=False) - telescope = Column(String, nullable=False) - configuration = Column(String) - scheduling_block_id = Column(Integer) - ngas_fileset_id = Column(String) - project_code = Column(ForeignKey("projects.project_code", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - starttime = Column(Float(53)) - endtime = Column(Float(53)) - calibration_status = Column( - ForeignKey("calibration_status_values.status"), - nullable=False, - server_default=text("'Unknown'::character varying"), - ) - scheduling_block_type = Column(String) - band_code = Column(String) - ingestion_complete = Column(Boolean, nullable=False, server_default=text("false")) - segment = Column(String(2)) - alma_ous_id = Column(ForeignKey("alma_ouses.alma_ous_id")) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), unique=True) - - alma_ous = relationship("AlmaOus") - calibration_status_value = relationship("CalibrationStatusValue") - filegroup = relationship("Filegroup") - project = relationship("Project") - science_product = relationship("ScienceProduct", uselist=False) - scans = relationship("Scan", cascade="all, delete-orphan") - calibrations = relationship("Calibration") - - def __repr__(self): - return "<ExecutionBlock#{execution_block_id} project={project_code} start={starttime} end={endtime}>".format( - **self.__dict__ - ) - - -class RealfastExecutionBlock(ExecutionBlock): - __tablename__ = "realfast_execution_blocks" - - execution_block_id = Column(ForeignKey("execution_blocks.execution_block_id"), primary_key=True) - transient_ra = Column(String) - transient_ra_error = Column(Float(53)) - transient_dec = Column(String) - transient_dec_error = Column(Float(53)) - transient_snr = Column(Float(53)) - transient_dm = Column(Float(53)) - transient_dm_error = Column(Float(53)) - preaverage_time = Column(Float(53)) - rfpipe_version = Column(String) - prefs_id = Column(String) - rf_qa_label = Column(String) - rf_qa_zero_fraction = Column(Float(53)) - rf_qa_visibility_noise = Column(Float(53)) - rf_qa_image_noise = Column(Float(53)) - - -class ExternalProductSystem(Base): - __tablename__ = "external_product_systems" - - name = Column(String, primary_key=True) - - def __repr__(self): - return "<ExternalProductSystem#{name}>".format(**self.__dict__) - - -class VLASSExecutionBlock(ExecutionBlock): - __tablename__ = "VLASS_execution_blocks" - - execution_block_id = Column(ForeignKey("execution_blocks.execution_block_id"), primary_key=True) - - -class FailedIngestion(Base): - __tablename__ = "failed_ingestions" - - filename = Column(String(), primary_key=True) - telescope = Column(String()) - last_attempted = Column(DateTime(True)) - category = Column(String()) - failure_reason = Column(String()) - resolution = Column(String()) - state = Column(String()) - - -class Filegroup(Base): - __tablename__ = "filegroups" - __table_args__ = ( - CheckConstraint( - "(CASE WHEN (project_code IS NOT NULL) THEN 1 ELSE 0 END + CASE WHEN (parent_filegroup_id IS NOT NULL) THEN 1 ELSE 0 END) = 1" - ), - ) - - filegroup_id = Column( - Integer, primary_key=True, server_default=text("nextval('filegroups_filegroup_id_seq'::regclass)") - ) - project_code = Column(ForeignKey("projects.project_code", ondelete="CASCADE", onupdate="CASCADE")) - parent_filegroup_id = Column(ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE")) - datasize = Column(BigInteger) - type = Column(String) - - parent_filegroup = relationship( - "Filegroup", remote_side=[filegroup_id], backref=backref("children_filegroups", cascade="all, delete-orphan") - ) - project = relationship("Project") - - execution_blocks = relationship("ExecutionBlock", cascade="all, delete-orphan") - files = relationship("File", cascade="all, delete-orphan") - scans = relationship("Scan") - - @property - def all_files(self): - """ - :return: all the files under this filegroup, recursively. - - Beware performance issues here! - """ - # this is a gross and probably expensive albeit beautiful way to write this query - return self.files + [file for subgroup in self.children_filegroups for file in subgroup.all_files] - - def __repr__(self): - return "<Filegroup#{filegroup_id} project={project_code}>".format(**self.__dict__) - - -class File(Base): - __tablename__ = "files" - - file_id = Column(Integer, primary_key=True, server_default=text("nextval('files_file_id_seq'::regclass)")) - file_path = Column(String) - ngas_id = Column(String) - filegroup = Column( - ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False, index=True - ) - filename = Column(String, nullable=False) - filesize = Column(BigInteger, nullable=False) - format = Column(String, nullable=False) - type = Column(String, nullable=False) - checksum = Column(String) - checksum_type = Column(String) - ingestion_time = Column(DateTime(True)) - ngas_cluster = Column(String) - ngas_location = Column(String) - preview_storage_path = Column(String) - - filegroup1 = relationship("Filegroup") - images = relationship("Image", cascade="all, delete-orphan") - subscans = relationship("Subscan") - - def __repr__(self): - return "<File#{file_id} {file_path}/{filename} ngas_id={ngas_id}>".format(**self.__dict__) - - -class ImageProduct(Base): - __tablename__ = "image_products" - - image_product_id = Column( - Integer, primary_key=True, server_default=text("nextval('image_products_image_product_id_seq'::regclass)") - ) - project_code = Column(ForeignKey("projects.project_code"), nullable=False) - configurations = Column(String(255)) - collection_name = Column(String(255)) - calibration_level = Column(Integer, server_default=text("2")) - product_file_id = Column( - ForeignKey("files.file_id", ondelete="CASCADE", onupdate="CASCADE"), ForeignKey("files.file_id"), nullable=False - ) - tags = Column(String(255)) - image_set_filegroup = Column(ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE")) - - filegroup = relationship("Filegroup") - product_file = relationship("File", primaryjoin="ImageProduct.product_file_id == File.file_id") - product_file1 = relationship("File", primaryjoin="ImageProduct.product_file_id == File.file_id") - project = relationship("Project") - - -class Image(Base): - __tablename__ = "images" - - image_id = Column(Integer, primary_key=True, server_default=text("nextval('images_image_id_seq'::regclass)")) - file_id = Column(ForeignKey("files.file_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - target_name = Column(String, nullable=False) - telescope = Column(String, nullable=False) - thumbnail = Column(String) - spatial_resolution = Column(Float(53), nullable=False) - image_field_of_view = Column(Float(53), nullable=False) - max_intensity = Column(Float(53), nullable=False) - min_intensity = Column(Float(53), nullable=False) - rms_noise = Column(Float(53), nullable=False) - polarization_id = Column(ForeignKey("polarizations.polarization_id"), nullable=False) - ra = Column(String(255), nullable=False) - dec = Column(String(255), nullable=False) - min_frequency = Column(Float(53), nullable=False) - max_frequency = Column(Float(53), nullable=False) - ra_element_count = Column(Integer, nullable=False) - dec_element_count = Column(Integer, nullable=False) - starttime = Column(Float(53)) - endtime = Column(Float(53)) - exposure_time = Column(Float(53)) - rest_frequency = Column(Float(53)) - image_units = Column(String(255)) - spatial_region = Column(Text) - beam_axis_ratio = Column(Float(53)) - band_code = Column(String) - ra_pixel_size = Column(Float(53), nullable=False) - dec_pixel_size = Column(Float(53), nullable=False) - tags = Column(String) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), unique=True) - collection_name = Column(String) - configurations = Column(String) - calibration_level = Column(Integer) - - file = relationship("File") - polarization = relationship("Polarization") - science_product = relationship("ScienceProduct", uselist=False) - - def __repr__(self): - return "<Image#{image_id} target={target_name} telescope={telescope}>".format(**self.__dict__) - - -class VlassImage(Image): - __tablename__ = "vlass_images" - - image_id = Column(ForeignKey("images.image_id"), primary_key=True) - epoch = Column(ForeignKey("vlass_epochs.epoch")) - tile = Column(String) - type = Column(ForeignKey("vlass_image_types.type")) - - vlass_epoch = relationship("VlassEpoch") - vlass_image_type = relationship("VlassImageType") - - -class Intent(Base): - __tablename__ = "intents" - - intent_name = Column(String, primary_key=True) - - subscans = relationship("Subscan", secondary="subscan_intents") - - def __repr__(self): - return "<Intent {0}>".format(self.intent_name) - - -t_logs = Table( - "logs", - metadata, - Column("filename", String), - Column("class", String), - Column("method", String), - Column("line", Integer), - Column("arguments", String), - Column("timestamp", DateTime(True)), - Column("formatted_message", String), - Column("logger_name", String), - Column("level", String), - Column("thread_name", String), - Column("reference_mask", Integer), - Column("properties", JSON), - Column("stacktrace", Text), - Column("request_id", Integer), -) - - -class Polarization(Base): - __tablename__ = "polarizations" - - polarization_id = Column(Integer, primary_key=True) - name = Column(String, nullable=False) - description = Column(String, nullable=False) - - def __repr__(self): - return "<Polarization {0}>".format(self.name) - - -class ProductGroup(Base): - __tablename__ = "product_groups" - - product_group_id = Column( - Integer, primary_key=True, server_default=text("nextval('product_groups_product_group_id_seq'::regclass)") - ) - product_group_type = Column(String, nullable=False) - alma_ous_id = Column(ForeignKey("alma_ouses.alma_ous_id")) - program_id = Column(ForeignKey("programs.program_id")) - parent_product_group_id = Column(ForeignKey("product_groups.product_group_id")) - - ALMA_ous = relationship("AlmaOus") - parent_product_group = relationship("ProductGroup", remote_side=[product_group_id]) - program = relationship("Program") - science_products = relationship("ScienceProduct", secondary="science_products_product_groups") - - -class Program(Base): - __tablename__ = "programs" - - program_id = Column(String, primary_key=True) - project_code = Column(ForeignKey("projects.project_code"), nullable=False) - program_type = Column(String, nullable=False) - parent_program_id = Column(ForeignKey("programs.program_id")) - - parent_program = relationship("Program", remote_side=[program_id]) - project = relationship("Project") - - -class Project(Base): - __tablename__ = "projects" - - project_code = Column(String, primary_key=True) - legacy_id = Column(String) - total_observation_time = Column(Float(53)) - opt_project_id = Column(Integer) - title = Column(String) - abstract = Column(Text) - proprietary_expiration = Column(DateTime) - last_addition = Column(Date) - starttime = Column(Float(53)) - endtime = Column(Float(53)) - proprietary_duration = Column(Float(53)) - - science_products = relationship("ScienceProduct", secondary="science_products_projects") - authors = relationship("Author", cascade="all,delete, delete-orphan", backref="parent") - execution_blocks = relationship("ExecutionBlock") - file_groups = relationship("Filegroup") - alma_ouses = relationship("AlmaOus", backref="projects") - - def __repr__(self): - return '<Project#{project_code} "{title}" start={starttime} end={endtime}>'.format(**self.__dict__) - - -class Receiver(Base): - __tablename__ = "receivers" - - receiver_id = Column( - Integer, primary_key=True, server_default=text("nextval('receivers_receiver_id_seq'::regclass)") - ) - description = Column(String, nullable=False) - - def __repr__(self): - return "<Receiver {0}>".format(self.receiver_id) - - -class ReingestionState(Base): - __tablename__ = "reingestion_states" - - state = Column(String, primary_key=True) - - -class RhCommand(Base): - __tablename__ = "rh_commands" - - command_id = Column(Numeric, primary_key=True) - name = Column(String, nullable=False, unique=True) - arguments = Column(String) - description = Column(String) - host = Column(String) - script = Column(String, nullable=False) - staging_area = Column(String) - execution_level = Column(String, nullable=False) - - -class RhDataEntity(Base): - __tablename__ = "rh_data_entities" - __table_args__ = (UniqueConstraint("data_entity_name", "request_id"),) - - data_entity_id = Column(Numeric, primary_key=True) - data_entity_name = Column(String, nullable=False) - request_id = Column(ForeignKey("rh_requests.request_id"), nullable=False, index=True) - state = Column(String, nullable=False) - meta_data_uri = Column(String) - - request = relationship("RhRequest") - - -class RhFile(Base): - __tablename__ = "rh_files" - __table_args__ = ( - CheckConstraint( - "((request_id IS NOT NULL) AND (data_entity_id IS NULL)) OR ((request_id IS NULL) AND (data_entity_id IS NOT NULL))" - ), - ) - - file_id = Column(Numeric, primary_key=True) - request_id = Column(ForeignKey("rh_requests.request_id"), index=True) - data_entity_id = Column(ForeignKey("rh_data_entities.data_entity_id"), index=True) - file_key = Column(String, nullable=False, index=True) - namespace = Column(String, nullable=False) - file_name = Column(String, nullable=False) - file_type = Column(String) - file_uri = Column(String, nullable=False) - file_size = Column(Numeric, nullable=False) - rank = Column(Numeric) - permission = Column(String) - medium_id = Column(Numeric) - - data_entity = relationship("RhDataEntity") - request = relationship("RhRequest") - - -class RhOperatorRequest(Base): - __tablename__ = "rh_operator_requests" - - request_id = Column(Numeric, primary_key=True) - creation_date = Column(DateTime, nullable=False) - priority = Column(String, nullable=False) - resolved_flag = Column(String(1), nullable=False) - action_id = Column(Numeric) - request_description = Column(String) - - -class RhProcess(Base): - __tablename__ = "rh_processes" - __table_args__ = ( - CheckConstraint( - "((request_id IS NOT NULL) AND (data_entity_id IS NULL)) OR ((request_id IS NULL) AND (data_entity_id IS NOT NULL))" - ), - ) - - process_id = Column(Numeric, primary_key=True) - state = Column(String, nullable=False) - command_id = Column(ForeignKey("rh_commands.command_id"), nullable=False) - job_id = Column(String) - delivery_method = Column(String) - arguments = Column(String) - file_id = Column(ForeignKey("rh_files.file_id")) - request_id = Column(ForeignKey("rh_requests.request_id")) - data_entity_id = Column(ForeignKey("rh_data_entities.data_entity_id")) - process_type = Column(String, nullable=False) - - command = relationship("RhCommand") - data_entity = relationship("RhDataEntity") - file = relationship("RhFile") - request = relationship("RhRequest") - - -class RhRequestParameter(Base): - __tablename__ = "rh_request_parameters" - - request_id = Column(ForeignKey("rh_requests.request_id"), primary_key=True, nullable=False) - pname = Column(String, primary_key=True, nullable=False) - pvalue = Column(String) - - request = relationship("RhRequest") - - -class RhRequest(Base): - __tablename__ = "rh_requests" - - request_id = Column(Numeric, primary_key=True) - account_id = Column(Numeric, nullable=False) - request_state = Column(String, nullable=False) - creation_date = Column(DateTime, nullable=False) - request_description = Column(String) - delivery_method_type = Column(String) - delivery_media_type = Column(String) - delivery_media_address = Column(String) - completion_date = Column(DateTime) - priority_code = Column(Numeric, nullable=False) - ds_file_size = Column(Numeric) - aux_file_size = Column(Numeric) - total_files_number = Column(Numeric) - total_processes_number = Column(Numeric) - notification_email = Column(String) - archive_id = Column(ForeignKey("archive.id")) - - archive = relationship("Archive") - - -t_rh_requests_mediums = Table( - "rh_requests_mediums", - metadata, - Column("request_id", ForeignKey("rh_requests.request_id"), primary_key=True, nullable=False), - Column("medium_id", ForeignKey("rh_site_delivery_medium.medium_id"), primary_key=True, nullable=False), -) - - -class RhSiteDeliveryMedium(Base): - __tablename__ = "rh_site_delivery_medium" - - medium_id = Column(Numeric, primary_key=True) - active = Column(String(1), nullable=False) - media_type = Column(String, nullable=False) - host_name = Column(String, nullable=False) - device = Column(String, nullable=False) - capacity = Column(Float, nullable=False) - request_id = Column(Numeric) - state = Column(String, nullable=False) - last_mod = Column(DateTime, server_default=text("'2018-04-18 15:21:15.783814'::timestamp without time zone")) - status_message = Column(String, nullable=False) - - requests = relationship("RhRequest", secondary="rh_requests_mediums") - - -class Role(Base): - __tablename__ = "role" - __table_args__ = (UniqueConstraint("application", "name"),) - - role_no = Column(Numeric, primary_key=True) - version = Column(Numeric, nullable=False) - application = Column(String, nullable=False) - name = Column(String, nullable=False) - parent_role = Column(ForeignKey("role.role_no")) - - parent = relationship("Role", remote_side=[role_no]) - - -t_rsl_eb_cal_map = Table("rsl_eb_cal_map", metadata, Column("eb_locator", String), Column("cal_locator", String)) - - -class Scan(Base): - __tablename__ = "scans" - - scan_id = Column(Integer, primary_key=True, server_default=text("nextval('scans_scan_id_seq'::regclass)")) - ost_scan_id = Column(Integer) - execution_block_id = Column( - ForeignKey("execution_blocks.execution_block_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False - ) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - max_bandwidth = Column(Float(53), nullable=False) - min_bandwidth = Column(Float(53), nullable=False) - polarization_code = Column(Integer, nullable=False) - max_frequency = Column(Float(53), nullable=False) - min_frequency = Column(Float(53), nullable=False) - filename = Column(String) - - execution_block = relationship("ExecutionBlock") - filegroup = relationship("Filegroup") - subscans = relationship("Subscan", cascade="all, delete-orphan") - - def __repr__(self): - return "<Scan#{0}>".format(self.scan_id) - - -class ScienceProductGroupType(Base): - __tablename__ = "science_product_group_types" - - science_product_group_type = Column(String, primary_key=True) - description = Column(String) - - -class ScienceProductType(Base): - __tablename__ = "science_product_types" - - science_product_type = Column(String, primary_key=True) - description = Column(String) - - -class ScienceProduct(Base): - __tablename__ = "science_products" - - science_product_locator = Column(String, primary_key=True) - science_product_type = Column(ForeignKey("science_product_types.science_product_type"), nullable=False) - metadata_ingestion_date = Column(DateTime, nullable=False) - metadata_ingestion_version = Column(String, nullable=False) - filegroup_id = Column(ForeignKey("filegroups.filegroup_id"), nullable=False) - external_name = Column(String) - external_system = Column(ForeignKey("external_product_systems.name")) - - external_product_system = relationship("ExternalProductSystem") - filegroup = relationship("Filegroup") - science_product_type1 = relationship("ScienceProductType") - - execution_block = relationship("ExecutionBlock", uselist=False, back_populates="science_product") - project = relationship("Project", uselist=False, secondary="science_products_projects") - - @property - def locator(self): - return self.science_product_locator - - @property - def subdirectory(self): - if self.science_product_type == "Execution Block": - return self.execution_block.ngas_fileset_id - else: - return self.external_name - - def __repr__(self): - return f"<ScienceProduct#{self.science_product_locator} type={self.science_product_type}>" - - -class ScienceProductsProductGroup(Base): - __tablename__ = "science_products_product_groups" - - science_product_locator = Column( - ForeignKey("science_products.science_product_locator"), primary_key=True, nullable=False - ) - product_group_id = Column(ForeignKey("product_groups.product_group_id"), primary_key=True, nullable=False) - - product_group = relationship("ProductGroup") - science_product = relationship("ScienceProduct") - - -t_science_products_projects = Table( - "science_products_projects", - metadata, - Column( - "science_product_locator", - ForeignKey("science_products.science_product_locator"), - primary_key=True, - nullable=False, - ), - Column("project_code", ForeignKey("projects.project_code"), primary_key=True, nullable=False), -) - - -t_source_3c48 = Table( - "source_3c48", - metadata, - Column("project_code", String), - Column("execution_block_id", Integer), - Column("ost_scan_id", Integer), - Column("starttime", DateTime(True)), - Column("ngas_id", String), - Column("source", Text), - Column("receiver_band", Text), -) - - -t_subscan_data_descriptions = Table( - "subscan_data_descriptions", - metadata, - Column("subscan_id", ForeignKey("subscans.subscan_id"), primary_key=True, nullable=False), - Column( - "data_description_id", - ForeignKey("data_descriptions.data_description_id"), - primary_key=True, - nullable=False, - index=True, - ), -) - - -t_subscan_intents = Table( - "subscan_intents", - metadata, - Column("intent_name", ForeignKey("intents.intent_name"), primary_key=True, nullable=False), - Column( - "subscan_id", - ForeignKey("subscans.subscan_id", ondelete="CASCADE", onupdate="CASCADE"), - primary_key=True, - nullable=False, - ), -) - - -class Subscan(Base): - __tablename__ = "subscans" - - subscan_id = Column(Integer, primary_key=True, server_default=text("nextval('subscans_subscan_id_seq'::regclass)")) - scan_id = Column(ForeignKey("scans.scan_id", ondelete="CASCADE", onupdate="CASCADE"), nullable=False) - file_id = Column(ForeignKey("files.file_id", ondelete="CASCADE", onupdate="CASCADE"), index=True) - ost_subscan_id = Column(Integer) - obstype = Column(String, nullable=False) - starttime = Column(Float(53), nullable=False) - endtime = Column(Float(53), nullable=False) - sourcename = Column(String, nullable=False) - sourcetype = Column(String, nullable=False) - ra = Column(Float(53), nullable=False) - dec = Column(Float(53), nullable=False) - exposure_time = Column(Float(53), nullable=False) - integration_time = Column(Float(53), nullable=False) - receiver_id = Column(ForeignKey("receivers.receiver_id"), nullable=False) - backend = Column(String, nullable=False) - intent = Column(String) - configuration_id = Column( - ForeignKey("configurations.configuration_id", ondelete="CASCADE", onupdate="CASCADE"), - nullable=False, - index=True, - ) - - configuration = relationship("Configuration") - file = relationship("File") - receiver = relationship("Receiver") - scan = relationship("Scan") - data_descriptions = relationship("DataDescription", secondary="subscan_data_descriptions") - intents = relationship("Intent", secondary="subscan_intents") - - def __repr__(self): - return "<Subscan#{subscan_id} {obstype} start={starttime} end={endtime} ra={ra} dec={dec} backend={backend} intent={intent}>".format( - **self.__dict__ - ) - - -t_total_file_sizes = Table( - "total_file_sizes", - metadata, - Column("filegroup_id", Integer), - Column("parent_filegroup_id", Integer), - Column("filesize", Numeric), -) - - -class VlassCalibrationType(Base): - __tablename__ = "vlass_calibration_types" - - type = Column(String, primary_key=True) - description = Column(String) - - -t_vlass_calibrations = Table( - "vlass_calibrations", - metadata, - Column("calibration_id", ForeignKey("calibrations.calibration_id"), primary_key=True), - Column("type", ForeignKey("vlass_calibration_types.type")), -) - - -class VlassEpoch(Base): - __tablename__ = "vlass_epochs" - - epoch = Column(String, primary_key=True) - description = Column(String) - - execution_blocks = relationship("ExecutionBlock", secondary="vlass_execution_blocks") - - -class VlassExecutionBlockTile(Base): - __tablename__ = "vlass_execution_block_tiles" - - execution_block_id = Column( - ForeignKey("vlass_execution_blocks.execution_block_id"), primary_key=True, nullable=False - ) - tile = Column(String, primary_key=True, nullable=False) - - execution_block = relationship("VlassExecutionBlock") - - -class VlassExecutionBlock(Base): - __tablename__ = "vlass_execution_blocks" - - execution_block_id = Column(ForeignKey("execution_blocks.execution_block_id"), primary_key=True) - epoch = Column(ForeignKey("vlass_epochs.epoch")) - - execution_block = relationship("ExecutionBlock") - vlass_epoch = relationship("VlassEpoch") - - -class VlassImageType(Base): - __tablename__ = "vlass_image_types" - - type = Column(String, primary_key=True) - description = Column(String) - - -class VlbaReingestionQueue(Base): - __tablename__ = "vlba_reingestion_queue" - - filename = Column(String, primary_key=True) - observation_finished = Column(DateTime(True), nullable=False) - last_updated = Column(DateTime(True), nullable=False, server_default=text("now()")) - state = Column( - ForeignKey("reingestion_states.state"), nullable=False, server_default=text("'WAITING'::character varying") - ) - - reingestion_state = relationship("ReingestionState") - - -class ProblemSeverityList(Base): - __tablename__ = "problem_severity_list" - - severity = Column(Integer, primary_key=True) - description = Column(String) - - -class ProblemType(Base): - __tablename__ = "problem_types" - - problem_type_id = Column( - Integer, primary_key=True, server_default=text("nextval('problem_types_problem_type_id_seq'::regclass)") - ) - description = Column(String) - - -class ScienceProductComment(Base): - __tablename__ = "science_product_comments" - - comment_id = Column( - Integer, primary_key=True, server_default=text("nextval('science_product_comments_comment_id_seq'::regclass)") - ) - problem_type_id = Column(ForeignKey("problem_types.problem_type_id"), nullable=False) - science_product_locator = Column(ForeignKey("science_products.science_product_locator"), nullable=False) - severity = Column(ForeignKey("problem_severity_list.severity"), nullable=False) - comment = Column(String) - - problem_type = relationship("ProblemType") - science_product = relationship("ScienceProduct") - problem_severity_list = relationship("ProblemSeverityList") diff --git a/shared/schema/schema/ngasmodel.py b/shared/schema/schema/ngasmodel.py deleted file mode 100644 index 8918557294b6af7b2846079662a9c24f3e676744..0000000000000000000000000000000000000000 --- a/shared/schema/schema/ngasmodel.py +++ /dev/null @@ -1,67 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import Column, ForeignKey, Integer, String -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship - -Base = declarative_base() -metadata = Base.metadata - - -class NGASHost(Base): - __tablename__ = "ngas_hosts" - host_id = Column("host_id", String, primary_key=True) - domain = Column("domain", String) - port = Column("srv_port", Integer) - cluster_name = Column("cluster_name", String) - disks = relationship("NGASDisk", backref="host") - - @property - def server(self): - return f"{self.host_id}.{self.domain}" - - def __repr__(self): - return f"<NGASHost {self.host_id}.{self.domain}:{self.port}>" - - -class NGASDisk(Base): - __tablename__ = "ngas_disks" - disk_id = Column("disk_id", String, primary_key=True) - mounted = Column("mounted", Integer) - host_id = Column("host_id", ForeignKey("ngas_hosts.host_id")) - files = relationship("NGASFile", backref="disk") - - def __repr__(self): - return f"<NGASDisk#{self.disk_id} mounted={self.mounted}>" - - -class NGASFile(Base): - __tablename__ = "ngas_files" - file_id = Column("file_id", String, primary_key=True) - file_name = Column("file_name", String) - ingestion_date = Column("ingestion_date", String) - file_size = Column("file_size", Integer) - version = Column("file_version", Integer, primary_key=True) - disk_id = Column("disk_id", ForeignKey("ngas_disks.disk_id")) - checksum = Column("checksum", String) - checksum_plugin = Column("checksum_plugin", String) - format = Column("format", String) - - def __repr__(self): - return f"<NGASFile#{self.file_id} name={self.file_name} size={self.file_size} version={self.version}>" diff --git a/shared/schema/schema/optmodel.py b/shared/schema/schema/optmodel.py deleted file mode 100644 index a6575718cdc21a48e1b14f3afb1a8e2db27e1ca6..0000000000000000000000000000000000000000 --- a/shared/schema/schema/optmodel.py +++ /dev/null @@ -1,86 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - Boolean, - Column, - DateTime, - Float, - ForeignKey, - Index, - Integer, - String, - Text, - text, -) -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship - -Base = declarative_base() -metadata = Base.metadata - - -class Coauthor(Base): - __tablename__ = "coauthors" - __table_args__ = (Index("coauthors_idx_project_id_idx", "idx", "project_id"),) - - project_id = Column(ForeignKey("project.id"), primary_key=True, nullable=False, index=True) - projectauthor_id = Column(ForeignKey("projectauthor.id"), nullable=False, unique=True) - idx = Column(Integer, primary_key=True, nullable=False) - - project = relationship("Project") - projectauthor = relationship("Projectauthor", uselist=False) - - -class Project(Base): - __tablename__ = "project" - - id = Column(Integer, primary_key=True, server_default=text("nextval('project_id_seq'::regclass)")) - rowversion = Column(Integer, nullable=False) - projectcode = Column(String, nullable=False, unique=True) - title = Column(String) - proposalcode = Column(String, nullable=False) - createdon = Column(DateTime) - createdby = Column(Integer) - lastupdatedon = Column(DateTime) - lastupdatedby = Column(Integer) - comments = Column(Text) - projecttype = Column(String) - test = Column(Boolean, server_default=text("false")) - telescope = Column(String) - refereemedian = Column(Float(53)) - has_submitted_sb = Column(Boolean, nullable=False, server_default=text("false")) - is_complete = Column(Boolean, nullable=False, server_default=text("false")) - hoursallocated = Column(Float(53), nullable=False) - hoursusedsuccess = Column(Float(53), nullable=False) - hoursusedfailure = Column(Float(53), nullable=False) - pi = Column(ForeignKey("projectauthor.id"), index=True) - contactauthor = Column(ForeignKey("projectauthor.id"), index=True) - - projectauthor = relationship("Projectauthor", primaryjoin="Project.contactauthor == Projectauthor.id") - projectauthor1 = relationship("Projectauthor", primaryjoin="Project.pi == Projectauthor.id") - - -class Projectauthor(Base): - __tablename__ = "projectauthor" - - id = Column(Integer, primary_key=True, server_default=text("nextval('projectauthor_id_seq'::regclass)")) - rowversion = Column(Integer, nullable=False) - globalid = Column(Integer, nullable=False) - presentonproposal = Column(Boolean, nullable=False, server_default=text("false")) - receivesemail = Column(Boolean, nullable=False, server_default=text("true")) diff --git a/shared/schema/schema/pstmodel.py b/shared/schema/schema/pstmodel.py deleted file mode 100644 index 5a732ee45c452fcc620b671b9ece82d56295593c..0000000000000000000000000000000000000000 --- a/shared/schema/schema/pstmodel.py +++ /dev/null @@ -1,2197 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - BigInteger, - Column, - Date, - DateTime, - Float, - ForeignKey, - Index, - Integer, - SmallInteger, - String, - Table, - Text, - text, -) -from sqlalchemy.dialects.mysql.types import BIT, MEDIUMBLOB -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship - -Base = declarative_base() -metadata = Base.metadata - - -class AbstractBug(Base): - __tablename__ = "AbstractBug" - - bug_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - id = Column(Integer, nullable=False) - status = Column(String(255), nullable=False) - statusNumber = Column(Integer, nullable=False, index=True) - type = Column(String(255), nullable=False) - typeNumber = Column(Integer, nullable=False, index=True) - issueDate = Column(Date, index=True) - completeDate = Column(Date, index=True) - author = Column(String(255)) - location = Column(String(255)) - description = Column(String) - resolution = Column(String) - versionNumber = Column(String(255)) - osName = Column(String(255)) - email = Column(String) - - -class GBTVEGASSpectrometer(Base): - __tablename__ = "GBT_VEGAS_Spectrometer" - - id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - mode = Column(Integer, nullable=False) - bandwidth = Column(Float(asdecimal=True), nullable=False) - restFrequencies = Column(String(255), nullable=False) - spectralResolution = Column(Float(asdecimal=True), nullable=False) - integrationTime = Column(Float(asdecimal=True), nullable=False) - dataRate = Column(Float(asdecimal=True), nullable=False) - vegas_id = Column(ForeignKey("GBT_VEGAS_14A.Id", ondelete="CASCADE"), index=True) - - vegas = relationship("GBTVEGAS14A") - - -class GBTVegasPulsar(Base): - __tablename__ = "GBT_Vegas_Pulsar" - - Id = Column(BigInteger, primary_key=True) - COMMENTS = Column(String(512)) - BAND_WIDTH = Column(String(128)) - BAND_WIDTH_UNIT = Column(String(255)) - OBSERVING_MODE = Column(String(128)) - POLAR_CROSS_PROD = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - Dedispersion = Column(String(255)) - BITS = Column(String(255)) - - -class NormalizedScienceType(Base): - __tablename__ = "NormalizedScienceTypes" - - id = Column(Integer, primary_key=True) - cycle_id = Column(Integer, nullable=False) - science_type = Column(Text, nullable=False) - normalized = Column(Integer, nullable=False) - - -class RESOURCE(Base): - __tablename__ = "RESOURCES" - - resource_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - RESOURCE_GROUP = Column(Text) - RESOURCE_NAME = Column(Text) - PROPOSAL_ID = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - TELESCOPE = Column(String(255), nullable=False) - DISPLAY_POSITION = Column(Float(asdecimal=True), nullable=False) - - proposal = relationship("Proposal") - - -class GMVARESOURCE(RESOURCE): - __tablename__ = "GMVA_RESOURCE" - - Id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), primary_key=True, index=True) - FRONT_END = Column(String(255)) - BACK_END = Column(String(255)) - VLBA = Column(BIT(1), nullable=False) - EUROPEAN = Column(BIT(1), nullable=False) - BREWSTER = Column(BIT(1), nullable=False) - FORT_DAVIS = Column(BIT(1), nullable=False) - KITT_PEAK = Column(BIT(1), nullable=False) - LOS_ALAMOS = Column(BIT(1), nullable=False) - MAUNA_KEA = Column(BIT(1), nullable=False) - NORTH_LIBERTY = Column(BIT(1), nullable=False) - OWENS_VALLEY = Column(BIT(1), nullable=False) - PIE_TOWN = Column(BIT(1), nullable=False) - EFFELSBERG = Column(BIT(1), nullable=False) - PLATEAU_DE_BURE = Column(BIT(1), nullable=False) - PICO_VELETA = Column(BIT(1), nullable=False) - ONSALA = Column(BIT(1), nullable=False) - METSAHOVI = Column(BIT(1), nullable=False) - YEBES = Column(BIT(1), nullable=False) - OTHER_STATIONS = Column(String(255)) - FULL_POLAR = Column(BIT(1), nullable=False) - AVERAGING_TIME = Column(String(255)) - SPECTRAL_POINTS = Column(String(255)) - MULTI_CORR_PASS = Column(String(255)) - MARK4_CONVERSION = Column(BIT(1), nullable=False) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - SAMPLING_LEVEL = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - BITS = Column(String(255), nullable=False) - POLAR_CROSS_PROD = Column(String(255)) - AGG_BIT_RATE = Column(String(255)) - NO_OF_FIELDS = Column(Integer) - Wideband_Observing_System = Column(BIT(1), nullable=False) - Observing_System = Column(String(255), nullable=False) - GREEN_BANK = Column(BIT(1), nullable=False) - - -class GBTRESOURCE(RESOURCE): - __tablename__ = "GBT_RESOURCE" - - Id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), primary_key=True, index=True) - FRONT_END = Column(String(255)) - BACK_END = Column(String(255)) - RECEIVER_OTHER = Column(String(255)) - - -class GBTGuppi(GBTRESOURCE): - __tablename__ = "GBT_Guppi" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - BAND_WIDTH = Column(String(128)) - BAND_WIDTH_UNIT = Column(String(128)) - OBSERVING_MODE = Column(String(128)) - POLAR_CROSS_PROD = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - Dedispersion = Column(String(255)) - Bits = Column(String(255), server_default=text("'1'")) - - -class GBTBACKENDBREAKTHROUGHLISTEN(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_BREAKTHROUGH_LISTEN" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(String(512)) - - -class GBTBACKENDPROCESSORPULSAR(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_PROCESSOR_PULSAR" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - POLAR_CROSS_PROD = Column(String(255)) - PHASE_BINS = Column(String(255)) - - -class GBTZpectrometer(GBTRESOURCE): - __tablename__ = "GBT_Zpectrometer" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - PI_PRE_APPROVAL = Column(BIT(1)) - - -class GBTVEGAS14A(GBTRESOURCE): - __tablename__ = "GBT_VEGAS_14A" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - observing_type = Column(String(255)) - number_beams = Column(Integer) - - -class GBTBACKENDRADAR(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_RADAR" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - PI_PRE_APPROVAL = Column(BIT(1)) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - Bits = Column(String(255), server_default=text("'1'")) - - -class GBTSPECTROSPIGOT(GBTRESOURCE): - __tablename__ = "GBT_SPECTRO_SPIGOT" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - POLAR_CROSS_PRODUCT = Column(String(255)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - - -class GBTBACKENDCGSR2(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_CGSR2" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - PI_PRE_APPROVAL = Column(BIT(1)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - - -class GBTBACKENDPROCESSORLINE(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_PROCESSOR_LINE" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - POLAR_CROSS_PROD = Column(String(255)) - - -class GBTBACKENDGASP(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_GASP" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - PI_PRE_APPROVAL = Column(BIT(1)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - - -class GBTBACKENDBCPM(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_BCPM" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - - -class GBTSPECTOMETERLINE(GBTRESOURCE): - __tablename__ = "GBT_SPECTOMETER_LINE" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - SAMPLING_LEVEL = Column(String(255)) - BEAMS = Column(String(255)) - POLAR_CROSS_PRODUCT = Column(String(255)) - - -class GBTVEGA(GBTRESOURCE): - __tablename__ = "GBT_VEGAS" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - CROSS_POLARIZATION = Column(BIT(1)) - BEAMS = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - Resolution = Column(String(255)) - MinimumInterval = Column(String(255)) - - -class GBTBACKENDJPLRADAR(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_JPL_RADAR" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - PI_PRE_APPROVAL = Column(BIT(1)) - SPECTRAL_RESOLUTION = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - BITS = Column(String(255)) - - -class GBTBACKENDDIGITAL(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_DIGITAL" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - Bits = Column(String(255), server_default=text("'1'")) - - -class GBTMUSTANG(GBTRESOURCE): - __tablename__ = "GBT_MUSTANG" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - Array = Column(String(255)) - - -class GBTBACKENDOTHER(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_OTHER" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SPECIAL_BACKEND = Column(String(255)) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - BITS = Column(String(255), nullable=False) - COMMENTS = Column(Text) - - -class GBTBACKENDCALTECHCONTINUUM(GBTRESOURCE): - __tablename__ = "GBT_BACKEND_CALTECH_CONTINUUM" - - Id = Column(ForeignKey("GBT_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String(255)) - SKY_FREQUENCY_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(String(255)) - TIME_RESOLUTION_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - - -class VLBARESOURCE(RESOURCE): - __tablename__ = "VLBA_RESOURCE" - - Id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), primary_key=True, index=True) - FRONT_END = Column(String(255)) - BACK_END = Column(String(255)) - VLBA = Column(BIT(1), nullable=False) - HSA = Column(BIT(1), nullable=False) - BREWSTER = Column(BIT(1), nullable=False) - FORT_DAVIS = Column(BIT(1), nullable=False) - HANCOCK = Column(BIT(1), nullable=False) - KITT_PEAK = Column(BIT(1), nullable=False) - LOS_ALAMOS = Column(BIT(1), nullable=False) - MAUNA_KEA = Column(BIT(1), nullable=False) - NORTH_LIBERTY = Column(BIT(1), nullable=False) - OWENS_VALLEY = Column(BIT(1), nullable=False) - PIE_TOWN = Column(BIT(1), nullable=False) - ST_CROIX = Column(BIT(1), nullable=False) - GBT = Column(BIT(1), nullable=False, index=True) - ARECIBO = Column(BIT(1), nullable=False) - EFFELSBERG = Column(BIT(1), nullable=False) - VLA_Y1 = Column(BIT(1), nullable=False, index=True) - VLA_Y27 = Column(BIT(1), nullable=False, index=True) - GEODETIC = Column(String(255)) - FULL_POLAR = Column(BIT(1), nullable=False) - PULSAR_GATE = Column(BIT(1), nullable=False) - MULTIPLE_FIELDS = Column(String(255)) - AVERAGING_TIME = Column(String(255)) - SPECTRAL_POINTS = Column(String(255)) - MULTI_CORR_PASS = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - SAMPLING_LEVEL = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - BITS = Column(String(255), nullable=False) - POLAR_CROSS_PROD = Column(String(255)) - AGG_BIT_RATE = Column(String(255)) - NO_OF_FIELDS = Column(Integer, server_default=text("'0'")) - Wideband_Observing_System = Column(BIT(1), nullable=False) - Observing_Mode = Column(String(255), server_default=text("'Standard'")) - RSROComments = Column(String) - Observing_System = Column(String(255), server_default=text("'Legacy System'")) - MARK4_CONVERSION = Column(BIT(1)) - shared_risk = Column(BIT(1), nullable=False) - - -class VLARESOURCE(RESOURCE): - __tablename__ = "VLA_RESOURCE" - - Id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), primary_key=True, index=True) - FRONT_END = Column(String(255)) - BACK_END = Column(String(255)) - CONFIGURATION = Column(String(255)) - - -class VLABACKENDGENERAL13A(VLARESOURCE): - __tablename__ = "VLA_BACKEND_GENERAL13A" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - OBSERVING_CHOICE = Column(String(255), nullable=False) - FILE_CONTENTS = Column(MEDIUMBLOB) - REST_FREQUENCIES = Column(String) - - -class VLABACKENDSRO13A(VLARESOURCE): - __tablename__ = "VLA_BACKEND_SRO13A" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SRO_CATALOG_ID = Column(String(255), nullable=False) - SRO_RESOURCE_NAME = Column(String(255), nullable=False) - SRO_RESOURCE_ID = Column(String(255), nullable=False) - - -class VLABACKENDOSRODUAL(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSRODUAL" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDSINGLE(VLARESOURCE): - __tablename__ = "VLA_BACKEND_SINGLE" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - SKY_FREQUENCY = Column(Text) - SKY_UNIT = Column(String(255)) - REST_FREQUENCY_TYPE = Column(String(255)) - - -class VLABACKENDECSO(VLARESOURCE): - __tablename__ = "VLA_BACKEND_ECSO" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - - -class VLABACKENDOSRO2(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSRO2" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(Text) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDOSROFULL(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSROFULL" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDHIGH(VLARESOURCE): - __tablename__ = "VLA_BACKEND_HIGH" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SPECTRAL_RESOL = Column(Text) - SPECTRAL_RESOL_UNIT = Column(String(255)) - TIME_RESOLUTION = Column(Text) - TIME_RESOLUTION_UNIT = Column(String(255)) - - -class VLABACKENDOSROSINGLE(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSROSINGLE" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(String) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDOSRO1(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OSRO1" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(Text) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - Polarization = Column(String(255)) - CHANNEL_COUNT = Column(Integer) - CHANNEL_WIDTH = Column(String(255)) - CHANNEL_WIDTH_UNIT = Column(String(255)) - - -class VLABACKENDRSRO13A(VLARESOURCE): - __tablename__ = "VLA_BACKEND_RSRO13A" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - DESCRIPTION = Column(String(255), nullable=False) - - -class VLABACKENDMULTI(VLARESOURCE): - __tablename__ = "VLA_BACKEND_MULTI" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SKY_FREQUENCY = Column(Text) - REST_FREQUENCY_TYPE = Column(String(255)) - SKY_UNIT = Column(String(255)) - BAND_WIDTH = Column(String(255)) - BAND_WIDTH_UNIT = Column(String(255)) - HANNING_SMOOTH = Column(String(255)) - SPECTRAL_RESOL = Column(String(255)) - SPECTRAL_RESOL_UNIT = Column(String(255)) - IF_MODE = Column(SmallInteger) - CHANNEL_COUNT = Column(Integer) - - -class VLABACKENDRSRO(VLARESOURCE): - __tablename__ = "VLA_BACKEND_RSRO" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - COMMENTS = Column(Text) - - -class VLABACKENDSTAFF13A(VLARESOURCE): - __tablename__ = "VLA_BACKEND_STAFF13A" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - DESCRIPTION = Column(String(255), nullable=False) - - -class VLABACKENDOTHER(VLARESOURCE): - __tablename__ = "VLA_BACKEND_OTHER" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - SPECIAL_BACK_END = Column(String(255)) - - -class VLABACKENDWIDEBAND(VLARESOURCE): - __tablename__ = "VLA_BACKEND_WIDEBAND" - - Id = Column(ForeignKey("VLA_RESOURCE.Id", ondelete="CASCADE"), primary_key=True, index=True) - BASEBAND_CENTERS = Column(String(255), nullable=False) - POLARIZATION_PRODUCTS = Column(String(255), nullable=False) - DUMP_TIME = Column(String(255), nullable=False) - DATA_RATE = Column(String(255), nullable=False) - BASEBANDS = Column(String(255), nullable=False) - SHARED_RISK = Column(BIT(1), nullable=False) - DATA_RATE_JUSTIFICATION = Column(String(255)) - - -class TechJustification(Base): - __tablename__ = "TechJustification" - - id = Column(Integer, primary_key=True) - proposal_id = Column(Integer, nullable=False, unique=True) - arrayconfig = Column(Text) - daynight = Column(Text) - receivers = Column(Text) - correlator = Column(Text) - sensitivity = Column(Text) - integrationTime = Column(Text) - dumpTime = Column(Text) - imaging = Column(Text) - rfi = Column(Text) - stations = Column(Text) - weather = Column(Text) - dates = Column(Text) - minlength = Column(Text) - phaseref = Column(Text) - polarization = Column(Text) - hsa = Column(Text) - resource = Column(Text) - mapping = Column(Text) - overhead = Column(Text) - novel = Column(Text) - pulsar = Column(Text) - other = Column(Text) - mosaic = Column(Text) - bitrate = Column(Text) - joint = Column(Text) - total_correlator_output_data_size = Column(Text) - - -class TechJustificationFile(Base): - __tablename__ = "TechJustificationFile" - - id = Column(Integer, primary_key=True) - techjust_id = Column(Integer, nullable=False) - filename = Column(Text, nullable=False) - filetype = Column(Text, nullable=False) - filesize = Column(Integer, nullable=False) - file = Column(MEDIUMBLOB) - - -class ValidConfiguration(Base): - __tablename__ = "ValidConfigurations" - - id = Column(Integer, primary_key=True) - cycle_id = Column(Integer, nullable=False) - configuration = Column(Text, nullable=False) - - -class Addres(Base): - __tablename__ = "address" - - address_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - defaultAddress = Column(BIT(1)) - addressDescription = Column(String(255)) - street1 = Column(String(255)) - street2 = Column(String(255)) - street3 = Column(String(255)) - street4 = Column(String(255)) - city = Column(String(255)) - postalCode = Column(String(255)) - region = Column(String(255)) - addressState_id = Column(ForeignKey("addressState.addressState_id"), index=True) - addressCountry_id = Column(ForeignKey("addressCountry.addressCountry_id"), index=True) - person_id = Column(ForeignKey("person.person_id"), index=True) - organization_id = Column(ForeignKey("organization.organization_id"), index=True) - updatedOn = Column(DateTime) - updatedBy = Column(Integer) - - addressCountry = relationship("AddressCountry") - addressState = relationship("AddressState") - organization = relationship("Organization") - person = relationship("Person") - - -class AddressCountry(Base): - __tablename__ = "addressCountry" - - addressCountry_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - addressCountry = Column(String(255), nullable=False) - alpha_2 = Column(String(2)) - alpha_3 = Column(String(3)) - idd_isd = Column(String(25)) - status = Column(String(25)) - - -t_addressCountry_bck = Table( - "addressCountry_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class AddressState(Base): - __tablename__ = "addressState" - - addressState_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - stateName = Column(String(255), nullable=False) - state = Column(String(255)) - - -t_addressState_bck = Table( - "addressState_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class AddressType(Base): - __tablename__ = "addressType" - - addressType_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - addressType = Column(String(255), nullable=False) - - addresss = relationship("Addres", secondary="address_addressType") - - -t_addressType_bck = Table( - "addressType_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_address_addressType = Table( - "address_addressType", - metadata, - Column("address_id", ForeignKey("address.address_id"), primary_key=True, nullable=False, index=True), - Column("addressType_id", ForeignKey("addressType.addressType_id"), primary_key=True, nullable=False, index=True), -) - - -t_address_bck = Table( - "address_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class Author(Base): - __tablename__ = "author" - - author_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - AFFILIATION = Column(String(255)) - DOMESTIC = Column(BIT(1)) - NEW_USER = Column(BIT(1)) - EMAIL = Column(String(255), nullable=False) - ADDRESS = Column(String(255)) - FIRST_NAME = Column(String(255)) - LAST_NAME = Column(String(255)) - PROFESSIONAL_STATUS = Column(String(255)) - THESIS_OBSERVING = Column(BIT(1), nullable=False) - GRADUATION_YEAR = Column(String(255)) - TELEPHONE = Column(String(255)) - OLDAUTHOR_ID = Column(String(255), nullable=False) - DISPLAY_POSITION = Column(Integer, nullable=False) - STORAGE_ORDER = Column(Integer, nullable=False) - OTHER_AWARDS = Column(Text) - SUPPORT_REQUESTER = Column(BIT(1), nullable=False) - SUPPORTED = Column(BIT(1), nullable=False) - BUDGET = Column(Float(asdecimal=True)) - ASSIGNMENT = Column(Text) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - user_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), index=True) - dissertationPlan_id = Column(ForeignKey("dissertationPlan.dissertationPlan_id"), index=True) - person_id = Column(BigInteger, nullable=False) - country_id = Column(ForeignKey("addressCountry.addressCountry_id"), index=True) - state_id = Column(ForeignKey("addressState.addressState_id"), index=True) - organization_id = Column(ForeignKey("organization.organization_id"), index=True) - - country = relationship("AddressCountry") - dissertationPlan = relationship("DissertationPlan") - organization = relationship("Organization") - proposal = relationship("Proposal", primaryjoin="Author.proposal_id == Proposal.proposal_id", lazy="subquery") - state = relationship("AddressState") - user = relationship("UserAuthentication", lazy="subquery") - - -t_author_bck = Table( - "author_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class Bug(Base): - __tablename__ = "bug" - - bug_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - id = Column(Integer, nullable=False) - status = Column(String(255), nullable=False) - statusNumber = Column(Integer, nullable=False, index=True) - type = Column(String(255), nullable=False) - typeNumber = Column(Integer, nullable=False, index=True) - issueDate = Column(Date, index=True) - completeDate = Column(Date, index=True) - author = Column(String(255)) - location = Column(String(255)) - description = Column(Text) - resolution = Column(Text) - versionNumber = Column(String(255)) - osName = Column(String(255)) - email = Column(String(255)) - - -class CasaRegionSetup(Base): - __tablename__ = "casaRegionSetup" - - regionSetup_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - region = Column(String(128), nullable=False, index=True) - userName = Column(String(128), nullable=False, index=True) - firstName = Column(String(128), nullable=False) - lastName = Column(String(128), nullable=False) - email = Column(Text, nullable=False) - user_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), index=True) - - user = relationship("UserAuthentication") - - -class CasaUserSetup(Base): - __tablename__ = "casaUserSetup" - - userSetup_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - role_id = Column(ForeignKey("role.role_id"), nullable=False, index=True) - user_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), nullable=False, index=True) - region_id = Column(ForeignKey("casaRegionSetup.regionSetup_id"), nullable=False, index=True) - region = Column(String(128), nullable=False, index=True) - userName = Column(String(128), nullable=False, index=True) - firstName = Column(String(128), nullable=False) - lastName = Column(String(128), nullable=False) - email = Column(Text, nullable=False) - - region1 = relationship("CasaRegionSetup") - role = relationship("Role") - user = relationship("UserAuthentication") - - -class CasaBug(Base): - __tablename__ = "casa_bug" - - bug_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - id = Column(Integer, nullable=False) - status = Column(String(255), nullable=False) - statusNumber = Column(Integer, nullable=False, index=True) - type = Column(String(255), nullable=False) - typeNumber = Column(Integer, nullable=False, index=True) - issueDate = Column(Date, index=True) - completeDate = Column(Date, index=True) - author = Column(String(255)) - location = Column(String(255)) - description = Column(Text) - resolution = Column(Text) - versionNumber = Column(String(255)) - osName = Column(String(255)) - email = Column(String(255)) - region_id = Column(ForeignKey("casaRegionSetup.regionSetup_id"), index=True) - regionName = Column(String(255)) - uss_id = Column(ForeignKey("casaUserSetup.userSetup_id"), index=True) - username = Column(String(255)) - - region = relationship("CasaRegionSetup") - uss = relationship("CasaUserSetup") - - -class Casalog(Base): - __tablename__ = "casalog" - - casalog_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - date = Column(DateTime, nullable=False, index=True) - pagename = Column(String(50), nullable=False) - module = Column(String(20), nullable=False) - action = Column(String(24)) - ipaddress = Column(String(128)) - username = Column(String(255), nullable=False, index=True) - - -class DissertationPlan(Base): - __tablename__ = "dissertationPlan" - - dissertationPlan_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - FILE_NAME = Column(String(255), nullable=False) - FILE_ID = Column(String(255), nullable=False) - BYTE_SIZE = Column(Integer) - PAGE_COUNT = Column(Integer) - LAST_DATE = Column(DateTime) - CONTENT_TYPE = Column(String(255), nullable=False) - FILE_TYPE = Column(String(255)) - FILE_CONTENTS = Column(MEDIUMBLOB) - PERSON_ID = Column(ForeignKey("person.person_id"), unique=True) - USER_ID = Column(ForeignKey("userAuthentication.userAuthentication_id"), unique=True) - - person = relationship("Person") - userAuthentication = relationship("UserAuthentication") - - -class Email(Base): - __tablename__ = "email" - - email_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - emailType = Column(String(255)) - email = Column(String(255), nullable=False) - defaultEmail = Column(BIT(1), nullable=False) - person_id = Column(ForeignKey("person.person_id"), index=True) - organization_id = Column(ForeignKey("organization.organization_id"), index=True) - - organization = relationship("Organization") - person = relationship("Person") - - -t_email_bck = Table( - "email_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class EntryStatu(Base): - __tablename__ = "entryStatus" - - entryStatus_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - entryStatus = Column(String(255), nullable=False) - - -t_entryStatus_bck = Table( - "entryStatus_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_fix_15A_codes = Table( - "fix_15A_codes", - metadata, - Column("proposal_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("prop_id", String(255), nullable=False), - Column("new_id", String(320), nullable=False, server_default=text("''")), - Column("pi_name", String(511)), - Column("email", String(255), nullable=False), - Column("deadline_date", DateTime), -) - - -class JustificationFile(Base): - __tablename__ = "justificationFile" - - justificationFile_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - JUSTIFICATION_FILE_NAME = Column(String(255), nullable=False) - JUSTIFICATION_FILE_ID = Column(String(255), nullable=False) - JUSTIFICATION_BYTE_SIZE = Column(Integer) - JUSTIFICATION_PAGE_COUNT = Column(Integer) - JUST_STORAGE_DATE = Column(DateTime) - CONTENT_TYPE = Column(String(255), nullable=False) - JUSTIFICATION_FILE_TYPE = Column(String(255)) - FILE_CONTENTS = Column(MEDIUMBLOB) - - -t_justification_bck = Table( - "justification_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class ObservingType(Base): - __tablename__ = "observingType" - - observingType_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - proposal_id = Column(ForeignKey("proposal.proposal_id"), index=True) - display_position = Column(Integer) - observingType = Column(String(255), nullable=False) - - proposal = relationship("Proposal") - - -t_observingType_bck = Table( - "observingType_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class Organization(Base): - __tablename__ = "organization" - - organization_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - formalName = Column(String(255), nullable=False) - shortName = Column(String(255)) - mailingName = Column(String(255)) - departmentName = Column(String(255)) - url = Column(String(255)) - contactPerson1 = Column(String(255)) - contactPerson2 = Column(String(255)) - parentId = Column(Integer) - updatedOn = Column(DateTime) - updatedBy = Column(Integer) - entryStatus = Column(ForeignKey("entryStatus.entryStatus_id"), index=True) - - entryStatu = relationship("EntryStatu") - persons = relationship("Person", secondary="person_organization") - - -class OrganizationType(Base): - __tablename__ = "organizationType" - - organizationType_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - organizationType = Column(String(255), nullable=False) - - organizations = relationship("Organization", secondary="organization_organizationType") - - -t_organizationType_bck = Table( - "organizationType_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_organization_bck = Table( - "organization_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_organization_organizationType = Table( - "organization_organizationType", - metadata, - Column("organization_id", ForeignKey("organization.organization_id"), primary_key=True, nullable=False, index=True), - Column( - "organizationType_id", - ForeignKey("organizationType.organizationType_id"), - primary_key=True, - nullable=False, - index=True, - ), -) - - -class Pagelog(Base): - __tablename__ = "pagelog" - - pagelog_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - date = Column(DateTime, nullable=False, index=True) - pagename = Column(String(50), nullable=False) - module = Column(String(20), nullable=False) - action = Column(String(255)) - recordable = Column(BIT(1)) - username = Column(String(255), nullable=False, index=True) - sessionid = Column(Text) - proposalid = Column(String(128)) - ipAddress = Column(String(255)) - - -class Permissionset(Base): - __tablename__ = "permissionset" - - permissionset_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - home_view = Column(BIT(1), nullable=False) - home_full = Column(BIT(1), nullable=False) - proposalModule_view = Column(BIT(1), nullable=False) - proposalModule_full = Column(BIT(1), nullable=False) - myproposals_view = Column(BIT(1), nullable=False) - myproposals_full = Column(BIT(1), nullable=False) - proposalList_view = Column(BIT(1), nullable=False) - proposalList_full = Column(BIT(1), nullable=False) - settingsModule_view = Column(BIT(1), nullable=False) - settingsModule_full = Column(BIT(1), nullable=False) - myprofile_view = Column(BIT(1), nullable=False) - myprofile_full = Column(BIT(1), nullable=False) - roleList_view = Column(BIT(1), nullable=False) - roleList_full = Column(BIT(1), nullable=False) - profileList_view = Column(BIT(1), nullable=False) - profileList_full = Column(BIT(1), nullable=False) - organizationList_view = Column(BIT(1), nullable=False) - organizationList_full = Column(BIT(1), nullable=False) - bug_view = Column(BIT(1), nullable=False) - bug_full = Column(BIT(1), nullable=False) - analyticsModule_view = Column(BIT(1), nullable=False) - analyticsModule_full = Column(BIT(1), nullable=False) - a_proposal_view = Column(BIT(1), nullable=False) - a_proposal_full = Column(BIT(1), nullable=False) - a_casa_view = Column(BIT(1), nullable=False) - a_casa_full = Column(BIT(1), nullable=False) - casaModule_view = Column(BIT(1), nullable=False) - casaModule_full = Column(BIT(1), nullable=False) - casaHome_view = Column(BIT(1), nullable=False) - casaHome_full = Column(BIT(1), nullable=False) - casa_bugs_view = Column(BIT(1), nullable=False) - casa_bugs_full = Column(BIT(1), nullable=False) - casa_setup_view = Column(BIT(1), nullable=False) - casa_setup_full = Column(BIT(1), nullable=False) - pscAccess = Column(BIT(1), nullable=False) - reviewCategory_view = Column(BIT(1), nullable=False) - reviewCategory_full = Column(BIT(1), nullable=False) - available_authors_view = Column(BIT(1), nullable=False) - available_authors_full = Column(BIT(1), nullable=False) - available_organizations_view = Column(BIT(1), nullable=False) - available_organizations_full = Column(BIT(1), nullable=False) - profilesModule_view = Column(BIT(1), nullable=False) - profilesModule_full = Column(BIT(1), nullable=False) - adminModule_view = Column(BIT(1), nullable=False) - adminModule_full = Column(BIT(1), nullable=False) - groupList_view = Column(BIT(1), nullable=False) - groupList_full = Column(BIT(1), nullable=False) - reviewsModule_view = Column(BIT(1), nullable=False) - reviewsModule_full = Column(BIT(1), nullable=False) - myreviews_view = Column(BIT(1), nullable=False) - myreviews_full = Column(BIT(1), nullable=False) - refereeSetup_view = Column(BIT(1), nullable=False) - refereeSetup_full = Column(BIT(1), nullable=False) - mergeAccounts = Column(BIT(1), nullable=False) - editRefereeComments = Column(BIT(1), nullable=False) - observationsModule_view = Column(BIT(1), nullable=False) - observationsModule_full = Column(BIT(1), nullable=False) - helpdeskModule_view = Column(BIT(1), nullable=False) - helpdeskModule_full = Column(BIT(1), nullable=False) - reviewCycles_view = Column(BIT(1), nullable=False) - reviewCycles_full = Column(BIT(1), nullable=False) - tech_review_panel_view = Column(BIT(1), nullable=False) - tech_review_panel_full = Column(BIT(1), nullable=False) - scientific_review_panel_view = Column(BIT(1), nullable=False) - scientific_review_panel_full = Column(BIT(1), nullable=False) - reviewsSetup_view = Column(BIT(1), nullable=False) - reviewsSetup_full = Column(BIT(1), nullable=False) - technical_review_categorySetup_view = Column(BIT(1), nullable=False) - technical_review_categorySetup_full = Column(BIT(1), nullable=False) - scientific_review_categorySetup_view = Column(BIT(1), nullable=False) - scientific_review_categorySetup_full = Column(BIT(1), nullable=False) - technical_refereeSetup_view = Column(BIT(1), nullable=False) - technical_refereeSetup_full = Column(BIT(1), nullable=False) - scientific_refereeSetup_view = Column(BIT(1), nullable=False) - scientific_refereeSetup_full = Column(BIT(1), nullable=False) - reviews_summary_view = Column(BIT(1), nullable=False) - reviews_summary_full = Column(BIT(1), nullable=False) - panel_reviews_view = Column(BIT(1), nullable=False) - panel_reviews_full = Column(BIT(1), nullable=False) - tac_reviews_view = Column(BIT(1), nullable=False) - tac_reviews_full = Column(BIT(1), nullable=False) - tac_members_view = Column(BIT(1), nullable=False) - tac_members_full = Column(BIT(1), nullable=False) - tac_panel_view = Column(BIT(1), nullable=False) - tac_panel_full = Column(BIT(1), nullable=False) - dataProcessingModule_view = Column(BIT(1), nullable=False) - dataProcessingModule_full = Column(BIT(1), nullable=False) - - -t_permissionset_bck = Table( - "permissionset_bck", - metadata, - Column("permissionset_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("objectversion", Integer, nullable=False, server_default=text("'0'")), - Column("home_view", BIT(1), nullable=False), - Column("home_full", BIT(1), nullable=False), - Column("proposalModule_view", BIT(1), nullable=False), - Column("proposalModule_full", BIT(1), nullable=False), - Column("myproposals_view", BIT(1), nullable=False), - Column("myproposals_full", BIT(1), nullable=False), - Column("proposalList_view", BIT(1), nullable=False), - Column("proposalList_full", BIT(1), nullable=False), - Column("settingsModule_view", BIT(1), nullable=False), - Column("settingsModule_full", BIT(1), nullable=False), - Column("myprofile_view", BIT(1), nullable=False), - Column("myprofile_full", BIT(1), nullable=False), - Column("roleList_view", BIT(1), nullable=False), - Column("roleList_full", BIT(1), nullable=False), - Column("profileList_view", BIT(1), nullable=False), - Column("profileList_full", BIT(1), nullable=False), - Column("organizationList_view", BIT(1), nullable=False), - Column("organizationList_full", BIT(1), nullable=False), - Column("bug_view", BIT(1), nullable=False), - Column("bug_full", BIT(1), nullable=False), - Column("analyticsModule_view", BIT(1), nullable=False), - Column("analyticsModule_full", BIT(1), nullable=False), - Column("a_summary_view", BIT(1), nullable=False), - Column("a_summary_full", BIT(1), nullable=False), -) - - -class Person(Base): - __tablename__ = "person" - __table_args__ = (Index("person_i2", "firstName", "lastName"),) - - person_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - prefix = Column(ForeignKey("personPrefix.personPrefix_id"), index=True) - firstName = Column(String(255)) - middleName = Column(String(255)) - lastName = Column(String(255)) - preferredName = Column(String(255)) - suffix = Column(ForeignKey("personSuffix.personSuffix_id"), index=True) - aipsNumber = Column(SmallInteger) - gender = Column(String(255)) - url = Column(String(255)) - unknownAffiliationName = Column(String(255)) - unknownAffiliationCountry = Column(ForeignKey("addressCountry.addressCountry_id"), index=True) - personContactLevel_id = Column(ForeignKey("personContactLevel.personContactLevel_id"), index=True) - entryStatus = Column(ForeignKey("entryStatus.entryStatus_id"), index=True) - defaultOrganization_id = Column(ForeignKey("organization.organization_id"), index=True) - personAuthentication_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), index=True) - personSpouse_id = Column(ForeignKey("personSpouse.personSpouse_id"), index=True) - outOfDateReporterId = Column(Integer) - updatedOn = Column(DateTime) - updatedBy = Column(Integer) - graduationYear = Column(SmallInteger) - timezone = Column(String(255)) - lastLogin = Column(DateTime) - lastObservation = Column(DateTime) - incomplete = Column(BIT(1)) - affiliation = Column(Text) - enabled = Column(BIT(1), nullable=False, index=True) - gender_for_metrics = Column(String(255)) - - defaultOrganization = relationship("Organization") - entryStatu = relationship("EntryStatu") - personAuthentication = relationship("UserAuthentication") - personContactLevel = relationship("PersonContactLevel") - personSpouse = relationship("PersonSpouse") - personPrefix = relationship("PersonPrefix") - personSuffix = relationship("PersonSuffix") - addressCountry = relationship("AddressCountry") - reviewCategorys = relationship("ReviewCategory", secondary="person_reviewCategory") - - -class PersonContactLevel(Base): - __tablename__ = "personContactLevel" - - personContactLevel_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personContactLevel = Column(String(255), nullable=False) - - -t_personContactLevel_bck = Table( - "personContactLevel_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class PersonGroup(Base): - __tablename__ = "personGroup" - - personGroup_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personGroupType = Column(SmallInteger, nullable=False) - personGroupName = Column(String(255), nullable=False) - personGroupDescription = Column(String(255), nullable=False) - - persons = relationship("Person", secondary="person_personGroup") - - -t_personGroup_bck = Table( - "personGroup_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class PersonNote(Base): - __tablename__ = "personNote" - - userNote_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personNoteText = Column(String(255), nullable=False) - updatedOn = Column(DateTime) - updatedBy = Column(Integer) - person_id = Column(ForeignKey("person.person_id"), index=True) - - person = relationship("Person") - - -t_personNote_bck = Table( - "personNote_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class PersonPrefix(Base): - __tablename__ = "personPrefix" - - personPrefix_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personPrefix = Column(String(255), nullable=False, unique=True) - - -t_personPrefix_bck = Table( - "personPrefix_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class PersonSpouse(Base): - __tablename__ = "personSpouse" - - personSpouse_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - prefix = Column(ForeignKey("personPrefix.personPrefix_id"), index=True) - firstName = Column(String(255)) - middleName = Column(String(255)) - lastName = Column(String(255)) - preferredName = Column(String(255)) - suffix = Column(ForeignKey("personSuffix.personSuffix_id"), index=True) - gender = Column(String(1)) - - personPrefix = relationship("PersonPrefix") - personSuffix = relationship("PersonSuffix") - - -class PersonSuffix(Base): - __tablename__ = "personSuffix" - - personSuffix_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personSuffix = Column(String(255), nullable=False, unique=True) - - -t_personSuffix_bck = Table( - "personSuffix_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class PersonType(Base): - __tablename__ = "personType" - - personType_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - personType = Column(String(255), nullable=False) - educationType = Column(BIT(1), nullable=False) - - persons = relationship("Person", secondary="person_personType") - - -t_personType_bck = Table( - "personType_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -t_person_bck = Table( - "person_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -t_person_organization = Table( - "person_organization", - metadata, - Column("organization_id", ForeignKey("organization.organization_id"), primary_key=True, nullable=False, index=True), - Column("person_id", ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True), -) - - -t_person_personGroup = Table( - "person_personGroup", - metadata, - Column("person_id", ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True), - Column( - "personGroup_id", - ForeignKey("personGroup.personGroup_id", ondelete="CASCADE"), - primary_key=True, - nullable=False, - index=True, - ), -) - - -t_person_personType = Table( - "person_personType", - metadata, - Column("person_id", ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True), - Column("personType_id", ForeignKey("personType.personType_id"), primary_key=True, nullable=False, index=True), -) - - -t_person_reviewCategory = Table( - "person_reviewCategory", - metadata, - Column("person_id", ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True), - Column( - "reviewCategory_id", - ForeignKey("reviewCategory.reviewCategory_id"), - primary_key=True, - nullable=False, - index=True, - ), -) - - -class Phone(Base): - __tablename__ = "phone" - - phone_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - phoneType = Column(String(255)) - phone = Column(String(255), nullable=False) - defaultPhone = Column(BIT(1), nullable=False) - fax = Column(BIT(1), nullable=False) - person_id = Column(ForeignKey("person.person_id"), index=True) - organization_id = Column(ForeignKey("organization.organization_id"), index=True) - - organization = relationship("Organization") - person = relationship("Person") - - -t_phone_bck = Table( - "phone_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class Proposal(Base): - __tablename__ = "proposal" - - proposal_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - ABSTRACT = Column(Text) - CREATED_DATE = Column(DateTime, nullable=False) - PROP_ID = Column(String(255), nullable=False, unique=True) - LEGACY_ID = Column(String(255, "latin1_general_cs")) - PRESENT = Column(String(255)) - PROPOSAL_TYPE = Column(String(255)) - JOINT_PROPOSAL_TYPE = Column(String(255)) - RAPID_RESPONSE_TYPE = Column(String(255)) - STAFF_SUPPORT = Column(String(255)) - STATUS = Column(String(255)) - PLAN_SUBMITTED = Column(String(255)) - MODIFIED_DATE = Column(DateTime, nullable=False) - SUBMITTED_DATE = Column(DateTime) - DEADLINE_DATE = Column(DateTime) - TITLE = Column(Text) - PROCESSED = Column(BIT(1), nullable=False) - RELATED_PROPOSALS = Column(Text) - PREV_PROP_IDS = Column(Text) - LOCK_USER_ID = Column(String(255)) - LOCK_MILLIS = Column(BigInteger) - LOCK_USER_INFO = Column(String(255)) - OBSERVING_TYPE_OTHER = Column(String(255)) - OLD_CONTACT = Column(String(255)) - OLD_PI = Column(String(255)) - OLD_EDITOR = Column(String(255)) - justificationFile_id = Column(ForeignKey("justificationFile.justificationFile_id"), index=True) - editor_id = Column(ForeignKey("author.author_id"), index=True) - contact_id = Column(ForeignKey("author.author_id"), index=True) - principal_investigator_id = Column(ForeignKey("author.author_id"), index=True) - comments = Column(Text) - category1_id = Column(ForeignKey("reviewCategory.reviewCategory_id"), index=True) - category2_id = Column(ForeignKey("reviewCategory.reviewCategory_id"), index=True) - TELESCOPE = Column(String(255), nullable=False) - category3_id = Column(ForeignKey("reviewCategory.reviewCategory_id"), index=True) - displayTechnicalReviews = Column(BIT(1)) - reviewersConflict = Column(BIT(1)) - technicalCategory_id = Column(ForeignKey("technical_review_category.tech_reviewCategory_id"), index=True) - scienceCategory = Column(String(255)) - public = Column(BIT(1), nullable=False) - allocated_hours = Column(Float(asdecimal=True), server_default=text("'0'")) - disposition_letter = Column(MEDIUMBLOB) - trigger_criteria = Column(String) - techJustification_id = Column(Integer) - uses_GBT = Column(BIT(1), nullable=False) - uses_VLA = Column(BIT(1), nullable=False) - allocated_hours_a = Column(Float(asdecimal=True), server_default=text("'0'")) - allocated_hours_b = Column(Float(asdecimal=True), server_default=text("'0'")) - allocated_hours_c = Column(Float(asdecimal=True), server_default=text("'0'")) - sponsor = Column(String(255)) - hst_orbits_requested = Column(String(255)) - external = Column(BIT(1), nullable=False) - total_time = Column(Float(asdecimal=True), server_default=text("'0'")) - external_proposal_id = Column(String(255)) - swift_ksecs = Column(String(255)) - chandra_ksecs = Column(String(255)) - - category1 = relationship("ReviewCategory", primaryjoin="Proposal.category1_id == ReviewCategory.reviewCategory_id") - category2 = relationship("ReviewCategory", primaryjoin="Proposal.category2_id == ReviewCategory.reviewCategory_id") - category3 = relationship("ReviewCategory", primaryjoin="Proposal.category3_id == ReviewCategory.reviewCategory_id") - contact = relationship("Author", primaryjoin="Proposal.contact_id == Author.author_id") - editor = relationship("Author", primaryjoin="Proposal.editor_id == Author.author_id") - justificationFile = relationship("JustificationFile") - principal_investigator = relationship( - "Author", primaryjoin="Proposal.principal_investigator_id == Author.author_id" - ) - technicalCategory = relationship("TechnicalReviewCategory") - - -t_proposal_15A_bck = Table( - "proposal_15A_bck", - metadata, - Column("proposal_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("objectversion", Integer, nullable=False), - Column("ABSTRACT", Text), - Column("CREATED_DATE", DateTime, nullable=False), - Column("PROP_ID", String(255), nullable=False), - Column("LEGACY_ID", String(255, "latin1_general_cs")), - Column("PRESENT", String(255)), - Column("PROPOSAL_TYPE", String(255)), - Column("JOINT_PROPOSAL_TYPE", String(255)), - Column("RAPID_RESPONSE_TYPE", String(255)), - Column("STAFF_SUPPORT", String(255)), - Column("STATUS", String(255)), - Column("PLAN_SUBMITTED", String(255)), - Column("MODIFIED_DATE", DateTime, nullable=False), - Column("SUBMITTED_DATE", DateTime), - Column("DEADLINE_DATE", DateTime), - Column("TITLE", Text), - Column("PROCESSED", BIT(1), nullable=False), - Column("RELATED_PROPOSALS", Text), - Column("PREV_PROP_IDS", Text), - Column("LOCK_USER_ID", String(255)), - Column("LOCK_MILLIS", BigInteger), - Column("LOCK_USER_INFO", String(255)), - Column("OBSERVING_TYPE_OTHER", String(255)), - Column("OLD_CONTACT", String(255)), - Column("OLD_PI", String(255)), - Column("OLD_EDITOR", String(255)), - Column("justificationFile_id", BigInteger), - Column("editor_id", BigInteger), - Column("contact_id", BigInteger), - Column("principal_investigator_id", BigInteger), - Column("comments", Text), - Column("category1_id", BigInteger), - Column("category2_id", BigInteger), - Column("TELESCOPE", String(255), nullable=False), - Column("category3_id", BigInteger), - Column("displayTechnicalReviews", BIT(1)), - Column("reviewersConflict", BIT(1)), - Column("technicalCategory_id", BigInteger), - Column("scienceCategory", String(255)), - Column("public", BIT(1), nullable=False), - Column("allocated_hours", Float(asdecimal=True), server_default=text("'0'")), - Column("disposition_letter", MEDIUMBLOB), - Column("trigger_criteria", String), - Column("techJustification_id", Integer), - Column("uses_GBT", BIT(1), nullable=False), - Column("uses_VLA", BIT(1), nullable=False), - Column("allocated_hours_a", Float(asdecimal=True), server_default=text("'0'")), - Column("allocated_hours_b", Float(asdecimal=True), server_default=text("'0'")), - Column("allocated_hours_c", Float(asdecimal=True), server_default=text("'0'")), - Column("sponsor", String(255)), - Column("hst_orbits_requested", String(255)), -) - - -t_proposal_bck = Table( - "proposal_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class ProposalNormalizedScore(Base): - __tablename__ = "proposal_normalized_scores" - - normalized_scores_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - scientificCategory = Column(String(255), nullable=False) - avgNormalizedScore = Column(Float(asdecimal=True), nullable=False) - normalizedScoreStdev = Column(Float(asdecimal=True), nullable=False) - srpScores = Column(Float(asdecimal=True), nullable=False) - complete = Column(BIT(1), nullable=False) - finalized = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - review_cycle = relationship("ReviewCycle") - - -t_proposal_normalized_scores_backup = Table( - "proposal_normalized_scores_backup", - metadata, - Column("normalized_scores_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("objectversion", Integer, nullable=False), - Column("review_cycle_id", BigInteger, nullable=False), - Column("proposal_id", BigInteger, nullable=False), - Column("scientificCategory", String(255), nullable=False), - Column("avgNormalizedScore", Float(asdecimal=True), nullable=False), - Column("normalizedScoreStdev", Float(asdecimal=True), nullable=False), - Column("srpScores", Float(asdecimal=True), nullable=False), - Column("complete", BIT(1), nullable=False), - Column("finalized", BIT(1), nullable=False), -) - - -t_proposal_public_bit_allocated_hours_backup = Table( - "proposal_public_bit_allocated_hours_backup", - metadata, - Column("proposal_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("public", BIT(1), nullable=False), - Column("allocated_hours", Float(asdecimal=True), server_default=text("'0'")), -) - - -class ProposalReview(Base): - __tablename__ = "proposal_reviews" - - review_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - complete = Column(BIT(1), nullable=False) - chair = Column(BIT(1), nullable=False) - conflict = Column(BIT(1), nullable=False) - reasons = Column(String) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), nullable=False, index=True) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - saved = Column(BIT(1), nullable=False) - close = Column(BIT(1), nullable=False) - reviewsComplete = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - referee = relationship("Referee") - review_cycle = relationship("ReviewCycle") - - -class ScientificReview(ProposalReview): - __tablename__ = "scientific_reviews" - - review_id = Column(ForeignKey("proposal_reviews.review_id", ondelete="CASCADE"), primary_key=True, index=True) - scientificCategory = Column(String(255), nullable=False) - pctRecommendTime = Column(Float(asdecimal=True)) - score = Column(Float(asdecimal=True), server_default=text("'0'")) - comments = Column(String) - normalizedScore = Column(Float(asdecimal=True), nullable=False, server_default=text("'0'")) - - -class TechnicalReview(ProposalReview): - __tablename__ = "technical_reviews" - - review_id = Column(ForeignKey("proposal_reviews.review_id", ondelete="CASCADE"), primary_key=True, index=True) - commentsForAuthors = Column(String) - commentsForTAC = Column(String) - - -class ProposalTacReview(Base): - __tablename__ = "proposal_tac_reviews" - - tac_review_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - totalTimeRequested = Column(Float(asdecimal=True), nullable=False) - totalTimeAllocated = Column(Float(asdecimal=True), nullable=False) - schedulingPriority = Column(String(255), nullable=False) - complete = Column(BIT(1), nullable=False) - finalized = Column(BIT(1), nullable=False) - normalizedSRPScore = Column(Float(asdecimal=True), nullable=False, server_default=text("'0'")) - reviewPostponed = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - review_cycle = relationship("ReviewCycle") - - -# class RefereeComment(Base): -# __tablename__ = 'refereeComments' -# -# refereeComments_id = Column(BigInteger, primary_key=True) -# objectversion = Column(Integer, nullable=False) -# person_id = Column(ForeignKey('person.person_id'), index=True) -# comments = Column(Text) -# pctRecommendTime = Column(String(255)) -# rating = Column(String(255)) -# commentsToPSC = Column(Text) -# complete = Column(BIT(1), nullable=False) -# -# person = relationship('Person') -# -# -# class RefereeComment(Base): -# __tablename__ = 'referee_comment' -# -# proposal_id = Column(ForeignKey('proposal.proposal_id'), primary_key=True, nullable=False, index=True) -# commentid = Column(ForeignKey('refereeComments.refereeComments_id'), nullable=False, index=True) -# userid = Column(ForeignKey('userAuthentication.userAuthentication_id'), primary_key=True, nullable=False, index=True) -# -# parent = relationship('RefereeComment', remote_side=[proposal_id, userid]) -# proposal = relationship('Proposal') -# userAuthentication = relationship('UserAuthentication') - - -class Referee(Base): - __tablename__ = "referees" - - referee_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - person_id = Column(ForeignKey("person.person_id"), nullable=False, index=True) - user_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), nullable=False, index=True) - active = Column(BIT(1), nullable=False) - acceptReviews = Column(BIT(1), nullable=False) - type = Column(Integer, nullable=False) - - person = relationship("Person") - user = relationship("UserAuthentication") - - -t_resource_bck = Table( - "resource_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), - Column("class", String(255), nullable=False), -) - - -class ReviewCategory(Base): - __tablename__ = "reviewCategory" - - reviewCategory_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - telescope = Column(String(255), nullable=False) - code = Column(String(128), nullable=False, index=True) - description = Column(Text) - - -class ReviewCycle(Base): - __tablename__ = "review_cycles" - - review_cycle_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - title = Column(String(255), nullable=False) - proposal_deadline = Column(Date, nullable=False) - review_deadline = Column(Date, nullable=False) - status = Column(String(255), nullable=False) - code = Column(String(3), nullable=False, server_default=text("'xxx'")) - - -class Role(Base): - __tablename__ = "role" - - role_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - name = Column(String(128), nullable=False, index=True) - description = Column(Text) - permissionset_id = Column(ForeignKey("permissionset.permissionset_id"), nullable=False, index=True) - - permissionset = relationship("Permissionset") - - -class ScientificCategory(Base): - __tablename__ = "scientificCategory" - - scientificCategory_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - proposal_id = Column(ForeignKey("proposal.proposal_id"), index=True) - display_position = Column(Integer) - scientificCategory = Column(String(255), nullable=False) - - proposal = relationship("Proposal") - - -class ScientificReviewPanel(Base): - __tablename__ = "scientific_review_panel" - - sr_panel_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), nullable=False, index=True) - chair = Column(BIT(1), nullable=False) - scientificCategory = Column(String(255), nullable=False) - - referee = relationship("Referee") - review_cycle = relationship("ReviewCycle") - - -t_scientific_reviews_backup = Table( - "scientific_reviews_backup", - metadata, - Column("review_id", BigInteger, nullable=False), - Column("scientificCategory", String(255), nullable=False), - Column("pctRecommendTime", Float(asdecimal=True)), - Column("score", Float(asdecimal=True), server_default=text("'0'")), - Column("comments", String), - Column("normalizedScore", Float(asdecimal=True), nullable=False, server_default=text("'0'")), -) - - -t_scientific_type = Table( - "scientific_type", - metadata, - Column("code", String(16), index=True), - Column("name", String(50), index=True), - Column("abbreviation", String(3)), - Column("description", String(255)), - Column("legacy", Integer), -) - - -class SearchPreference(Base): - __tablename__ = "searchPreferences" - - preference_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - username = Column(String(128), nullable=False) - pagename = Column(Text, nullable=False) - listname = Column(String(255)) - value = Column(String(255)) - - -class Session(Base): - __tablename__ = "session" - - session_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - SESSION_NAME = Column(Text) - SESSION_TIME = Column(Float(asdecimal=True)) - REPEATS = Column(Integer) - SEPARATION = Column(String(255)) - INTERVAL_TIME = Column(Integer) - CONSTRAINT_FIELD = Column(Text) - COMMENTS = Column(Text) - MINIMUM_LST = Column(Text) - MAXIMUM_LST = Column(Text) - ELEVATION_MINIMUM = Column(Text) - SESSION_TIME_CALCULATED = Column(BIT(1), nullable=False) - DISPLAY_POSITION = Column(Integer, nullable=False) - PROPOSAL_ID = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - MODIFIED_SESSION = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - - -class ModifiedSession(Session): - __tablename__ = "ModifiedSession" - - session_id = Column(ForeignKey("session.session_id"), primary_key=True, index=True) - CREATED_DATE = Column(DateTime, nullable=False) - REQUESTED_SESSION_TIME = Column(Float(asdecimal=True)) - REQUESTED_REPEATS = Column(Integer) - schedulingPriority = Column(String(255), server_default=text("''")) - ALLOCATED_SESSION_TIME = Column(Float(asdecimal=True), server_default=text("'0'")) - ALLOCATED_REPEATS = Column(Integer, server_default=text("'0'")) - START_LST = Column(String) - STOP_LST = Column(String) - - -class SessionPair(Base): - __tablename__ = "sessionPair" - - sessionPair_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - PAIR_IDENTIFIER = Column(String(255)) - FIGURE_OF_MERIT = Column(Text) - FIGURE_UNITS = Column(String(255)) - PAIR_TIME = Column(Float(asdecimal=True)) - PAIR_TIME_UNIT = Column(String(255)) - CONSTRAINT_FIELD = Column(Text) - DISPLAY_POSITION = Column(Integer, nullable=False) - RESOURCE_GROUP = Column(String(255)) - SOURCE_GROUP = Column(String(255)) - SESSION_ID = Column(ForeignKey("session.session_id", ondelete="CASCADE"), nullable=False, index=True) - SUB_ARRAY = Column(Integer, nullable=False) - SUB_ARRAY_COUNT = Column(Integer, nullable=False) - SUB_ARRAY_GROUP = Column(String(255), nullable=False) - - session = relationship("Session") - - -t_sessionPair_bck = Table( - "sessionPair_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class SessionResource(Base): - __tablename__ = "sessionResource" - - sessionResource_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - sessionPair_id = Column(ForeignKey("sessionPair.sessionPair_id", ondelete="CASCADE"), nullable=False, index=True) - resource_id = Column(ForeignKey("RESOURCES.resource_id", ondelete="CASCADE"), nullable=False, index=True) - display_position = Column(Integer, nullable=False) - SESSION_ID = Column(ForeignKey("session.session_id", ondelete="CASCADE"), nullable=False, index=True) - - session = relationship("Session") - resource = relationship("RESOURCE") - sessionPair = relationship("SessionPair") - - -t_sessionResource_bck = Table( - "sessionResource_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class SessionSource(Base): - __tablename__ = "sessionSource" - - sessionSource_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - sessionPair_id = Column(ForeignKey("sessionPair.sessionPair_id", ondelete="CASCADE"), nullable=False, index=True) - source_id = Column(ForeignKey("source.source_id", ondelete="CASCADE"), nullable=False, index=True) - display_position = Column(Integer, nullable=False) - SESSION_ID = Column(ForeignKey("session.session_id", ondelete="CASCADE"), nullable=False, index=True) - - session = relationship("Session") - sessionPair = relationship("SessionPair") - source = relationship("Source") - - -t_sessionSource_bck = Table( - "sessionSource_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -t_session_bck = Table( - "session_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class Source(Base): - __tablename__ = "source" - - source_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - proposal_id = Column(ForeignKey("proposal.proposal_id"), nullable=False, index=True) - display_position = Column(Float(asdecimal=True), nullable=False, index=True) - source_group = Column(Text) - target_name = Column(Text) - coordinate = Column(String(255)) - right_ascension = Column(Text) - declination = Column(Text) - right_ascension_range = Column(Text) - declination_range = Column(Text) - velocity_type = Column(String(255), nullable=False) - velocity_redshift = Column(Text, nullable=False) - convention = Column(String(255), nullable=False, server_default=text("'Radio'")) - coordinate_system = Column(String(255), nullable=False, server_default=text("'Equatorial'")) - referenceFrame = Column(String(255), nullable=False, server_default=text("'LSRK'")) - calibrator = Column(BIT(1), nullable=False) - - proposal = relationship("Proposal") - - -t_source_bck = Table( - "source_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class SrpComment(Base): - __tablename__ = "srp_comments" - - srp_comments_id = Column(BigInteger, primary_key=True) - person_id = Column(ForeignKey("person.person_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), index=True) - commentsForAuthors = Column(String) - commentsForTAC = Column(String) - byPSTAdmin = Column(BIT(1), nullable=False) - lastUpdated = Column(DateTime, nullable=False, server_default=text("CURRENT_TIMESTAMP")) - - person = relationship("Person") - referee = relationship("Referee") - - -class SrpCommentsMap(Base): - __tablename__ = "srp_comments_map" - - normalized_scores_id = Column( - ForeignKey("proposal_normalized_scores.normalized_scores_id"), primary_key=True, nullable=False, index=True - ) - srp_comments_id = Column(ForeignKey("srp_comments.srp_comments_id"), nullable=False, index=True) - person_id = Column(ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True) - - normalized_scores = relationship("ProposalNormalizedScore") - person = relationship("Person") - srp_comments = relationship("SrpComment") - - -t_srp_comments_tmp = Table( - "srp_comments_tmp", - metadata, - Column("srp_comments_id", BigInteger, nullable=False, server_default=text("'0'")), - Column("person_id", BigInteger, nullable=False), - Column("referee_id", BigInteger), - Column("commentsForAuthors", String), - Column("commentsForTAC", String), - Column("byPSTAdmin", BIT(1), nullable=False), - Column("lastUpdated", DateTime), -) - - -class StudentSupport(Base): - __tablename__ = "studentSupport" - - studentSupport_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - travel = Column(Text) - hardware = Column(Text) - miscellaneous_budget = Column(Float(asdecimal=True)) - applied = Column(BIT(1), nullable=False) - propId = Column(String(255), nullable=False) - proposal_id = Column(ForeignKey("proposal.proposal_id", ondelete="CASCADE"), unique=True) - sos_pi_id = Column(ForeignKey("author.author_id"), index=True) - - proposal = relationship("Proposal") - sos_pi = relationship("Author") - - -t_studentSupport_bck = Table( - "studentSupport_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) - - -class TacComment(Base): - __tablename__ = "tac_comments" - - tac_comments_id = Column(BigInteger, primary_key=True) - person_id = Column(ForeignKey("person.person_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), index=True) - commentsForAuthors = Column(String) - commentsForTAC = Column(String) - byPSTAdmin = Column(BIT(1), nullable=False) - - person = relationship("Person") - referee = relationship("Referee") - - -class TacCommentsMap(Base): - __tablename__ = "tac_comments_map" - - tac_review_id = Column( - ForeignKey("proposal_tac_reviews.tac_review_id"), primary_key=True, nullable=False, index=True - ) - tac_comments_id = Column(ForeignKey("tac_comments.tac_comments_id"), nullable=False, index=True) - person_id = Column(ForeignKey("person.person_id"), primary_key=True, nullable=False, index=True) - - person = relationship("Person") - tac_comments = relationship("TacComment") - tac_review = relationship("ProposalTacReview") - - -class TacPanel(Base): - __tablename__ = "tac_panel" - - tac_panel_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), nullable=False, index=True) - chair = Column(BIT(1), nullable=False) - - referee = relationship("Referee") - review_cycle = relationship("ReviewCycle") - - -class TechnicalReviewCategory(Base): - __tablename__ = "technical_review_category" - - tech_reviewCategory_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - name = Column(String, nullable=False) - code = Column(String(128), nullable=False, index=True) - description = Column(String) - telescope = Column(String(255), nullable=False) - - -class TechnicalReviewPanel(Base): - __tablename__ = "technical_review_panel" - - tr_panel_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - review_cycle_id = Column(ForeignKey("review_cycles.review_cycle_id"), nullable=False, index=True) - referee_id = Column(ForeignKey("referees.referee_id"), nullable=False, index=True) - technical_category_id = Column( - ForeignKey("technical_review_category.tech_reviewCategory_id"), nullable=False, index=True - ) - telescope = Column(String(255), nullable=False) - - referee = relationship("Referee") - review_cycle = relationship("ReviewCycle") - technical_category = relationship("TechnicalReviewCategory") - - -class Uisetting(Base): - __tablename__ = "uisetting" - - uisetting_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - FLYOVER_HELP = Column(BIT(1), nullable=False) - TELESCOPE = Column(String(255)) - EXPIRATION_RECOVERY = Column(String(255)) - EDITOR_ROLE = Column(String(255)) - PROPOSALS_PER_PAGE = Column(Integer) - CLIENT_SIDE_CHANGE_INDICATOR = Column(String(255)) - - -t_uisettings_bck = Table( - "uisettings_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -t_url_bck = Table( - "url_bck", metadata, Column("newid", BigInteger, nullable=False), Column("oldid", BigInteger, nullable=False) -) - - -class UserAuthentication(Base): - __tablename__ = "userAuthentication" - - userAuthentication_id = Column(BigInteger, primary_key=True) - objectversion = Column(Integer, nullable=False) - role_id = Column(ForeignKey("role.role_id"), nullable=False, index=True) - permissionset_id = Column(ForeignKey("permissionset.permissionset_id"), nullable=False, index=True) - uisetting_id = Column(ForeignKey("uisetting.uisetting_id"), index=True) - personName = Column(String(128), nullable=False, unique=True) - password = Column(String(255), nullable=False) - displayName = Column(String(255), nullable=False) - authenticationToken = Column(String(255)) - changePassword = Column(BIT(1), nullable=False) - rememberLogin = Column(BIT(1)) - defaultAccount_id = Column(ForeignKey("userAuthentication.userAuthentication_id"), index=True) - - defaultAccount = relationship("UserAuthentication", remote_side=[userAuthentication_id]) - permissionset = relationship("Permissionset") - role = relationship("Role") - uisetting = relationship("Uisetting") - - -t_userAuthentication_bck = Table( - "userAuthentication_bck", - metadata, - Column("newid", BigInteger, nullable=False), - Column("oldid", BigInteger, nullable=False), -) diff --git a/shared/schema/schema/vlassmodel.py b/shared/schema/schema/vlassmodel.py deleted file mode 100644 index d744f3258d04335e3652a771d51480a4f85f52e2..0000000000000000000000000000000000000000 --- a/shared/schema/schema/vlassmodel.py +++ /dev/null @@ -1,524 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# coding: utf-8 -from sqlalchemy import ( - BigInteger, - Boolean, - Column, - DateTime, - Float, - ForeignKey, - Integer, - SmallInteger, - String, - Table, - Text, - text, -) -from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship - -Base = declarative_base() -metadata = Base.metadata - - -t_calibration_product_minitile = Table( - "calibration_product_minitile", - metadata, - Column( - "calibration_product_id", - ForeignKey("calibration_product.calibration_product_id"), - primary_key=True, - nullable=False, - ), - Column("minitile_id", ForeignKey("minitile.id"), primary_key=True, nullable=False), -) - - -class Calibrator(Base): - __tablename__ = "calibrator" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - sct_id = Column(BigInteger) - sct_catalog_id = Column(BigInteger) - type = Column(Integer) - - schedblocks = relationship("Schedblock", secondary="fluxcal_schedblock") - minitiles = relationship("Minitile", secondary="minitile_calibrator") - schedblocks1 = relationship("Schedblock", secondary="phasecal_schedblock") - schedblocks2 = relationship("Schedblock", secondary="polcal_schedblock") - - -class CalibratorFlux(Base): - __tablename__ = "calibrator_flux" - - id = Column(Integer, primary_key=True) - frequency = Column(Float(53)) - obs_date = Column(DateTime) - flux = Column(Float(53)) - sp_idx = Column(Float(53)) - calibrator_id = Column(ForeignKey("calibrator.id")) - uv_min = Column(Float(53)) - uv_max = Column(Float(53)) - - calibrator = relationship("Calibrator") - - -class CalibratorPol(Base): - __tablename__ = "calibrator_pol" - - id = Column(Integer, primary_key=True) - fraction = Column(Float(53)) - pos_angle = Column(Float(53)) - rm = Column(Float(53)) - ref_freq = Column(Float(53)) - calibrator_id = Column(ForeignKey("calibrator.id")) - - calibrator = relationship("Calibrator") - - -class ConfigurationFile(Base): - __tablename__ = "configuration_file" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - content_type = Column(String(255)) - contents = Column(Text) - jobspec_id = Column(ForeignKey("jobspec.id"), index=True) - - jobspec = relationship("Jobspec") - - -class ConfigurationFileTemplate(Base): - __tablename__ = "configuration_file_template" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - content_type = Column(String(255)) - contents = Column(Text) - doc = Column(Text) - workflow_id = Column(ForeignKey("workflow.id")) - - workflow = relationship("Workflow") - - -t_databasechangelog = Table( - "databasechangelog", - metadata, - Column("id", String(255), nullable=False), - Column("author", String(255), nullable=False), - Column("filename", String(255), nullable=False), - Column("dateexecuted", DateTime, nullable=False), - Column("orderexecuted", Integer, nullable=False), - Column("exectype", String(10), nullable=False), - Column("md5sum", String(35)), - Column("description", String(255)), - Column("comments", String(255)), - Column("tag", String(255)), - Column("liquibase", String(20)), - Column("contexts", String(255)), - Column("labels", String(255)), - Column("deployment_id", String(10)), -) - - -class Databasechangeloglock(Base): - __tablename__ = "databasechangeloglock" - - id = Column(Integer, primary_key=True) - locked = Column(Boolean, nullable=False) - lockgranted = Column(DateTime) - lockedby = Column(String(255)) - - -t_fluxcal_schedblock = Table( - "fluxcal_schedblock", - metadata, - Column("schedblock_id", ForeignKey("schedblock.schedblock_id"), primary_key=True, nullable=False), - Column("calibrator_id", ForeignKey("calibrator.id"), primary_key=True, nullable=False), -) - - -class InputProductVersion(Base): - __tablename__ = "input_product_versions" - - id = Column(Integer, primary_key=True) - product_version_id = Column(ForeignKey("product_version.id")) - jobspec_id = Column(ForeignKey("jobspec.id")) - - jobspec = relationship("Jobspec") - product_version = relationship("ProductVersion") - product_versions = relationship("ProductVersion", secondary="inputs_to_product_versions") - - -t_inputs_to_product_versions = Table( - "inputs_to_product_versions", - metadata, - Column("intputs_id", ForeignKey("input_product_versions.id"), primary_key=True, nullable=False), - Column("product_version_id", ForeignKey("product_version.id"), primary_key=True, nullable=False, index=True), -) - - -class Job(Base): - __tablename__ = "job" - - id = Column(Integer, primary_key=True) - start_timestamp = Column(DateTime) - end_timestamp = Column(DateTime) - status = Column(Integer) - json_results = Column(Text) - qa_analyst = Column(String(255)) - notes = Column(Text) - jobspec_id = Column(ForeignKey("jobspec.id"), nullable=False, index=True) - name = Column(String(255)) - archival_job_id = Column(ForeignKey("job.id"), index=True) - arch_status = Column(Integer) - - archival_job = relationship("Job", remote_side=[id]) - jobspec = relationship("Jobspec") - - -class JobTaskTemplate(Base): - __tablename__ = "job_task_template" - - id = Column(Integer, primary_key=True) - order_num = Column(SmallInteger) - name = Column(String(255)) - command_template = Column(String(255)) - doc = Column(Text) - workflow_id = Column(ForeignKey("workflow.id")) - - workflow = relationship("Workflow") - - -class Jobspec(Base): - __tablename__ = "jobspec" - - id = Column(Integer, primary_key=True) - json = Column(Text) - creation_date = Column(DateTime) - next_id = Column(ForeignKey("jobspec.id"), index=True) - queue_id = Column(ForeignKey("queue.id"), index=True) - name = Column(String(255)) - enqueued = Column(Boolean) - sdm_id = Column(String(255)) - - next = relationship("Jobspec", remote_side=[id]) - queue = relationship("Queue", primaryjoin="Jobspec.queue_id == Queue.id") - product_versions = relationship("ProductVersion", secondary="jobspec_to_product_version") - - -t_jobspec_to_product_version = Table( - "jobspec_to_product_version", - metadata, - Column("product_version_id", ForeignKey("product_version.id"), primary_key=True, nullable=False, index=True), - Column("jobspec_id", ForeignKey("jobspec.id"), primary_key=True, nullable=False), -) - - -class Jobtask(Base): - __tablename__ = "jobtask" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - start_timestamp = Column(DateTime) - end_timestamp = Column(DateTime) - status = Column(Integer) - json_results = Column(Text) - is_final = Column(Boolean) - job_id = Column(ForeignKey("job.id"), index=True) - pbs_job_id = Column(String(255)) - - job = relationship("Job") - - -class JsonConfiguration(Base): - __tablename__ = "json_configuration" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - json = Column(Text) - product_type_id = Column(ForeignKey("product_type.id")) - product_version_id = Column(ForeignKey("product_version.id")) - product_id = Column(ForeignKey("product.id")) - - product = relationship("Product") - product_type = relationship("ProductType") - product_version = relationship("ProductVersion") - - -class Minitile(Base): - __tablename__ = "minitile" - - id = Column(Integer, primary_key=True, server_default=text("nextval('minitile_id_seq'::regclass)")) - name = Column(String(255)) - epoch = Column(Integer) - tier = Column(Integer) - ra_min = Column(Float(53)) - dec_min = Column(Float(53)) - ra_max = Column(Float(53)) - dec_max = Column(Float(53)) - area = Column(Float(53)) - factor = Column(Float(53)) - first_epoch_half = Column(Boolean) - custom_1 = Column(String(255)) - custom_2 = Column(String(255)) - custom_3 = Column(String(255)) - custom_4 = Column(String(255)) - custom_5 = Column(String(255)) - definitions = Column(Text) - - schedblocks = relationship("Schedblock", secondary="schedblock_minitile") - - -t_minitile_calibrator = Table( - "minitile_calibrator", - metadata, - Column("minitile_id", ForeignKey("minitile.id"), primary_key=True, nullable=False), - Column("calibrator_id", ForeignKey("calibrator.id"), primary_key=True, nullable=False), -) - - -t_phasecal_schedblock = Table( - "phasecal_schedblock", - metadata, - Column("schedblock_id", ForeignKey("schedblock.schedblock_id"), primary_key=True, nullable=False), - Column("calibrator_id", ForeignKey("calibrator.id"), primary_key=True, nullable=False), -) - - -t_polcal_schedblock = Table( - "polcal_schedblock", - metadata, - Column("schedblock_id", ForeignKey("schedblock.schedblock_id"), primary_key=True, nullable=False), - Column("calibrator_id", ForeignKey("calibrator.id"), primary_key=True, nullable=False), -) - - -class Prerequisite(Base): - __tablename__ = "prerequisite" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - ready = Column(Boolean) - product_id = Column(ForeignKey("product.id"), nullable=False, index=True) - req_product_id = Column(ForeignKey("product.id")) - - product = relationship("Product", primaryjoin="Prerequisite.product_id == Product.id") - req_product = relationship("Product", primaryjoin="Prerequisite.req_product_id == Product.id") - - -class PrerequisiteArchiveid(Base): - __tablename__ = "prerequisite_archiveids" - - prerequisite_id = Column(ForeignKey("prerequisite.id"), primary_key=True, nullable=False) - archive_id = Column(String(255), nullable=False) - name = Column(String(255), primary_key=True, nullable=False) - - prerequisite = relationship("Prerequisite") - - -class Product(Base): - __tablename__ = "product" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - category = Column(Integer) - epoch = Column(Integer) - notes = Column(Text) - product_type_id = Column(ForeignKey("product_type.id"), nullable=False) - completed = Column(Boolean) - status = Column(Integer, nullable=False, server_default=text("0")) - - product_type = relationship("ProductType") - tags = relationship("Tag", secondary="product_tag") - - -class CalibrationProduct(Product): - __tablename__ = "calibration_product" - - calibration_product_id = Column(ForeignKey("product.id"), primary_key=True) - - minitiles = relationship("Minitile", secondary="calibration_product_minitile") - - -# -# NOTE: -# slqacodegen created a much more complete model of the database, but that -# model included somewhat-circular references among the foreign keys for -# image_product and it's sub-tables. This configuration was causing -# issues using the model within SqlAlchemy for metadata lookups in the -# service layer (ingestion_metadata.py). -# -# To postpone this particular part of refactoring the VLASS system, I have -# deleted image_product and all associated tables, as they weren't required -# for the current use-case. -# -# - JLS 08/29/2019 -# - - -class Schedblock(Product): - __tablename__ = "schedblock" - - schedblock_id = Column(ForeignKey("product.id"), primary_key=True) - opt_id = Column(BigInteger) - flux_position = Column(Integer) - lst_start = Column(Float) - lst_end = Column(Float) - submitted = Column(Boolean) - - -t_product_tag = Table( - "product_tag", - metadata, - Column("product_id", ForeignKey("product.id"), primary_key=True, nullable=False), - Column("tag_id", ForeignKey("tag.id"), primary_key=True, nullable=False), -) - - -class ProductType(Base): - __tablename__ = "product_type" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - event_type = Column(String(255)) - - -class ProductVersion(Base): - __tablename__ = "product_version" - - id = Column(Integer, primary_key=True) - number = Column(Integer) - notes = Column(Text) - product_id = Column(ForeignKey("product.id")) - status = Column(Integer) - - product = relationship("Product") - - -class ProductVersionArchiveid(Base): - __tablename__ = "product_version_archiveids" - - product_version_id = Column(ForeignKey("product_version.id"), primary_key=True, nullable=False) - archive_id = Column(String(255), nullable=False) - name = Column(String(255), primary_key=True, nullable=False) - - product_version = relationship("ProductVersion") - - -class Queue(Base): - __tablename__ = "queue" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - workflow_id = Column(ForeignKey("workflow.id")) - head_jobspec_id = Column(ForeignKey("jobspec.id")) - tail_jobspec_id = Column(ForeignKey("jobspec.id")) - submit = Column(Boolean) - project_code = Column(String(255)) - create_job = Column(Boolean) - auto_qa = Column(Boolean, server_default=text("false")) - - head_jobspec = relationship("Jobspec", primaryjoin="Queue.head_jobspec_id == Jobspec.id") - tail_jobspec = relationship("Jobspec", primaryjoin="Queue.tail_jobspec_id == Jobspec.id") - workflow = relationship("Workflow") - - -t_rawdata = Table( - "rawdata", - metadata, - Column("opt_id", BigInteger), - Column("sdm_id", String(255)), - Column("schedblock_id", ForeignKey("schedblock.schedblock_id")), - Column("rawdata_id", ForeignKey("product.id"), nullable=False), -) - - -class Scan(Base): - __tablename__ = "scan" - - id = Column(Integer, primary_key=True) - start_source_id = Column(ForeignKey("source.id")) - end_source_id = Column(ForeignKey("source.id")) - num_phase_centers = Column(Integer) - minitile_id = Column(ForeignKey("minitile.id")) - - end_source = relationship("Source", primaryjoin="Scan.end_source_id == Source.id") - minitile = relationship("Minitile") - start_source = relationship("Source", primaryjoin="Scan.start_source_id == Source.id") - - -t_schedblock_minitile = Table( - "schedblock_minitile", - metadata, - Column("schedblock_id", ForeignKey("schedblock.schedblock_id"), primary_key=True, nullable=False), - Column("minitile_id", ForeignKey("minitile.id"), primary_key=True, nullable=False), -) - - -class Setting(Base): - __tablename__ = "settings" - - id = Column(String(1), primary_key=True, server_default=text("'X'::bpchar")) - allow_job_deletion = Column(Boolean, server_default=text("false")) - allow_product_deletion = Column(Boolean, server_default=text("false")) - - -class Source(Base): - __tablename__ = "source" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - sct_catalog_id = Column(BigInteger) - sct_id = Column(BigInteger) - ra = Column(Float(53)) - decl = Column(Float(53)) - - -class Tag(Base): - __tablename__ = "tag" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - - -class Workflow(Base): - __tablename__ = "workflow" - - id = Column(Integer, primary_key=True) - name = Column(String(255)) - host = Column(String(255)) - port = Column(Integer) - json = Column(Text) - enqueue = Column(Boolean) - product_type_id = Column(ForeignKey("product_type.id")) - arch_workflow_id = Column(ForeignKey("workflow.id")) - - arch_workflow = relationship("Workflow", remote_side=[id]) - product_type = relationship("ProductType") - - -class WorkflowProjectCode(Base): - __tablename__ = "workflow_project_codes" - - project_code_id = Column(ForeignKey("workflow.id"), primary_key=True, nullable=False) - project_code = Column(String(255), primary_key=True, nullable=False) - - project_code1 = relationship("Workflow") diff --git a/shared/schema/setup.py b/shared/schema/setup.py deleted file mode 100644 index 6d10910da133cb5e2bd9dbd7b58ec9ef12ccf01e..0000000000000000000000000000000000000000 --- a/shared/schema/setup.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import setup - -VERSION = open("schema/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="NRAO Archive Schema Library", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=[ - "pendulum==2.1.2", - "sqlalchemy==1.4.46", - "pycapo", - "psycopg2", - "mysqlclient==2.1.1", - "cx_Oracle", - ], - keywords=[], - packages=["schema"], - classifiers=["Programming Language :: Python :: 3.10"], -) diff --git a/shared/schema/test/test_schema_placeholder.py b/shared/schema/test/test_schema_placeholder.py deleted file mode 100644 index e84d40a37be34a5905e9c752cdd1b356760e5cec..0000000000000000000000000000000000000000 --- a/shared/schema/test/test_schema_placeholder.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -def test_placeholder(): - pass diff --git a/shared/workspaces/LICENSE b/shared/workspaces/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..bc08fe2e41e331fcf35fe07812c5f68f637f79ae --- /dev/null +++ b/shared/workspaces/LICENSE @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/shared/workspaces/alembic/Dockerfile.local b/shared/workspaces/alembic/Dockerfile.local index 74fa51928365847e6bd017e1bd6077965e1dc51b..348fcdd71720ddc69261f4de209d201956c2386e 100644 --- a/shared/workspaces/alembic/Dockerfile.local +++ b/shared/workspaces/alembic/Dockerfile.local @@ -1,6 +1,37 @@ # This is nrao:schema # The purpose of this is just to run the alembic migrations against the database in a docker-compose environment -FROM cache:tmp +ARG WS_VERSION=unknown-version +FROM python:3.10-slim-buster + +# Environment variables +ENV PIP_NO_CACHE_DIR false +ENV CAPO_PROFILE docker +ENV CAPO_PATH /home/ssa/capo + +# Get postgres/mysql development stuff in the image +RUN apt update \ + && apt install -y --no-install-recommends \ + gcc \ + libmariadb-dev-compat \ + libpq-dev \ + && rm -rf /var/lib/apt/lists + +# Create vlapipe group and create vlapipe user placed in vlapipe group +RUN addgroup --gid 6000 vlapipe && \ + useradd --create-home --comment "" --gid 6000 --uid 6000 vlapipe + +# Create almapipe group and create almapipe user placed in almapipe group +RUN addgroup --gid 9233 almapipe && \ + useradd --create-home --comment "" --gid 9233 --uid 9233 almapipe + +USER root +WORKDIR /code/ +RUN chown vlapipe . && chgrp vlapipe . +USER vlapipe + +# COPY --chown=vlapipe:vlapipe ./shared ./shared + +ENV PATH "${PATH}:/home/vlapipe/.local/bin" WORKDIR /code/shared/workspaces/alembic diff --git a/shared/workspaces/alembic/requirements.txt b/shared/workspaces/alembic/requirements.txt index d53efb818af43676046ab73a1b74f84028a494d9..6d3589a2515b0c46ef7ec00855bb668776d9946b 100644 --- a/shared/workspaces/alembic/requirements.txt +++ b/shared/workspaces/alembic/requirements.txt @@ -1,6 +1,8 @@ # This file is intended to support the Dockerfile.base, not for actual development # DO NOT MODIFY THIS FILE, THIS IS FOR DOCKER ONLY! +-e ../../workspaces alembic == 1.5.8 -pycapo == 0.3.0 +pycapo == 0.3.1 psycopg2-binary == 2.8 +sqlalchemy == 1.4.47 diff --git a/shared/workspaces/alembic/versions/08090cb7acc4_add_mark4_observation_ingestion_workflow.py b/shared/workspaces/alembic/versions/08090cb7acc4_add_mark4_observation_ingestion_workflow.py new file mode 100644 index 0000000000000000000000000000000000000000..a4cca7049e9a4b9d5d62d55aed2d714d2980f0a6 --- /dev/null +++ b/shared/workspaces/alembic/versions/08090cb7acc4_add_mark4_observation_ingestion_workflow.py @@ -0,0 +1,106 @@ +"""add mark4 observation ingestion workflow + +Revision ID: 08090cb7acc4 +Revises: 705ed8cfc7be +Create Date: 2023-09-11 10:50:44.427048 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '08090cb7acc4' +down_revision = '705ed8cfc7be' +branch_labels = None +depends_on = None + +wf_name = "ingest_mk_four_obs" + +ingest_mk_four_obs_condor = """executable = ingest_mk_four_obs.sh +arguments = {{data_src}} + +output = ingest.out +error = ingest.err +log = condor.log + +SBIN_PATH = /lustre/aoc/cluster/pipeline/$ENV(CAPO_PROFILE)/workspaces/sbin +SPOOL_DIR = {{spool_dir}} +should_transfer_files = yes +transfer_input_files = $ENV(HOME)/.ssh/condor_transfer, nraorsync://$(SBIN_PATH)/pycapo ++WantIOProxy = True + +request_memory = {{ramInGb}} +getenv = True +environment = "CAPO_PATH=/home/casa/capo" + +requirements = HasLustre == True + +queue + +""" + +ingest_mk_four_obs_sh = """#!/bin/sh +set -o errexit + +# Get NGAS hosts and set up variables to randomly select one +NGASHOSTSTR=$(./pycapo -q archive-ingestion.NGASHosts) +NGASHOSTARR=(`/bin/echo ${NGASHOSTSTR}`) # Put the space-delimited host list into an array +NGASHOSTLEN=${#NGASHOSTARR[@]} + +# Copy from the difx area to the Workspaces staging area +WSSTAGINGDIR=$(./pycapo -q edu.nrao.workspaces.IngestionSettings.stagingDirectory) +/bin/cp -r $1 $WSSTAGINGDIR + +OBSDIR=$(/bin/basename $1) +/bin/chmod -R 750 $WSSTAGINGDIR/$OBSDIR # Make sure NGAS has permissions to ingest the files +cd $WSSTAGINGDIR/$OBSDIR + +for FILE in *; do + # Pick random NGAS host to distribute the ingestion load + NGASINDEX=$(($RANDOM % $NGASHOSTLEN)) + NGASHOST=${NGASHOSTARR[$NGASINDEX]} + + FULLPATH=$(/bin/readlink -f $FILE) + NGASCMD="${NGASHOST}ARCHIVE?filename=file://${FULLPATH}" + + INGESTOUT=$(/bin/curl $NGASCMD) + if echo $INGESTOUT | grep -i "error"; then + echo "Failed to ingest ${FILE}" + exit 1 + fi +done""" + +def upgrade(): + op.execute( + f""" + INSERT INTO workflows (workflow_name, requires_lustre) VALUES (E'{wf_name}', true) + """ + ) + + op.execute( + f""" + INSERT INTO workflow_templates (filename, content, workflow_name) + VALUES ('ingest_mk_four_obs.condor', E'{ingest_mk_four_obs_condor}', E'{wf_name}') + """ + ) + + op.execute( + f""" + INSERT INTO workflow_templates (filename, content, workflow_name) + VALUES ('ingest_mk_four_obs.sh', E'{ingest_mk_four_obs_sh}', E'{wf_name}') + """ + ) + +def downgrade(): + op.execute( + f""" + DELETE FROM workflow_templates WHERE workflow_name = E'{wf_name}' + """ + ) + + op.execute( + f""" + DELETE FROM workflows WHERE workflow_name = E'{wf_name}' + """ + ) diff --git a/shared/workspaces/alembic/versions/28b6a6bfb73c_add_radial_config_to_htcondor_templates.py b/shared/workspaces/alembic/versions/28b6a6bfb73c_add_radial_config_to_htcondor_templates.py new file mode 100644 index 0000000000000000000000000000000000000000..8de654ba3c08d2178ac6e7d7a3e22ac31904a9bb --- /dev/null +++ b/shared/workspaces/alembic/versions/28b6a6bfb73c_add_radial_config_to_htcondor_templates.py @@ -0,0 +1,128 @@ +# Copyright (C) 2023 Associated Universities, Inc. Washington DC, USA. +# +# This file is part of NRAO Workspaces. +# +# Workspaces is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Workspaces is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +# +"""add radial config to htcondor templates + +Revision ID: 28b6a6bfb73c +Revises: 1f32110d170d +Create Date: 2023-08-11 14:18:53.827274 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "28b6a6bfb73c" +down_revision = "1f32110d170d" +branch_labels = None +depends_on = None + +old_vlass_ql_envoy_condor = """executable = vlass_ql_envoy.sh +arguments = metadata.json PPR.xml {{request_id}} + +output = envoy.out +error = envoy.err +log = condor.log + +SBIN_PATH = /lustre/aoc/cluster/pipeline/$ENV(CAPO_PROFILE)/workspaces/sbin +VLASS_DIR = {{data_location}} +should_transfer_files = yes +transfer_input_files = $ENV(HOME)/.ssh/condor_transfer, nraorsync://$(SBIN_PATH)/.matplotlib, nraorsync://$(SBIN_PATH)/pycapo, nraorsync://$(SBIN_PATH)/update_stage, nraorsync://$(SBIN_PATH)/casa_envoy, nraorsync://$(SBIN_PATH)/vela, nraorsync://$(VLASS_DIR)/working, nraorsync://$(VLASS_DIR)/rawdata, nraorsync://$(VLASS_DIR)/products{{#remote}}, nraorsync://$(VLASS_DIR)/{{profile}}.properties{{/remote}}, nraorsync://$(VLASS_DIR)/PPR.xml, nraorsync://$(VLASS_DIR)/metadata.json{{files_to_transfer}} +transfer_output_files = .job.ad ++nrao_output_files = "working products" +when_to_transfer_output = ON_EXIT +output_destination = nraorsync://$(VLASS_DIR) ++WantIOProxy = True + +request_memory = 31G +request_disk = 100G +getenv = True + +{{^remote}} +environment = "CAPO_PATH=/home/casa/capo" +requirements = (VLASS == True) && (HasLustre == True) ++partition = "VLASS" +{{/remote}} +{{#remote}} +requirements = (VLASS == True) ++partition = "VLASS" +Rank = (TARGET.VLASS == True) + (TARGET.VLASSTEST =!= True) + (HasLustre =!= True) +{{/remote}} + +queue +""" + +new_vlass_ql_envoy_condor = """executable = vlass_ql_envoy.sh +arguments = metadata.json PPR.xml {{request_id}} + +output = envoy.out +error = envoy.err +log = condor.log + +SBIN_PATH = /lustre/aoc/cluster/pipeline/$ENV(CAPO_PROFILE)/workspaces/sbin +VLASS_DIR = {{data_location}} +should_transfer_files = yes +transfer_input_files = {{#radial}}$ENV(HOME)/.ssh/condor_ssh_config, {{/radial}}$ENV(HOME)/.ssh/condor_transfer, nraorsync://$(SBIN_PATH)/.matplotlib, nraorsync://$(SBIN_PATH)/pycapo, nraorsync://$(SBIN_PATH)/update_stage, nraorsync://$(SBIN_PATH)/casa_envoy, nraorsync://$(SBIN_PATH)/vela, nraorsync://$(VLASS_DIR)/working, nraorsync://$(VLASS_DIR)/rawdata, nraorsync://$(VLASS_DIR)/products{{#remote}}, nraorsync://$(VLASS_DIR)/{{profile}}.properties{{/remote}}, nraorsync://$(VLASS_DIR)/PPR.xml, nraorsync://$(VLASS_DIR)/metadata.json{{files_to_transfer}} +transfer_output_files = .job.ad ++nrao_output_files = "working products" +when_to_transfer_output = ON_EXIT +output_destination = nraorsync://$(VLASS_DIR) ++WantIOProxy = True +{{#radial}} +universe = grid +grid_resource = condor radialhead.nrao.radial.local radialhead.nrao.radial.local ++remote_jobuniverse = 5 ++remote_requirements = True ++remote_ShouldTransferFiles = "YES" ++remote_WhenToTransferOutput = "ON_EXIT" +{{/radial}} + +request_memory = 31G +request_disk = 100G +getenv = True + +{{^remote}} +environment = "CAPO_PATH=/home/casa/capo" +requirements = (VLASS == True) && (HasLustre == True) ++partition = "VLASS" +{{/remote}} +{{#remote}} +requirements = (VLASS == True) ++partition = "VLASS" +Rank = (TARGET.VLASS == True) + (TARGET.VLASSTEST =!= True) + (HasLustre =!= True) +{{/remote}} + +queue +""" + + +def upgrade(): + op.execute( + f""" + UPDATE workflow_templates + SET content=E'{new_vlass_ql_envoy_condor}' WHERE filename='vlass_ql_envoy.condor' + """ + ) + + +def downgrade(): + op.execute( + f""" + UPDATE workflow_templates + SET content=E'{old_vlass_ql_envoy_condor}' WHERE filename='vlass_ql_envoy.condor' + """ + ) diff --git a/shared/workspaces/alembic/versions/491102d56809_add_ingest_obs_workflow.py b/shared/workspaces/alembic/versions/491102d56809_add_ingest_obs_workflow.py new file mode 100644 index 0000000000000000000000000000000000000000..030e921c8b1f9a7a61e44d2e9900268cab0cfe69 --- /dev/null +++ b/shared/workspaces/alembic/versions/491102d56809_add_ingest_obs_workflow.py @@ -0,0 +1,102 @@ +"""add ingest obs workflow + +Revision ID: 491102d56809 +Revises: 28b6a6bfb73c +Create Date: 2023-08-23 10:25:52.684465 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '491102d56809' +down_revision = '8ccdd4674889' +branch_labels = None +depends_on = None + +wf_name = "ingest_obs" + +ingest_obs_condor = """executable = ingest_obs.sh +arguments = metadata.json {{data_src}} + +output = ingest.out +error = ingest.err +log = condor.log + +SBIN_PATH = /lustre/aoc/cluster/pipeline/$ENV(CAPO_PROFILE)/workspaces/sbin +SPOOL_DIR = {{spool_dir}} +should_transfer_files = yes +transfer_input_files = $ENV(HOME)/.ssh/condor_transfer, nraorsync://$(SBIN_PATH)/pycapo, nraorsync://$(SBIN_PATH)/ingest_envoy, nraorsync://$(SBIN_PATH)/ingest, nraorsync://$(SBIN_PATH)/observation-product-collector.sh, ./metadata.json ++WantIOProxy = True + +request_memory = {{ramInGb}} +getenv = True +environment = "CAPO_PATH=/home/casa/capo" + +requirements = HasLustre == True + +queue + +""" + +ingest_obs_sh = """#!/bin/sh +set -o errexit + +./ingest_envoy --observation $1 $2 + +""" + +metadata_json = """{ + "telescope": "{{telescope}}", + "data_location": "{{data_src}}", + "projectMetadata": { + "telescope": "{{telescope}}", + "projectCode": "{{projectCode}}" + } +} + +""" + + +def upgrade(): + op.execute( + f""" + INSERT INTO workflows (workflow_name) VALUES (E'{wf_name}') + """ + ) + + op.execute( + f""" + INSERT INTO workflow_templates (filename, content, workflow_name) + VALUES ('ingest_obs.condor', E'{ingest_obs_condor}', E'{wf_name}') + """ + ) + + op.execute( + f""" + INSERT INTO workflow_templates (filename, content, workflow_name) + VALUES ('ingest_obs.sh', E'{ingest_obs_sh}', E'{wf_name}') + """ + ) + + op.execute( + f""" + INSERT INTO workflow_templates (filename, content, workflow_name) + VALUES ('metadata.json', E'{metadata_json}', E'{wf_name}') + """ + ) + + +def downgrade(): + op.execute( + f""" + DELETE FROM workflow_templates WHERE workflow_name = E'{wf_name}' + """ + ) + + op.execute( + f""" + DELETE FROM workflows WHERE workflow_name = E'{wf_name}' + """ + ) diff --git a/shared/workspaces/alembic/versions/705ed8cfc7be_fix_custom_text_part_of_std_calibration_.py b/shared/workspaces/alembic/versions/705ed8cfc7be_fix_custom_text_part_of_std_calibration_.py new file mode 100644 index 0000000000000000000000000000000000000000..26f1ca7d2267c01859f3462c2199808771b794c3 --- /dev/null +++ b/shared/workspaces/alembic/versions/705ed8cfc7be_fix_custom_text_part_of_std_calibration_.py @@ -0,0 +1,41 @@ +"""fix custom text part of std_calibration_complete template + +Revision ID: 705ed8cfc7be +Revises: 491102d56809 +Create Date: 2023-08-31 13:14:13.039335 + +""" +from pathlib import Path + +import sqlalchemy as sa +from alembic import op + +template_name = "std_calibration_complete" +old_content = (Path.cwd() / "versions" / "templates" / "emails" / "std_calibration_complete_new.txt").read_text() +new_content = (Path.cwd() / "versions" / "templates" / "emails" / "std_calibration_complete_newer.txt").read_text() + +# revision identifiers, used by Alembic. +revision = "705ed8cfc7be" +down_revision = "491102d56809" +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute( + f""" + UPDATE notification_templates + SET template=E'{new_content}' + WHERE name=E'{template_name}' + """ + ) + + +def downgrade(): + op.execute( + f""" + UPDATE notification_templates + SET template=E'{old_content}' + WHERE name=E'{template_name}' + """ + ) diff --git a/shared/workspaces/alembic/versions/8ccdd4674889_add_custom_text_option_to_std_.py b/shared/workspaces/alembic/versions/8ccdd4674889_add_custom_text_option_to_std_.py new file mode 100644 index 0000000000000000000000000000000000000000..f480a6045e44150e95f7e6b4ad5d9948b4f2a588 --- /dev/null +++ b/shared/workspaces/alembic/versions/8ccdd4674889_add_custom_text_option_to_std_.py @@ -0,0 +1,41 @@ +"""add custom text option to std_calibration_complete template + +Revision ID: 8ccdd4674889 +Revises: 28b6a6bfb73c +Create Date: 2023-08-24 10:05:59.908998 + +""" +from pathlib import Path + +import sqlalchemy as sa +from alembic import op + +template_name = "std_calibration_complete" +old_content = (Path.cwd() / "versions" / "templates" / "emails" / "std_calibration_complete_old.txt").read_text() +new_content = (Path.cwd() / "versions" / "templates" / "emails" / "std_calibration_complete_new.txt").read_text() + +# revision identifiers, used by Alembic. +revision = "8ccdd4674889" +down_revision = "28b6a6bfb73c" +branch_labels = None +depends_on = None + + +def upgrade(): + op.execute( + f""" + UPDATE notification_templates + SET template=E'{new_content}' + WHERE name=E'{template_name}' + """ + ) + + +def downgrade(): + op.execute( + f""" + UPDATE notification_templates + SET template=E'{old_content}' + WHERE name=E'{template_name}' + """ + ) diff --git a/shared/workspaces/alembic/versions/templates/emails/std_calibration_complete_new.txt b/shared/workspaces/alembic/versions/templates/emails/std_calibration_complete_new.txt new file mode 100644 index 0000000000000000000000000000000000000000..b7d9fd0065f1194e65c53c524edb8716ca5f98b5 --- /dev/null +++ b/shared/workspaces/alembic/versions/templates/emails/std_calibration_complete_new.txt @@ -0,0 +1,99 @@ +{{#version}}{{#parameters}}{{#metadata}}{{#is_srdp}}Subject: Calibration complete for {{sdm_id}} +{{#custom_text}}{{custom_text}}{{/custom_text}}{{^custom_text}}The results of this data processing request passed our quality assurance, with the following notes:{{/custom_text}} + +Hello, + +One of your Scheduling Blocks, + +{{sdm_id}}, observed on {{obs_end_time}}, {{bands}}, <filesize> + +has been processed through the VLA CASA Calibration Pipeline using CASA 6.2.1, which is designed to handle Stokes I continuum data, and is now available should you wish to access the calibrated data. + +These results have been checked by NRAO staff and notes about the quality assurance are below (these notes are also in the weblog). + +{{#workflow_metadata}}{{#qa}}{{qa}}{{/qa}}{{^qa}}No QA notes available.{{/qa}}{{/workflow_metadata}}{{^workflow_metadata}}No QA notes available.{{/workflow_metadata}} + +Accessing Pipeline Products: + +There are two main pipeline products you may be interested in: the calibrated Measurement Set (MS) or the smaller pipeline product tar file that includes the weblog, final calibration and flag tables, a restore script, and other small files related to the calibration. + +For the entire Calibrated MS and pipeline tar file: you will need to request a calibrated MS (CMS) from our new archive access tool at https://data.nrao.edu . To access the pipeline products, please follow these steps: + +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. + +Once logged in, you should be able to access your projects, both public and proprietary by selecting <yourusername>\'s data: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. + +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the "Add to clipboard" button to the left of that observation. + +Click the "Download" button at the top of the project list. + +In the pop-up window that opens, leave the default options the same: this should have the "Choose download data format:" option to "Calibrated Measurement Set", and the "Restore previous CMS" option should be filled in with a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar. Note that these two options are unavailable when more than one archive file is added to the clipboard. If the calibrated measurement set is needed for multiple scheduling blocks they must be downloaded one at a time. Since this calibration was done with CASA 6.2.1-7 leave the "CASA Version:" drop-down menu at this version. Now click the "Submit Request" button. + +Once ready, you should receive an email with download instructions. This restoration of the calibrated MS may take several hours or longer, depending on the specifics of your observation. + +===== + +For just the pipeline tar file (includes the weblog, final flag versions, final calibration tables, restore script, and other related small files) + +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. + +Once logged in, you should be able to access your projects, both public and proprietary: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. + +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the icon in the "Cals" column near the right side of the returned list, which should bring up a pop-up window to download a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar, and click "Submit Request". Once ready, you should receive an email with download instructions. + +____________ + +For more information about the pipeline, including instructions for rerunning the pipeline, applying pipeline calibration to raw data, or modification to suit your particular science goals, or access to the scripted pipeline please visit our pipeline web page: https://science.nrao.edu/facilities/vla/data-processing/pipeline + +For more information about the SRDP project, please see https://science.nrao.edu/srdp + +Please let us know if you have any questions or concerns through the NRAO Helpdesk (https://help.nrao.edu/) , using the VLA Pipeline department for questions about the pipeline processing, the VLA/VLBA Archive and Data Retrieval department for questions about data retrieval, and the VLA Data Products department for questions about quality assurance and the use of of Science-Ready (SRDP) products.{{/is_srdp}}{{^is_srdp}}Subject: Calibration complete for {{sdm_id}} + +Hello, + +One of your Scheduling Blocks has been processed through the VLA CASA Calibration Pipeline using CASA 6.2.1, which is designed to handle Stokes I continuum data, and is now available should you wish to access the calibrated data. + +{{sdm_id}}, observed on {{obs_end_time}}, {{bands}}, <filesize> + +{{#workflow_metadata}}{{#qa}}{{qa}}{{/qa}}{{^qa}}No QA notes available.{{/qa}}{{/workflow_metadata}}{{^workflow_metadata}}No QA notes available.{{/workflow_metadata}} + +Notes + +These products are not included in NRAO\'s Science Ready Data Products (SRDP) program but have been checked by NRAO staff for general quality. + +Some data may need further flagging before imaging: please check your data and the target calibration carefully before using the output from the pipeline for science! + +If your observations used a resolved calibrator source, but does not have standard model images in CASA, the pipeline calibration would not be accurate. In such instances, re-calibration using UV limits, or imaging the calibrator first and using the resulting image model, will be needed. + +If your science involves spectral lines, you should be aware of the following: + +1) The pipeline applies Hanning-smoothing by default, which may make the calibrated data set not optimal for certain spectral-line science. + +2) During the calibration process, several edge channels in each sub-band get flagged by default because they are noisier. Therefore, breaks in the frequency span get introduced in the pipeline calibrated data, which in turn may make the output not suitable for certain spectral-line science. + +3) The pipeline runs an RFI flagging algorithm which should flag strong lines and may remove spectral lines of interest to your science. + +Accessing Pipeline Products: + +There are two main pipeline products you may be interested in: the calibrated Measurement Set (MS) or the smaller pipeline product tar file that includes the weblog, final calibration and flag tables, a restore script, and other small files related to the calibration. +For the entire Calibrated MS and pipeline tar file: you will need to request a calibrated MS (CMS) from our new archive access tool at https://data.nrao.edu . To access the pipeline products, please follow these steps: + +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. +Once logged in, you should be able to access your projects, both public and proprietary by selecting <yourusername>\'s data: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the "Add to clipboard" button to the left of that observation. +Click the "Download" button at the top of the project list. +In the pop-up window that opens, leave the default options the same: this should have the "Choose download data format:" option to "Calibrated Measurement Set", and the "Restore previous CMS" option should be filled in with a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar. Note that these two options are unavailable when more than one archive file is added to the clipboard. If the calibrated measurement set is needed for multiple scheduling blocks they must be downloaded one at a time. Since this calibration was done with CASA , 6.2.1-7 leave the "CASA Version:" drop-down menu at this version. Now click the "Submit Request" button. +Once ready, you should receive an email with download instructions. This restoration of the calibrated MS may take several hours or longer, depending on the specifics of your observation. +===== +For just the pipeline tar file (includes the weblog, final flag versions, final calibration tables, restore script, and other related small files) +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. +Once logged in, you should be able to access your projects, both public and proprietary: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the icon in the "Cals" column near the right side of the returned list, which should bring up a pop-up window to download a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar, and click "Submit Request". Once ready, you should receive an email with download instructions. + +More Information: + +For more information about the pipeline, including access to the scripted pipeline, instructions for rerunning the pipeline, applying pipeline calibration to raw data, or modification to suit your particular science goals, please go here: +https://science.nrao.edu/facilities/vla/data-processing/pipeline + +Please let us know if you have any questions or concerns through the VLA Pipeline department of the Helpdesk at: +https://help.nrao.edu/{{/is_srdp}}{{/metadata}}{{/parameters}}{{/version}} diff --git a/shared/workspaces/alembic/versions/templates/emails/std_calibration_complete_newer.txt b/shared/workspaces/alembic/versions/templates/emails/std_calibration_complete_newer.txt new file mode 100644 index 0000000000000000000000000000000000000000..191a8e81d5e4bb09097c7d34e940c74797319468 --- /dev/null +++ b/shared/workspaces/alembic/versions/templates/emails/std_calibration_complete_newer.txt @@ -0,0 +1,102 @@ +{{#version}}{{#parameters}}{{#metadata}}{{#is_srdp}}Subject: Calibration complete for {{sdm_id}} + +Hello, + +One of your Scheduling Blocks, + +{{sdm_id}}, observed on {{obs_end_time}}, {{bands}}, <filesize> + +has been processed through the VLA CASA Calibration Pipeline using CASA 6.4.1, which is designed to handle Stokes I continuum data, and is now available should you wish to access the calibrated data. + +These results have been checked by NRAO staff and notes about the quality assurance are below. + +{{#custom_text}}{{custom_text}}{{/custom_text}}{{^custom_text}}The results of this data processing request passed our quality assurance, with the following notes:{{/custom_text}} + +The following notes are also in the weblog: + +{{#workflow_metadata}}{{#qa}}{{qa}}{{/qa}}{{^qa}}No QA notes available.{{/qa}}{{/workflow_metadata}}{{^workflow_metadata}}No QA notes available.{{/workflow_metadata}} + +Accessing Pipeline Products: + +There are two main pipeline products you may be interested in: the calibrated Measurement Set (MS) or the smaller pipeline product tar file that includes the weblog, final calibration and flag tables, a restore script, and other small files related to the calibration. + +For the entire Calibrated MS and pipeline tar file: you will need to request a calibrated MS (CMS) from our new archive access tool at https://data.nrao.edu . To access the pipeline products, please follow these steps: + +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. + +Once logged in, you should be able to access your projects, both public and proprietary by selecting <yourusername>\'s data: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. + +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the "Add to clipboard" button to the left of that observation. + +Click the "Download" button at the top of the project list. + +In the pop-up window that opens, leave the default options the same: this should have the "Choose download data format:" option to "Calibrated Measurement Set", and the "Restore previous CMS" option should be filled in with a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar. Note that these two options are unavailable when more than one archive file is added to the clipboard. If the calibrated measurement set is needed for multiple scheduling blocks they must be downloaded one at a time. Since this calibration was done with CASA 6.2.1-7 leave the "CASA Version:" drop-down menu at this version. Now click the "Submit Request" button. + +Once ready, you should receive an email with download instructions. This restoration of the calibrated MS may take several hours or longer, depending on the specifics of your observation. + +===== + +For just the pipeline tar file (includes the weblog, final flag versions, final calibration tables, restore script, and other related small files) + +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. + +Once logged in, you should be able to access your projects, both public and proprietary: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. + +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the icon in the "Cals" column near the right side of the returned list, which should bring up a pop-up window to download a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar, and click "Submit Request". Once ready, you should receive an email with download instructions. + +____________ + +For more information about the pipeline, including instructions for rerunning the pipeline, applying pipeline calibration to raw data, or modification to suit your particular science goals, or access to the scripted pipeline please visit our pipeline web page: https://science.nrao.edu/facilities/vla/data-processing/pipeline + +For more information about the SRDP project, please see https://science.nrao.edu/srdp + +Please let us know if you have any questions or concerns through the NRAO Helpdesk (https://help.nrao.edu/) , using the VLA Pipeline department for questions about the pipeline processing, the VLA/VLBA Archive and Data Retrieval department for questions about data retrieval, and the VLA Data Products department for questions about quality assurance and the use of of Science-Ready (SRDP) products.{{/is_srdp}}{{^is_srdp}}Subject: Calibration complete for {{sdm_id}} + +Hello, + +One of your Scheduling Blocks has been processed through the VLA CASA Calibration Pipeline using CASA 6.4.1, which is designed to handle Stokes I continuum data, and is now available should you wish to access the calibrated data. + +{{sdm_id}}, observed on {{obs_end_time}}, {{bands}}, <filesize> + +{{#workflow_metadata}}{{#qa}}{{qa}}{{/qa}}{{^qa}}No QA notes available.{{/qa}}{{/workflow_metadata}}{{^workflow_metadata}}No QA notes available.{{/workflow_metadata}} + +Notes + +These products are not included in NRAO\'s Science Ready Data Products (SRDP) program but have been checked by NRAO staff for general quality. + +Some data may need further flagging before imaging: please check your data and the target calibration carefully before using the output from the pipeline for science! + +If your observations used a resolved calibrator source, but does not have standard model images in CASA, the pipeline calibration would not be accurate. In such instances, re-calibration using UV limits, or imaging the calibrator first and using the resulting image model, will be needed. + +If your science involves spectral lines, you should be aware of the following: + +1) The pipeline applies Hanning-smoothing by default, which may make the calibrated data set not optimal for certain spectral-line science. + +2) During the calibration process, several edge channels in each sub-band get flagged by default because they are noisier. Therefore, breaks in the frequency span get introduced in the pipeline calibrated data, which in turn may make the output not suitable for certain spectral-line science. + +3) The pipeline runs an RFI flagging algorithm which should flag strong lines and may remove spectral lines of interest to your science. + +Accessing Pipeline Products: + +There are two main pipeline products you may be interested in: the calibrated Measurement Set (MS) or the smaller pipeline product tar file that includes the weblog, final calibration and flag tables, a restore script, and other small files related to the calibration. +For the entire Calibrated MS and pipeline tar file: you will need to request a calibrated MS (CMS) from our new archive access tool at https://data.nrao.edu . To access the pipeline products, please follow these steps: + +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. +Once logged in, you should be able to access your projects, both public and proprietary by selecting <yourusername>\'s data: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the "Add to clipboard" button to the left of that observation. +Click the "Download" button at the top of the project list. +In the pop-up window that opens, leave the default options the same: this should have the "Choose download data format:" option to "Calibrated Measurement Set", and the "Restore previous CMS" option should be filled in with a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar. Note that these two options are unavailable when more than one archive file is added to the clipboard. If the calibrated measurement set is needed for multiple scheduling blocks they must be downloaded one at a time. Since this calibration was done with CASA , 6.2.1-7 leave the "CASA Version:" drop-down menu at this version. Now click the "Submit Request" button. +Once ready, you should receive an email with download instructions. This restoration of the calibrated MS may take several hours or longer, depending on the specifics of your observation. +===== +For just the pipeline tar file (includes the weblog, final flag versions, final calibration tables, restore script, and other related small files) +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. +Once logged in, you should be able to access your projects, both public and proprietary: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the icon in the "Cals" column near the right side of the returned list, which should bring up a pop-up window to download a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar, and click "Submit Request". Once ready, you should receive an email with download instructions. + +More Information: + +For more information about the pipeline, including access to the scripted pipeline, instructions for rerunning the pipeline, applying pipeline calibration to raw data, or modification to suit your particular science goals, please go here: +https://science.nrao.edu/facilities/vla/data-processing/pipeline + +Please let us know if you have any questions or concerns through the VLA Pipeline department of the Helpdesk at: +https://help.nrao.edu/{{/is_srdp}}{{/metadata}}{{/parameters}}{{/version}} diff --git a/shared/workspaces/alembic/versions/templates/emails/std_calibration_complete_old.txt b/shared/workspaces/alembic/versions/templates/emails/std_calibration_complete_old.txt new file mode 100644 index 0000000000000000000000000000000000000000..d1c2a812773a8c0217e84aab177fc09a48852410 --- /dev/null +++ b/shared/workspaces/alembic/versions/templates/emails/std_calibration_complete_old.txt @@ -0,0 +1,98 @@ +{{#version}}{{#parameters}}{{#metadata}}{{#is_srdp}}Subject: Calibration complete for {{sdm_id}} + +Hello, + +One of your Scheduling Blocks, + +{{sdm_id}}, observed on {{obs_end_time}}, {{bands}}, <filesize> + +has been processed through the VLA CASA Calibration Pipeline using CASA 6.2.1, which is designed to handle Stokes I continuum data, and is now available should you wish to access the calibrated data. + +These results have been checked by NRAO staff and notes about the quality assurance are below (these notes are also in the weblog). + +{{#workflow_metadata}}{{#qa}}{{qa}}{{/qa}}{{^qa}}No QA notes available.{{/qa}}{{/workflow_metadata}}{{^workflow_metadata}}No QA notes available.{{/workflow_metadata}} + +Accessing Pipeline Products: + +There are two main pipeline products you may be interested in: the calibrated Measurement Set (MS) or the smaller pipeline product tar file that includes the weblog, final calibration and flag tables, a restore script, and other small files related to the calibration. + +For the entire Calibrated MS and pipeline tar file: you will need to request a calibrated MS (CMS) from our new archive access tool at https://data.nrao.edu . To access the pipeline products, please follow these steps: + +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. + +Once logged in, you should be able to access your projects, both public and proprietary by selecting <yourusername>\'s data: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. + +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the "Add to clipboard" button to the left of that observation. + +Click the "Download" button at the top of the project list. + +In the pop-up window that opens, leave the default options the same: this should have the "Choose download data format:" option to "Calibrated Measurement Set", and the "Restore previous CMS" option should be filled in with a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar. Note that these two options are unavailable when more than one archive file is added to the clipboard. If the calibrated measurement set is needed for multiple scheduling blocks they must be downloaded one at a time. Since this calibration was done with CASA 6.2.1-7 leave the "CASA Version:" drop-down menu at this version. Now click the "Submit Request" button. + +Once ready, you should receive an email with download instructions. This restoration of the calibrated MS may take several hours or longer, depending on the specifics of your observation. + +===== + +For just the pipeline tar file (includes the weblog, final flag versions, final calibration tables, restore script, and other related small files) + +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. + +Once logged in, you should be able to access your projects, both public and proprietary: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. + +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the icon in the "Cals" column near the right side of the returned list, which should bring up a pop-up window to download a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar, and click "Submit Request". Once ready, you should receive an email with download instructions. + +____________ + +For more information about the pipeline, including instructions for rerunning the pipeline, applying pipeline calibration to raw data, or modification to suit your particular science goals, or access to the scripted pipeline please visit our pipeline web page: https://science.nrao.edu/facilities/vla/data-processing/pipeline + +For more information about the SRDP project, please see https://science.nrao.edu/srdp + +Please let us know if you have any questions or concerns through the NRAO Helpdesk (https://help.nrao.edu/) , using the VLA Pipeline department for questions about the pipeline processing, the VLA/VLBA Archive and Data Retrieval department for questions about data retrieval, and the VLA Data Products department for questions about quality assurance and the use of of Science-Ready (SRDP) products.{{/is_srdp}}{{^is_srdp}}Subject: Calibration complete for {{sdm_id}} + +Hello, + +One of your Scheduling Blocks has been processed through the VLA CASA Calibration Pipeline using CASA 6.2.1, which is designed to handle Stokes I continuum data, and is now available should you wish to access the calibrated data. + +{{sdm_id}}, observed on {{obs_end_time}}, {{bands}}, <filesize> + +{{#workflow_metadata}}{{#qa}}{{qa}}{{/qa}}{{^qa}}No QA notes available.{{/qa}}{{/workflow_metadata}}{{^workflow_metadata}}No QA notes available.{{/workflow_metadata}} + +Notes + +These products are not included in NRAO\'s Science Ready Data Products (SRDP) program but have been checked by NRAO staff for general quality. + +Some data may need further flagging before imaging: please check your data and the target calibration carefully before using the output from the pipeline for science! + +If your observations used a resolved calibrator source, but does not have standard model images in CASA, the pipeline calibration would not be accurate. In such instances, re-calibration using UV limits, or imaging the calibrator first and using the resulting image model, will be needed. + +If your science involves spectral lines, you should be aware of the following: + +1) The pipeline applies Hanning-smoothing by default, which may make the calibrated data set not optimal for certain spectral-line science. + +2) During the calibration process, several edge channels in each sub-band get flagged by default because they are noisier. Therefore, breaks in the frequency span get introduced in the pipeline calibrated data, which in turn may make the output not suitable for certain spectral-line science. + +3) The pipeline runs an RFI flagging algorithm which should flag strong lines and may remove spectral lines of interest to your science. + +Accessing Pipeline Products: + +There are two main pipeline products you may be interested in: the calibrated Measurement Set (MS) or the smaller pipeline product tar file that includes the weblog, final calibration and flag tables, a restore script, and other small files related to the calibration. +For the entire Calibrated MS and pipeline tar file: you will need to request a calibrated MS (CMS) from our new archive access tool at https://data.nrao.edu . To access the pipeline products, please follow these steps: + +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. +Once logged in, you should be able to access your projects, both public and proprietary by selecting <yourusername>\'s data: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the "Add to clipboard" button to the left of that observation. +Click the "Download" button at the top of the project list. +In the pop-up window that opens, leave the default options the same: this should have the "Choose download data format:" option to "Calibrated Measurement Set", and the "Restore previous CMS" option should be filled in with a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar. Note that these two options are unavailable when more than one archive file is added to the clipboard. If the calibrated measurement set is needed for multiple scheduling blocks they must be downloaded one at a time. Since this calibration was done with CASA , 6.2.1-7 leave the "CASA Version:" drop-down menu at this version. Now click the "Submit Request" button. +Once ready, you should receive an email with download instructions. This restoration of the calibrated MS may take several hours or longer, depending on the specifics of your observation. +===== +For just the pipeline tar file (includes the weblog, final flag versions, final calibration tables, restore script, and other related small files) +Click the "Log in" link at the top right of this page and select the NRAO login, which should take you to a page where you will enter your my.nrao.edu login information. +Once logged in, you should be able to access your projects, both public and proprietary: navigate to the desired project and click the "+" symbol at the left to expand the list of available SBs. +Find the specific observation you want and if you would like to recreate the pipeline calibration, click the icon in the "Cals" column near the right side of the returned list, which should bring up a pop-up window to download a tar file named something like project-code_YYYY_MM_DD_THH_MM_SS.SSS.tar, and click "Submit Request". Once ready, you should receive an email with download instructions. + +More Information: + +For more information about the pipeline, including access to the scripted pipeline, instructions for rerunning the pipeline, applying pipeline calibration to raw data, or modification to suit your particular science goals, please go here: +https://science.nrao.edu/facilities/vla/data-processing/pipeline + +Please let us know if you have any questions or concerns through the VLA Pipeline department of the Helpdesk at: +https://help.nrao.edu/{{/is_srdp}}{{/metadata}}{{/parameters}}{{/version}} diff --git a/shared/workspaces/poetry.lock b/shared/workspaces/poetry.lock new file mode 100644 index 0000000000000000000000000000000000000000..e60e820a02e1f0a41c4aa16e3b57be80b6624b18 --- /dev/null +++ b/shared/workspaces/poetry.lock @@ -0,0 +1,657 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "chevron" +version = "0.14.0" +description = "Mustache templating language renderer" +optional = false +python-versions = "*" +files = [ + {file = "chevron-0.14.0-py3-none-any.whl", hash = "sha256:fbf996a709f8da2e745ef763f482ce2d311aa817d287593a5b990d6d6e4f0443"}, + {file = "chevron-0.14.0.tar.gz", hash = "sha256:87613aafdf6d77b6a90ff073165a61ae5086e21ad49057aa0e53681601800ebf"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cx-oracle" +version = "8.3.0" +description = "Python interface to Oracle" +optional = false +python-versions = "*" +files = [ + {file = "cx_Oracle-8.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b6a23da225f03f50a81980c61dbd6a358c3575f212ca7f4c22bb65a9faf94f7f"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win32.whl", hash = "sha256:715a8bbda5982af484ded14d184304cc552c1096c82471dd2948298470e88a04"}, + {file = "cx_Oracle-8.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:07f01608dfb6603a8f2a868fc7c7bdc951480f187df8dbc50f4d48c884874e6a"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4b3afe7a911cebaceda908228d36839f6441cbd38e5df491ec25960562bb01a0"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win32.whl", hash = "sha256:076ffb71279d6b2dcbf7df028f62a01e18ce5bb73d8b01eab582bf14a62f4a61"}, + {file = "cx_Oracle-8.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:b82e4b165ffd807a2bd256259a6b81b0a2452883d39f987509e2292d494ea163"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b902db61dcdcbbf8dd981f5a46d72fef40c5150c7fc0eb0f0698b462d6eb834e"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win32.whl", hash = "sha256:4c82ca74442c298ceec56d207450c192e06ecf8ad52eb4aaad0812e147ceabf7"}, + {file = "cx_Oracle-8.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:54164974d526b76fdefb0b66a42b68e1fca5df78713d0eeb8c1d0047b83f6bcf"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:410747d542e5f94727f5f0e42e9706c772cf9094fb348ce965ab88b3a9e4d2d8"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win32.whl", hash = "sha256:3baa878597c5fadb2c72f359f548431c7be001e722ce4a4ebdf3d2293a1bb70b"}, + {file = "cx_Oracle-8.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:de42bdc882abdc5cea54597da27a05593b44143728e5b629ad5d35decb1a2036"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:df412238a9948340591beee9ec64fa62a2efacc0d91107034a7023e2991fba97"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win32.whl", hash = "sha256:70d3cf030aefd71f99b45beba77237b2af448adf5e26be0db3d0d3dee6ea4230"}, + {file = "cx_Oracle-8.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:bf01ce87edb4ef663b2e5bd604e1e0154d2cc2f12b60301f788b569d9db8a900"}, + {file = "cx_Oracle-8.3.0.tar.gz", hash = "sha256:3b2d215af4441463c97ea469b9cc307460739f89fdfa8ea222ea3518f1a424d9"}, +] + +[[package]] +name = "dnspython" +version = "2.3.0" +description = "DNS toolkit" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "dnspython-2.3.0-py3-none-any.whl", hash = "sha256:89141536394f909066cabd112e3e1a37e4e654db00a25308b0f130bc3152eb46"}, + {file = "dnspython-2.3.0.tar.gz", hash = "sha256:224e32b03eb46be70e12ef6d64e0be123a64e621ab4c0822ff6d450d52a540b9"}, +] + +[package.extras] +curio = ["curio (>=1.2,<2.0)", "sniffio (>=1.1,<2.0)"] +dnssec = ["cryptography (>=2.6,<40.0)"] +doh = ["h2 (>=4.1.0)", "httpx (>=0.21.1)", "requests (>=2.23.0,<3.0.0)", "requests-toolbelt (>=0.9.1,<0.11.0)"] +doq = ["aioquic (>=0.9.20)"] +idna = ["idna (>=2.1,<4.0)"] +trio = ["trio (>=0.14,<0.23)"] +wmi = ["wmi (>=1.5.1,<2.0.0)"] + +[[package]] +name = "email-validator" +version = "2.0.0" +description = "A robust email address syntax and deliverability validation library." +optional = false +python-versions = ">=3.7" +files = [ + {file = "email_validator-2.0.0-py3-none-any.whl", hash = "sha256:07c61b62ee446e39274b18204afa8e422baf64570776045272b04d10c02f64f6"}, + {file = "email_validator-2.0.0.tar.gz", hash = "sha256:f4904f4145c11f8de5897afbb8d7db4b465c57f13db1c8c106c16d02bceebd9a"}, +] + +[package.dependencies] +dnspython = ">=2.0.0" +idna = ">=2.0.0" + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, + {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, + {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, + {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, + {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, + {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, + {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, + {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, + {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, + {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, + {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, + {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, + {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, + {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, + {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, + {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, + {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, + {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, + {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, + {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, + {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, + {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, + {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, + {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, + {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, + {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, + {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, + {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, + {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, + {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, + {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, + {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, + {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, + {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, + {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, + {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, + {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, + {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +] + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "immutable-views" +version = "0.6.1" +description = "Immutable views on other collection objects" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "immutable-views-0.6.1.tar.gz", hash = "sha256:48e0543786e8a196667fb8412ce35c4f555ce08f39eab21dcf4b0a23d8d19295"}, + {file = "immutable_views-0.6.1-py2.py3-none-any.whl", hash = "sha256:549dbe1106c53e26da28e1ab0f19f54ff20592cc6590f791ffd060de140c1aff"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "marshmallow" +version = "3.19.0" +description = "A lightweight library for converting complex datatypes to and from native Python datatypes." +optional = false +python-versions = ">=3.7" +files = [ + {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, + {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, +] + +[package.dependencies] +packaging = ">=17.0" + +[package.extras] +dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +tests = ["pytest", "pytz", "simplejson"] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pendulum" +version = "2.1.2" +description = "Python datetimes made easy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pendulum-2.1.2-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:b6c352f4bd32dff1ea7066bd31ad0f71f8d8100b9ff709fb343f3b86cee43efe"}, + {file = "pendulum-2.1.2-cp27-cp27m-win_amd64.whl", hash = "sha256:318f72f62e8e23cd6660dbafe1e346950281a9aed144b5c596b2ddabc1d19739"}, + {file = "pendulum-2.1.2-cp35-cp35m-macosx_10_15_x86_64.whl", hash = "sha256:0731f0c661a3cb779d398803655494893c9f581f6488048b3fb629c2342b5394"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:3481fad1dc3f6f6738bd575a951d3c15d4b4ce7c82dce37cf8ac1483fde6e8b0"}, + {file = "pendulum-2.1.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9702069c694306297ed362ce7e3c1ef8404ac8ede39f9b28b7c1a7ad8c3959e3"}, + {file = "pendulum-2.1.2-cp35-cp35m-win_amd64.whl", hash = "sha256:fb53ffa0085002ddd43b6ca61a7b34f2d4d7c3ed66f931fe599e1a531b42af9b"}, + {file = "pendulum-2.1.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:c501749fdd3d6f9e726086bf0cd4437281ed47e7bca132ddb522f86a1645d360"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c807a578a532eeb226150d5006f156632df2cc8c5693d778324b43ff8c515dd0"}, + {file = "pendulum-2.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2d1619a721df661e506eff8db8614016f0720ac171fe80dda1333ee44e684087"}, + {file = "pendulum-2.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:f888f2d2909a414680a29ae74d0592758f2b9fcdee3549887779cd4055e975db"}, + {file = "pendulum-2.1.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e95d329384717c7bf627bf27e204bc3b15c8238fa8d9d9781d93712776c14002"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4c9c689747f39d0d02a9f94fcee737b34a5773803a64a5fdb046ee9cac7442c5"}, + {file = "pendulum-2.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1245cd0075a3c6d889f581f6325dd8404aca5884dea7223a5566c38aab94642b"}, + {file = "pendulum-2.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:db0a40d8bcd27b4fb46676e8eb3c732c67a5a5e6bfab8927028224fbced0b40b"}, + {file = "pendulum-2.1.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f5e236e7730cab1644e1b87aca3d2ff3e375a608542e90fe25685dae46310116"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:de42ea3e2943171a9e95141f2eecf972480636e8e484ccffaf1e833929e9e052"}, + {file = "pendulum-2.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7c5ec650cb4bec4c63a89a0242cc8c3cebcec92fcfe937c417ba18277d8560be"}, + {file = "pendulum-2.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:33fb61601083f3eb1d15edeb45274f73c63b3c44a8524703dc143f4212bf3269"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:29c40a6f2942376185728c9a0347d7c0f07905638c83007e1d262781f1e6953a"}, + {file = "pendulum-2.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:94b1fc947bfe38579b28e1cccb36f7e28a15e841f30384b5ad6c5e31055c85d7"}, + {file = "pendulum-2.1.2.tar.gz", hash = "sha256:b06a0ca1bfe41c990bbf0c029f0b6501a7f2ec4e38bfec730712015e8860f207"}, +] + +[package.dependencies] +python-dateutil = ">=2.6,<3.0" +pytzdata = ">=2020.1" + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pycapo" +version = "0.3.1" +description = "CAPO (CASA, Archive, and Pipeline Options) for Python" +optional = false +python-versions = "*" +files = [ + {file = "pycapo-0.3.1-py3-none-any.whl", hash = "sha256:9b85c00a37a101ba3a61f70e388d906e9a6a6fbce1f60fd8343e0626c50a7c35"}, + {file = "pycapo-0.3.1.tar.gz", hash = "sha256:38c19769964400c66a5dff09b61e57d439f900ba097b3a6966660e33d43a125f"}, +] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytzdata" +version = "2020.1" +description = "The Olson timezone database for Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pytzdata-2020.1-py2.py3-none-any.whl", hash = "sha256:e1e14750bcf95016381e4d472bad004eef710f2d6417240904070b3d6654485f"}, + {file = "pytzdata-2020.1.tar.gz", hash = "sha256:3efa13b335a00a8de1d345ae41ec78dd11c9f8807f522d39850f2dd828681540"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sqlalchemy" +version = "1.4.47" +description = "Database Abstraction Library" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "SQLAlchemy-1.4.47-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:dcfb480bfc9e1fab726003ae00a6bfc67a29bad275b63a4e36d17fe7f13a624e"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:28fda5a69d6182589892422c5a9b02a8fd1125787aab1d83f1392aa955bf8d0a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win32.whl", hash = "sha256:45e799c1a41822eba6bee4e59b0e38764e1a1ee69873ab2889079865e9ea0e23"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27m-win_amd64.whl", hash = "sha256:10edbb92a9ef611f01b086e271a9f6c1c3e5157c3b0c5ff62310fb2187acbd4a"}, + {file = "SQLAlchemy-1.4.47-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7a4df53472c9030a8ddb1cce517757ba38a7a25699bbcabd57dcc8a5d53f324e"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:511d4abc823152dec49461209607bbfb2df60033c8c88a3f7c93293b8ecbb13d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbe57f39f531c5d68d5594ea4613daa60aba33bb51a8cc42f96f17bbd6305e8d"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca8ab6748e3ec66afccd8b23ec2f92787a58d5353ce9624dccd770427ee67c82"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299b5c5c060b9fbe51808d0d40d8475f7b3873317640b9b7617c7f988cf59fda"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win32.whl", hash = "sha256:684e5c773222781775c7f77231f412633d8af22493bf35b7fa1029fdf8066d10"}, + {file = "SQLAlchemy-1.4.47-cp310-cp310-win_amd64.whl", hash = "sha256:2bba39b12b879c7b35cde18b6e14119c5f1a16bd064a48dd2ac62d21366a5e17"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:795b5b9db573d3ed61fae74285d57d396829e3157642794d3a8f72ec2a5c719b"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:989c62b96596b7938cbc032e39431e6c2d81b635034571d6a43a13920852fb65"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3b67bda733da1dcdccaf354e71ef01b46db483a4f6236450d3f9a61efdba35a"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win32.whl", hash = "sha256:9a198f690ac12a3a807e03a5a45df6a30cd215935f237a46f4248faed62e69c8"}, + {file = "SQLAlchemy-1.4.47-cp311-cp311-win_amd64.whl", hash = "sha256:03be6f3cb66e69fb3a09b5ea89d77e4bc942f3bf84b207dba84666a26799c166"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:16ee6fea316790980779268da47a9260d5dd665c96f225d28e7750b0bb2e2a04"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:557675e0befafa08d36d7a9284e8761c97490a248474d778373fb96b0d7fd8de"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bb2797fee8a7914fb2c3dc7de404d3f96eb77f20fc60e9ee38dc6b0ca720f2c2"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28297aa29e035f29cba6b16aacd3680fbc6a9db682258d5f2e7b49ec215dbe40"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win32.whl", hash = "sha256:998e782c8d9fd57fa8704d149ccd52acf03db30d7dd76f467fd21c1c21b414fa"}, + {file = "SQLAlchemy-1.4.47-cp36-cp36m-win_amd64.whl", hash = "sha256:dde4d02213f1deb49eaaf8be8a6425948963a7af84983b3f22772c63826944de"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:e98ef1babe34f37f443b7211cd3ee004d9577a19766e2dbacf62fce73c76245a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14a3879853208a242b5913f3a17c6ac0eae9dc210ff99c8f10b19d4a1ed8ed9b"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7120a2f72599d4fed7c001fa1cbbc5b4d14929436135768050e284f53e9fbe5e"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:048509d7f3ac27b83ad82fd96a1ab90a34c8e906e4e09c8d677fc531d12c23c5"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win32.whl", hash = "sha256:6572d7c96c2e3e126d0bb27bfb1d7e2a195b68d951fcc64c146b94f088e5421a"}, + {file = "SQLAlchemy-1.4.47-cp37-cp37m-win_amd64.whl", hash = "sha256:a6c3929df5eeaf3867724003d5c19fed3f0c290f3edc7911616616684f200ecf"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:71d4bf7768169c4502f6c2b0709a02a33703544f611810fb0c75406a9c576ee1"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd45c60cc4f6d68c30d5179e2c2c8098f7112983532897566bb69c47d87127d3"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0fdbb8e9d4e9003f332a93d6a37bca48ba8095086c97a89826a136d8eddfc455"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f216a51451a0a0466e082e163591f6dcb2f9ec182adb3f1f4b1fd3688c7582c"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win32.whl", hash = "sha256:bd988b3362d7e586ef581eb14771bbb48793a4edb6fcf62da75d3f0f3447060b"}, + {file = "SQLAlchemy-1.4.47-cp38-cp38-win_amd64.whl", hash = "sha256:32ab09f2863e3de51529aa84ff0e4fe89a2cb1bfbc11e225b6dbc60814e44c94"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:07764b240645627bc3e82596435bd1a1884646bfc0721642d24c26b12f1df194"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e2a42017984099ef6f56438a6b898ce0538f6fadddaa902870c5aa3e1d82583"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6b6d807c76c20b4bc143a49ad47782228a2ac98bdcdcb069da54280e138847fc"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a94632ba26a666e7be0a7d7cc3f7acab622a04259a3aa0ee50ff6d44ba9df0d"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win32.whl", hash = "sha256:f80915681ea9001f19b65aee715115f2ad310730c8043127cf3e19b3009892dd"}, + {file = "SQLAlchemy-1.4.47-cp39-cp39-win_amd64.whl", hash = "sha256:fc700b862e0a859a37faf85367e205e7acaecae5a098794aff52fdd8aea77b12"}, + {file = "SQLAlchemy-1.4.47.tar.gz", hash = "sha256:95fc02f7fc1f3199aaa47a8a757437134cf618e9d994c84effd53f530c38586f"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\")"} + +[package.extras] +aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"] +mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx-oracle (>=7)", "cx-oracle (>=7,<8)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +pymysql = ["pymysql", "pymysql (<1)"] +sqlcipher = ["sqlcipher3-binary"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "transaction" +version = "3.1.0" +description = "Transaction management for Python" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "transaction-3.1.0-py2.py3-none-any.whl", hash = "sha256:8376a959aa71821df1bdd7d066858a3f9f34b7f5f1c0a0e1efbd11d626895449"}, + {file = "transaction-3.1.0.tar.gz", hash = "sha256:65d0b1ea92dbe7c4e3b237fb6bd8b41dea23d7459e7bdd8c3880bffdaf912fa4"}, +] + +[package.dependencies] +"zope.interface" = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["mock"] +testing = ["coverage", "mock", "nose"] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "zope-interface" +version = "6.0" +description = "Interfaces for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, + {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, + {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, + {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, + {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, + {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, + {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, + {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, + {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, + {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, + {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, + {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, + {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, + {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, + {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, + {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, + {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, +] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] +testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "2025f1b28db6d64ba57eb373c11283c8b13b1d0f76a34b8b3ccad514e949678d" diff --git a/shared/workspaces/pyproject.toml b/shared/workspaces/pyproject.toml index 9123331acac0f80d1685ca636ec7717c93eaa43e..37b8e90d953d650f68ff51cdd865a981217fe3bb 100644 --- a/shared/workspaces/pyproject.toml +++ b/shared/workspaces/pyproject.toml @@ -1,9 +1,28 @@ +[tool.poetry] +name = "workspaces" +version = "2.8.2rc1" +description = "SSA Workspaces shared library" +authors = ["DMS SSA <dms-ssa@nrao.edu>"] +license = "GPL3+" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.10" +pycapo = "^0.3.1" +marshmallow = "^3.19.0" +sqlalchemy = "1.4.47" +cx-oracle = "^8.3.0" +chevron = "^0.14.0" +requests = "^2.29.0" +transaction = "^3.1.0" +immutable-views = "^0.6.1" +pendulum = "^2.1.2" +email-validator = "2.0.0" + + +[tool.poetry.group.test.dependencies] +pytest = "^7.3.1" + [build-system] -requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2"] - -[tool.setuptools_scm] -write_to = "workspaces/_version.py" -write_to_template = """ -\"\"\"Version information for this package, don't put anything else here.\"\"\" -___version___ = '{version}' -""" +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/shared/workspaces/setup.py b/shared/workspaces/setup.py deleted file mode 100644 index e60f364b654f17c283e260688bc559f91d98137f..0000000000000000000000000000000000000000 --- a/shared/workspaces/setup.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/python -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -# -*- coding: utf-8 -*- - -from pathlib import Path - -from setuptools import find_packages, setup - -VERSION = open("workspaces/_version.py").readlines()[-1].split()[-1].strip("\"'") -README = Path("README.md").read_text() - -requires = [ - "pycapo", - "marshmallow", - "ssa-schema", - "sqlalchemy==1.4.46", - "cx-Oracle", - "chevron", - "requests", - "transaction", - "immutable_views", - "email-validator==2.0.0", -] - -setup( - name="ssa-" + Path().absolute().name, - version=VERSION, - description="Workspaces support library", - long_description=README, - author="NRAO SSA Team", - author_email="dms-ssa@nrao.edu", - url="TBD", - license="GPL", - install_requires=requires, - keywords=[], - packages=find_packages(), - classifiers=["Programming Language :: Python :: 3.10"], - entry_points={"console_scripts": ["workflow = workspaces.cli:main"]}, -) diff --git a/shared/workspaces/test/test_data/products/__init__.py b/shared/workspaces/test/test_data/products/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/shared/workspaces/test/test_data/products/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/shared/workspaces/test/test_data/products/expected_values_alma.py b/shared/workspaces/test/test_data/products/expected_values_alma.py deleted file mode 100644 index 0f7193d13780ae647fefdf5b3b0761254cd2aed9..0000000000000000000000000000000000000000 --- a/shared/workspaces/test/test_data/products/expected_values_alma.py +++ /dev/null @@ -1,326 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Test data: ALMA download products """ - -import warnings - -from sqlalchemy import exc as sa_exc - -from schema import Author, ExecutionBlock, Project, ScienceProduct - -from ..utilities import get_file_info_from_json_file -from .expected_values_evla import ( - CASA_LOG, - EXECUTION_BLOCK, - METADATA_INGESTION_DATE, - PPR_FILENAME, -) - -EXEC_BLOCK = "execblock" -CALIBRATED = "CALIBRATED" -WEBLOG = "weblog.tgz" -PIPELINE_MANIFEST = "unknown.download_alma_ms.pipeline_manifest.xml" -PIPELINE_AQUAREPORT = "pipeline_aquareport.xml" -CASA_PIPESCRIPT = "casa_pipescript.py" -AUX_PRODUCTS = "unknown.download_alma_ms.auxproducts.tgz" -MS_PP_REQUEST = "unknown.download_alma_ms.pprequest.xml" - -# pylint: disable=R0201, R0801, R0902, R0903 - - -class AlmaPublicProductSet: - """Test data for ALMA project 2017.1.00297.S""" - - def __init__(self): - self.project = self.build_project() - self.exec_blocks = self.build_exec_blocks() - self.science_products = self.build_science_products() - self.file_info = get_file_info_from_json_file("A001_X1296_Xa93_RAW.json") - self.rawdata_total_size = self._compute_rawdata_size() - self.measurement_set, self.basic_ms_size = self.build_basic_ms() - self.restored_ms, self.rest_ms_size = self.build_restored_ms() - - def build_project(self) -> Project: - """Returns project metadata for 2017.1.00297.S, - including authors' details - """ - - with warnings.catch_warnings(): - # Suppress SQLAlchemy warnings - warnings.simplefilter("ignore", category=sa_exc.SAWarning) - - project_code = "2017.1.00297.S" - project = Project( - project_code=project_code, - starttime=56799.3877155556, - endtime=56799.4128683333, - proprietary_duration=365, - total_observation_time=0.0583143749972805, - title="Copy of 2012.1.00060.S for testing", - abstract="Understanding the physical factors that control the conversion of interstellar gas into stars is of fundamental importance for both developing a predictive physical theory of star formation and understanding the evolution of galaxies from the earliest epochs of cosmic history to the present time. An important aspect of this question is the study of empirical relations that connect the star formation rate in a given region to local properties of the interstellar medium. An important example is the Schmidt-Kennicutt (KS) law for galaxies that relates the surface densities of the star formation rate and the surface densities of interstellar gas in a non-linear fashion. However, it is also known that there is a linear correlation between the total SFR in galaxies and the mass of dense molecular gas as traced by the high excitation HCN molecule. Contrary to the KS relation, this scaling relation suggests that the total SFR depends simply on the total amount of dense molecular gas in a star forming system. Recently, we have begun to test these scaling relations in the Galactic neighborhood where star formation rates can be much better constrained. We found that for local clouds the total SFR scales most directly, and linearly, with the total mass of high extinction (and dense) molecular gas. Furthermore, we found this linear scaling law between SFR and dense gas to extend and extrapolate directly and smoothly to external galaxies. Moreover, our observations also demonstrate that a KS type relation does not exist for molecular clouds in the Galactic neighborhood. This is a direct consequence of a well known scaling law between the mass and size of molecular clouds, Larson's third law. Overall, our results indicate that a linear scaling law, in which the total amount of dense gas controls the SFR, is the fundamental physical relation that connects star formation across the vast scales from individual GMCs to entire galaxies. Critical testing of these ideas require resolved observations of GMCs in external galaxies. Here we propose to use ALMA to evaluate star formation scaling laws in a nearby galaxy where we can obtain resolved observations of individual GMCs. This allows us to obtain observations of a larger sample of GMCs than is accessible in the Galactic neighborhood. An extensive APEX survey of HII regions in the nearby galaxy NGC 300 has provided us with a sample of 36 star-forming regions with CO(2-1) detections and 42 upper limits. We are currently working on obtaining star formation rates for these regions from multi-wavelength ancillary data including our Herschel observations. We propose to use ALMA's unequalled capabilities to obtain snapshot observations of 40 selected regions in CO(2-1) in order to make resolved measurements of cloud structure to obtain sizes and virial masses. As a pilot project, we also propose to observe the brightest subsample in HCN(1-0) as a dense-gas tracer. Our proposed ALMA CO observations will enable us to to test Larson's scaling laws in an external galaxy and to evaluate which formulation of the Schmidt law is the most meaningful and appropriate to apply to spiral galaxies, and in doing so refine Schmidt's original conjecture of a scaling relation between the rate of star formation and gas density.", - ) - project.authors = [ - Author( - project_code=project_code, - author_id=32550, - username="franzbauer", - firstname="Franz", - lastname="Bauer", - pst_person_id=None, - is_pi=True, - ), - Author( - project_code=project_code, - author_id=32551, - username="ezetre", - firstname="Ezequiel", - lastname="Treister", - pst_person_id=None, - is_pi=False, - ), - Author( - project_code=project_code, - author_id=32552, - username="lho", - firstname="Luis", - lastname="Ho", - pst_person_id=None, - is_pi=False, - ), - Author( - project_code=project_code, - author_id=32554, - username="jyshangguan", - firstname="Jinyi", - lastname="Shangguan", - pst_person_id=None, - is_pi=False, - ), - Author( - project_code=project_code, - author_id=32553, - username="rwang", - firstname="Ran", - lastname="Wang", - pst_person_id=None, - is_pi=False, - ), - ] - - return project - - def build_exec_blocks(self) -> list: - """Returns execution blocks for OUS uid://A001/X1296/Xa93.""" - alma_ous_id = "uid://A001/X1296/Xa93" - band_code = "05" - - return [ - ExecutionBlock( - project_code=self.project.project_code, - execution_block_id=102209, - alma_ous_id=alma_ous_id, - band_code=band_code, - filegroup_id=212043, - ngas_fileset_id="uid___A002_Xcd8029_Xa892", - starttime=58256.0535855556, - endtime=58256.1137983333, - calibration_status=CALIBRATED, - ), - ExecutionBlock( - project_code=self.project.project_code, - execution_block_id=102169, - alma_ous_id=alma_ous_id, - band_code=band_code, - filegroup_id=211958, - ngas_fileset_id="uid___A002_Xcd8029_Xfdd", - starttime=58255.0338461111, - endtime=58255.0919594444, - calibration_status=CALIBRATED, - ), - ExecutionBlock( - project_code=self.project.project_code, - execution_block_id=102211, - alma_ous_id=alma_ous_id, - band_code=band_code, - filegroup_id=212047, - ngas_fileset_id="uid___A002_Xcd8029_Xb0a4", - starttime=58256.1152683333, - endtime=58256.1753838889, - calibration_status=CALIBRATED, - ), - ] - - def build_science_products(self) -> list: - """Returns science products assocated with project""" - - external_system = "ALMA Operations" - return [ - ScienceProduct( - external_name="uid___A002_Xcd8029_Xfdd", - filegroup_id=211958, - external_system=external_system, - metadata_ingestion_date=METADATA_INGESTION_DATE, - metadata_ingestion_version="1", - science_product_type=EXECUTION_BLOCK, - ), - ScienceProduct( - external_name="uid___A002_Xcd8029_Xb0a4", - filegroup_id=212047, - external_system=external_system, - metadata_ingestion_date=METADATA_INGESTION_DATE, - metadata_ingestion_version="1", - science_product_type=EXECUTION_BLOCK, - ), - ScienceProduct( - external_name="uid___A002_Xcd8029_Xa892", - filegroup_id=212043, - external_system=external_system, - metadata_ingestion_date=METADATA_INGESTION_DATE, - metadata_ingestion_version="1", - science_product_type=EXECUTION_BLOCK, - ), - ] - - def build_basic_ms(self) -> tuple: - """Returns basic measurement set metadata""" - - ms_info = { - "uid___A002_Xcd8029_Xa892": { - "uid___A002_Xcd8029_Xa892.400887655.tar.gz": 504369560, - PIPELINE_MANIFEST: 804, - CASA_PIPESCRIPT: 680, - PPR_FILENAME: 4584, - WEBLOG: 1592335, - MS_PP_REQUEST: 4584, - AUX_PRODUCTS: 839, - CASA_LOG: 1729, - PIPELINE_AQUAREPORT: 3472, - "uid___A002_Xcd8029_Xa892.ms.tgz": 519234359, - }, - "uid___A002_Xcd8029_Xb0a4": { - "uid___A002_Xcd8029_Xb0a4.400887655.tar.gz": 503501127, - PIPELINE_MANIFEST: 804, - CASA_LOG: 1729, - WEBLOG: 1576475, - CASA_PIPESCRIPT: 680, - PIPELINE_AQUAREPORT: 3465, - "uid___A002_Xcd8029_Xb0a4.ms.tgz": 518582184, - AUX_PRODUCTS: 844, - PPR_FILENAME: 4584, - MS_PP_REQUEST: 4584, - }, - "uid___A002_Xcd8029_Xfdd": { - "uid___A002_Xcd8029_Xfdd.400887655.tar.gz": 489883578, - PIPELINE_MANIFEST: 802, - PIPELINE_AQUAREPORT: 3460, - PPR_FILENAME: 4582, - MS_PP_REQUEST: 4582, - WEBLOG: 1562579, - "uid___A002_Xcd8029_Xfdd.ms.tgz": 504128830, - CASA_LOG: 1723, - AUX_PRODUCTS: 836, - CASA_PIPESCRIPT: 679, - }, - } - - total_size = 0 - for mous in ms_info.keys(): - for _, size in ms_info[mous].items(): - total_size += size - - return ms_info, total_size - - def build_restored_ms(self): - """Returns restored measurement set metadata""" - ms_info = { - "uid___A002_Xcd8029_Xb0a4": { - "uid___A002_Xcd8029_Xb0a4.ms.tgz": 1325422495, - "uid___A002_Xcd8029_Xa892.ms.tgz": 1331336708, - "uid___A002_Xcd8029_Xfdd.ms.tgz": 1290775660, - PPR_FILENAME: 5158, - }, - } - total_size = 0 - for _, size in ms_info["uid___A002_Xcd8029_Xb0a4"].items(): - total_size += size - return ms_info, total_size - - def _compute_rawdata_size(self): - total_size = 0 - for file_type in self.file_info.keys(): - metadata = self.file_info[file_type] - for item in metadata.items(): - total_size += item[1] - return total_size - - -class AlmaProprietaryImageProductSet: - """proprietary project 2019.1.00914.S, with image data""" - - def __init__(self): - self.project_code = "2019.1.00914.S" - self.file_info, self.total_size = self._build_file_info() - - def _build_file_info(self) -> tuple: - """ - TODO - :return: - """ - - img_files_metadata = [ - get_file_info_from_json_file("ALMA_CONT_IMG_4d1b66da.json"), - get_file_info_from_json_file("ALMA_CONT_IMG_71595054.json"), - get_file_info_from_json_file("ALMA_IMG_CUBE.json"), - ] - - file_info = {} - total_size = 0 - for metadata in img_files_metadata: - files = metadata["files"] - for file in files: - file_info[file["ngas_file_id"]] = file["size"] - total_size += file["size"] - return file_info, total_size - - -class AlmaAudiProductSet: - """AUDI products for project 2019.1.00914.S""" - - def __init__(self): - self.science_products = self.build_science_products() - self.file_info = get_file_info_from_json_file("A001_X1296_Xa93_RAW.json") - self.total_size = self._compute_total_size() - - def _compute_total_size(self): - total_size = 0 - for file_type in self.file_info.keys(): - metadata = self.file_info[file_type] - for item in metadata.items(): - total_size += item[1] - return total_size - - def build_science_products(self) -> list: - """Returns 2019.1.00914.S science product in list""" - - return [ - ScienceProduct( - external_name="uid___A002_Xe5aacf_Xdde3", - filegroup_id=398280, - science_product_type=EXECUTION_BLOCK, - ) - ] diff --git a/shared/workspaces/test/test_data/products/expected_values_evla.py b/shared/workspaces/test/test_data/products/expected_values_evla.py deleted file mode 100644 index fdaed8a3e04c8f0bcc769c86092ca36da989ef08..0000000000000000000000000000000000000000 --- a/shared/workspaces/test/test_data/products/expected_values_evla.py +++ /dev/null @@ -1,699 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Test data for two VLA EBs, a calibration product, and VLBA and VLASS - image products -""" -import datetime -import warnings - -from sqlalchemy import exc as sa_exc - -from schema import Author, ExecutionBlock, Project, ScienceProduct - -from ..utilities import ( - DATE_FORMAT, - DATETIME_FORMAT, - get_exec_block_details_from_loc_report, - get_file_info_from_loc_report, - get_locations_report, -) - -# pylint: disable=C0301, R0201 - -METADATA_INGESTION_DATE = datetime.datetime.strptime("2019-12-12 16:04:02.11191", DATETIME_FORMAT) -EXECUTION_BLOCK = "Execution Block" -PPR_FILENAME = "PPR.xml" -CASA_LOG = "casa_commands.log" -MANIFEST = "unknown.pipeline_manifest.xml" -DO_NOT_CALIBRATE = "Do Not Calibrate" -VLBA_OPERATIONS = "VLBA Operations" - - -class VlaProductSet: - """Encapsulates project 17A-109's products""" - - def __init__(self): - self.project = self.build_project() - self.exec_blocks = self.build_exec_blocks() - self.science_products = self.build_science_products() - self.file_info, self.total_size = get_exec_block_details_from_loc_report("17a-109_fg_", self.exec_blocks) - self.measurement_set = self.build_basic_ms() - self.cms = self.build_cms() - - def build_project(self) -> Project: - """Construct VlaProductSet for 17A-109""" - - with warnings.catch_warnings(): - # Suppress SQLAlchemy warnings - warnings.simplefilter("ignore", category=sa_exc.SAWarning) - - project = Project( - project_code="17A-109", - starttime=57795.8403622685, - endtime=57892.7843396991, - title="A detailed study of the jet-galaxy interaction in Minkowski's Object", - abstract="Minkowski's Object is a dwarf starforming galaxy interacting with an FRI radio jet from a nearby elliptical galaxy. It has been proposed as a prototype for jet-induced star formation, a hypothesis consistent with our recent ALMA observations that map the CO 1-0 emission in the galaxy. In order to better understand the nature of the interaction, we are requesting C- and Ku-band observations at matched resolution to our ALMA and archival VLA L-band data. Faraday synthesis of the C-band polarimetric data will allow us to study the geometry of the interaction, in particular how well the relativistic electron population is mixed with the ionized gas in the star forming region. This will give us important information for our simulations of the interaction and the triggering of star formation in Minkowski's Object. In turn, this will inform on the conditions where jet-induced star formation is likely in higher redshift objects. We will use the combination of the C- and Ku-band data to investigate the variation the spectral index in the interaction region, in particular to search for shock acceleration in the interaction zone.", - proprietary_duration=365, - total_observation_time=0.0391880786919501, - legacy_id="AL988", - opt_project_id=33151323, - last_addition=datetime.datetime.strptime("2017-08-28", DATE_FORMAT).date(), - ) - project.authors = self.build_authors(project.project_code) - return project - - def build_authors(self, project_code: str) -> list: - """Returns author details for this project.""" - - authors = [ - Author( - project_code=project_code, - author_id=780, - username="mlacy", - firstname="Mark", - lastname="Lacy", - pst_person_id="885", - is_pi=True, - ), - Author( - project_code=project_code, - author_id=781, - username="swood", - firstname="Sarah", - lastname="Wood", - pst_person_id="6877", - is_pi=False, - ), - Author( - project_code=project_code, - author_id=782, - username="stevecroft", - firstname="Steve", - lastname="Croft", - pst_person_id="2116", - is_pi=False, - ), - Author( - project_code=project_code, - author_id=783, - username="KristinaNyland", - firstname="Kristina", - lastname="Nyland", - pst_person_id="2950", - is_pi=False, - ), - Author( - project_code=project_code, - author_id=784, - username="fragilep", - firstname="Chris", - lastname="Fragile", - pst_person_id="9238", - is_pi=False, - ), - ] - return authors - - def build_exec_blocks(self) -> list: - """Returns this project's execution blocks""" - - exec_blocks = [ - ExecutionBlock( - execution_block_id=910, - filegroup_id=18468, - ngas_fileset_id="17A-109.sb33151327.eb33496982.57795.84034732639", - scheduling_block_id=33151327, - scheduling_block_type="OBSERVER", - ost_exec_block_id=33496982, - configuration="D", - starttime=57795.8403622685, - endtime=57795.8795503472, - calibration_status="Calibrated", - band_code="KU X", - ), - ExecutionBlock( - execution_block_id=910, - filegroup_id=41979, - ngas_fileset_id="17A-109.sb33151331.eb33786546.57892.65940042824", - scheduling_block_id=33151331, - scheduling_block_type="OBSERVER", - ost_exec_block_id=33786546, - configuration="C", - starttime=57892.6600277778, - endtime=57892.7843396991, - calibration_status="Calibrated", - band_code="C X", - ), - ] - return exec_blocks - - def build_science_products(self) -> list: - """Returns this project's science products""" - - science_products = [ - ScienceProduct( - filegroup_id=18468, - external_name="17A-109.sb33151327.eb33496982.57795.84034732639", - metadata_ingestion_date=METADATA_INGESTION_DATE, - metadata_ingestion_version="1", - science_product_type=EXECUTION_BLOCK, - ), - ScienceProduct( - filegroup_id=41979, - external_name="17A-109.sb33151331.eb33786546.57892.65940042824", - metadata_ingestion_date=METADATA_INGESTION_DATE, - metadata_ingestion_version="1", - science_product_type=EXECUTION_BLOCK, - ), - ] - return science_products - - def build_basic_ms(self) -> dict: - """ - Returns measurement set metadata for a couple of this project's - filegroups - - :return: - """ - - files = { - "fg_41979": [ - {"filename": "weblog.tgz", "size": 1683135}, - {"filename": "unknown.pprequest.xml", "size": 5611}, - {"filename": "pipeline_aquareport.xml", "size": 1351}, - {"filename": PPR_FILENAME, "size": 5611}, - {"filename": "unknown.auxproducts.tgz", "size": 615}, - {"filename": CASA_LOG, "size": 1995}, - {"filename": MANIFEST, "size": 809}, - {"filename": "casa_pipescript.py", "size": 823}, - # the tar delivered when basic MS is requested - { - "filename": "17A-109.sb33151327.eb33496982.57795.84034732639.ms.tgz", - "size": 23690977245, - }, - ], - "fg_18468": [ - {"filename": "weblog.tgz", "size": 1681803}, - {"filename": "unknown.pprequest.xml", "size": 5610}, - {"filename": "pipeline_aquareport.xml", "size": 1351}, - {"filename": PPR_FILENAME, "size": 5610}, - {"filename": "unknown.auxproducts.tgz", "size": 615}, - {"filename": CASA_LOG, "size": 1995}, - {"filename": MANIFEST, "size": 809}, - {"filename": "casa_pipescript.py", "size": 823}, - # the tar delivered when basic MS is requested - { - "filename": "17A-109.sb33151327.eb33496982.57795.84034732639.ms.tgz", - "size": 23690977531, - }, - ], - } - return files - - def build_cms(self): - """ - Returns calibrated measurement set metadata - for a couple of this project's filegroups - - :return: - """ - - files = { - "fg_41979": [ - { - "filename": "17A-109.sb33151331.eb33786546.57892.65940042824.ms" ".calapply.txt", - "size": 1058, - }, - {"filename": MANIFEST, "size": 11006}, - {"filename": "unknown.session_1.caltables.tgz", "size": 71653397}, - {"filename": "casa_piperestorescript.py", "size": 205}, - {"filename": "flux.csv", "size": 22}, - {"filename": PPR_FILENAME, "size": 1632}, - {"filename": CASA_LOG, "size": 133935}, - # the tar delivered when calibrated MS (aka 'restore') is - # requested - { - "filename": "17A-109.sb33151331.eb33786546.57892.65940042824.400685418.tar.gz", - "size": 88842463132, - }, - ], - "fg_18468": [ - {"filename": MANIFEST, "size": 24025}, - {"filename": "unknown.session_1.caltables.tgz", "size": 26463229}, - {"filename": "casa_piperestorescript.py", "size": 1149}, - {"filename": "flux.csv", "size": 22}, - {"filename": PPR_FILENAME, "size": 1632}, - {"filename": CASA_LOG, "size": 260953}, - { - "filename": "17A-109.sb33151327.eb33496982.57795.84034732639.ms.calapply.txt", - "size": 1058, - }, - { - "filename": "17A-109.sb33151327.eb33496982.57795.84034732639.400820221.tar.gz", - "size": 47520134173, - }, - ], - } - - return files - - -class CalibrationProduct: - """Encapsulates calibration test data for 18B-265""" - - def __init__(self): - self.project = self.build_project() - self.science_product = self.build_science_product() - self.file_info, self.total_size = get_file_info_from_loc_report(get_locations_report("calibration")) - - def build_project(self) -> Project: - """ - Returns 18B-265 Project. - - :return: - - """ - - with warnings.catch_warnings(): - # Suppress SQLAlchemy warnings - warnings.simplefilter("ignore", category=sa_exc.SAWarning) - - project = Project( - project_code="18B-265", - legacy_id="AS1535", - total_observation_time=0.0316695485962555, - proprietary_duration=365, - starttime=58745.9972239583, - endtime=59043.2400404977, - last_addition=datetime.datetime.strptime("2020-07-13", DATE_FORMAT).date(), - ) - project.authors = self.build_authors() - return project - - def build_authors(self) -> list: - """ - Returns author details for 18B-265 - :return: - - """ - - return [ - Author( - project_code="18B-265", - author_id=59386, - username="mansi", - firstname="Mansi", - lastname="Kasliwal", - pst_person_id="8998", - is_pi=False, - ), - Author( - project_code="18B-265", - author_id=59387, - username="chomiuk", - firstname="Laura", - lastname="Chomiuk", - pst_person_id="701", - is_pi=False, - ), - Author( - project_code="18B-265", - author_id=59388, - username="kirx", - firstname="Kirill", - lastname="Sokoloski", - pst_person_id="5512", - is_pi=False, - ), - Author( - project_code="18B-265", - author_id=59389, - username="KojiMukai", - firstname="Koji", - lastname="Muki", - pst_person_id="3674", - is_pi=False, - ), - Author( - project_code="18B-265", - author_id=59387, - username="JustinLinford", - firstname="Justin", - lastname="Linford", - pst_person_id="3794", - is_pi=False, - ), - Author( - project_code="18B-265", - author_id=59390, - username="ThomasNelson", - firstname="Thomas", - lastname="Nelson", - pst_person_id="5234", - is_pi=False, - ), - Author( - project_code="18B-265", - author_id=59394, - username="EliasAydi", - firstname="Elias", - lastname="Aydi", - pst_person_id="10794", - is_pi=False, - ), - Author( - project_code="18B-265", - author_id=59392, - username="jeno@astro.columbia.edu", - firstname="Jennifer", - lastname="Sokoloski", - pst_person_id="1200", - is_pi=True, - ), - Author( - project_code="18B-265", - author_id=59393, - username="amkawash", - firstname="Adam", - lastname="Kawash", - pst_person_id="8687", - is_pi=False, - ), - ] - - def build_science_product(self): - """ - Returns the science product associated with this calibration. - - :return: - """ - - return ScienceProduct( - filegroup_id=388273, - external_name="18B-265_2019_12_10_T00_00_59.203.tar", - science_product_type="Calibration", - metadata_ingestion_version="1", - metadata_ingestion_date=datetime.datetime.strptime("2019-12-13 23:30:57.730581", DATETIME_FORMAT), - external_system="EVLA Processing", - ) - - -class VlbaProductSet: - - """Encapsulates a set of products for VLBA project BT142.""" - - def __init__(self): - self.project = self.build_project() - self.exec_blocks = self.build_exec_blocks() - self.science_products = self.build_science_products() - self.file_info, self.total_size = self.get_vlba_file_info_from_loc_report() - - def build_project(self) -> Project: - """ - Returns BT142 metadata and authors details - - :return: - """ - - with warnings.catch_warnings(): - # Suppress SQLAlchemy warnings - warnings.simplefilter("ignore", category=sa_exc.SAWarning) - - project = Project( - project_code="BT142", - starttime=58154.8048148148, - endtime=58217.8342361111, - title="Jets, outflows, and inclined disks in Seyfert galaxies: the H2O megamasers' view", - abstract="Jets, outflows, and inclined disks in Seyfert galaxies: the H2O megamasers' view | Candidate extragalactic water masers associated with accretion disks around AGN are typically identified by a triple-peak profile of the maser spectra. However, a large number of maser sources show single-broad lines or groups of lines clustered in a narrow velocity range. In this proposal, we propose for a study of four galaxies, classified as Seyfert or LINER, hosting bright water masers and showing evidences of ejection/accretion nuclear activity. Our main goals are that of detecting the maser emission at VLBI scales, determining its location and distribution with respect to the main nuclear centers of activity, and derive the nature of the emission. These sources will potentially constitute new case studies for the scarcely-populated class of confirmed jet/outflow masers or very first examples of the exotic, recently-invoked class of 'inclined water maser disks'. Furthermore, the proposed mesurements will set the basis for a number of follow-up (VLBI) studies aim at a better understanding of the physics and disk/jet geometry in Seyferts and LINERs.", - proprietary_duration=365, - total_observation_time=0.0391880786919501, - last_addition=datetime.datetime.strptime("2018-11-05", DATE_FORMAT).date(), - ) - project.authors = self.build_authors() - - return project - - def build_authors(self) -> list: - """ - Returns author details for this project - :return: - """ - - authors = [ - Author( - username="atarchi", - firstname="Andrea", - lastname="Tarchi", - pst_person_id="236", - project_code="BT142", - author_id=45311, - is_pi=True, - ), - Author( - username="jbraatz", - firstname="James", - lastname="Braatz", - pst_person_id="26", - project_code="BT142", - author_id=45310, - is_pi=False, - ), - Author( - username="pcastangia", - firstname="Paola", - lastname="Castangia", - pst_person_id="541", - project_code="BT142", - author_id=45312, - is_pi=False, - ), - Author( - username="gsurcis", - firstname="Gabriele", - lastname="Surcis", - pst_person_id="2512", - project_code="BT142", - author_id=45313, - is_pi=False, - ), - ] - return authors - - def build_exec_blocks(self) -> list: - """ - Constructs this project's execution blocks. - - :return: - """ - - exec_blocks = [ - ExecutionBlock( - execution_block_id=108778, - filegroup_id=278938, - starttime=58175.0757060185, - endtime=58175.325625, - calibration_status=DO_NOT_CALIBRATE, - band_code="K", - ), - ExecutionBlock( - execution_block_id=108833, - filegroup_id=279054, - starttime=58160.1166550926, - endtime=58160.3043634259, - calibration_status=DO_NOT_CALIBRATE, - band_code="L", - ), - ExecutionBlock( - execution_block_id=108862, - filegroup_id=279119, - starttime=58154.8048148148, - endtime=58154.9928009259, - calibration_status=DO_NOT_CALIBRATE, - band_code="L", - ), - ExecutionBlock( - execution_block_id=108630, - filegroup_id=278613, - starttime=58217.5843171296, - endtime=58217.8342361111, - calibration_status=DO_NOT_CALIBRATE, - band_code="K", - ), - ] - return exec_blocks - - def build_science_products(self): - """ - Returns science products associate with the exec blocks we got - - :return: - """ - - return [ - ScienceProduct( - filegroup_id=279054, - science_product_type=EXECUTION_BLOCK, - metadata_ingestion_version="1", - metadata_ingestion_date=METADATA_INGESTION_DATE, - external_name="BT142A2", - external_system=VLBA_OPERATIONS, - ), - ScienceProduct( - filegroup_id=278938, - science_product_type=EXECUTION_BLOCK, - metadata_ingestion_version="1", - metadata_ingestion_date=METADATA_INGESTION_DATE, - external_name="BT142A1", - external_system=VLBA_OPERATIONS, - ), - ScienceProduct( - filegroup_id=279119, - science_product_type=EXECUTION_BLOCK, - metadata_ingestion_version="1", - metadata_ingestion_date=METADATA_INGESTION_DATE, - external_name="BT142B2", - external_system=VLBA_OPERATIONS, - ), - ScienceProduct( - filegroup_id=278613, - science_product_type=EXECUTION_BLOCK, - metadata_ingestion_version="1", - metadata_ingestion_date=METADATA_INGESTION_DATE, - external_name="BT142B1", - external_system=VLBA_OPERATIONS, - ), - ] - - def get_vlba_file_info_from_loc_report(self) -> tuple: - """ - Pull file metadata from VLBA locations report. - We're using this metadata differently from EVLA metadata; - hence the bespoke method. - - :return: - """ - - file_info = dict() - locations_report = get_locations_report("vlba_eb") - - for file_spec in locations_report["files"]: - filename = file_spec["ngas_file_id"] - size = file_spec["size"] - file_info[filename] = size - - return file_info, locations_report["aggregate_size"] - - -class VlassImageProductSet: - """Encapsulates a VLASS image product""" - - def __init__(self): - self.project = self.build_project() - self.science_products = self.build_science_products() - location_report = get_locations_report("img") - self.file_info, self.total_size = get_file_info_from_loc_report(location_report) - - def build_project(self) -> Project: - """ - Returns VLASS1.1 project metadata - - :return: - """ - - with warnings.catch_warnings(): - # Suppress SQLAlchemy warnings - warnings.simplefilter("ignore", category=sa_exc.SAWarning) - - project = Project( - project_code="VLASS1.1", - title="The Very Large Array Sky Survey", - abstract='The Very Large Array Sky Survey (VLASS) is a 5500-hr, community-driven project to survey the whole sky visible to the VLA. It will engage radio astronomy experts, multi-wavelength astronomers and citizen scientists alike. The data will be taken in three passes over the sky to allow the discovery of transient radio sources, and will cover the frequency range 2-4 GHz with an angular resolution of 2.5 arcsec. By utilizing the "on the fly" interferometry mode, the overheads will be much reduced compared to conventional survey techniques. The key science topics to be addressed by the survey are: Imaging Galaxies Through Time and Space; Hidden Explosions; Faraday Tomography of The Magnetic Sky; Peering Though Our Dusty Galaxy; and Missing Physics.', - opt_project_id=33997662, - starttime=58004.0162552083, - endtime=58169.6566603472, - total_observation_time=0.158181712955411, - last_addition=datetime.datetime.strptime("2017-09-08", DATE_FORMAT).date(), - proprietary_duration=0, - ) - project.authors = self.build_authors() - return project - - def build_authors(self) -> list: - """Returns VLASS1.1 authors' metadata""" - - return [ - Author( - project_code="VLASS1.1", - username="vlass", - firstname="Vlass", - lastname="Scientist", - pst_person_id="9707", - is_pi=True, - ), - Author( - project_code="VLASS1.1", - username="cchandle", - firstname="Claire", - lastname="Chandler", - pst_person_id="36", - is_pi=False, - ), - Author( - project_code="VLASS1.1", - username="akimball", - firstname="Amy", - lastname="Kimball", - pst_person_id="1743", - is_pi=False, - ), - Author( - project_code="VLASS1.1", - username="jwrobel", - firstname="Joan", - lastname="Wrobel", - pst_person_id="172", - is_pi=False, - ), - Author( - project_code="VLASS1.1", - username="fschinzel", - firstname="Frank", - lastname="Schinzel", - pst_person_id="2059", - is_pi=False, - ), - ] - - def build_science_products(self) -> list: - """ - Returns science product associated with this image file, - as a list for consistency with the other ProductSets. - - :return: - """ - - return [ - ScienceProduct( - filegroup_id=223148, - external_name="VLASS1.1.ql.T01t01.J000232-383000.10.2048.v1", - metadata_ingestion_version="1", - metadata_ingestion_date=METADATA_INGESTION_DATE, - science_product_type="Image", - external_system="CASA Pipeline", - ), - ] diff --git a/shared/workspaces/test/test_data/products/expected_values_gbt.py b/shared/workspaces/test/test_data/products/expected_values_gbt.py deleted file mode 100644 index 5d1808037d26f178e301d5624eb852416accf12c..0000000000000000000000000000000000000000 --- a/shared/workspaces/test/test_data/products/expected_values_gbt.py +++ /dev/null @@ -1,169 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Test data: GBT download products """ - -import datetime -import warnings - -from sqlalchemy import exc as sa_exc - -from schema import Author, ExecutionBlock, Project, ScienceProduct - -from ..utilities import ( - DATE_FORMAT, - DATETIME_FORMAT, - get_exec_block_details_from_loc_report, -) - -# pylint: disable=C0301, R0201 - - -class GbtProductSet: - """Encapsulates a GBT project and its products""" - - def __init__(self): - self.project = self.build_project() - self.exec_blocks = self.build_exec_blocks() - self.science_products = self.build_science_products() - self.file_info, self.total_size = get_exec_block_details_from_loc_report("AGBT17B_044_02", self.exec_blocks) - - def build_project(self) -> Project: - """Returns AGBT17B_044 metadata""" - - with warnings.catch_warnings(): - # Suppress SQLAlchemy warnings - warnings.simplefilter("ignore", category=sa_exc.SAWarning) - - project = Project( - project_code="AGBT17B_044", - starttime=58089.1619444443, - endtime=58138.2070370372, - proprietary_duration=365, - total_observation_time=27.055, - last_addition=datetime.datetime.strptime("2020-10-21", DATE_FORMAT).date(), - title="Infall and Fragmentation of Cores in the Taurus: I Finding Cores with Infall", - abstract=" We propose to conduct a survey of investigating infall candidates and fragmentation toward a complete population of prestellar cores in Taurus in HCN, HCO+, N2H+, and NH2D. The proposed observation will trace infall motions within prestellar cores from 0.05 pc down to 0.0075 pc (1500 AU) spatial scale, which is a typical size scale of individual planetary systems. The scientific goal is to estimate a fraction of infall candidates out of a complete population of prestellar cores and to understand internal velocity structure during final gravitational collapse before forming stars. We shall also search for fragmentation within prestellar cores, and to investigate kinematics involved with fragmentation processes. We propose to conduct pointing observation toward 57 prestellar cores using the ARGUS of the GBT in the 89 GHz transitions of HCN and HCO+, 93 GHz transition of N2H+, and to map 2 prestellar cores, which are found to have infall motions, in N2H+ and NH2D.", - ) - project.authors = self.build_authors() - return project - - def build_authors(self) -> list: - """Returns AGBT17B_044 authors' metadata""" - - return [ - Author(username="seo3919", firstname="Youngmin", lastname="Seo", is_pi=True), - Author(username="schurch", firstname="Sarah", lastname="Church", is_pi=False), - Author( - username="Paul Goldsmith", - firstname="Paul", - lastname="Goldsmith", - is_pi=False, - ), - Author( - username="yancyshirley", - firstname="Yancy", - lastname="Shirley", - is_pi=False, - ), - Author( - username="Michael Dunham", - firstname="Michael", - lastname="Dunham", - is_pi=False, - ), - Author(username="DTFrayer", firstname="Dave", lastname="Frayer", is_pi=False), - ] - - def build_exec_blocks(self): - """Returns AGBT17B_044's execution blocks""" - - exec_blocks = [ - ExecutionBlock( - execution_block_id=152679, - filegroup_id=553493, - calibration_level="0", - calibration_status="GBT/NOCAL", - band_code="N/A", - ), - ExecutionBlock( - execution_block_id=152680, - filegroup_id=553494, - calibration_level="0", - calibration_status="GBT/NOCAL", - band_code="N/A", - ), - ExecutionBlock( - execution_block_id=152681, - filegroup_id=553495, - calibration_level="0", - calibration_status="GBT/NOCAL", - band_code="N/A", - ), - ExecutionBlock( - execution_block_id=152682, - filegroup_id=553496, - calibration_level="0", - calibration_status="GBT/NOCAL", - band_code="N/A", - ), - ExecutionBlock( - execution_block_id=152683, - filegroup_id=553497, - calibration_level="0", - calibration_status="GBT/NOCAL", - band_code="N/A", - ), - ExecutionBlock( - execution_block_id=152684, - filegroup_id=553498, - calibration_level="0", - calibration_status="GBT/NOCAL", - band_code="N/A", - ), - ExecutionBlock( - execution_block_id=152685, - filegroup_id=553499, - calibration_level="0", - calibration_status="GBT/NOCAL", - band_code="N/A", - ), - ExecutionBlock( - execution_block_id=152686, - filegroup_id=553500, - calibration_level="0", - calibration_status="GBT/NOCAL", - band_code="N/A", - ), - ] - return exec_blocks - - def build_science_products(self): - """Returns AGBT17B_044's science product - (as a list, for consistency with other ProductSets) - """ - - return [ - ScienceProduct( - filegroup_id=553493, - external_system="GBT", - science_product_type="dummy1", - metadata_ingestion_date=datetime.datetime.strptime("2020-10-21 15:36:37.876148", DATETIME_FORMAT), - metadata_ingestion_version="1", - external_name="EXTERNAL NAME 2020-10-21 15:36:37.903180", - ) - ] diff --git a/shared/workspaces/workspaces/__init__.py b/shared/workspaces/workspaces/__init__.py index e18480c840f4d6a6f1515ca896aa31a41ce4a136..66bf85f83163fe0665354d61356ee2ce63e9f85b 100644 --- a/shared/workspaces/workspaces/__init__.py +++ b/shared/workspaces/workspaces/__init__.py @@ -15,3 +15,7 @@ # # You should have received a copy of the GNU General Public License # along with Workspaces. If not, see <https://www.gnu.org/licenses/>. +""" +SSA Workspaces shared library +""" +__version__ = "2.8.2rc1" diff --git a/shared/workspaces/workspaces/_version.py b/shared/workspaces/workspaces/_version.py deleted file mode 100644 index a3b088cf253769d1fd69636f05f93d514eed41d3..0000000000000000000000000000000000000000 --- a/shared/workspaces/workspaces/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Version information for this package, don't put anything else here. """ -___version___ = "4.0.0a1.dev1" diff --git a/shared/workspaces/workspaces/capability/services/capability_info.py b/shared/workspaces/workspaces/capability/services/capability_info.py index ada1ac9833da65bb5f6ccfa9d96d4eee9a510e4f..a38a91f3a1fb48fe84536c2846a516b0fba0fb5c 100644 --- a/shared/workspaces/workspaces/capability/services/capability_info.py +++ b/shared/workspaces/workspaces/capability/services/capability_info.py @@ -353,7 +353,12 @@ class CapabilityInfo: :return: """ - return self.session.query(CapabilityRequest).filter_by(id=request_id).first() + return ( + self.session.query(CapabilityRequest) + .options(selectinload(CapabilityRequest.versions)) + .filter_by(id=request_id) + .first() + ) def get_enabled_capabilities(self) -> List[Capability]: """ @@ -425,6 +430,15 @@ class CapabilityInfo: return {"created_requests": json_list} + def lookup_versions_from_request_id(self, request_id: int) -> List[CapabilityVersion]: + """ + Return versions for a given capability request + + :param request_id: ID of request + :return: Versions for a given capability request + """ + return self.session.query(CapabilityVersion).filter_by(capability_request_id=request_id).all() + def lookup_version(self, request_id: int, version_number: int) -> Optional[CapabilityVersion]: """ Return version with the given version number for the given capability request diff --git a/shared/workspaces/workspaces/capability/services/capability_service.py b/shared/workspaces/workspaces/capability/services/capability_service.py index ddacdf1ff5fbfdfabcb5989a86c68d372d6db273..e1d9197095bbdcfed5eceaa5a397b2590047abdc 100644 --- a/shared/workspaces/workspaces/capability/services/capability_service.py +++ b/shared/workspaces/workspaces/capability/services/capability_service.py @@ -274,6 +274,47 @@ class CapabilityService(CapabilityServiceIF): """ logger.debug(f"Received {message['type']} (no action taken): {message}") + @on_message(service="workflow", type="workflow-updated") + def update_fetch_stage(self, **message: Dict): + # In here, we want to track whether or not the fetch start time is complete + # There are going to be various messages from the workflow. Most of the time we won't care about them. + msg_subject = message["subject"] + if msg_subject["type"] == "WorkflowRequest": + # Figure out what stage we're discussing—that will determine whether we care about the log message + parse_log = message["condor_metadata"]["log"].split("Stage", 1)[1].split("has", 1) + stage = parse_log[0].strip() + + logger.debug("Got an update for stage %s", stage) + # If it's the FETCH stage, we care + if stage == "FETCH": + logger.debug("Updating the fetch start or stop time") + + # Since we care, we should look up the execution for this + workflow_request_id = msg_subject["workflow_request_id"] + execution = self.capability_info.lookup_execution_by_workflow_request_id(workflow_request_id) + version = execution.version + + # Pull out the metadata, or make a blank dictionary because we're about to add to it + # sqlalchemy does not detect in-place mutations of JSON + # https://docs.sqlalchemy.org/en/14/core/type_basics.html#sqlalchemy.types.JSON + # to get past this we use a deepcopy of version.workflow_metadata to create a "new" JSON obj + metadata = copy.deepcopy(version.workflow_metadata) if version.workflow_metadata else {} + + # Figure out which message "type" this is (Started or Ended) + msg_type = parse_log[1].split("at", 1)[0].strip() + + # retrieve the timestamp + timestamp = message["condor_metadata"]["timestamp"] + # record it + metadata[f"fetch_{'start' if msg_type == 'Started' else 'end'}_time"] = timestamp + + logger.info("Updating FETCH times in metadata %s on capability version %s", metadata, version) + # update the metadata (this is a no-op unless we just created the dictionary) + version.workflow_metadata = metadata + + # save it + self.capability_info.save_version(version) + class CapabilityLauncher: """ diff --git a/shared/workspaces/workspaces/workflow/services/workflow_info.py b/shared/workspaces/workspaces/workflow/services/workflow_info.py index eab3cdeecb810e6f47e314676b2fb5272e667cf3..c1e71881bc2f3804b655264730836b52d5f45d7e 100644 --- a/shared/workspaces/workspaces/workflow/services/workflow_info.py +++ b/shared/workspaces/workspaces/workflow/services/workflow_info.py @@ -167,7 +167,7 @@ class WorkflowInfo(WorkflowInfoIF): # otherwise, the argument must be already be a string workflow_name = workflow.workflow_name if hasattr(workflow, "workflow_name") else workflow - if any(item in workflow_name for item in ["null", "carta", "vlass", "qa", "split"]): + if any(item in workflow_name for item in ["null", "carta", "vlass", "qa", "split", "ingest"]): argument["need_project_metadata"] = False if ( @@ -182,7 +182,7 @@ class WorkflowInfo(WorkflowInfoIF): parent = self.lookup_workflow_request(argument["parent_wf_request_id"]) argument["source_dir"] = parent.results_dir - if "ingest" in workflow_name: + if "ingest" in workflow_name and "obs" not in workflow_name: argument["need_project_metadata"] = True if any(item in workflow_name for item in ["vlass", "pims"]): diff --git a/shared/workspaces/workspaces/workflow/services/workflow_service.py b/shared/workspaces/workspaces/workflow/services/workflow_service.py index d074e8b0e4c12f0376744acac8eb99f9cb3aadb2..6c1a10fba9ff890bd478dc1db26c7b34db90aaf7 100644 --- a/shared/workspaces/workspaces/workflow/services/workflow_service.py +++ b/shared/workspaces/workspaces/workflow/services/workflow_service.py @@ -836,7 +836,7 @@ class WorkflowMessageHandler: wf_req_id = subject["workflow_request_id"] wf_request = self.info.lookup_workflow_request(wf_req_id) - if "ingest" in wf_request.workflow_name: + if "ingest" in wf_request.workflow_name and "obs" not in wf_request.workflow_name: if "seci" not in wf_request.workflow_name: subject["execution_wf_id"] = wf_request.argument["parent_wf_request_id"] logger.debug("Sending ingestion complete message!") @@ -867,7 +867,7 @@ class WorkflowMessageHandler: wf_req_id = subject["workflow_request_id"] wf_request = self.info.lookup_workflow_request(wf_req_id) - if "ingest" in wf_request.workflow_name: + if "ingest" in wf_request.workflow_name and "obs" not in wf_request.workflow_name: if "seci" not in wf_request.workflow_name: subject["execution_wf_id"] = wf_request.argument["parent_wf_request_id"] logger.debug("Sending ingestion failed message!") diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..29fba01387cc84a517a9933eafe706e153e5ac4f --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1,22 @@ +dsnparse==0.1.15 +pytest +pendulum==2.1.2 +pytest-mock==3.10.0 +behave==1.2.6 +pytest-cov +mock_alchemy==0.2.1 +pytest-resource-path +requests-mock +astropy +fakeredis==1.7.1 +prometheus-client==0.4.1 +pyramid==2.0.1 +pyramid-retry==2.1.1 +pyramid_beaker==0.8 +pyramid-tm==2.5 +immutable_views +hypothesis +kombu +zope-sqlalchemy==2.0 +-e ./shared/messaging +-e ./shared/workspaces diff --git a/testing/coverage_audit/README.md b/testing/coverage_audit/README.md deleted file mode 100644 index 681a219a0fcc613cfa20775d5004660dfbf8a4d4..0000000000000000000000000000000000000000 --- a/testing/coverage_audit/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Coverage Audit - -This package contains the **coverage-audit**, which fetches and parses the `coverage_report.xml` -test coverage report produced by the gitlab CI, then prints a human-readable summary to the console. - -## Usage -```coverage-audit [target_dir]``` -the `coverage-audit` command downloads the latest coverage report from gitlab, -as a `.zip`, extracts the coverage report file, parses it, and prints a -summary of workspaces modules whose test coverage is under 100%. If a target -directory is supplied, the coverage report and related files are written -to `target_dir/coverage/`. - -### Example output - -``` -The following workspaces modules have test coverage of < 100%: -apps/cli/executables/pexable/carta_envoy/carta_envoy/carta.py: line-rate = 0.6441; branch-rate = 0.2222 -apps/cli/executables/pexable/carta_envoy/carta_envoy/connect.py: line-rate = 0.6531; branch-rate = 0.5 -apps/cli/executables/pexable/carta_envoy/carta_envoy/launchers.py: line-rate = 0.6707; branch-rate = 0.45 -... -``` diff --git a/testing/coverage_audit/_version.py b/testing/coverage_audit/_version.py deleted file mode 100644 index 15528507efb3ffe9d08f81273bbedf54b42cae10..0000000000000000000000000000000000000000 --- a/testing/coverage_audit/_version.py +++ /dev/null @@ -1,18 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -___version___ = "4.0.0a1.dev1" diff --git a/testing/coverage_audit/coverage_audit/__init__.py b/testing/coverage_audit/coverage_audit/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/testing/coverage_audit/coverage_audit/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/testing/coverage_audit/coverage_audit/coverage_audit.py b/testing/coverage_audit/coverage_audit/coverage_audit.py deleted file mode 100644 index 8f1674b3bf722c0feb1dbd00bfb32ae29a751ca2..0000000000000000000000000000000000000000 --- a/testing/coverage_audit/coverage_audit/coverage_audit.py +++ /dev/null @@ -1,326 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Detailed audit of incomplete test coverage reported by gitlab CI """ - -import ast -import http -import os -import zipfile -from pathlib import Path -from typing import List -from xml.etree import ElementTree as ET -from xml.etree.ElementTree import Element - -# pylint: disable=E0401, R0903, R1721 -import requests - -COVERAGE_REPORT_XML = "coverage.xml" - - -class CoverageReportSummary: - """Wraps items parsed out of a coverage report""" - - def __init__(self): - self.classes = self.functions = self.other_items = [] - - def add_item(self, item): - """ - Add this ast item to the appropriate list. - - :param item: ast thing, e.g., ClassDef, FunctionDef, If, IfExp - :return: - """ - if isinstance(item, ast.ClassDef): - self.classes.append(item) - elif isinstance(item, ast.FunctionDef): - self.functions.append(item) - else: - self._add_other_item(item) - - def _add_other_item(self, item): - """ - Examine this ast item and, if it's something we're interested in, - add it to the other_items list. - - :param item: some ast thing that isn't a ClassDef nor a FunctionDef - :return: - """ - if isinstance(item, ast.If) or isinstance(item, ast.IfExp): - self.other_items.append(item) - elif not isinstance(item, ast.Import) and not isinstance(item, ast.ImportFrom): - # (we're not interested in `import` lines) - val = item.value - if hasattr(val, "n"): - content = item.value.n - else: - content = item.value - if not isinstance(content, str) and not isinstance(item, ast.Assign): - self.other_items.append(item) - - -class ModuleMetadata: - """Represents a Python module to be audited for test coverage.""" - - def __init__(self, path: Path, summary: CoverageReportSummary): - self.path = path - self.summary = summary - - -class ElementCoverageMetadata: - """Encapsulates metadata from the coverage report for a module we're going to audit - for test coverage""" - - def __init__(self, path: Path, line_rate: float, branch_rate: float): - self.path = path - self.line_rate = line_rate - self.branch_rate = branch_rate - self.modules = [] - - def __str__(self): - return f"{self.path}: line-rate = {self.line_rate}; branch-rate = {self.branch_rate}" - - def __eq__(self, other): - if isinstance(other, ElementCoverageMetadata): - return ( - other.path == self.path - and other.line_rate == self.line_rate - and other.branch_rate == self.branch_rate - and other.modules == self.modules - ) - return False - - def add_module(self, module: ModuleMetadata): - """ - Add this module to the metadata. - - :param module: module to add - :return: - """ - self.modules.append(module) - - -class CoverageReportParser: - """Turn a gitlab coverage report into audit targets we can examine""" - - def __init__(self, report_path: Path): - self.xml_file = report_path - self.project_root = find_project_root() - self.targets = [] - - def parse(self): - """ - Find the audit targets in this coverage report - - :return: a list of metadata about classes to be audited - """ - - for target in self._read_coverage_report(): - self.targets.append(target) - - def _read_coverage_report(self) -> List[ElementCoverageMetadata]: - """ - parse the coverage report generated by gitlab - - :return: a list of metadata about classes to be audited - """ - - targets = [] - coverage = ET.parse(self.xml_file) - for package in coverage.findall(".//package"): - complexity = int(package.attrib["complexity"]) - if complexity > 0: - print(f">>> (FYI: nonzero complexity of {complexity} for {package.attrib['name']})") - - for element in package.findall(".//class"): - target = ElementDigger(self.project_root, element).dig() - if target: - targets.append(target) - - return targets - - -class ElementDigger: - """Excavates an element parsed out of the coverage report""" - - def __init__(self, project_root: Path, element: Element): - self.project_root = project_root - self.element = element - - def dig(self) -> ElementCoverageMetadata: - """ - Parse the class metadata for this "class" element of the coverage report. - - :return: - """ - target = ElementCoverageMetadata( - path=Path(self.element.attrib["filename"]), - line_rate=float(self.element.attrib["line-rate"]), - branch_rate=float(self.element.attrib["branch-rate"]), - ) - - add_target = False - for lines in self.element.findall(".//lines"): - for line in lines: - attribs = line.attrib - if "branch" in attribs and "condition-coverage" in attribs: - condition_coverage = attribs["condition-coverage"] - # it will be a % string; convert to an int - cov_percent = int(condition_coverage.split("%")[0]) - if cov_percent < 100: - add_target = True - module = self._create_audit_module(target) - target.add_module(module) - if add_target: - return target - - def _create_audit_module(self, target: ElementCoverageMetadata) -> ModuleMetadata: - """ - Find the Python module at this target's path, scoop up the functions and classes, - and return an AuditModule - - :param target: a target of code test audit - :return: - """ - - summary = CoverageReportSummary() - - module_path = self.project_root / target.path - - with open(module_path, "r") as infile: - content = infile.read() - dumped = ast.Dict(ast.parse(content)) - for item in dumped.keys.body: - summary.add_item(item) - - return ModuleMetadata(path=module_path, summary=summary) - - -class CoverageReportGrabber: - """Download gitlab's latest coverage report""" - - def __init__(self, destination: Path = None): - if destination: - self.destination = destination - else: - self.destination = Path.cwd() - - def grab(self): - """ - Issue http GET request for coverage.xml, which will be contained n a .zip. - Retrieve it to the current directory and unzip it. - - :return: the coverage report - """ - - url = "https://gitlab.nrao.edu/ssa/workspaces/-/jobs/artifacts/main/download?job=unit+test+coverage" - response = requests.get(url) - if response.status_code == http.HTTPStatus.OK: - # write the zip file, then extract the .xml we want - return self._write_cov_rpt_xml(response.content) - - raise RuntimeError(f"RETRIEVAL FAILURE: {response}") - - def _write_cov_rpt_xml(self, content: bytes) -> Path: - """ - Write the coverage report extracted from the downloaded .zip - - :param content: file contents - :return: COVERAGE_REPORT_XML file at self.destination - """ - target_path = self.destination / "coverage.zip" - with open(target_path, "wb") as cov_zip: - cov_zip.write(content) - - xml_file = self.destination / COVERAGE_REPORT_XML - with zipfile.ZipFile(target_path, "r") as zip_ref: - zip_ref.extract(COVERAGE_REPORT_XML, self.destination) - - target_path.unlink() - return xml_file - - -class Reporter: - """Create a digest of not-fully-covered items found in the coverage report""" - - def __init__(self, targets: List[ElementCoverageMetadata]): - self.targets = targets - - def report(self): - """ - Print results to the console in human-readable format - - :return: - """ - if len(self.targets) == 0: - print("All workspaces modules are fully covered by current tests.") - return - - print("The following workspaces modules have test coverage of < 100%:") - for target in self.targets: - print(target) - - -def we_are_in_docker() -> bool: - """ - Are we executing inside a Docker container? - (If not, we assume it's local testing.) - - :return: is she or isn't she? only her hairdresser knows for sure - """ - return Path("/packages").is_dir() - - -def find_project_root() -> Path: - """ - Under which top level do we start looking for tests? - - :return: project root - """ - if we_are_in_docker(): - # we're testing in the workflow container - return Path("/packages") - - # someone is testing locally - possible_roots = [file for file in Path(os.environ["HOME"]).rglob("workspaces") if file.is_dir()] - if len(possible_roots) > 0: - workspaces = possible_roots[0] - return workspaces - raise FileNotFoundError(f"project root not found under {os.environ['HOME' ]}") - - -def main(argv: List[str] = None): - """ - yes, you -can- have it all - - :return: - """ - if argv: - target_path = Path(argv[0]) - else: - target_path = Path.cwd() - - latest_report = CoverageReportGrabber(target_path).grab() - parser = CoverageReportParser(latest_report) - parser.parse() - - reporter = Reporter(parser.targets) - reporter.report() - - -if __name__ == "main": - main() diff --git a/testing/coverage_audit/setup.py b/testing/coverage_audit/setup.py deleted file mode 100644 index d741ac3c6c2f888b50e4066a1d2bdb1f31d69845..0000000000000000000000000000000000000000 --- a/testing/coverage_audit/setup.py +++ /dev/null @@ -1,106 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -"""A setuptools-based setup module for coverage_audit. - -See: -https://packaging.python.org/en/latest/distributing.html -https://github.com/pypa/sampleproject -""" -# For matching the version string. -import re - -# To use a consistent encoding -from codecs import open -from os import path - -# Always prefer setuptools over distutils -from pathlib import Path - -from setuptools import find_packages, setup - -THIS_MODULE = "coverage_audit" -here = path.abspath(path.dirname(__file__)) - -# Get the long description from the README file -with open(path.join(here, "README.md"), encoding="utf-8") as f: - long_description = f.read() - -requires = [ - "pytest>=5.4,<6.0", -] - - -def read(*parts): - """ - Read _version.py. - - :param parts: paths to search for _version.py - :return: - """ - with open(path.join(here, *parts), "r") as fp: - return fp.read() - - -def find_version() -> str: - """ - What version are we now? - - :return: string representing current version of this app - """ - version_file = read(Path.cwd() / "_version.py") - if not version_file: - raise RuntimeError("Unable to find version file.") - - version_match = re.search(r"^___version___ = ['\"]([^'\"]*)['\"]", version_file, re.M) - if version_match: - return version_match.group(1) - raise RuntimeError(f"Unable to find version string in {version_file}.") - - -setup( - name="ssa-" + THIS_MODULE, - # Versions should comply with PEP440. For a discussion on single-sourcing - # the version across setup.py and the project code, see - # https://packaging.python.org/en/latest/single_source_version.html - version=find_version(), - description="Coverage Audit: the Workspaces Testing Coverage Audit", - long_description=long_description, - # Author details - author="Science Support and Archive", - author_email="ssa-announcements@nrao.edu", - # Choose your license - license="GPL", - # See https://pypi.python.org/pypi?%3Aaction=list_classifiers - classifiers=[ - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - "Development Status :: 4 - Beta", - # Indicate who your project is intended for - "Intended Audience :: Developers", - "Topic :: Software Development :: Build Tools", - # Pick your license as you wish (should match "license" above) - "License :: OSI Approved :: GPL License", - # Specify the Python versions you support here. In particular, ensure - # that you indicate whether you support Python 2, Python 3 or both. - "Programming Language :: Python :: 3.10", - ], - packages=find_packages(), - entry_points={"console_scripts": ["coverage-audit = coverage_audit.coverage_audit:main"]}, -) diff --git a/testing/coverage_audit/test/coverage.xml b/testing/coverage_audit/test/coverage.xml deleted file mode 100644 index 17833fb4bd178301c43cfe75480f088a282f1f98..0000000000000000000000000000000000000000 --- a/testing/coverage_audit/test/coverage.xml +++ /dev/null @@ -1,4822 +0,0 @@ -<?xml version="1.0" ?> -<coverage version="5.5" timestamp="1626887307770" lines-valid="4083" lines-covered="3152" line-rate="0.772" - branches-valid="662" branches-covered="370" branch-rate="0.5589" complexity="0"> - <!-- Generated by coverage.py: https://coverage.readthedocs.io --> - <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd --> - <sources> - <source>/builds/ssa/workspaces</source> - </sources> - <packages> - <package name="apps.cli.executables.pexable.casa_envoy.casa_envoy" line-rate="0.7043" branch-rate="0.4444" - complexity="0"> - <classes> - <class name="auditor.py" filename="apps/cli/executables/pexable/casa_envoy/casa_envoy/auditor.py" - complexity="0" line-rate="0.7699" branch-rate="0.619"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="26" hits="1"/> - <line number="37" hits="1"/> - <line number="41" hits="1"/> - <line number="43" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="44" hits="1"/> - <line number="46" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="47" hits="1"/> - <line number="48" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="50"/> - <line number="49" hits="1"/> - <line number="50" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,51"/> - <line number="51" hits="0"/> - <line number="54" hits="1"/> - <line number="55" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="60" hits="1"/> - <line number="61" hits="1"/> - <line number="63" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="64" hits="1"/> - <line number="65" hits="1"/> - <line number="68" hits="1"/> - <line number="69" hits="1"/> - <line number="70" hits="1"/> - <line number="71" hits="1"/> - <line number="72" hits="1"/> - <line number="73" hits="1"/> - <line number="75" hits="1"/> - <line number="76" hits="1"/> - <line number="77" hits="1"/> - <line number="78" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="79" hits="1"/> - <line number="80" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="81" hits="1"/> - <line number="82" hits="1"/> - <line number="83" hits="1"/> - <line number="84" hits="1"/> - <line number="86" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="87" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="88" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="89" hits="1"/> - <line number="90" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="91" hits="1"/> - <line number="92" hits="1"/> - <line number="94" hits="1"/> - <line number="96" hits="1"/> - <line number="97" hits="1"/> - <line number="98" hits="1"/> - <line number="100" hits="1"/> - <line number="101" hits="1"/> - <line number="102" hits="1"/> - <line number="104" hits="1"/> - <line number="105" hits="1"/> - <line number="107" hits="1"/> - <line number="108" hits="1"/> - <line number="110" hits="1"/> - <line number="111" hits="1"/> - <line number="112" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="113" hits="1"/> - <line number="115" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="116"/> - <line number="116" hits="0"/> - <line number="117" hits="0"/> - <line number="119" hits="1"/> - <line number="122" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="123"/> - <line number="123" hits="0"/> - <line number="125" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="126"/> - <line number="126" hits="0"/> - <line number="127" hits="0"/> - <line number="129" hits="1"/> - <line number="132" hits="1"/> - <line number="133" hits="1"/> - <line number="134" hits="1"/> - <line number="135" hits="1"/> - <line number="136" hits="1"/> - <line number="137" hits="1"/> - <line number="138" hits="1"/> - <line number="140" hits="1"/> - <line number="141" hits="1"/> - <line number="142" hits="1"/> - <line number="143" hits="1"/> - <line number="144" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="148"/> - <line number="145" hits="1"/> - <line number="146" hits="1"/> - <line number="148" hits="0"/> - <line number="149" hits="0"/> - <line number="150" hits="0"/> - <line number="152" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="153,172"/> - <line number="153" hits="0"/> - <line number="154" hits="0"/> - <line number="155" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="156,169"/> - <line number="156" hits="0"/> - <line number="158" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="159,167"/> - <line number="159" hits="0"/> - <line number="160" hits="0"/> - <line number="161" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="162,164"/> - <line number="162" hits="0"/> - <line number="164" hits="0"/> - <line number="165" hits="0"/> - <line number="167" hits="0"/> - <line number="169" hits="0"/> - <line number="170" hits="0"/> - <line number="172" hits="0"/> - </lines> - </class> - <class name="foundation.py" filename="apps/cli/executables/pexable/casa_envoy/casa_envoy/foundation.py" - complexity="0" line-rate="0.625" branch-rate="0.125"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="10" hits="1"/> - <line number="12" hits="1"/> - <line number="14" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="24" hits="1"/> - <line number="33" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="40" hits="1"/> - <line number="41" hits="0"/> - <line number="42" hits="0"/> - <line number="43" hits="0"/> - <line number="44" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="45,52"/> - <line number="45" hits="0"/> - <line number="47" hits="0"/> - <line number="48" hits="0"/> - <line number="49" hits="0"/> - <line number="50" hits="0"/> - <line number="52" hits="0"/> - <line number="54" hits="0"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="60"/> - <line number="60" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="61,62"/> - <line number="61" hits="0"/> - <line number="62" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="59,63"/> - <line number="63" hits="0"/> - </lines> - </class> - <class name="launchers.py" filename="apps/cli/executables/pexable/casa_envoy/casa_envoy/launchers.py" - complexity="0" line-rate="0.6062" branch-rate="0.32"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="21" hits="1"/> - <line number="22" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="24"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="39" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="47" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="48" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="52" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="53"/> - <line number="53" hits="0"/> - <line number="54" hits="0"/> - <line number="56" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="61" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="62"/> - <line number="62" hits="0"/> - <line number="63" hits="0"/> - <line number="65" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1"/> - <line number="68" hits="1"/> - <line number="69" hits="1"/> - <line number="71" hits="1"/> - <line number="72" hits="0"/> - <line number="73" hits="0"/> - <line number="74" hits="0"/> - <line number="83" hits="0"/> - <line number="85" hits="1"/> - <line number="86" hits="1"/> - <line number="88" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="89"/> - <line number="89" hits="0"/> - <line number="91" hits="1"/> - <line number="93" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="94"/> - <line number="94" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="95,97"/> - <line number="95" hits="0"/> - <line number="96" hits="0"/> - <line number="97" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="98,101"/> - <line number="98" hits="0"/> - <line number="99" hits="0"/> - <line number="101" hits="0"/> - <line number="104" hits="1"/> - <line number="105" hits="1"/> - <line number="106" hits="1"/> - <line number="107" hits="1"/> - <line number="108" hits="1"/> - <line number="109" hits="1"/> - <line number="111" hits="1"/> - <line number="112" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="113"/> - <line number="113" hits="0"/> - <line number="115" hits="1"/> - <line number="117" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="122"/> - <line number="118" hits="1"/> - <line number="119" hits="1"/> - <line number="120" hits="1"/> - <line number="122" hits="0"/> - <line number="123" hits="0"/> - <line number="125" hits="1"/> - <line number="127" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="128"/> - <line number="128" hits="0"/> - <line number="130" hits="1"/> - <line number="132" hits="1"/> - <line number="133" hits="1"/> - <line number="134" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="137"/> - <line number="135" hits="1"/> - <line number="137" hits="0"/> - <line number="140" hits="0"/> - <line number="142" hits="1"/> - <line number="143" hits="0"/> - <line number="144" hits="0"/> - <line number="146" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="147,149"/> - <line number="147" hits="0"/> - <line number="149" hits="0"/> - <line number="153" hits="1"/> - <line number="154" hits="0"/> - <line number="155" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="156,158"/> - <line number="156" hits="0"/> - <line number="158" hits="0"/> - <line number="159" hits="0"/> - <line number="161" hits="0"/> - <line number="162" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="163,165"/> - <line number="163" hits="0"/> - <line number="165" hits="0"/> - <line number="166" hits="0"/> - <line number="169" hits="1"/> - <line number="170" hits="1"/> - <line number="171" hits="1"/> - <line number="172" hits="1"/> - <line number="173" hits="1"/> - <line number="174" hits="1"/> - <line number="176" hits="1"/> - <line number="177" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="178,180"/> - <line number="178" hits="0"/> - <line number="180" hits="0"/> - <line number="182" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="183,186"/> - <line number="183" hits="0"/> - <line number="184" hits="0"/> - <line number="186" hits="0"/> - <line number="187" hits="0"/> - <line number="189" hits="1"/> - <line number="190" hits="1"/> - <line number="191" hits="1"/> - <line number="192" hits="1"/> - <line number="193" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="196"/> - <line number="194" hits="1"/> - <line number="196" hits="0"/> - <line number="197" hits="0"/> - <line number="199" hits="1"/> - <line number="200" hits="1"/> - <line number="201" hits="1"/> - <line number="203" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="212"/> - <line number="204" hits="1"/> - <line number="206" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="209"/> - <line number="207" hits="1"/> - <line number="209" hits="0"/> - <line number="212" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,213"/> - <line number="213" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="214,216"/> - <line number="214" hits="0"/> - <line number="216" hits="0"/> - <line number="219" hits="0"/> - <line number="221" hits="1"/> - <line number="222" hits="0"/> - <line number="223" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="224,226"/> - <line number="224" hits="0"/> - <line number="226" hits="0"/> - <line number="227" hits="0"/> - <line number="229" hits="0"/> - <line number="230" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="231,233"/> - <line number="231" hits="0"/> - <line number="233" hits="0"/> - <line number="234" hits="0"/> - </lines> - </class> - <class name="palaver.py" filename="apps/cli/executables/pexable/casa_envoy/casa_envoy/palaver.py" - complexity="0" line-rate="0.9535" branch-rate="0.625"> - <methods/> - <lines> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="12" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="36" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="52" hits="1"/> - <line number="60" hits="1"/> - <line number="68" hits="1"/> - <line number="74" hits="1"/> - <line number="80" hits="1"/> - <line number="83" hits="1"/> - <line number="84" hits="1"/> - <line number="86" hits="1"/> - <line number="88" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="89" hits="1"/> - <line number="90" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="91"/> - <line number="91" hits="0"/> - <line number="93" hits="1"/> - <line number="95" hits="1"/> - <line number="97" hits="1"/> - <line number="99" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="100" hits="1"/> - <line number="101" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="102"/> - <line number="102" hits="0"/> - <line number="104" hits="1"/> - <line number="106" hits="1"/> - <line number="108" hits="1"/> - </lines> - </class> - <class name="schema.py" filename="apps/cli/executables/pexable/casa_envoy/casa_envoy/schema.py" - complexity="0" line-rate="0.75" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="18" hits="0"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="0"/> - <line number="25" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="0"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.executables.pexable.conveyor.conveyor" line-rate="0.8827" branch-rate="0.5789" - complexity="0"> - <classes> - <class name="conveyor.py" filename="apps/cli/executables/pexable/conveyor/conveyor/conveyor.py" - complexity="0" line-rate="0.913" branch-rate="0.5"> - <methods/> - <lines> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="27" hits="1"/> - <line number="34" hits="1"/> - <line number="41" hits="1"/> - <line number="48" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="55" hits="1"/> - <line number="58" hits="1"/> - <line number="61" hits="1"/> - <line number="65" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1"/> - <line number="68" hits="1"/> - <line number="70" hits="1"/> - <line number="82" hits="1"/> - <line number="83" hits="1"/> - <line number="84" hits="1"/> - <line number="85" hits="1"/> - <line number="87" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="88" hits="1"/> - <line number="89" hits="1"/> - <line number="90" hits="1"/> - <line number="91" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="95"/> - <line number="92" hits="1"/> - <line number="93" hits="1"/> - <line number="94" hits="1"/> - <line number="95" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="96,100"/> - <line number="96" hits="0"/> - <line number="97" hits="0"/> - <line number="98" hits="0"/> - <line number="100" hits="1"/> - <line number="101" hits="1"/> - </lines> - </class> - <class name="deliver.py" filename="apps/cli/executables/pexable/conveyor/conveyor/deliver.py" - complexity="0" line-rate="0.8118" branch-rate="0.5455"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="10" hits="1"/> - <line number="16" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="31"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,32"/> - <line number="32" hits="0"/> - <line number="33" hits="0"/> - <line number="34" hits="0"/> - <line number="35" hits="0"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="46"/> - <line number="46" hits="0"/> - <line number="48" hits="0"/> - <line number="50" hits="0"/> - <line number="51" hits="0"/> - <line number="52" hits="0"/> - <line number="53" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="60"/> - <line number="54" hits="1"/> - <line number="55" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="60" hits="0"/> - <line number="61" hits="0"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="65" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="66"/> - <line number="66" hits="0"/> - <line number="67" hits="1"/> - <line number="69" hits="1"/> - <line number="71" hits="1"/> - <line number="72" hits="1"/> - <line number="73" hits="1"/> - <line number="74" hits="1"/> - <line number="75" hits="1"/> - <line number="76" hits="1"/> - <line number="77" hits="1"/> - <line number="78" hits="1"/> - <line number="80" hits="1"/> - <line number="82" hits="1"/> - <line number="84" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="88"/> - <line number="85" hits="1"/> - <line number="86" hits="1"/> - <line number="88" hits="0"/> - <line number="89" hits="0"/> - <line number="91" hits="1"/> - <line number="94" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="95" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="94"/> - <line number="96" hits="1"/> - <line number="97" hits="1"/> - <line number="98" hits="1"/> - <line number="101" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="102" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="101"/> - <line number="103" hits="1"/> - <line number="104" hits="1"/> - <line number="105" hits="1"/> - <line number="107" hits="1"/> - <line number="108" hits="1"/> - <line number="109" hits="1"/> - <line number="110" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="114"/> - <line number="111" hits="1"/> - <line number="112" hits="1"/> - <line number="114" hits="0"/> - <line number="116" hits="1"/> - <line number="117" hits="1"/> - <line number="118" hits="1"/> - </lines> - </class> - <class name="retrieve.py" filename="apps/cli/executables/pexable/conveyor/conveyor/retrieve.py" - complexity="0" line-rate="0.9474" branch-rate="0.7"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="8" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="25" hits="1"/> - <line number="27" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="33" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="39" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="40" hits="1"/> - <line number="41" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="45"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="45" hits="0"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="49" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="61" hits="1"/> - <line number="62" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1"/> - <line number="69" hits="1"/> - <line number="70" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="71"/> - <line number="71" hits="0"/> - <line number="72" hits="0"/> - <line number="74" hits="1"/> - <line number="79" hits="1"/> - <line number="81" hits="1"/> - <line number="82" hits="1"/> - <line number="83" hits="1"/> - </lines> - </class> - <class name="solicitor.py" filename="apps/cli/executables/pexable/conveyor/conveyor/solicitor.py" - complexity="0" line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.executables.pexable.delivery.delivery" line-rate="0.9045" branch-rate="0.7917" - complexity="0"> - <classes> - <class name="context.py" filename="apps/cli/executables/pexable/delivery/delivery/context.py" - complexity="0" line-rate="0.9623" branch-rate="1"> - <methods/> - <lines> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="14" hits="1"/> - <line number="25" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="42" hits="1"/> - <line number="44" hits="1"/> - <line number="46" hits="0"/> - <line number="48" hits="1"/> - <line number="49" hits="0"/> - <line number="51" hits="1"/> - <line number="59" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="60" hits="1"/> - <line number="61" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="70" hits="1"/> - <line number="72" hits="1"/> - <line number="74" hits="1"/> - <line number="76" hits="1"/> - <line number="77" hits="1"/> - <line number="83" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="84" hits="1"/> - <line number="86" hits="1"/> - <line number="89" hits="1"/> - <line number="92" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="93" hits="1"/> - <line number="97" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="98" hits="1"/> - <line number="100" hits="1"/> - <line number="102" hits="1"/> - <line number="103" hits="1"/> - <line number="104" hits="1"/> - <line number="106" hits="1"/> - <line number="115" hits="1"/> - <line number="116" hits="1"/> - <line number="124" hits="1"/> - <line number="133" hits="1"/> - <line number="134" hits="1"/> - <line number="141" hits="1"/> - <line number="150" hits="1"/> - <line number="151" hits="1"/> - <line number="158" hits="1"/> - <line number="165" hits="1"/> - <line number="167" hits="1"/> - </lines> - </class> - <class name="deliverer.py" filename="apps/cli/executables/pexable/delivery/delivery/deliverer.py" - complexity="0" line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="6" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="16" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="25" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="30" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="35" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="40" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="45" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="50" hits="1"/> - <line number="52" hits="1"/> - </lines> - </class> - <class name="delivery.py" filename="apps/cli/executables/pexable/delivery/delivery/delivery.py" - complexity="0" line-rate="0.8077" branch-rate="0.5"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="0"/> - <line number="13" hits="1"/> - <line number="22" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="24,26"/> - <line number="24" hits="0"/> - <line number="26" hits="0"/> - <line number="28" hits="1"/> - <line number="36" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="46" hits="1"/> - <line number="49" hits="1"/> - <line number="52" hits="1"/> - <line number="55" hits="1"/> - <line number="58" hits="1"/> - <line number="60" hits="1"/> - <line number="63" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="64"/> - <line number="64" hits="0"/> - </lines> - </class> - <class name="finder.py" filename="apps/cli/executables/pexable/delivery/delivery/finder.py" - complexity="0" line-rate="0.8889" branch-rate="0.8333"> - <methods/> - <lines> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="14" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="26" hits="0"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="42" hits="1"/> - <line number="48" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="49" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="50"/> - <line number="50" hits="0"/> - <line number="51" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="52" hits="1"/> - </lines> - </class> - <class name="products.py" filename="apps/cli/executables/pexable/delivery/delivery/products.py" - complexity="0" line-rate="0.8491" branch-rate="0.75"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="7" hits="1"/> - <line number="10" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="34" hits="0"/> - <line number="36" hits="1"/> - <line number="37" hits="0"/> - <line number="38" hits="0"/> - <line number="40" hits="1"/> - <line number="41" hits="0"/> - <line number="44" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="55" hits="1"/> - <line number="57" hits="1"/> - <line number="59" hits="1"/> - <line number="60" hits="1"/> - <line number="63" hits="1"/> - <line number="69" hits="1"/> - <line number="70" hits="1"/> - <line number="71" hits="0"/> - <line number="73" hits="1"/> - <line number="74" hits="0"/> - <line number="76" hits="1"/> - <line number="77" hits="0"/> - <line number="82" hits="1"/> - <line number="83" hits="1"/> - <line number="84" hits="1"/> - <line number="85" hits="1"/> - <line number="87" hits="1"/> - <line number="129" hits="1"/> - <line number="132" hits="1"/> - <line number="135" hits="1"/> - <line number="137" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="138" hits="1"/> - <line number="141" hits="1"/> - <line number="142" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="143" hits="1"/> - <line number="145" hits="1"/> - <line number="154" hits="1"/> - <line number="162" hits="1"/> - <line number="166" hits="1"/> - <line number="168" hits="1"/> - <line number="170" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.executables.pexable.delivery.delivery.destinations" line-rate="0.9912" branch-rate="1" - complexity="0"> - <classes> - <class name="checksum.py" - filename="apps/cli/executables/pexable/delivery/delivery/destinations/checksum.py" complexity="0" - line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="4" hits="1"/> - <line number="7" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="16" hits="1"/> - <line number="18" hits="1"/> - <line number="21" hits="1"/> - <line number="23" hits="1"/> - <line number="31" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="48" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="54" hits="1"/> - <line number="56" hits="1"/> - <line number="59" hits="1"/> - <line number="61" hits="1"/> - <line number="62" hits="1"/> - </lines> - </class> - <class name="fetchfile.py" - filename="apps/cli/executables/pexable/delivery/delivery/destinations/fetchfile.py" - complexity="0" line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="6" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="16" hits="1"/> - <line number="19" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="28" hits="1"/> - <line number="30" hits="1"/> - <line number="33" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - </lines> - </class> - <class name="local.py" filename="apps/cli/executables/pexable/delivery/delivery/destinations/local.py" - complexity="0" line-rate="0.9714" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="10" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="19" hits="1"/> - <line number="28" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="29" hits="1"/> - <line number="33" hits="1"/> - <line number="35" hits="1"/> - <line number="45" hits="1"/> - <line number="48" hits="1"/> - <line number="51" hits="1"/> - <line number="53" hits="1"/> - <line number="60" hits="1"/> - <line number="62" hits="1"/> - <line number="63" hits="1"/> - <line number="66" hits="1"/> - <line number="73" hits="1"/> - <line number="79" hits="1"/> - <line number="80" hits="1"/> - <line number="81" hits="1"/> - <line number="83" hits="1"/> - <line number="85" hits="1"/> - <line number="89" hits="1"/> - <line number="92" hits="1"/> - <line number="94" hits="1"/> - <line number="95" hits="1"/> - <line number="97" hits="1"/> - <line number="98" hits="0"/> - </lines> - </class> - <class name="sharedweb.py" - filename="apps/cli/executables/pexable/delivery/delivery/destinations/sharedweb.py" - complexity="0" line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="9" hits="1"/> - <line number="16" hits="1"/> - <line number="20" hits="1"/> - <line number="23" hits="1"/> - <line number="26" hits="1"/> - <line number="31" hits="1"/> - <line number="34" hits="1"/> - <line number="37" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - </lines> - </class> - <class name="tar.py" filename="apps/cli/executables/pexable/delivery/delivery/destinations/tar.py" - complexity="0" line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="4" hits="1"/> - <line number="7" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="20" hits="1"/> - <line number="22" hits="1"/> - <line number="25" hits="1"/> - <line number="27" hits="1"/> - <line number="37" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="41" hits="1"/> - <line number="44" hits="1"/> - <line number="47" hits="1"/> - <line number="49" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="57" hits="1"/> - <line number="59" hits="1"/> - <line number="60" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.executables.pexable.ingest_envoy.ingest_envoy" line-rate="0.8597" branch-rate="0.5854" - complexity="0"> - <classes> - <class name="ingest.py" filename="apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingest.py" - complexity="0" line-rate="0.9756" branch-rate="0.625"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="24" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="29" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="36" hits="1"/> - <line number="43" hits="1"/> - <line number="50" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="55" hits="1"/> - <line number="57" hits="1"/> - <line number="60" hits="1"/> - <line number="66" hits="1"/> - <line number="70" hits="1"/> - <line number="71" hits="1"/> - <line number="74" hits="1"/> - <line number="75" hits="1"/> - <line number="77" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="78" hits="1"/> - <line number="79" hits="1"/> - <line number="81" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="88"/> - <line number="82" hits="1"/> - <line number="83" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="85" hits="1"/> - <line number="88" hits="0"/> - </lines> - </class> - <class name="ingestion_manifest.py" - filename="apps/cli/executables/pexable/ingest_envoy/ingest_envoy/ingestion_manifest.py" - complexity="0" line-rate="0.7847" branch-rate="0.525"> - <methods/> - <lines> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="16" hits="1"/> - <line number="33" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="48" hits="1"/> - <line number="51" hits="1"/> - <line number="62" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="65" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1"/> - <line number="69" hits="1"/> - <line number="71" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="73" hits="1"/> - <line number="74" hits="1"/> - <line number="82" hits="1"/> - <line number="83" hits="1"/> - <line number="91" hits="0"/> - <line number="93" hits="1"/> - <line number="94" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="95,97"/> - <line number="95" hits="0"/> - <line number="97" hits="0"/> - <line number="99" hits="1"/> - <line number="100" hits="1"/> - <line number="106" hits="0"/> - <line number="109" hits="1"/> - <line number="112" hits="1"/> - <line number="119" hits="1"/> - <line number="120" hits="1"/> - <line number="121" hits="1"/> - <line number="122" hits="1"/> - <line number="123" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="124" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="125"/> - <line number="125" hits="0"/> - <line number="127" hits="1"/> - <line number="139" hits="1"/> - <line number="148" hits="1"/> - <line number="150" hits="1"/> - <line number="152" hits="1"/> - <line number="154" hits="1"/> - <line number="164" hits="1"/> - <line number="166" hits="1"/> - <line number="168" hits="1"/> - <line number="169" hits="1"/> - <line number="170" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="171" hits="1"/> - <line number="173" hits="1"/> - <line number="181" hits="1"/> - <line number="183" hits="1"/> - <line number="184" hits="1"/> - <line number="187" hits="1"/> - <line number="189" hits="1"/> - <line number="191" hits="1"/> - <line number="192" hits="1"/> - <line number="198" hits="1"/> - <line number="199" hits="1"/> - <line number="200" hits="1"/> - <line number="202" hits="1"/> - <line number="210" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="211" hits="1"/> - <line number="212" hits="1"/> - <line number="213" hits="1"/> - <line number="214" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="215" hits="1"/> - <line number="218" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="219"/> - <line number="219" hits="0"/> - <line number="221" hits="1"/> - <line number="223" hits="1"/> - <line number="230" hits="1"/> - <line number="232" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="233" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="240"/> - <line number="234" hits="1"/> - <line number="235" hits="1"/> - <line number="238" hits="1"/> - <line number="240" hits="1"/> - <line number="241" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="242"/> - <line number="242" hits="0"/> - <line number="244" hits="1"/> - <line number="246" hits="1"/> - <line number="253" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="259"/> - <line number="255" hits="1"/> - <line number="259" hits="0"/> - <line number="262" hits="1"/> - <line number="265" hits="1"/> - <line number="271" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="272"/> - <line number="272" hits="0"/> - <line number="274" hits="1"/> - <line number="282" hits="1"/> - <line number="290" hits="0"/> - <line number="291" hits="0"/> - <line number="293" hits="1"/> - <line number="298" hits="0"/> - <line number="299" hits="0"/> - <line number="300" hits="0"/> - <line number="303" hits="0"/> - <line number="304" hits="0"/> - <line number="305" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="306,308"/> - <line number="306" hits="0"/> - <line number="308" hits="0"/> - <line number="311" hits="1"/> - <line number="312" hits="0"/> - <line number="314" hits="1"/> - <line number="321" hits="1"/> - <line number="323" hits="1"/> - <line number="324" hits="1"/> - <line number="325" hits="1"/> - <line number="327" hits="1"/> - <line number="329" hits="1"/> - <line number="337" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="338,342"/> - <line number="338" hits="0"/> - <line number="342" hits="0"/> - <line number="348" hits="0"/> - <line number="350" hits="1"/> - <line number="357" hits="1"/> - <line number="359" hits="1"/> - <line number="371" hits="1"/> - <line number="377" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,378"/> - <line number="378" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="379,382"/> - <line number="379" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="378,380"/> - <line number="380" hits="0"/> - <line number="382" hits="0"/> - <line number="385" hits="1"/> - <line number="394" hits="1"/> - <line number="397" hits="1"/> - <line number="403" hits="1"/> - <line number="404" hits="1"/> - <line number="405" hits="1"/> - <line number="408" hits="1"/> - <line number="415" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="419"/> - <line number="416" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="417" hits="1"/> - <line number="419" hits="0"/> - </lines> - </class> - <class name="launchers.py" - filename="apps/cli/executables/pexable/ingest_envoy/ingest_envoy/launchers.py" complexity="0" - line-rate="0.7586" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="18" hits="1"/> - <line number="24" hits="0"/> - <line number="25" hits="0"/> - <line number="27" hits="1"/> - <line number="33" hits="1"/> - <line number="38" hits="1"/> - <line number="40" hits="1"/> - <line number="42" hits="0"/> - <line number="45" hits="0"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="52" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="0"/> - <line number="60" hits="0"/> - <line number="62" hits="0"/> - </lines> - </class> - <class name="manifest_components.py" - filename="apps/cli/executables/pexable/ingest_envoy/ingest_envoy/manifest_components.py" - complexity="0" line-rate="0.88" branch-rate="0.6333"> - <methods/> - <lines> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="20" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="31" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="42" hits="1"/> - <line number="45" hits="1"/> - <line number="46" hits="1"/> - <line number="47" hits="0"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="56" hits="0"/> - <line number="59" hits="1"/> - <line number="62" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="70"/> - <line number="68" hits="1"/> - <line number="70" hits="0"/> - <line number="72" hits="1"/> - <line number="78" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="80"/> - <line number="79" hits="1"/> - <line number="80" hits="0"/> - <line number="83" hits="1"/> - <line number="86" hits="1"/> - <line number="87" hits="1"/> - <line number="89" hits="1"/> - <line number="90" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="93"/> - <line number="91" hits="1"/> - <line number="93" hits="0"/> - <line number="95" hits="1"/> - <line number="101" hits="1"/> - <line number="102" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="104" hits="1"/> - <line number="111" hits="1"/> - <line number="114" hits="1"/> - <line number="122" hits="1"/> - <line number="123" hits="1"/> - <line number="124" hits="1"/> - <line number="125" hits="1"/> - <line number="126" hits="1"/> - <line number="128" hits="1"/> - <line number="129" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="138"/> - <line number="130" hits="1"/> - <line number="138" hits="0"/> - <line number="140" hits="1"/> - <line number="141" hits="1"/> - <line number="152" hits="1"/> - <line number="155" hits="1"/> - <line number="156" hits="1"/> - <line number="157" hits="1"/> - <line number="159" hits="1"/> - <line number="160" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="163"/> - <line number="161" hits="1"/> - <line number="163" hits="0"/> - <line number="165" hits="1"/> - <line number="166" hits="1"/> - <line number="169" hits="1"/> - <line number="172" hits="1"/> - <line number="179" hits="1"/> - <line number="180" hits="1"/> - <line number="181" hits="1"/> - <line number="182" hits="1"/> - <line number="185" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="186"/> - <line number="186" hits="0"/> - <line number="188" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="189"/> - <line number="189" hits="0"/> - <line number="191" hits="1"/> - <line number="192" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="200"/> - <line number="193" hits="1"/> - <line number="200" hits="0"/> - <line number="202" hits="1"/> - <line number="208" hits="1"/> - <line number="209" hits="1"/> - <line number="210" hits="1"/> - <line number="211" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="212" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="213" hits="1"/> - <line number="215" hits="1"/> - <line number="218" hits="1"/> - <line number="221" hits="1"/> - <line number="226" hits="1"/> - <line number="227" hits="1"/> - <line number="229" hits="1"/> - <line number="230" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="231,236"/> - <line number="231" hits="0"/> - <line number="236" hits="0"/> - <line number="238" hits="1"/> - <line number="244" hits="1"/> - <line number="246" hits="1"/> - <line number="247" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="248" hits="1"/> - <line number="250" hits="1"/> - <line number="251" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="255"/> - <line number="252" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="253" hits="1"/> - <line number="255" hits="1"/> - <line number="258" hits="1"/> - <line number="261" hits="1"/> - <line number="262" hits="0"/> - <line number="264" hits="1"/> - <line number="270" hits="0"/> - </lines> - </class> - <class name="solicitor.py" - filename="apps/cli/executables/pexable/ingest_envoy/ingest_envoy/solicitor.py" complexity="0" - line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="22" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - </lines> - </class> - <class name="utilities.py" - filename="apps/cli/executables/pexable/ingest_envoy/ingest_envoy/utilities.py" complexity="0" - line-rate="0.9706" branch-rate="0.75"> - <methods/> - <lines> - <line number="3" hits="1"/> - <line number="5" hits="1"/> - <line number="11" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="23" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="32" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="43" hits="1"/> - <line number="45" hits="1"/> - <line number="46" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="53" hits="1"/> - <line number="57" hits="1"/> - <line number="61" hits="1"/> - <line number="67" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="68" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="69"/> - <line number="69" hits="0"/> - <line number="73" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.executables.pexable.null.null" line-rate="0.7206" branch-rate="0.75" complexity="0"> - <classes> - <class name="null.py" filename="apps/cli/executables/pexable/null/null/null.py" complexity="0" - line-rate="0.7206" branch-rate="0.75"> - <methods/> - <lines> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="12" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="34" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="42" hits="1"/> - <line number="46" hits="1"/> - <line number="47" hits="1"/> - <line number="50" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="1"/> - <line number="56" hits="1"/> - <line number="59" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="65" hits="1"/> - <line number="66" hits="1"/> - <line number="69" hits="1"/> - <line number="73" hits="1"/> - <line number="74" hits="1"/> - <line number="75" hits="1"/> - <line number="78" hits="1"/> - <line number="82" hits="0"/> - <line number="83" hits="0"/> - <line number="86" hits="1"/> - <line number="91" hits="1"/> - <line number="92" hits="1"/> - <line number="93" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="95"/> - <line number="94" hits="1"/> - <line number="95" hits="1"/> - <line number="104" hits="1"/> - <line number="108" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="109" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="110" hits="1"/> - <line number="113" hits="1"/> - <line number="119" hits="0"/> - <line number="123" hits="0"/> - <line number="126" hits="0"/> - <line number="136" hits="0"/> - <line number="137" hits="0"/> - <line number="146" hits="0"/> - <line number="155" hits="0"/> - <line number="164" hits="0"/> - <line number="173" hits="0"/> - <line number="182" hits="0"/> - <line number="191" hits="0"/> - <line number="194" hits="1"/> - <line number="195" hits="0"/> - <line number="196" hits="0"/> - <line number="197" hits="0"/> - <line number="199" hits="0"/> - <line number="200" hits="0"/> - <line number="203" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="204"/> - <line number="204" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.executables.pexable.productfetcher.productfetcher" line-rate="0.8983" - branch-rate="0.8553" complexity="0"> - <classes> - <class name="exceptions.py" - filename="apps/cli/executables/pexable/productfetcher/productfetcher/exceptions.py" - complexity="0" line-rate="0.7931" branch-rate="1"> - <methods/> - <lines> - <line number="9" hits="1"/> - <line number="12" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="0"/> - <line number="24" hits="1"/> - <line number="30" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="0"/> - <line number="34" hits="0"/> - <line number="35" hits="0"/> - <line number="38" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="0"/> - <line number="51" hits="1"/> - <line number="58" hits="1"/> - <line number="65" hits="1"/> - <line number="70" hits="1"/> - <line number="71" hits="1"/> - <line number="72" hits="1"/> - <line number="73" hits="1"/> - <line number="74" hits="1"/> - <line number="76" hits="1"/> - <line number="77" hits="0"/> - <line number="82" hits="1"/> - </lines> - </class> - <class name="fetch_plan.py" - filename="apps/cli/executables/pexable/productfetcher/productfetcher/fetch_plan.py" - complexity="0" line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="30" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="40" hits="1"/> - <line number="47" hits="1"/> - <line number="49" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="52" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="56" hits="1"/> - </lines> - </class> - <class name="fetcher_factory.py" - filename="apps/cli/executables/pexable/productfetcher/productfetcher/fetcher_factory.py" - complexity="0" line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="3" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="23" hits="1"/> - <line number="29" hits="1"/> - <line number="39" hits="1"/> - <line number="42" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="46" hits="1"/> - <line number="47" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="48" hits="1"/> - <line number="50" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="56" hits="1"/> - <line number="63" hits="1"/> - <line number="70" hits="1"/> - <line number="77" hits="1"/> - <line number="84" hits="1"/> - <line number="94" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="95" hits="1"/> - <line number="97" hits="1"/> - </lines> - </class> - <class name="fetchers.py" - filename="apps/cli/executables/pexable/productfetcher/productfetcher/fetchers.py" complexity="0" - line-rate="0.831" branch-rate="0.75"> - <methods/> - <lines> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="22" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="31" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="40" hits="1"/> - <line number="41" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="42" hits="1"/> - <line number="47" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="61" hits="1"/> - <line number="62" hits="0"/> - <line number="64" hits="1"/> - <line number="71" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="72" hits="1"/> - <line number="75" hits="1"/> - <line number="78" hits="1"/> - <line number="81" hits="1"/> - <line number="83" hits="1"/> - <line number="85" hits="1"/> - <line number="86" hits="0"/> - <line number="89" hits="1"/> - <line number="94" hits="1"/> - <line number="95" hits="1"/> - <line number="96" hits="1"/> - <line number="97" hits="1"/> - <line number="99" hits="1"/> - <line number="100" hits="1"/> - <line number="101" hits="1"/> - <line number="103" hits="1"/> - <line number="104" hits="1"/> - <line number="106" hits="1"/> - <line number="113" hits="1"/> - <line number="116" hits="1"/> - <line number="119" hits="1"/> - <line number="121" hits="1"/> - <line number="123" hits="1"/> - <line number="124" hits="0"/> - <line number="127" hits="1"/> - <line number="132" hits="1"/> - <line number="134" hits="1"/> - <line number="136" hits="1"/> - <line number="137" hits="1"/> - <line number="138" hits="1"/> - <line number="139" hits="1"/> - <line number="141" hits="1"/> - <line number="142" hits="1"/> - <line number="143" hits="1"/> - <line number="145" hits="1"/> - <line number="146" hits="0"/> - <line number="148" hits="1"/> - <line number="155" hits="1"/> - <line number="158" hits="1"/> - <line number="160" hits="1"/> - <line number="161" hits="1"/> - <line number="162" hits="1"/> - <line number="170" hits="1"/> - <line number="171" hits="0"/> - <line number="172" hits="0"/> - <line number="174" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="176" hits="1"/> - <line number="178" hits="1"/> - <line number="179" hits="1"/> - <line number="185" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="186,197"/> - <line number="186" hits="0"/> - <line number="187" hits="0"/> - <line number="188" hits="0"/> - <line number="189" hits="0"/> - <line number="191" hits="0"/> - <line number="192" hits="0"/> - <line number="193" hits="0"/> - <line number="194" hits="0"/> - <line number="196" hits="0"/> - <line number="197" hits="0"/> - <line number="199" hits="1"/> - <line number="200" hits="0"/> - <line number="203" hits="1"/> - <line number="208" hits="1"/> - <line number="209" hits="1"/> - <line number="210" hits="1"/> - <line number="212" hits="1"/> - <line number="213" hits="1"/> - <line number="214" hits="1"/> - <line number="216" hits="1"/> - <line number="217" hits="1"/> - <line number="219" hits="1"/> - <line number="220" hits="0"/> - <line number="222" hits="1"/> - <line number="223" hits="0"/> - <line number="226" hits="1"/> - <line number="230" hits="1"/> - <line number="231" hits="1"/> - <line number="232" hits="1"/> - <line number="234" hits="1"/> - <line number="235" hits="1"/> - <line number="236" hits="1"/> - <line number="237" hits="1"/> - <line number="238" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="240" hits="1"/> - <line number="241" hits="1"/> - <line number="244" hits="1"/> - <line number="245" hits="1"/> - <line number="247" hits="1"/> - <line number="248" hits="0"/> - <line number="251" hits="1"/> - <line number="256" hits="1"/> - <line number="257" hits="1"/> - <line number="258" hits="1"/> - <line number="259" hits="1"/> - <line number="261" hits="1"/> - <line number="262" hits="1"/> - <line number="263" hits="1"/> - <line number="265" hits="1"/> - <line number="270" hits="1"/> - <line number="271" hits="1"/> - <line number="273" hits="1"/> - <line number="274" hits="0"/> - <line number="277" hits="1"/> - <line number="284" hits="1"/> - <line number="287" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="288" hits="1"/> - <line number="290" hits="1"/> - <line number="293" hits="1"/> - <line number="299" hits="1"/> - <line number="300" hits="1"/> - <line number="301" hits="1"/> - <line number="303" hits="1"/> - <line number="304" hits="0"/> - <line number="305" hits="0"/> - </lines> - </class> - <class name="locations.py" - filename="apps/cli/executables/pexable/productfetcher/productfetcher/locations.py" complexity="0" - line-rate="0.9079" branch-rate="0.5625"> - <methods/> - <lines> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="23" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="36" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="49" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="50" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="51" hits="1"/> - <line number="53" hits="1"/> - <line number="56" hits="1"/> - <line number="61" hits="1"/> - <line number="62" hits="1"/> - <line number="65" hits="1"/> - <line number="70" hits="1"/> - <line number="71" hits="1"/> - <line number="72" hits="1"/> - <line number="74" hits="1"/> - <line number="88" hits="1"/> - <line number="90" hits="1"/> - <line number="96" hits="1"/> - <line number="98" hits="1"/> - <line number="99" hits="0"/> - <line number="102" hits="1"/> - <line number="105" hits="1"/> - <line number="106" hits="1"/> - <line number="107" hits="1"/> - <line number="108" hits="1"/> - <line number="109" hits="1"/> - <line number="110" hits="1"/> - <line number="111" hits="1"/> - <line number="112" hits="1"/> - <line number="114" hits="1"/> - <line number="125" hits="1"/> - <line number="126" hits="1"/> - <line number="127" hits="1"/> - <line number="128" hits="1"/> - <line number="129" hits="1"/> - <line number="130" hits="1"/> - <line number="131" hits="1"/> - <line number="132" hits="1"/> - <line number="133" hits="1"/> - <line number="135" hits="1"/> - <line number="136" hits="1"/> - <line number="138" hits="1"/> - <line number="139" hits="1"/> - <line number="141" hits="1"/> - <line number="145" hits="1"/> - <line number="147" hits="1"/> - <line number="153" hits="1"/> - <line number="154" hits="1"/> - <line number="156" hits="1"/> - <line number="162" hits="1"/> - <line number="163" hits="1"/> - <line number="165" hits="1"/> - <line number="166" hits="0"/> - <line number="168" hits="1"/> - <line number="169" hits="1"/> - <line number="181" hits="1"/> - <line number="184" hits="1"/> - <line number="185" hits="1"/> - <line number="186" hits="1"/> - <line number="187" hits="1"/> - <line number="188" hits="1"/> - <line number="190" hits="1"/> - <line number="191" hits="1"/> - <line number="192" hits="1"/> - <line number="193" hits="1"/> - <line number="194" hits="1"/> - <line number="195" hits="1"/> - <line number="196" hits="1"/> - <line number="198" hits="1"/> - <line number="199" hits="0"/> - <line number="201" hits="1"/> - <line number="203" hits="0"/> - <line number="205" hits="1"/> - <line number="206" hits="0"/> - <line number="209" hits="1"/> - <line number="212" hits="1"/> - <line number="213" hits="1"/> - <line number="215" hits="1"/> - <line number="216" hits="1"/> - <line number="219" hits="1"/> - <line number="222" hits="1"/> - <line number="223" hits="1"/> - <line number="225" hits="1"/> - <line number="226" hits="1"/> - <line number="230" hits="1"/> - <line number="231" hits="1"/> - <line number="233" hits="1"/> - <line number="234" hits="1"/> - <line number="235" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="236,237"/> - <line number="236" hits="0"/> - <line number="237" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="238,239"/> - <line number="238" hits="0"/> - <line number="239" hits="0"/> - <line number="240" hits="0"/> - <line number="242" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="244"/> - <line number="243" hits="1"/> - <line number="244" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="245,246"/> - <line number="245" hits="0"/> - <line number="246" hits="0"/> - <line number="249" hits="1"/> - <line number="252" hits="1"/> - <line number="253" hits="1"/> - <line number="254" hits="1"/> - <line number="256" hits="1"/> - <line number="257" hits="1"/> - <line number="258" hits="1"/> - <line number="261" hits="1"/> - <line number="264" hits="1"/> - <line number="265" hits="1"/> - <line number="266" hits="1"/> - <line number="267" hits="1"/> - <line number="268" hits="1"/> - <line number="269" hits="1"/> - <line number="270" hits="1"/> - <line number="271" hits="1"/> - <line number="272" hits="1"/> - <line number="273" hits="1"/> - <line number="275" hits="1"/> - <line number="276" hits="1"/> - <line number="278" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="279" hits="1"/> - <line number="281" hits="1"/> - <line number="282" hits="1"/> - <line number="283" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="284" hits="1"/> - <line number="285" hits="1"/> - <line number="288" hits="1"/> - <line number="291" hits="1"/> - <line number="292" hits="1"/> - <line number="294" hits="1"/> - <line number="295" hits="1"/> - <line number="296" hits="1"/> - </lines> - </class> - <class name="ngas.py" filename="apps/cli/executables/pexable/productfetcher/productfetcher/ngas.py" - complexity="0" line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="22" hits="1"/> - <line number="24" hits="1"/> - <line number="26" hits="1"/> - <line number="29" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="38" hits="1"/> - <line number="49" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="1"/> - <line number="56" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="57" hits="1"/> - <line number="59" hits="1"/> - <line number="71" hits="1"/> - <line number="78" hits="1"/> - <line number="80" hits="1"/> - <line number="89" hits="1"/> - <line number="94" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="95" hits="1"/> - <line number="96" hits="1"/> - <line number="98" hits="1"/> - <line number="103" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="104" hits="1"/> - <line number="107" hits="1"/> - <line number="108" hits="1"/> - <line number="110" hits="1"/> - <line number="111" hits="1"/> - </lines> - </class> - <class name="product_fetcher.py" - filename="apps/cli/executables/pexable/productfetcher/productfetcher/product_fetcher.py" - complexity="0" line-rate="0.9048" branch-rate="0.9583"> - <methods/> - <lines> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="17" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="26" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="39" hits="1"/> - <line number="44" hits="1"/> - <line number="47" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="60" hits="1"/> - <line number="61" hits="1"/> - <line number="63" hits="1"/> - <line number="70" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="73" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="84" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="87" hits="1"/> - <line number="89" hits="1"/> - <line number="90" hits="1"/> - <line number="103" hits="1"/> - <line number="104" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="105" hits="1"/> - <line number="106" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="107" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="108" hits="1"/> - <line number="109" hits="1"/> - <line number="111" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="114" hits="1"/> - <line number="118" hits="1"/> - <line number="119" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="120" hits="1"/> - <line number="123" hits="1"/> - <line number="125" hits="1"/> - <line number="126" hits="1"/> - <line number="134" hits="1"/> - <line number="135" hits="1"/> - <line number="138" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="139" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="141" hits="1"/> - <line number="145" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="146" hits="1"/> - <line number="148" hits="1"/> - <line number="157" hits="1"/> - <line number="158" hits="1"/> - <line number="177" hits="1"/> - <line number="182" hits="1"/> - <line number="191" hits="1"/> - <line number="194" hits="1"/> - <line number="202" hits="1"/> - <line number="203" hits="1"/> - <line number="210" hits="1"/> - <line number="217" hits="1"/> - <line number="218" hits="1"/> - <line number="224" hits="1"/> - <line number="231" hits="1"/> - <line number="234" hits="1"/> - <line number="236" hits="0"/> - <line number="238" hits="0"/> - <line number="241" hits="0"/> - <line number="244" hits="0"/> - <line number="246" hits="0"/> - <line number="247" hits="0"/> - <line number="248" hits="0"/> - <line number="251" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="252"/> - <line number="252" hits="0"/> - </lines> - </class> - <class name="progress.py" - filename="apps/cli/executables/pexable/productfetcher/productfetcher/progress.py" complexity="0" - line-rate="0.9" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="5" hits="1"/> - <line number="8" hits="1"/> - <line number="13" hits="1"/> - <line number="17" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="0"/> - </lines> - </class> - <class name="validators.py" - filename="apps/cli/executables/pexable/productfetcher/productfetcher/validators.py" - complexity="0" line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="25" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="34" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="38" hits="1"/> - <line number="43" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="53" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> - <line number="61" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="62" hits="1"/> - <line number="66" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="67" hits="1"/> - <line number="72" hits="1"/> - <line number="78" hits="1"/> - <line number="79" hits="1"/> - <line number="80" hits="1"/> - <line number="81" hits="1"/> - <line number="82" hits="1"/> - <line number="83" hits="1"/> - <line number="84" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.executables.pexable.vela.vela" line-rate="0.8372" branch-rate="0.4583" complexity="0"> - <classes> - <class name="emulators.py" filename="apps/cli/executables/pexable/vela/vela/emulators.py" complexity="0" - line-rate="0.75" branch-rate="0.3333"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="0"/> - <line number="22" hits="0"/> - <line number="23" hits="0"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="28" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="31"/> - <line number="29" hits="1"/> - <line number="31" hits="1"/> - <line number="33" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="34"/> - <line number="34" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="35,37"/> - <line number="35" hits="0"/> - <line number="37" hits="0"/> - </lines> - </class> - <class name="forger.py" filename="apps/cli/executables/pexable/vela/vela/forger.py" complexity="0" - line-rate="0.8707" branch-rate="0.8"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="20" hits="1"/> - <line number="26" hits="1"/> - <line number="28" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="29" hits="1"/> - <line number="30" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="31" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="46" hits="1"/> - <line number="47" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="56" hits="1"/> - <line number="58" hits="1"/> - <line number="61" hits="1"/> - <line number="62" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1"/> - <line number="69" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="70" hits="1"/> - <line number="71" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="72" hits="1"/> - <line number="74" hits="1"/> - <line number="77" hits="1"/> - <line number="78" hits="1"/> - <line number="80" hits="1"/> - <line number="85" hits="1"/> - <line number="87" hits="1"/> - <line number="88" hits="1"/> - <line number="89" hits="1"/> - <line number="91" hits="1"/> - <line number="92" hits="1"/> - <line number="93" hits="1"/> - <line number="95" hits="1"/> - <line number="96" hits="1"/> - <line number="98" hits="1"/> - <line number="99" hits="0"/> - <line number="100" hits="0"/> - <line number="102" hits="0"/> - <line number="104" hits="0"/> - <line number="105" hits="0"/> - <line number="106" hits="0"/> - <line number="108" hits="0"/> - <line number="109" hits="0"/> - <line number="111" hits="0"/> - <line number="112" hits="0"/> - <line number="114" hits="1"/> - <line number="115" hits="1"/> - <line number="116" hits="1"/> - <line number="117" hits="1"/> - <line number="118" hits="1"/> - <line number="120" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="121" hits="1"/> - <line number="122" hits="1"/> - <line number="123" hits="1"/> - <line number="124" hits="1"/> - <line number="125" hits="1"/> - <line number="126" hits="1"/> - <line number="127" hits="1"/> - <line number="128" hits="1"/> - <line number="130" hits="1"/> - <line number="131" hits="1"/> - <line number="133" hits="1"/> - <line number="134" hits="1"/> - <line number="136" hits="1"/> - <line number="137" hits="1"/> - <line number="138" hits="1"/> - <line number="139" hits="1"/> - <line number="140" hits="1"/> - <line number="141" hits="1"/> - <line number="142" hits="1"/> - <line number="144" hits="1"/> - <line number="145" hits="1"/> - <line number="146" hits="1"/> - <line number="148" hits="1"/> - <line number="149" hits="1"/> - <line number="150" hits="1"/> - <line number="157" hits="1"/> - <line number="159" hits="1"/> - <line number="160" hits="1"/> - <line number="161" hits="1"/> - <line number="163" hits="1"/> - <line number="166" hits="1"/> - <line number="167" hits="1"/> - <line number="168" hits="1"/> - <line number="171" hits="1"/> - <line number="172" hits="1"/> - <line number="176" hits="1"/> - <line number="177" hits="0"/> - <line number="178" hits="0"/> - <line number="179" hits="0"/> - <line number="181" hits="0"/> - <line number="182" hits="0"/> - </lines> - </class> - <class name="quasar.py" filename="apps/cli/executables/pexable/vela/vela/quasar.py" complexity="0" - line-rate="0.7812" branch-rate="0.125"> - <methods/> - <lines> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="10" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="26" hits="1"/> - <line number="33" hits="1"/> - <line number="39" hits="1"/> - <line number="45" hits="1"/> - <line number="51" hits="1"/> - <line number="57" hits="1"/> - <line number="60" hits="1"/> - <line number="61" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="69"/> - <line number="68" hits="1"/> - <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="70,71"/> - <line number="70" hits="0"/> - <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="72,73"/> - <line number="72" hits="0"/> - <line number="73" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="74,76"/> - <line number="74" hits="0"/> - <line number="76" hits="0"/> - <line number="78" hits="1"/> - <line number="79" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.executables.pexable.vela.vela.content" line-rate="1" branch-rate="1" complexity="0"> - <classes> - <class name="forger_content.py" - filename="apps/cli/executables/pexable/vela/vela/content/forger_content.py" complexity="0" - line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.utilities.aat_wrest.aat_wrest" line-rate="0.6446" branch-rate="0.3" complexity="0"> - <classes> - <class name="metadata_wrester.py" filename="apps/cli/utilities/aat_wrest/aat_wrest/metadata_wrester.py" - complexity="0" line-rate="0.68" branch-rate="0.3333"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="10" hits="1"/> - <line number="13" hits="1"/> - <line number="18" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="29" hits="1"/> - <line number="36" hits="1"/> - <line number="48" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="68"/> - <line number="54" hits="1"/> - <line number="68" hits="0"/> - <line number="73" hits="1"/> - <line number="74" hits="1"/> - <line number="76" hits="1"/> - <line number="83" hits="1"/> - <line number="95" hits="1"/> - <line number="96" hits="1"/> - <line number="97" hits="1"/> - <line number="98" hits="1"/> - <line number="99" hits="1"/> - <line number="100" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="115"/> - <line number="101" hits="1"/> - <line number="115" hits="0"/> - <line number="120" hits="1"/> - <line number="121" hits="1"/> - <line number="123" hits="1"/> - <line number="129" hits="0"/> - <line number="142" hits="0"/> - <line number="147" hits="0"/> - <line number="148" hits="0"/> - <line number="149" hits="0"/> - <line number="150" hits="0"/> - <line number="151" hits="0"/> - <line number="152" hits="0"/> - <line number="153" hits="0"/> - <line number="154" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="155,170"/> - <line number="155" hits="0"/> - <line number="170" hits="0"/> - <line number="175" hits="0"/> - <line number="176" hits="0"/> - </lines> - </class> - <class name="observation_wrester.py" - filename="apps/cli/utilities/aat_wrest/aat_wrest/observation_wrester.py" complexity="0" - line-rate="0.5122" branch-rate="0.25"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="7" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="14" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="24" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="56"/> - <line number="46" hits="1"/> - <line number="56" hits="0"/> - <line number="61" hits="1"/> - <line number="62" hits="1"/> - <line number="67" hits="1"/> - <line number="75" hits="0"/> - <line number="80" hits="0"/> - <line number="81" hits="0"/> - <line number="82" hits="0"/> - <line number="83" hits="0"/> - <line number="84" hits="0"/> - <line number="86" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="87,107"/> - <line number="87" hits="0"/> - <line number="88" hits="0"/> - <line number="89" hits="0"/> - <line number="91" hits="0"/> - <line number="92" hits="0"/> - <line number="93" hits="0"/> - <line number="95" hits="0"/> - <line number="96" hits="0"/> - <line number="98" hits="0"/> - <line number="107" hits="0"/> - <line number="112" hits="0"/> - <line number="114" hits="0"/> - </lines> - </class> - <class name="utilities.py" filename="apps/cli/utilities/aat_wrest/aat_wrest/utilities.py" complexity="0" - line-rate="0.7667" branch-rate="1"> - <methods/> - <lines> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="21" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="27" hits="1"/> - <line number="33" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="0"/> - <line number="45" hits="0"/> - <line number="46" hits="0"/> - <line number="48" hits="1"/> - <line number="49" hits="0"/> - <line number="51" hits="1"/> - <line number="52" hits="0"/> - <line number="55" hits="1"/> - <line number="63" hits="0"/> - <line number="68" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.utilities.system_mediator.system_mediator" line-rate="0.6667" branch-rate="0.5" - complexity="0"> - <classes> - <class name="arbitrator.py" filename="apps/cli/utilities/system_mediator/system_mediator/arbitrator.py" - complexity="0" line-rate="0.6667" branch-rate="0.5"> - <methods/> - <lines> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="27" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="38" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="46" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="45"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="50" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="65" hits="1"/> - <line number="67" hits="1"/> - <line number="74" hits="1"/> - <line number="75" hits="1"/> - <line number="76" hits="1"/> - <line number="77" hits="1"/> - <line number="78" hits="1"/> - <line number="80" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="81"/> - <line number="81" hits="0"/> - <line number="87" hits="1"/> - <line number="93" hits="1"/> - <line number="100" hits="1"/> - <line number="101" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="102"/> - <line number="102" hits="0"/> - <line number="104" hits="1"/> - <line number="105" hits="1"/> - <line number="106" hits="1"/> - <line number="107" hits="1"/> - <line number="109" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="110"/> - <line number="110" hits="0"/> - <line number="114" hits="0"/> - <line number="115" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="116"/> - <line number="116" hits="0"/> - <line number="120" hits="0"/> - <line number="121" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="122,123"/> - <line number="122" hits="0"/> - <line number="123" hits="0"/> - <line number="124" hits="1"/> - <line number="126" hits="1"/> - <line number="132" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="138"/> - <line number="133" hits="1"/> - <line number="134" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="135" hits="1"/> - <line number="136" hits="1"/> - <line number="138" hits="0"/> - <line number="141" hits="1"/> - <line number="147" hits="0"/> - <line number="151" hits="0"/> - <line number="159" hits="0"/> - <line number="162" hits="1"/> - <line number="168" hits="0"/> - <line number="169" hits="0"/> - <line number="172" hits="0"/> - <line number="173" hits="0"/> - <line number="174" hits="0"/> - <line number="175" hits="0"/> - <line number="176" hits="0"/> - <line number="178" hits="0"/> - <line number="179" hits="0"/> - <line number="182" hits="1"/> - <line number="188" hits="0"/> - <line number="189" hits="0"/> - <line number="190" hits="0"/> - <line number="192" hits="0"/> - <line number="193" hits="0"/> - <line number="195" hits="0"/> - <line number="196" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.utilities.wf_monitor.wf_monitor" line-rate="0.8611" branch-rate="0.75" complexity="0"> - <classes> - <class name="monitor.py" filename="apps/cli/utilities/wf_monitor/wf_monitor/monitor.py" complexity="0" - line-rate="0.8611" branch-rate="0.75"> - <methods/> - <lines> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="19" hits="1"/> - <line number="23" hits="1"/> - <line number="25" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="32" hits="1"/> - <line number="40" hits="1"/> - <line number="48" hits="1"/> - <line number="49" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="60" hits="1"/> - <line number="62" hits="1"/> - <line number="64" hits="1"/> - <line number="67" hits="1"/> - <line number="75" hits="1"/> - <line number="79" hits="1"/> - <line number="84" hits="1"/> - <line number="87" hits="1"/> - <line number="94" hits="1"/> - <line number="95" hits="1"/> - <line number="96" hits="1"/> - <line number="99" hits="1"/> - <line number="108" hits="1"/> - <line number="109" hits="1"/> - <line number="112" hits="1"/> - <line number="114" hits="1"/> - <line number="124" hits="1"/> - <line number="131" hits="1"/> - <line number="133" hits="1"/> - <line number="134" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="135" hits="1"/> - <line number="138" hits="1"/> - <line number="143" hits="1"/> - <line number="144" hits="1"/> - <line number="145" hits="1"/> - <line number="146" hits="1"/> - <line number="148" hits="1"/> - <line number="150" hits="1"/> - <line number="152" hits="1"/> - <line number="154" hits="1"/> - <line number="156" hits="1"/> - <line number="158" hits="1"/> - <line number="159" hits="1"/> - <line number="167" hits="1"/> - <line number="168" hits="1"/> - <line number="169" hits="1"/> - <line number="170" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="171" hits="1"/> - <line number="174" hits="1"/> - <line number="175" hits="0"/> - <line number="177" hits="1"/> - <line number="178" hits="1"/> - <line number="180" hits="1"/> - <line number="181" hits="1"/> - <line number="188" hits="1"/> - <line number="189" hits="1"/> - <line number="190" hits="1"/> - <line number="191" hits="1"/> - <line number="192" hits="1"/> - <line number="194" hits="1"/> - <line number="195" hits="1"/> - <line number="197" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="exit"/> - <line number="198" hits="1"/> - <line number="199" hits="1"/> - <line number="200" hits="1"/> - <line number="203" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="204" hits="1"/> - <line number="206" hits="1"/> - <line number="207" hits="1"/> - <line number="208" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="209"/> - <line number="209" hits="0"/> - <line number="210" hits="0"/> - <line number="212" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="214" hits="1"/> - <line number="216" hits="1"/> - <line number="217" hits="1"/> - <line number="218" hits="0"/> - <line number="220" hits="0"/> - <line number="221" hits="0"/> - <line number="222" hits="1"/> - <line number="223" hits="1"/> - <line number="225" hits="1"/> - <line number="226" hits="1"/> - <line number="227" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="229"/> - <line number="229" hits="0"/> - <line number="232" hits="1"/> - <line number="234" hits="1"/> - <line number="235" hits="1"/> - <line number="248" hits="1"/> - <line number="255" hits="1"/> - <line number="256" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="266"/> - <line number="258" hits="1"/> - <line number="260" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="261" hits="1"/> - <line number="263" hits="1"/> - <line number="266" hits="0"/> - <line number="268" hits="1"/> - <line number="276" hits="1"/> - <line number="278" hits="1"/> - <line number="280" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="281" hits="1"/> - <line number="282" hits="1"/> - <line number="284" hits="1"/> - <line number="286" hits="1"/> - <line number="288" hits="1"/> - <line number="305" hits="1"/> - <line number="306" hits="1"/> - <line number="315" hits="1"/> - <line number="316" hits="1"/> - <line number="318" hits="1"/> - <line number="319" hits="1"/> - <line number="326" hits="1"/> - <line number="328" hits="1"/> - <line number="329" hits="0"/> - <line number="331" hits="1"/> - <line number="332" hits="0"/> - <line number="335" hits="1"/> - <line number="341" hits="1"/> - <line number="348" hits="0"/> - <line number="349" hits="0"/> - <line number="350" hits="0"/> - <line number="353" hits="1"/> - <line number="359" hits="0"/> - <line number="363" hits="0"/> - <line number="371" hits="0"/> - <line number="372" hits="0"/> - <line number="378" hits="0"/> - <line number="381" hits="1"/> - <line number="388" hits="0"/> - <line number="389" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="apps.cli.utilities.ws_metrics.ws_metrics" line-rate="0.5698" branch-rate="0" complexity="0"> - <classes> - <class name="deep_thought.py" filename="apps/cli/utilities/ws_metrics/ws_metrics/deep_thought.py" - complexity="0" line-rate="0.5698" branch-rate="0"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="24" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="38" hits="1"/> - <line number="42" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="46" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> - <line number="59" hits="1"/> - <line number="62" hits="1"/> - <line number="64" hits="1"/> - <line number="65" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1"/> - <line number="68" hits="1"/> - <line number="70" hits="1"/> - <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="72,74"/> - <line number="72" hits="0"/> - <line number="73" hits="0"/> - <line number="74" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="75,79"/> - <line number="75" hits="0"/> - <line number="76" hits="0"/> - <line number="79" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="80,86"/> - <line number="80" hits="0"/> - <line number="81" hits="0"/> - <line number="82" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="83,85"/> - <line number="83" hits="0"/> - <line number="85" hits="0"/> - <line number="86" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,87"/> - <line number="87" hits="0"/> - <line number="88" hits="0"/> - <line number="89" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="90,93"/> - <line number="90" hits="0"/> - <line number="93" hits="0"/> - <line number="96" hits="1"/> - <line number="102" hits="0"/> - <line number="106" hits="0"/> - <line number="114" hits="0"/> - <line number="122" hits="0"/> - <line number="130" hits="0"/> - <line number="139" hits="0"/> - <line number="142" hits="1"/> - <line number="143" hits="0"/> - <line number="146" hits="1"/> - <line number="147" hits="0"/> - <line number="148" hits="0"/> - <line number="149" hits="0"/> - <line number="150" hits="0"/> - <line number="151" hits="0"/> - <line number="152" hits="0"/> - <line number="153" hits="0"/> - <line number="154" hits="0"/> - <line number="160" hits="0"/> - <line number="161" hits="0"/> - <line number="163" hits="0"/> - <line number="164" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="services.capability.capability" line-rate="1" branch-rate="1" complexity="0"> - <classes> - <class name="routes.py" filename="services/capability/capability/routes.py" complexity="0" line-rate="1" - branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="4" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="16" hits="1"/> - <line number="22" hits="1"/> - <line number="25" hits="1"/> - <line number="31" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="39" hits="1"/> - <line number="44" hits="1"/> - <line number="49" hits="1"/> - <line number="52" hits="1"/> - <line number="57" hits="1"/> - <line number="63" hits="1"/> - <line number="65" hits="1"/> - <line number="67" hits="1"/> - <line number="72" hits="1"/> - <line number="77" hits="1"/> - <line number="82" hits="1"/> - <line number="85" hits="1"/> - <line number="89" hits="1"/> - <line number="94" hits="1"/> - <line number="100" hits="1"/> - <line number="102" hits="1"/> - <line number="108" hits="1"/> - <line number="111" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="services.capability.capability.views" line-rate="0.8201" branch-rate="0.8545" complexity="0"> - <classes> - <class name="capability.py" filename="services/capability/capability/views/capability.py" complexity="0" - line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="8" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="18" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="34" hits="1"/> - <line number="36" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="54" hits="1" branch="true" condition-coverage="100% (3/3)"/> - <line number="56" hits="1"/> - <line number="59" hits="1"/> - <line number="60" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="62" hits="1"/> - <line number="66" hits="1"/> - <line number="68" hits="1"/> - <line number="74" hits="1"/> - <line number="75" hits="1"/> - <line number="78" hits="1"/> - <line number="79" hits="1"/> - <line number="93" hits="1"/> - <line number="94" hits="1"/> - <line number="95" hits="1"/> - <line number="97" hits="1" branch="true" condition-coverage="100% (3/3)"/> - <line number="99" hits="1"/> - <line number="102" hits="1"/> - <line number="103" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="105" hits="1"/> - <line number="109" hits="1"/> - <line number="111" hits="1"/> - <line number="112" hits="1"/> - <line number="113" hits="1"/> - <line number="114" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="115" hits="1"/> - <line number="117" hits="1"/> - <line number="120" hits="1"/> - <line number="121" hits="1"/> - <line number="130" hits="1"/> - <line number="132" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="134" hits="1"/> - <line number="135" hits="1"/> - <line number="137" hits="1"/> - <line number="138" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="139" hits="1"/> - <line number="141" hits="1"/> - <line number="144" hits="1"/> - <line number="145" hits="1"/> - <line number="154" hits="1"/> - <line number="156" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="158" hits="1"/> - <line number="159" hits="1"/> - <line number="161" hits="1"/> - <line number="162" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="163" hits="1"/> - <line number="165" hits="1"/> - </lines> - </class> - <class name="capability_request.py" - filename="services/capability/capability/views/capability_request.py" complexity="0" - line-rate="0.8421" branch-rate="1"> - <methods/> - <lines> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="24" hits="1"/> - <line number="27" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="28" hits="1"/> - <line number="30" hits="1"/> - <line number="33" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="46" hits="1"/> - <line number="49" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="50" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> - <line number="66" hits="1"/> - <line number="69" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="70" hits="1"/> - <line number="72" hits="1"/> - <line number="73" hits="1"/> - <line number="76" hits="1"/> - <line number="77" hits="1"/> - <line number="88" hits="1"/> - <line number="89" hits="1"/> - <line number="90" hits="1"/> - <line number="92" hits="1" branch="true" condition-coverage="100% (3/3)"/> - <line number="94" hits="1"/> - <line number="97" hits="1"/> - <line number="98" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="100" hits="1"/> - <line number="103" hits="1"/> - <line number="106" hits="1"/> - <line number="109" hits="1"/> - <line number="112" hits="1"/> - <line number="113" hits="1"/> - <line number="125" hits="0"/> - <line number="126" hits="0"/> - <line number="128" hits="0"/> - <line number="129" hits="0"/> - <line number="130" hits="0"/> - <line number="132" hits="0"/> - <line number="134" hits="0"/> - <line number="137" hits="0"/> - <line number="138" hits="0"/> - <line number="140" hits="0"/> - <line number="143" hits="0"/> - <line number="146" hits="1"/> - <line number="147" hits="1"/> - <line number="157" hits="0"/> - <line number="160" hits="1"/> - <line number="161" hits="1"/> - <line number="171" hits="1"/> - <line number="172" hits="1"/> - <line number="174" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="176" hits="1"/> - <line number="179" hits="1"/> - <line number="181" hits="1"/> - <line number="182" hits="1"/> - <line number="185" hits="1"/> - <line number="186" hits="1"/> - <line number="197" hits="1"/> - <line number="198" hits="1"/> - <line number="199" hits="1"/> - <line number="201" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="203" hits="1"/> - <line number="204" hits="1"/> - <line number="206" hits="1"/> - <line number="207" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="208" hits="1"/> - <line number="212" hits="1"/> - <line number="213" hits="1"/> - </lines> - </class> - <class name="capability_version.py" - filename="services/capability/capability/views/capability_version.py" complexity="0" - line-rate="0.5769" branch-rate="0.5"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="24" hits="1"/> - <line number="27" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="28" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="32" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="33"/> - <line number="33" hits="0"/> - <line number="35" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="40" hits="1"/> - <line number="43" hits="1"/> - <line number="46" hits="1"/> - <line number="47" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="61" hits="1" branch="true" condition-coverage="66% (2/3)" missing-branches="63"/> - <line number="63" hits="0"/> - <line number="66" hits="0"/> - <line number="67" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="69"/> - <line number="69" hits="0"/> - <line number="72" hits="0"/> - <line number="74" hits="1"/> - <line number="77" hits="1"/> - <line number="80" hits="1"/> - <line number="81" hits="1"/> - <line number="92" hits="0"/> - <line number="93" hits="0"/> - <line number="94" hits="0"/> - <line number="95" hits="0"/> - <line number="96" hits="0"/> - <line number="97" hits="0"/> - <line number="98" hits="0"/> - <line number="100" hits="0" branch="true" condition-coverage="0% (0/3)" - missing-branches="exit,102,106"/> - <line number="102" hits="0"/> - <line number="105" hits="0"/> - <line number="106" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="108,113"/> - <line number="108" hits="0"/> - <line number="111" hits="0"/> - <line number="113" hits="0"/> - <line number="114" hits="0"/> - <line number="115" hits="0"/> - <line number="120" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="services.notification.notification" line-rate="1" branch-rate="1" complexity="0"> - <classes> - <class name="routes.py" filename="services/notification/notification/routes.py" complexity="0" - line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="4" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="15" hits="1"/> - <line number="21" hits="1"/> - <line number="24" hits="1"/> - <line number="30" hits="1"/> - <line number="31" hits="1"/> - <line number="34" hits="1"/> - <line number="40" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="services.notification.notification.views" line-rate="0.8511" branch-rate="0.7" complexity="0"> - <classes> - <class name="notify.py" filename="services/notification/notification/views/notify.py" complexity="0" - line-rate="0.8511" branch-rate="0.7"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="14" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="26" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="42" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="43"/> - <line number="43" hits="0"/> - <line number="48" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="49"/> - <line number="49" hits="0"/> - <line number="54" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="55"/> - <line number="55" hits="0"/> - <line number="60" hits="1"/> - <line number="61" hits="1"/> - <line number="64" hits="0"/> - <line number="65" hits="0"/> - <line number="70" hits="1"/> - <line number="73" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="74" hits="1"/> - <line number="75" hits="1"/> - <line number="76" hits="1"/> - <line number="78" hits="1"/> - <line number="79" hits="1"/> - <line number="87" hits="1"/> - <line number="89" hits="1"/> - <line number="90" hits="1"/> - <line number="91" hits="0"/> - <line number="92" hits="0"/> - <line number="97" hits="1"/> - <line number="99" hits="1"/> - <line number="100" hits="1"/> - <line number="107" hits="1"/> - <line number="108" hits="1"/> - <line number="110" hits="1"/> - <line number="112" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="shared.messaging.messaging" line-rate="0.8537" branch-rate="0.7941" complexity="0"> - <classes> - <class name="messenger.py" filename="shared/messaging/messaging/messenger.py" complexity="0" - line-rate="0.7536" branch-rate="0.5714"> - <methods/> - <lines> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="15" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="22" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="39" hits="1"/> - <line number="41" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="56" hits="1"/> - <line number="58" hits="1"/> - <line number="66" hits="1"/> - <line number="68" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="69" hits="1"/> - <line number="70" hits="1"/> - <line number="72" hits="1"/> - <line number="73" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="74" hits="1"/> - <line number="75" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="76" hits="1"/> - <line number="77" hits="1"/> - <line number="82" hits="1"/> - <line number="84" hits="1"/> - <line number="86" hits="1"/> - <line number="87" hits="1"/> - <line number="89" hits="1"/> - <line number="95" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="96" hits="1"/> - <line number="97" hits="1"/> - <line number="100" hits="1"/> - <line number="105" hits="1"/> - <line number="106" hits="1"/> - <line number="107" hits="0"/> - <line number="110" hits="1"/> - <line number="111" hits="1"/> - <line number="112" hits="1"/> - <line number="120" hits="1"/> - <line number="121" hits="1"/> - <line number="129" hits="1"/> - <line number="138" hits="1"/> - <line number="139" hits="0"/> - <line number="140" hits="0"/> - <line number="141" hits="0"/> - <line number="142" hits="0"/> - <line number="143" hits="0"/> - <line number="145" hits="1"/> - <line number="152" hits="0"/> - <line number="153" hits="0"/> - <line number="154" hits="0"/> - <line number="156" hits="0"/> - <line number="158" hits="0"/> - <line number="160" hits="1"/> - <line number="165" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,exit"/> - <line number="174" hits="1"/> - <line number="180" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="181,188"/> - <line number="181" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="182,184"/> - <line number="182" hits="0"/> - <line number="184" hits="0"/> - <line number="188" hits="0"/> - </lines> - </class> - <class name="router.py" filename="shared/messaging/messaging/router.py" complexity="0" - line-rate="0.9815" branch-rate="0.95"> - <methods/> - <lines> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="28" hits="1"/> - <line number="30" hits="1"/> - <line number="32" hits="1"/> - <line number="35" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="45" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="50" hits="1"/> - <line number="53" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="60" hits="1"/> - <line number="61" hits="1"/> - <line number="63" hits="1"/> - <line number="70" hits="1"/> - <line number="71" hits="1"/> - <line number="72" hits="1"/> - <line number="73" hits="1"/> - <line number="74" hits="1"/> - <line number="76" hits="1"/> - <line number="85" hits="1"/> - <line number="87" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="90" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="91" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="93" hits="1"/> - <line number="95" hits="1"/> - <line number="98" hits="1"/> - <line number="105" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="106"/> - <line number="106" hits="0"/> - <line number="107" hits="1"/> - <line number="109" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="111" hits="1"/> - <line number="112" hits="1"/> - <line number="114" hits="1"/> - <line number="119" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="121" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="122" hits="1"/> - <line number="124" hits="1"/> - <line number="126" hits="1"/> - <line number="135" hits="1"/> - <line number="137" hits="1"/> - <line number="138" hits="1"/> - <line number="147" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="148" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="153" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="shared.workspaces.workspaces.capability" line-rate="0.7759" branch-rate="0.4545" complexity="0"> - <classes> - <class name="enums.py" filename="shared/workspaces/workspaces/capability/enums.py" complexity="0" - line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="11" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="32" hits="1"/> - <line number="40" hits="1"/> - <line number="43" hits="1"/> - <line number="48" hits="1"/> - <line number="49" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="53" hits="1"/> - <line number="56" hits="1"/> - <line number="61" hits="1"/> - <line number="62" hits="1"/> - <line number="63" hits="1"/> - <line number="64" hits="1"/> - <line number="65" hits="1"/> - <line number="66" hits="1"/> - <line number="69" hits="1"/> - <line number="77" hits="1"/> - <line number="78" hits="1"/> - <line number="79" hits="1"/> - </lines> - </class> - <class name="helpers.py" filename="shared/workspaces/workspaces/capability/helpers.py" complexity="0" - line-rate="0.74" branch-rate="0.4444"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="8" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="22" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="1"/> - <line number="29" hits="1"/> - <line number="35" hits="1"/> - <line number="37" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="47" hits="1"/> - <line number="48" hits="1"/> - <line number="55" hits="1"/> - <line number="56" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="69" hits="1"/> - <line number="72" hits="1"/> - <line number="76" hits="1"/> - <line number="79" hits="1"/> - <line number="81" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="82" hits="1"/> - <line number="83" hits="1"/> - <line number="84" hits="1"/> - <line number="85" hits="1"/> - <line number="86" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="93"/> - <line number="88" hits="1"/> - <line number="90" hits="1" branch="true" condition-coverage="50% (1/2)" missing-branches="91"/> - <line number="91" hits="0"/> - <line number="93" hits="0"/> - <line number="96" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="97" hits="1"/> - <line number="98" hits="1"/> - <line number="101" hits="1"/> - <line number="103" hits="1"/> - <line number="104" hits="0"/> - <line number="105" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="106,107"/> - <line number="106" hits="0"/> - <line number="107" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="108,109"/> - <line number="108" hits="0"/> - <line number="109" hits="0"/> - <line number="112" hits="1"/> - <line number="117" hits="1"/> - <line number="118" hits="1"/> - <line number="120" hits="1"/> - <line number="121" hits="1"/> - <line number="128" hits="1"/> - <line number="129" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="130" hits="1"/> - <line number="132" hits="1"/> - <line number="134" hits="1"/> - <line number="140" hits="0"/> - <line number="142" hits="1"/> - <line number="148" hits="1"/> - <line number="150" hits="1"/> - <line number="151" hits="1"/> - <line number="153" hits="1"/> - <line number="159" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,160"/> - <line number="160" hits="0"/> - <line number="163" hits="1"/> - <line number="168" hits="1"/> - <line number="175" hits="0"/> - <line number="176" hits="0"/> - <line number="177" hits="0"/> - <line number="178" hits="0"/> - <line number="179" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="182,184"/> - <line number="182" hits="0"/> - <line number="183" hits="0"/> - <line number="184" hits="0"/> - <line number="189" hits="0"/> - <line number="192" hits="1"/> - <line number="193" hits="1"/> - <line number="194" hits="1"/> - <line number="201" hits="0"/> - <line number="204" hits="1"/> - <line number="205" hits="1"/> - <line number="206" hits="0"/> - <line number="209" hits="1"/> - <line number="210" hits="1"/> - <line number="211" hits="0"/> - <line number="214" hits="1"/> - <line number="215" hits="1"/> - <line number="216" hits="0"/> - <line number="219" hits="1"/> - <line number="220" hits="1"/> - <line number="221" hits="0"/> - <line number="224" hits="1"/> - <line number="234" hits="1"/> - <line number="235" hits="1"/> - <line number="236" hits="0"/> - </lines> - </class> - <class name="schema.py" filename="shared/workspaces/workspaces/capability/schema.py" complexity="0" - line-rate="0.7545" branch-rate="0.5"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="25" hits="1"/> - <line number="28" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="49" hits="0"/> - <line number="50" hits="0"/> - <line number="51" hits="0"/> - <line number="53" hits="1"/> - <line number="54" hits="1"/> - <line number="63" hits="0"/> - <line number="64" hits="0"/> - <line number="65" hits="0"/> - <line number="67" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="68,71"/> - <line number="68" hits="0"/> - <line number="69" hits="0"/> - <line number="71" hits="0"/> - <line number="73" hits="1"/> - <line number="79" hits="0"/> - <line number="80" hits="0"/> - <line number="81" hits="0"/> - <line number="83" hits="1"/> - <line number="84" hits="0"/> - <line number="90" hits="1"/> - <line number="91" hits="1"/> - <line number="99" hits="1"/> - <line number="100" hits="1"/> - <line number="107" hits="0"/> - <line number="108" hits="0"/> - <line number="109" hits="0"/> - <line number="112" hits="1"/> - <line number="118" hits="1"/> - <line number="119" hits="1"/> - <line number="120" hits="1"/> - <line number="121" hits="1"/> - <line number="124" hits="1"/> - <line number="127" hits="1"/> - <line number="133" hits="1"/> - <line number="143" hits="1"/> - <line number="144" hits="1"/> - <line number="146" hits="1"/> - <line number="147" hits="0"/> - <line number="149" hits="1"/> - <line number="150" hits="0"/> - <line number="152" hits="1"/> - <line number="153" hits="1"/> - <line number="154" hits="0"/> - <line number="156" hits="1"/> - <line number="157" hits="1"/> - <line number="158" hits="0"/> - <line number="160" hits="1"/> - <line number="161" hits="0"/> - <line number="169" hits="1"/> - <line number="170" hits="1"/> - <line number="184" hits="1"/> - <line number="185" hits="1"/> - <line number="186" hits="0"/> - <line number="187" hits="0"/> - <line number="188" hits="0"/> - <line number="189" hits="0"/> - <line number="190" hits="0"/> - <line number="192" hits="1"/> - <line number="193" hits="1"/> - <line number="194" hits="1"/> - <line number="196" hits="1"/> - <line number="197" hits="1"/> - <line number="198" hits="1"/> - <line number="201" hits="1"/> - <line number="206" hits="1"/> - <line number="207" hits="1"/> - <line number="213" hits="1"/> - <line number="214" hits="1"/> - <line number="215" hits="1"/> - <line number="216" hits="1"/> - <line number="217" hits="1"/> - <line number="219" hits="1"/> - <line number="220" hits="1"/> - <line number="221" hits="1"/> - <line number="223" hits="1"/> - <line number="224" hits="1"/> - <line number="225" hits="1"/> - <line number="228" hits="1"/> - <line number="229" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="238" hits="1"/> - <line number="243" hits="1"/> - <line number="244" hits="1"/> - <line number="249" hits="1"/> - <line number="254" hits="1"/> - <line number="255" hits="1"/> - <line number="256" hits="1"/> - <line number="258" hits="1"/> - <line number="266" hits="1"/> - <line number="267" hits="1"/> - <line number="268" hits="0"/> - <line number="270" hits="1"/> - <line number="271" hits="1"/> - <line number="272" hits="0"/> - <line number="274" hits="1"/> - <line number="275" hits="0"/> - <line number="277" hits="1"/> - <line number="278" hits="0"/> - <line number="286" hits="1"/> - <line number="287" hits="1"/> - <line number="288" hits="0"/> - <line number="291" hits="1"/> - <line number="292" hits="1"/> - <line number="294" hits="1"/> - <line number="295" hits="0"/> - <line number="297" hits="1"/> - <line number="298" hits="0"/> - <line number="300" hits="1"/> - <line number="301" hits="0"/> - <line number="304" hits="1"/> - <line number="309" hits="1"/> - <line number="311" hits="1"/> - <line number="312" hits="1"/> - <line number="313" hits="1"/> - <line number="318" hits="1"/> - <line number="319" hits="1"/> - <line number="320" hits="1"/> - <line number="321" hits="1"/> - <line number="322" hits="1"/> - <line number="323" hits="1"/> - <line number="324" hits="1"/> - <line number="326" hits="1"/> - <line number="332" hits="1"/> - <line number="340" hits="1"/> - <line number="347" hits="1"/> - <line number="348" hits="0"/> - <line number="350" hits="1"/> - <line number="351" hits="1"/> - <line number="352" hits="1"/> - <line number="354" hits="1"/> - <line number="355" hits="1"/> - <line number="356" hits="1"/> - <line number="358" hits="1"/> - <line number="359" hits="1"/> - <line number="361" hits="1"/> - <line number="362" hits="1"/> - <line number="365" hits="1"/> - <line number="366" hits="1"/> - <line number="379" hits="1"/> - <line number="380" hits="1"/> - <line number="381" hits="0"/> - <line number="382" hits="0"/> - <line number="383" hits="0"/> - <line number="384" hits="0"/> - <line number="385" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="shared.workspaces.workspaces.capability.services" line-rate="0.6075" branch-rate="0.2917" - complexity="0"> - <classes> - <class name="capability_engine.py" - filename="shared/workspaces/workspaces/capability/services/capability_engine.py" complexity="0" - line-rate="0.5405" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="15" hits="1"/> - <line number="18" hits="1"/> - <line number="23" hits="1"/> - <line number="28" hits="1"/> - <line number="29" hits="1"/> - <line number="30" hits="1"/> - <line number="32" hits="1"/> - <line number="37" hits="1"/> - <line number="39" hits="1"/> - <line number="43" hits="0"/> - <line number="45" hits="1"/> - <line number="49" hits="0"/> - <line number="51" hits="0"/> - <line number="52" hits="0"/> - <line number="54" hits="1"/> - <line number="69" hits="0"/> - <line number="75" hits="0"/> - <line number="79" hits="0"/> - <line number="86" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="87,94"/> - <line number="87" hits="0"/> - <line number="90" hits="0"/> - <line number="94" hits="0"/> - <line number="95" hits="0"/> - <line number="96" hits="0"/> - <line number="97" hits="0"/> - <line number="98" hits="0"/> - <line number="100" hits="1"/> - <line number="101" hits="0"/> - <line number="102" hits="0"/> - </lines> - </class> - <class name="capability_info.py" - filename="shared/workspaces/workspaces/capability/services/capability_info.py" complexity="0" - line-rate="0.4917" branch-rate="0"> - <methods/> - <lines> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="23" hits="1"/> - <line number="27" hits="1"/> - <line number="28" hits="1"/> - <line number="33" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="40" hits="1"/> - <line number="44" hits="1"/> - <line number="50" hits="1"/> - <line number="51" hits="1"/> - <line number="53" hits="1"/> - <line number="64" hits="0"/> - <line number="65" hits="0"/> - <line number="66" hits="0"/> - <line number="68" hits="1"/> - <line number="84" hits="0"/> - <line number="85" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="86,87"/> - <line number="86" hits="0"/> - <line number="87" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="88,89"/> - <line number="88" hits="0"/> - <line number="89" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="90,92"/> - <line number="90" hits="0"/> - <line number="92" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="93,95"/> - <line number="93" hits="0"/> - <line number="95" hits="0"/> - <line number="96" hits="0"/> - <line number="98" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="99,102"/> - <line number="99" hits="0"/> - <line number="100" hits="0"/> - <line number="102" hits="0"/> - <line number="104" hits="1"/> - <line number="118" hits="1"/> - <line number="119" hits="1"/> - <line number="125" hits="1"/> - <line number="126" hits="1"/> - <line number="128" hits="1"/> - <line number="140" hits="0"/> - <line number="141" hits="0"/> - <line number="142" hits="0"/> - <line number="148" hits="0"/> - <line number="151" hits="0"/> - <line number="152" hits="0"/> - <line number="154" hits="0"/> - <line number="157" hits="0"/> - <line number="159" hits="1"/> - <line number="167" hits="1"/> - <line number="169" hits="1"/> - <line number="178" hits="1"/> - <line number="179" hits="1"/> - <line number="181" hits="1"/> - <line number="182" hits="1"/> - <line number="184" hits="1"/> - <line number="191" hits="1"/> - <line number="193" hits="1"/> - <line number="202" hits="0"/> - <line number="209" hits="0"/> - <line number="210" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="211,213"/> - <line number="211" hits="0"/> - <line number="213" hits="0"/> - <line number="215" hits="1"/> - <line number="224" hits="0"/> - <line number="231" hits="0"/> - <line number="232" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="233,235"/> - <line number="233" hits="0"/> - <line number="235" hits="0"/> - <line number="237" hits="1"/> - <line number="244" hits="0"/> - <line number="251" hits="1"/> - <line number="252" hits="1"/> - <line number="254" hits="1"/> - <line number="260" hits="0"/> - <line number="261" hits="0"/> - <line number="263" hits="1"/> - <line number="272" hits="1"/> - <line number="278" hits="1"/> - <line number="285" hits="0"/> - <line number="286" hits="0"/> - <line number="290" hits="1"/> - <line number="296" hits="0"/> - <line number="297" hits="0"/> - <line number="299" hits="1"/> - <line number="305" hits="0"/> - <line number="306" hits="0"/> - <line number="307" hits="0"/> - <line number="309" hits="1"/> - <line number="320" hits="0"/> - <line number="326" hits="0"/> - <line number="327" hits="0"/> - <line number="328" hits="0"/> - <line number="330" hits="1"/> - <line number="341" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,342"/> - <line number="342" hits="0"/> - <line number="344" hits="1"/> - <line number="351" hits="1"/> - <line number="356" hits="1"/> - <line number="357" hits="1"/> - <line number="359" hits="1"/> - <line number="366" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="367,372"/> - <line number="367" hits="0"/> - <line number="368" hits="0"/> - <line number="369" hits="0"/> - <line number="370" hits="0"/> - <line number="372" hits="0"/> - <line number="374" hits="1"/> - <line number="381" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="386,388"/> - <line number="386" hits="0"/> - <line number="388" hits="0"/> - </lines> - </class> - <class name="capability_queue.py" - filename="shared/workspaces/workspaces/capability/services/capability_queue.py" complexity="0" - line-rate="0.5909" branch-rate="0.1429"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="15" hits="1"/> - <line number="17" hits="1"/> - <line number="20" hits="1"/> - <line number="26" hits="1"/> - <line number="28" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="56" hits="1"/> - <line number="58" hits="1"/> - <line number="60" hits="1"/> - <line number="66" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="67,82"/> - <line number="67" hits="0"/> - <line number="68" hits="0"/> - <line number="69" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="70,81"/> - <line number="70" hits="0"/> - <line number="71" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="74,82"/> - <line number="74" hits="0"/> - <line number="76" hits="0"/> - <line number="78" hits="0"/> - <line number="79" hits="0"/> - <line number="81" hits="0"/> - <line number="82" hits="0"/> - <line number="84" hits="1"/> - <line number="91" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,92"/> - <line number="92" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="91,94"/> - <line number="94" hits="0"/> - <line number="96" hits="1"/> - <line number="102" hits="0"/> - <line number="103" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,104"/> - <line number="104" hits="0"/> - <line number="105" hits="0"/> - <line number="106" hits="0"/> - <line number="108" hits="1"/> - <line number="114" hits="0"/> - <line number="115" hits="0"/> - <line number="116" hits="0"/> - <line number="117" hits="0"/> - <line number="119" hits="1"/> - <line number="120" hits="1"/> - <line number="122" hits="1"/> - <line number="123" hits="0"/> - <line number="125" hits="1"/> - <line number="127" hits="0"/> - <line number="129" hits="1"/> - <line number="131" hits="0"/> - <line number="133" hits="1"/> - <line number="134" hits="1"/> - </lines> - </class> - <class name="capability_service.py" - filename="shared/workspaces/workspaces/capability/services/capability_service.py" complexity="0" - line-rate="0.5172" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="23" hits="1"/> - <line number="26" hits="1"/> - <line number="31" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="1"/> - <line number="39" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="45" hits="1"/> - <line number="59" hits="1"/> - <line number="60" hits="1"/> - <line number="62" hits="1"/> - <line number="65" hits="0"/> - <line number="66" hits="0"/> - <line number="68" hits="1"/> - <line number="76" hits="0"/> - <line number="82" hits="0"/> - <line number="84" hits="0"/> - <line number="86" hits="1"/> - <line number="87" hits="1"/> - <line number="88" hits="0"/> - <line number="90" hits="0"/> - <line number="91" hits="0"/> - <line number="94" hits="0"/> - <line number="95" hits="0"/> - <line number="97" hits="0"/> - <line number="103" hits="0"/> - <line number="105" hits="1"/> - <line number="106" hits="1"/> - <line number="107" hits="0"/> - <line number="109" hits="0"/> - <line number="110" hits="0"/> - <line number="113" hits="0"/> - <line number="114" hits="0"/> - <line number="116" hits="0"/> - <line number="122" hits="0"/> - <line number="124" hits="1"/> - <line number="125" hits="1"/> - <line number="133" hits="0"/> - <line number="136" hits="0"/> - <line number="139" hits="0"/> - <line number="145" hits="0"/> - <line number="146" hits="0"/> - <line number="148" hits="1"/> - <line number="149" hits="1"/> - <line number="150" hits="0"/> - <line number="152" hits="0"/> - <line number="153" hits="0"/> - <line number="154" hits="0"/> - <line number="156" hits="1"/> - <line number="157" hits="1"/> - <line number="158" hits="0"/> - <line number="160" hits="0"/> - <line number="161" hits="0"/> - <line number="162" hits="0"/> - <line number="164" hits="1"/> - <line number="165" hits="1"/> - <line number="166" hits="0"/> - <line number="168" hits="0"/> - <line number="169" hits="0"/> - <line number="170" hits="0"/> - <line number="172" hits="1"/> - <line number="173" hits="1"/> - <line number="174" hits="0"/> - <line number="176" hits="0"/> - <line number="177" hits="0"/> - <line number="180" hits="0"/> - <line number="183" hits="0"/> - <line number="189" hits="0"/> - <line number="191" hits="1"/> - <line number="192" hits="1"/> - <line number="199" hits="1"/> - <line number="202" hits="1"/> - <line number="203" hits="1"/> - <line number="204" hits="1"/> - </lines> - </class> - <class name="execution_manager.py" - filename="shared/workspaces/workspaces/capability/services/execution_manager.py" complexity="0" - line-rate="0.8889" branch-rate="1"> - <methods/> - <lines> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="8" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="24" hits="1"/> - <line number="27" hits="1"/> - <line number="35" hits="1"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="46" hits="1"/> - <line number="48" hits="1"/> - <line number="56" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - <line number="59" hits="1"/> - <line number="61" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="64" hits="1"/> - <line number="66" hits="1"/> - <line number="67" hits="1"/> - <line number="68" hits="1"/> - <line number="70" hits="1"/> - <line number="71" hits="1"/> - <line number="72" hits="1"/> - <line number="79" hits="1"/> - <line number="80" hits="1"/> - <line number="81" hits="1"/> - <line number="84" hits="1"/> - <line number="90" hits="1"/> - <line number="92" hits="1"/> - <line number="93" hits="1"/> - <line number="100" hits="0"/> - <line number="101" hits="0"/> - <line number="105" hits="0"/> - <line number="107" hits="0"/> - <line number="113" hits="0"/> - <line number="114" hits="0"/> - <line number="116" hits="1"/> - <line number="117" hits="1"/> - <line number="125" hits="0"/> - <line number="127" hits="1"/> - <line number="128" hits="1"/> - <line number="135" hits="0"/> - <line number="136" hits="0"/> - <line number="140" hits="0"/> - <line number="142" hits="1"/> - <line number="143" hits="1"/> - <line number="150" hits="1"/> - <line number="151" hits="1"/> - <line number="152" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="153" hits="1"/> - <line number="154" hits="1"/> - <line number="156" hits="1"/> - <line number="157" hits="1"/> - <line number="158" hits="1"/> - <line number="159" hits="1"/> - <line number="161" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="163" hits="1"/> - <line number="164" hits="1"/> - <line number="165" hits="1"/> - <line number="167" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="168" hits="1"/> - <line number="170" hits="1"/> - <line number="172" hits="1"/> - <line number="173" hits="1"/> - <line number="175" hits="1"/> - <line number="184" hits="1"/> - <line number="186" hits="1"/> - <line number="187" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="193" hits="1"/> - <line number="195" hits="1"/> - <line number="197" hits="1"/> - <line number="204" hits="1"/> - <line number="206" hits="1"/> - <line number="212" hits="1"/> - <line number="214" hits="1"/> - <line number="216" hits="1"/> - <line number="229" hits="1"/> - <line number="237" hits="1"/> - <line number="238" hits="1"/> - <line number="241" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="242" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="shared.workspaces.workspaces.notification" line-rate="0.8421" branch-rate="1" complexity="0"> - <classes> - <class name="schema.py" filename="shared/workspaces/workspaces/notification/schema.py" complexity="0" - line-rate="0.8421" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="8" hits="1"/> - <line number="10" hits="1"/> - <line number="13" hits="1"/> - <line number="18" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="23" hits="1"/> - <line number="30" hits="0"/> - <line number="31" hits="0"/> - <line number="37" hits="0"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="shared.workspaces.workspaces.notification.services" line-rate="0.5571" branch-rate="0" - complexity="0"> - <classes> - <class name="notification_info.py" - filename="shared/workspaces/workspaces/notification/services/notification_info.py" complexity="0" - line-rate="0.9565" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="9" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="0"/> - <line number="26" hits="1"/> - <line number="37" hits="1"/> - <line number="40" hits="1"/> - <line number="41" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="49" hits="1"/> - <line number="51" hits="1"/> - <line number="57" hits="1"/> - <line number="58" hits="1"/> - </lines> - </class> - <class name="notification_service.py" - filename="shared/workspaces/workspaces/notification/services/notification_service.py" - complexity="0" line-rate="0.3617" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="13" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="18" hits="0"/> - <line number="21" hits="0"/> - <line number="23" hits="1"/> - <line number="25" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="26,29"/> - <line number="26" hits="0"/> - <line number="27" hits="0"/> - <line number="29" hits="0"/> - <line number="30" hits="0"/> - <line number="40" hits="1"/> - <line number="42" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="43,46"/> - <line number="43" hits="0"/> - <line number="44" hits="0"/> - <line number="46" hits="0"/> - <line number="47" hits="0"/> - <line number="56" hits="1"/> - <line number="57" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="58,61"/> - <line number="58" hits="0"/> - <line number="59" hits="0"/> - <line number="61" hits="0"/> - <line number="62" hits="0"/> - <line number="71" hits="1"/> - <line number="77" hits="0"/> - <line number="78" hits="0"/> - <line number="81" hits="0"/> - <line number="92" hits="1"/> - <line number="93" hits="1"/> - <line number="94" hits="1"/> - <line number="96" hits="1"/> - <line number="97" hits="0"/> - <line number="98" hits="0"/> - <line number="99" hits="0"/> - <line number="101" hits="0"/> - <line number="103" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="104,106"/> - <line number="104" hits="0"/> - <line number="106" hits="0"/> - <line number="108" hits="0"/> - <line number="109" hits="0"/> - <line number="111" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="shared.workspaces.workspaces.products" line-rate="1" branch-rate="1" complexity="0"> - <classes> - <class name="schema.py" filename="shared/workspaces/workspaces/products/schema.py" complexity="0" - line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="shared.workspaces.workspaces.products.services" line-rate="1" branch-rate="1" complexity="0"> - <classes> - <class name="archive_service.py" - filename="shared/workspaces/workspaces/products/services/archive_service.py" complexity="0" - line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="12" hits="1"/> - <line number="14" hits="1"/> - <line number="17" hits="1"/> - <line number="22" hits="1"/> - <line number="23" hits="1"/> - <line number="24" hits="1"/> - <line number="26" hits="1"/> - <line number="27" hits="1"/> - <line number="34" hits="1"/> - <line number="37" hits="1"/> - <line number="39" hits="1"/> - <line number="40" hits="1"/> - <line number="41" hits="1"/> - <line number="43" hits="1"/> - <line number="44" hits="1"/> - <line number="45" hits="1"/> - <line number="46" hits="1"/> - <line number="47" hits="1"/> - <line number="49" hits="1"/> - <line number="51" hits="1"/> - <line number="57" hits="1"/> - <line number="59" hits="1"/> - <line number="60" hits="1"/> - <line number="73" hits="1"/> - <line number="76" hits="1"/> - <line number="79" hits="1"/> - <line number="87" hits="1"/> - </lines> - </class> - </classes> - </package> - <package name="shared.workspaces.workspaces.system" line-rate="0.6571" branch-rate="1" complexity="0"> - <classes> - <class name="schema.py" filename="shared/workspaces/workspaces/system/schema.py" complexity="0" - line-rate="0.6571" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="11" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="22" hits="0"/> - <line number="24" hits="1"/> - <line number="25" hits="1"/> - <line number="26" hits="0"/> - <line number="29" hits="1"/> - <line number="35" hits="1"/> - <line number="36" hits="0"/> - <line number="38" hits="1"/> - <line number="39" hits="0"/> - <line number="41" hits="1"/> - <line number="42" hits="1"/> - <line number="43" hits="0"/> - <line number="46" hits="1"/> - <line number="51" hits="1"/> - <line number="52" hits="1"/> - <line number="54" hits="1"/> - <line number="55" hits="0"/> - <line number="58" hits="1"/> - <line number="65" hits="0"/> - <line number="66" hits="0"/> - <line number="69" hits="0"/> - <line number="72" hits="1"/> - <line number="80" hits="0"/> - <line number="81" hits="0"/> - <line number="82" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="shared.workspaces.workspaces.workflow" line-rate="0.7083" branch-rate="0" complexity="0"> - <classes> - <class name="enum.py" filename="shared/workspaces/workspaces/workflow/enum.py" complexity="0" - line-rate="1" branch-rate="1"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="4" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="12" hits="1"/> - </lines> - </class> - <class name="schema.py" filename="shared/workspaces/workspaces/workflow/schema.py" complexity="0" - line-rate="0.693" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="2" hits="1"/> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="21" hits="1"/> - <line number="23" hits="1"/> - <line number="26" hits="1"/> - <line number="32" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="1"/> - <line number="35" hits="1"/> - <line number="37" hits="1"/> - <line number="38" hits="0"/> - <line number="40" hits="1"/> - <line number="48" hits="0"/> - <line number="62" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="63,65"/> - <line number="63" hits="0"/> - <line number="65" hits="0"/> - <line number="68" hits="1"/> - <line number="69" hits="0"/> - <line number="75" hits="1"/> - <line number="76" hits="1"/> - <line number="77" hits="0"/> - <line number="80" hits="1"/> - <line number="85" hits="1"/> - <line number="86" hits="1"/> - <line number="87" hits="1"/> - <line number="88" hits="1"/> - <line number="95" hits="1"/> - <line number="102" hits="0"/> - <line number="103" hits="0"/> - <line number="109" hits="0"/> - <line number="111" hits="1"/> - <line number="112" hits="1"/> - <line number="113" hits="0"/> - <line number="115" hits="1"/> - <line number="116" hits="1"/> - <line number="117" hits="0"/> - <line number="120" hits="1"/> - <line number="122" hits="0"/> - <line number="127" hits="1"/> - <line number="128" hits="1"/> - <line number="129" hits="0"/> - <line number="131" hits="1"/> - <line number="132" hits="0"/> - <line number="135" hits="1"/> - <line number="140" hits="1"/> - <line number="141" hits="1"/> - <line number="144" hits="1"/> - <line number="145" hits="1"/> - <line number="146" hits="1"/> - <line number="147" hits="1"/> - <line number="148" hits="1"/> - <line number="149" hits="1"/> - <line number="155" hits="1"/> - <line number="163" hits="1"/> - <line number="164" hits="1"/> - <line number="165" hits="0"/> - <line number="167" hits="1"/> - <line number="168" hits="1"/> - <line number="169" hits="0"/> - <line number="171" hits="1"/> - <line number="172" hits="1"/> - <line number="173" hits="0"/> - <line number="175" hits="1"/> - <line number="176" hits="1"/> - <line number="177" hits="0"/> - <line number="179" hits="1"/> - <line number="180" hits="0"/> - <line number="183" hits="1"/> - <line number="184" hits="0"/> - <line number="186" hits="1"/> - <line number="187" hits="0"/> - <line number="189" hits="1"/> - <line number="190" hits="0"/> - <line number="192" hits="1"/> - <line number="193" hits="0"/> - <line number="200" hits="1"/> - <line number="201" hits="1"/> - <line number="213" hits="1"/> - <line number="214" hits="1"/> - <line number="216" hits="0"/> - <line number="219" hits="0"/> - <line number="222" hits="0"/> - <line number="223" hits="0"/> - <line number="226" hits="0"/> - <line number="229" hits="1"/> - <line number="234" hits="1"/> - <line number="235" hits="0"/> - <line number="237" hits="1"/> - <line number="238" hits="1"/> - <line number="244" hits="1"/> - <line number="245" hits="1"/> - <line number="247" hits="1"/> - <line number="248" hits="1"/> - <line number="249" hits="0"/> - <line number="251" hits="1"/> - <line number="252" hits="1"/> - <line number="253" hits="0"/> - <line number="255" hits="1"/> - <line number="256" hits="0"/> - <line number="259" hits="1"/> - <line number="260" hits="0"/> - <line number="267" hits="1"/> - <line number="268" hits="1"/> - <line number="269" hits="0"/> - </lines> - </class> - </classes> - </package> - <package name="shared.workspaces.workspaces.workflow.services" line-rate="0.4612" branch-rate="0.2281" - complexity="0"> - <classes> - <class name="workflow_info.py" - filename="shared/workspaces/workspaces/workflow/services/workflow_info.py" complexity="0" - line-rate="0.5833" branch-rate="0"> - <methods/> - <lines> - <line number="1" hits="1"/> - <line number="3" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="12" hits="1"/> - <line number="13" hits="1"/> - <line number="16" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="24" hits="1"/> - <line number="25" hits="0"/> - <line number="27" hits="1"/> - <line number="28" hits="0"/> - <line number="30" hits="1"/> - <line number="37" hits="0"/> - <line number="39" hits="1"/> - <line number="40" hits="0"/> - <line number="42" hits="1"/> - <line number="48" hits="0"/> - <line number="50" hits="1"/> - <line number="63" hits="0"/> - <line number="65" hits="0" branch="true" condition-coverage="0% (0/3)" - missing-branches="exit,66,68"/> - <line number="66" hits="0"/> - <line number="68" hits="0"/> - <line number="70" hits="0"/> - <line number="76" hits="0"/> - <line number="77" hits="0"/> - <line number="78" hits="0"/> - <line number="80" hits="1"/> - <line number="86" hits="0"/> - <line number="87" hits="0"/> - <line number="89" hits="1"/> - <line number="100" hits="1"/> - <line number="105" hits="1"/> - <line number="106" hits="1"/> - <line number="107" hits="1"/> - </lines> - </class> - <class name="workflow_service.py" - filename="shared/workspaces/workspaces/workflow/services/workflow_service.py" complexity="0" - line-rate="0.4402" branch-rate="0.2407"> - <methods/> - <lines> - <line number="3" hits="1"/> - <line number="4" hits="1"/> - <line number="5" hits="1"/> - <line number="6" hits="1"/> - <line number="7" hits="1"/> - <line number="8" hits="1"/> - <line number="9" hits="1"/> - <line number="10" hits="1"/> - <line number="11" hits="1"/> - <line number="13" hits="1"/> - <line number="14" hits="1"/> - <line number="15" hits="1"/> - <line number="16" hits="1"/> - <line number="17" hits="1"/> - <line number="19" hits="1"/> - <line number="20" hits="1"/> - <line number="21" hits="1"/> - <line number="22" hits="1"/> - <line number="27" hits="1"/> - <line number="30" hits="1"/> - <line number="33" hits="1"/> - <line number="34" hits="0"/> - <line number="36" hits="1"/> - <line number="43" hits="0"/> - <line number="47" hits="0"/> - <line number="53" hits="0"/> - <line number="55" hits="1"/> - <line number="66" hits="0"/> - <line number="72" hits="0"/> - <line number="74" hits="1"/> - <line number="83" hits="0"/> - <line number="85" hits="1"/> - <line number="97" hits="0"/> - <line number="100" hits="0"/> - <line number="105" hits="0"/> - <line number="107" hits="1"/> - <line number="115" hits="0"/> - <line number="117" hits="1"/> - <line number="123" hits="0"/> - <line number="128" hits="1"/> - <line number="137" hits="1"/> - <line number="138" hits="1"/> - <line number="139" hits="1"/> - <line number="140" hits="1"/> - <line number="141" hits="1"/> - <line number="145" hits="1"/> - <line number="155" hits="0"/> - <line number="156" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="157,159"/> - <line number="157" hits="0"/> - <line number="159" hits="0"/> - <line number="161" hits="1"/> - <line number="162" hits="0"/> - <line number="163" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="exit,164"/> - <line number="164" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="163,165"/> - <line number="165" hits="0"/> - <line number="167" hits="1"/> - <line number="175" hits="0"/> - <line number="177" hits="1"/> - <line number="186" hits="0"/> - <line number="187" hits="0"/> - <line number="190" hits="0"/> - <line number="193" hits="0"/> - <line number="194" hits="0"/> - <line number="197" hits="0"/> - <line number="200" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="201,206"/> - <line number="201" hits="0"/> - <line number="203" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="204,209"/> - <line number="204" hits="0"/> - <line number="206" hits="0"/> - <line number="209" hits="0"/> - <line number="212" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="215,221"/> - <line number="215" hits="0"/> - <line number="218" hits="0"/> - <line number="221" hits="0"/> - <line number="224" hits="0"/> - <line number="225" hits="0"/> - <line number="229" hits="0"/> - <line number="231" hits="0"/> - <line number="233" hits="1"/> - <line number="239" hits="1"/> - <line number="240" hits="1"/> - <line number="241" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="243"/> - <line number="242" hits="1"/> - <line number="243" hits="1"/> - <line number="244" hits="1"/> - <line number="245" hits="1"/> - <line number="246" hits="1"/> - <line number="248" hits="1"/> - <line number="251" hits="1"/> - <line number="252" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="256"/> - <line number="253" hits="1"/> - <line number="254" hits="1"/> - <line number="255" hits="1"/> - <line number="256" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="257,260"/> - <line number="257" hits="0"/> - <line number="258" hits="0"/> - <line number="259" hits="0"/> - <line number="260" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="261,265"/> - <line number="261" hits="0"/> - <line number="262" hits="0"/> - <line number="263" hits="0"/> - <line number="265" hits="0"/> - <line number="266" hits="0"/> - <line number="268" hits="1"/> - <line number="269" hits="1"/> - <line number="273" hits="1"/> - <line number="274" hits="1"/> - <line number="275" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="285"/> - <line number="276" hits="1"/> - <line number="283" hits="1"/> - <line number="285" hits="0"/> - <line number="286" hits="0"/> - <line number="287" hits="0"/> - <line number="293" hits="0"/> - <line number="294" hits="0"/> - <line number="296" hits="1"/> - <line number="300" hits="1"/> - <line number="301" hits="1"/> - <line number="302" hits="1"/> - <line number="303" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="305" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="309"/> - <line number="306" hits="1"/> - <line number="309" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="310"/> - <line number="310" hits="0"/> - <line number="311" hits="0"/> - <line number="318" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="319"/> - <line number="319" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="318,320"/> - <line number="320" hits="0"/> - <line number="322" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="323" hits="1"/> - <line number="325" hits="1"/> - <line number="327" hits="1"/> - <line number="328" hits="1"/> - <line number="336" hits="1" branch="true" condition-coverage="100% (2/2)"/> - <line number="337" hits="1"/> - <line number="338" hits="1"/> - <line number="339" hits="1"/> - <line number="342" hits="1" branch="true" condition-coverage="50% (1/2)" - missing-branches="343"/> - <line number="343" hits="0"/> - <line number="344" hits="0"/> - <line number="347" hits="1"/> - <line number="349" hits="1"/> - <line number="356" hits="0"/> - <line number="362" hits="0"/> - <line number="363" hits="0"/> - <line number="366" hits="0"/> - <line number="367" hits="0"/> - <line number="368" hits="0"/> - <line number="371" hits="0"/> - <line number="372" hits="0"/> - <line number="379" hits="0"/> - <line number="381" hits="1"/> - <line number="382" hits="1"/> - <line number="390" hits="0"/> - <line number="391" hits="0"/> - <line number="393" hits="0"/> - <line number="394" hits="0"/> - <line number="396" hits="1"/> - <line number="397" hits="1"/> - <line number="404" hits="0"/> - <line number="405" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="406,409"/> - <line number="406" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="405,407"/> - <line number="407" hits="0"/> - <line number="408" hits="0"/> - <line number="409" hits="0"/> - <line number="411" hits="1"/> - <line number="412" hits="1"/> - <line number="413" hits="1"/> - <line number="419" hits="1"/> - <line number="420" hits="1"/> - <line number="427" hits="0"/> - <line number="429" hits="0"/> - <line number="432" hits="0"/> - <line number="435" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="436,451"/> - <line number="436" hits="0"/> - <line number="437" hits="0"/> - <line number="438" hits="0"/> - <line number="441" hits="0"/> - <line number="449" hits="0"/> - <line number="451" hits="0"/> - <line number="453" hits="1"/> - <line number="454" hits="0"/> - <line number="456" hits="0"/> - <line number="457" hits="0"/> - <line number="463" hits="0"/> - <line number="465" hits="1"/> - <line number="466" hits="1"/> - <line number="473" hits="0"/> - <line number="474" hits="0"/> - <line number="475" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="476,507"/> - <line number="476" hits="0"/> - <line number="477" hits="0"/> - <line number="480" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="481,482"/> - <line number="481" hits="0"/> - <line number="482" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="483,484"/> - <line number="483" hits="0"/> - <line number="484" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="485,486"/> - <line number="485" hits="0"/> - <line number="486" hits="0" branch="true" condition-coverage="0% (0/2)" - missing-branches="487,489"/> - <line number="487" hits="0"/> - <line number="489" hits="0"/> - <line number="491" hits="0"/> - <line number="497" hits="0"/> - <line number="498" hits="0"/> - <line number="499" hits="0"/> - <line number="500" hits="0"/> - <line number="501" hits="0"/> - <line number="502" hits="0"/> - <line number="507" hits="0"/> - </lines> - </class> - </classes> - </package> - </packages> -</coverage> diff --git a/testing/coverage_audit/test/test_test_coverage_audit.py b/testing/coverage_audit/test/test_test_coverage_audit.py deleted file mode 100644 index 028629ff805034d773b65a87e9e73fa7f5be19c3..0000000000000000000000000000000000000000 --- a/testing/coverage_audit/test/test_test_coverage_audit.py +++ /dev/null @@ -1,231 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -""" Coverage audit proof-of-concept masquerading as tests """ -import os -import shutil -import tempfile -from pathlib import Path -from unittest.mock import patch - -import coverage_audit - -# pylint: disable=E0401, R1721, W0621 -import pytest -from coverage_audit import ( - COVERAGE_REPORT_XML, - CoverageReportGrabber, - CoverageReportParser, - Reporter, - find_project_root, -) - -RUN_ALL = True - - -@pytest.fixture(scope="module") -def project_root() -> Path: - """ - Get the project root once and use it in all tests - - :return: top level under which audit targets will be found - """ - return find_project_root() - - -@pytest.fixture(scope="module") -def test_coverage_report() -> Path: - """ - Find the testing copy of the gitlab coverage report. - - :return: path to report file - """ - cur_dir = Path.cwd() - xmls = [file for file in cur_dir.parent.rglob(COVERAGE_REPORT_XML)] - for xml in xmls: - if "coverage_audit/test" in str(xml): - return xml - - -def test_main_launches_cov_audit(capsys): - """ - Is coverage_audit.main() functional? - - :return: - """ - - tmpdir = Path(tempfile.mkdtemp()) - - orig_dir = Path.cwd() - - # try it in current directory first - os.chdir(tmpdir) - coverage_audit.main() - cov_rpt_file = tmpdir / COVERAGE_REPORT_XML - assert cov_rpt_file.exists() - result = capsys.readouterr().out - lines = result.strip().split("\n") - num_lines = len(lines) - assert num_lines > 1 - - # go back to where we were, then pass in the destination - os.chdir(orig_dir) - cov_rpt_file.unlink() - coverage_audit.main([str(tmpdir)]) - assert cov_rpt_file.exists() - result = capsys.readouterr().out - lines = result.strip().split("\n") - assert len(lines) == num_lines - - shutil.rmtree(tmpdir) - - -@pytest.mark.skipif(not RUN_ALL, reason="temporary skip") -def test_expected_targets_created(test_coverage_report): - """ - Do the audit targets in the testing coverage.xml have the metadata we expect? - - :return: - """ - crp = CoverageReportParser(test_coverage_report) - - crp.parse() - # we're expecting this many "classes" to have coverage < 100% - assert len(crp.targets) == 39 - for target in crp.targets: - assert target.branch_rate >= 0.0 - assert target.line_rate > 0.0 - - -@pytest.mark.skipif(not RUN_ALL, reason="temporary skip") -def test_all_targets_analyzed(test_coverage_report): - """ - Have we dug into every target to get its 411? - - :return: - """ - crp = CoverageReportParser(test_coverage_report) - - with patch("coverage_audit.ElementDigger.dig") as mock: - crp.parse() - - assert mock.call_count == len(crp.targets) - - -@pytest.mark.skipif(not RUN_ALL, reason="temporary skip") -def test_parses_target_accurately(test_coverage_report): - """ - Do we find the attributes we expect in a given target created from - an element of the coverage report? - - :return: - """ - crp = CoverageReportParser(test_coverage_report) - crp.parse() - - module_found = False - for target in crp.targets: - if target.path.name.endswith("delivery.py"): - assert target.line_rate == 0.8077 - assert target.branch_rate == 0.5 - assert len(target.modules) == 2 - for module in target.modules: - assert module.path.name.endswith("delivery.py") - module_found = True - break - - assert module_found - - -@pytest.mark.skipif(not RUN_ALL, reason="temporary skip") -def test_creates_expected_digest(test_coverage_report: Path, capsys): - """ - For the test copy of coverage.xml, do we get the output we should? - - :return: - """ - parser = CoverageReportParser(test_coverage_report) - parser.parse() - reporter = Reporter(parser.targets) - reporter.get_reports() - result = capsys.readouterr().out - lines = result.strip().split("\n") - assert len(lines) == len(parser.targets) + 1 - - -@pytest.mark.skipif(not RUN_ALL, reason="temporary skip") -def test_fetches_latest_coverage_report(): - """ - Can we retrieve the latest coverage report from gitlab with an http request? - - :return: - """ - tmpdir = Path(tempfile.mkdtemp()) - latest_coverage_report = CoverageReportGrabber(tmpdir).grab() - assert latest_coverage_report.exists() - - shutil.rmtree(tmpdir) - - -@pytest.mark.skipif(not RUN_ALL, reason="temporary skip") -def test_parses_latest_coverage_report(test_coverage_report: Path): - """ - Do we get plausible results from the latest gitlab coverage report - (and are we indeed parsing the real one, not the test copy)? - - :return: - """ - tmpdir = Path(tempfile.mkdtemp()) - latest_report = CoverageReportGrabber(tmpdir).grab() - parser = CoverageReportParser(latest_report) - parser.parse() - - results = parser.targets - assert len(results) > 0 - - # results should be different from those of parsing our test copy - parser = CoverageReportParser(test_coverage_report) - parser.parse() - test_results = parser.targets - - # if number of results is same, be sure at least one of the results is different; - # otherwise, we can be confident we're reading the real coverage report.... - diff_found = False - if len(results) == len(test_results): - for result in results: - if result not in test_results: - diff_found = True - break - else: - diff_found = True - assert diff_found - - # ... but let's confirm that: make the lists equal length and compare results - len_diff = abs(len(test_results) - len(results)) - if len(results) > len(test_results): - results = results[: len(results) - len_diff] - else: - test_results = results[: len(test_results) - len_diff] - - diff_found = False - for result in results: - if result not in test_results: - diff_found = True - break - assert diff_found - - shutil.rmtree(tmpdir) diff --git a/testing/requirements.txt b/testing/requirements.txt index ea9e629d866873a1cad8aeaac8b5138aac4d42ff..5704b66e78f19b86d906a8a8bf715e77448f0b2a 100644 --- a/testing/requirements.txt +++ b/testing/requirements.txt @@ -1,17 +1,17 @@ # This is used by the automated testing infrastructure. # see services/capability/bin/run-tests.sh, services/workflow/bin/run-tests.sh, # and services/notification/bin/run-tests.sh for more details --e ../packages/shared/schema --e ../packages/shared/messaging --e ../packages/shared/workspaces --e ../packages/apps/cli/utilities/wf_monitor --e ../packages/apps/cli/utilities/aat_wrest --e ../packages/apps/cli/utilities/contacts_wrest --e ../packages/apps/cli/executables/pexable/mediator --e ../packages/apps/cli/executables/pexable/productfetcher --e ../packages/apps/cli/executables/pexable/deliver --e ../packages/apps/cli/executables/pexable/null --e ../packages/apps/cli/executables/pexable/casa_envoy --e ../packages/apps/cli/executables/pexable/conveyor --e ../packages/apps/cli/executables/pexable/ws_metrics +-e ../code/shared/schema +-e ../code/shared/messaging +-e ../code/shared/workspaces +-e ../code/apps/cli/utilities/wf_monitor +-e ../code/apps/cli/utilities/aat_wrest +-e ../code/apps/cli/utilities/contacts_wrest +-e ../code/apps/cli/executables/pexable/mediator +-e ../code/apps/cli/executables/pexable/productfetcher +-e ../code/apps/cli/executables/pexable/deliver +-e ../code/apps/cli/executables/pexable/null +-e ../code/apps/cli/executables/pexable/casa_envoy +-e ../code/apps/cli/executables/pexable/conveyor +-e ../code/apps/cli/executables/pexable/ws_metrics diff --git a/testing/testing/__init__.py b/testing/testing/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/testing/testing/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. diff --git a/testing/testing/_version.py b/testing/testing/_version.py deleted file mode 100644 index 15528507efb3ffe9d08f81273bbedf54b42cae10..0000000000000000000000000000000000000000 --- a/testing/testing/_version.py +++ /dev/null @@ -1,18 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>. -___version___ = "4.0.0a1.dev1" diff --git a/testing/testing/utils/__init__.py b/testing/testing/utils/__init__.py deleted file mode 100644 index e18480c840f4d6a6f1515ca896aa31a41ce4a136..0000000000000000000000000000000000000000 --- a/testing/testing/utils/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2021 Associated Universities, Inc. Washington DC, USA. -# -# This file is part of NRAO Workspaces. -# -# Workspaces is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Workspaces is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Workspaces. If not, see <https://www.gnu.org/licenses/>.