From e6e9038c5e85884bd1adc0d78bb394dd1e0817fd Mon Sep 17 00:00:00 2001 From: Ted Date: Wed, 4 Jun 2025 03:15:24 +0000 Subject: [PATCH 1/9] Test tag deletion --- .github/workflows/GenerateReport-Dev.yml | 239 ++++++++- .github/workflows/GenerateReport.yml | 14 +- src/requirements_full_list.txt | 609 +---------------------- utils/ConfigUtils.py | 8 +- utils/CustodianUtils.py | 24 +- utils/UpgradeInstruction.py | 10 +- 6 files changed, 269 insertions(+), 635 deletions(-) diff --git a/.github/workflows/GenerateReport-Dev.yml b/.github/workflows/GenerateReport-Dev.yml index eddcd94..7d6b6e8 100644 --- a/.github/workflows/GenerateReport-Dev.yml +++ b/.github/workflows/GenerateReport-Dev.yml @@ -1,13 +1,15 @@ -name: Generate Report (Dev) +name: Generate Report on: + schedule: + - cron: '0 0 * * MON,THU' workflow_dispatch: push: branches: - dev paths: - '**.py' - - '.github/workflows/GenerateReport-Dev.yml' + - '.github/workflows/GenerateReport.yml' - '.github/workflows/PythonSetup/**' - '.github/workflows/RcloneSetup/**' - '.env' @@ -22,7 +24,7 @@ permissions: jobs: healthcheck: name: Health Check - runs-on: self-hosted + runs-on: ubuntu-latest environment: WT_WeeklyTriggerEnv steps: - name: Checkout repository @@ -40,6 +42,14 @@ jobs: - name: DEBUG - Print config.env run: grep -E '^(FULL_RELOAD_PACKAGES|BASE_PACKAGE_CSV|REQUIREMENTS_FILE)=' .env || true + - name: Set up rclone + uses: ./.github/workflows/RcloneSetup + with: + rclone_conf_base64: ${{ secrets.RCLONE_CONF_BASE64 }} + + - name: DEBUG - Check rclone connection + run: rclone lsd gdrive:/Geek/PythonPackageManager/WeeklyReports/ + generate-report: name: Generate Weekly Report runs-on: self-hosted @@ -94,4 +104,225 @@ jobs: echo "โŒ Push failed. Someone else may have pushed changes. Please re-run the workflow." exit 1 } - + + create-weekly-release: + name: Create Weekly Report Release + runs-on: ubuntu-latest + environment: WT_WeeklyTriggerEnv + needs: generate-report + if: success() + + steps: + - name: Install GitHub CLI + run: | + sudo apt-get update + sudo apt-get install -y gh + + - name: Checkout latest commit from main + run: | + git init + git remote add origin https://github.com/${{ github.repository }} + git fetch origin dev + git checkout origin/dev + + - name: Find latest report set + id: find_latest + run: | + echo "๐Ÿ“ Scanning for latest report set..." + latest_json=$(find WeeklyReport -type f -name "WeeklyReport_*.json" | \ + sed -E 's/\.json$//' | \ + sort -t '_' -k2 | \ + tail -n 1).json + + if [[ -z "$latest_json" || ! -f "$latest_json" ]]; then + echo "โŒ No valid JSON report found." + exit 1 + fi + + base_name="${latest_json%.json}" + csv_file="${base_name}.csv" + html_file="${base_name}.html" + + echo "๐Ÿ“ Latest base: $base_name" + echo "๐Ÿ“„ CSV: $csv_file" + echo "๐Ÿ“„ HTML: $html_file" + echo "๐Ÿ“„ JSON: $latest_json" + + echo "CSV_PATH=$csv_file" >> $GITHUB_ENV + echo "HTML_PATH=$html_file" >> $GITHUB_ENV + echo "JSON_PATH=$latest_json" >> $GITHUB_ENV + + echo "CSV_FILENAME=$(basename "$csv_file")" >> $GITHUB_ENV + echo "HTML_FILENAME=$(basename "$html_file")" >> $GITHUB_ENV + echo "JSON_FILENAME=$(basename "$latest_json")" >> $GITHUB_ENV + + # ๐Ÿ—“๏ธ Get the Monday of current week + MONDAY_DATE=$(date -d "$(date +%Y-%m-%d -d @$(( $(date +%s) - ($(date +%u) - 1) * 86400 )))" +%Y%m%d) + echo "๐Ÿ“… This week's Monday: $MONDAY_DATE" + + # ๐Ÿ” Find existing tags in this week and determine Ver{x} + existing_tags=$(gh release list --limit 100 --json tagName | jq -r ".[] | .tagName" | grep -E "^weekly-${MONDAY_DATE}-Ver[0-9]+$" || true) + max_ver=$(echo "$existing_tags" | grep -oE 'Ver[0-9]+' | sed 's/Ver//' | sort -n | tail -n 1) + + if [[ -z "$max_ver" ]]; then + new_ver=1 + else + new_ver=$((max_ver + 1)) + fi + + tag="weekly-${MONDAY_DATE}-Ver${new_ver}" + echo "๐Ÿ†• Release tag: $tag" + + echo "RELEASE_TAG=$tag" >> $GITHUB_ENV + echo "release_tag=$tag" >> $GITHUB_OUTPUT + env: + GH_TOKEN: ${{ secrets.GH_PAT }} + + - name: Create GitHub Release + run: | + gh release create "$RELEASE_TAG" \ + "$CSV_PATH#${CSV_FILENAME}" \ + "$HTML_PATH#${HTML_FILENAME}" \ + "$JSON_PATH#${JSON_FILENAME}" \ + --title "Weekly Report - $RELEASE_TAG" \ + --notes "Automated weekly report" + env: + GH_TOKEN: ${{ secrets.GH_PAT }} + + - name: Remove old releases from last week (keep Ver1 and latest) + run: | + # โฑ๏ธ Calculate last Monday date + LAST_MONDAY=$(date -d "last monday" +%Y%m%d) + echo "๐Ÿงน Cleaning up releases from last week: $LAST_MONDAY" + + # ๐Ÿ” Find all tags that fits weekly-LAST_MONDAY-Ver{X} + matching_tags=$(gh release list --limit 100 --json tagName,createdAt | \ + jq -r ".[] | select(.tagName | test(\"^weekly-${LAST_MONDAY}-Ver[0-9]+\")).tagName") + + if [[ -z "$matching_tags" ]]; then + echo "โ„น๏ธ No matching tags found for last week." + exit 0 + fi + + echo "๐Ÿ” All matching tags:" + echo "$matching_tags" + + # Extract all tags + versions=$(echo "$matching_tags" | sed -nE "s/^weekly-${LAST_MONDAY}-Ver([0-9]+)$/\1/p" | sort -n) + + # Get biggest ver + max_ver=$(echo "$versions" | tail -n 1) + echo "๐Ÿ†• Max version: Ver$max_ver" + + for tag in $matching_tags; do + ver=$(echo "$tag" | sed -nE "s/^weekly-${LAST_MONDAY}-Ver([0-9]+)$/\1/p") + + if [[ "$ver" == "1" || "$ver" == "$max_ver" ]]; then + echo "โœ… Keeping $tag" + continue + fi + + echo "๐Ÿ—‘๏ธ Deleting $tag" + gh release delete "$tag" --yes || echo "โš ๏ธ Failed to delete release $tag" + if git ls-remote --tags origin | grep -q "refs/tags/$tag$"; then + echo "๐Ÿ”– Tag $tag exists. Deleting..." + gh api -X DELETE "repos/${{ github.repository }}/git/refs/tags/$tag" || echo "โš ๏ธ Failed to delete tag ref $tag" + else + echo "โ„น๏ธ Tag $tag does not exist. Skipping tag deletion." + fi + done + env: + GH_TOKEN: ${{ secrets.GH_PAT }} + + create-monthly-release: + name: Create Monthly Report Release + runs-on: ubuntu-latest + environment: WT_WeeklyTriggerEnv + needs: generate-report + if: success() + steps: + - name: Install GitHub CLI + run: | + sudo apt-get update + sudo apt-get install -y gh jq + + - name: Checkout latest commit from main + run: | + git init + git remote add origin https://github.com/${{ github.repository }} + git fetch origin dev + git checkout origin/dev + + - name: Find latest monthly report + id: find_latest_monthly + run: | + echo "๐Ÿ” Scanning for latest MonthlyReport..." + latest_file=$(find MonthlyReport -type f -name "MonthlyReport-*.xlsx" | sort | tail -n 1) + + if [[ -z "$latest_file" || ! -f "$latest_file" ]]; then + echo "โŒ No monthly report found." + exit 1 + fi + + echo "โœ… Found: $latest_file" + + filename=$(basename "$latest_file") + year_month=$(echo "$filename" | grep -oP '(?<=MonthlyReport-)[0-9]{6}') + + echo "๐Ÿ“ฆ Scanning existing monthly tags with prefix: monthly-${year_month}-Ver" + + existing_tags=$(gh release list --limit 100 --json tagName | jq -r ".[] | .tagName" | grep -E "^monthly-${year_month}-Ver[0-9]+$" || true) + + max_ver=$(echo "$existing_tags" | grep -oE 'Ver[0-9]+' | sed 's/Ver//' | sort -n | tail -n 1) + + if [[ -z "$max_ver" ]]; then + new_ver=1 + else + new_ver=$((max_ver + 1)) + fi + + tag="monthly-${year_month}-Ver${new_ver}" + echo "๐Ÿ†• New tag: $tag" + + echo "RELEASE_TAG=$tag" >> $GITHUB_ENV + echo "REPORT_FILE=$latest_file" >> $GITHUB_ENV + echo "REPORT_NAME=$filename" >> $GITHUB_ENV + env: + GH_TOKEN: ${{ secrets.GH_PAT }} + + - name: Create GitHub Release + run: | + gh release create "$RELEASE_TAG" \ + "$REPORT_FILE#${REPORT_NAME}" \ + --title "Monthly Report - $RELEASE_TAG" \ + --notes "Automated monthly report" + env: + GH_TOKEN: ${{ secrets.GH_PAT }} + + - name: Remove old releases for the same month + run: | + echo "๐Ÿงน Cleaning up other releases for the same month..." + + current_month_prefix=$(echo "${{ env.RELEASE_TAG }}" | grep -oP 'monthly-\K[0-9]{6}') + + gh release list --limit 100 --json tagName,createdAt | \ + jq -c '.[] | select(.tagName | test("^monthly-'$current_month_prefix'$"))' | \ + while read line; do + tag=$(echo "$line" | jq -r '.tagName') + + if [[ "$tag" == "${{ env.RELEASE_TAG }}" ]]; then + echo "โญ๏ธ Skipping current release: $tag" + continue + fi + + echo "๐Ÿ—‘๏ธ Deleting other release from the same month: $tag" + gh release delete "$tag" --yes || echo "โš ๏ธ Failed to delete release $tag" + if git ls-remote --tags origin | grep -q "refs/tags/$tag$"; then + echo "๐Ÿ”– Tag $tag exists. Deleting..." + gh api -X DELETE "repos/${{ github.repository }}/git/refs/tags/$tag" || echo "โš ๏ธ Failed to delete tag ref $tag" + else + echo "โ„น๏ธ Tag $tag does not exist. Skipping tag deletion." + fi + done + env: + GH_TOKEN: ${{ secrets.GH_PAT }} diff --git a/.github/workflows/GenerateReport.yml b/.github/workflows/GenerateReport.yml index 63c6dc1..0caaa02 100644 --- a/.github/workflows/GenerateReport.yml +++ b/.github/workflows/GenerateReport.yml @@ -301,7 +301,12 @@ jobs: echo "๐Ÿ—‘๏ธ Deleting $tag" gh release delete "$tag" --yes || echo "โš ๏ธ Failed to delete release $tag" - gh api -X DELETE "repos/${{ github.repository }}/git/refs/tags/$tag" || echo "โš ๏ธ Failed to delete tag ref $tag" + if git ls-remote --tags origin | grep -q "refs/tags/$tag$"; then + echo "๐Ÿ”– Tag $tag exists. Deleting..." + gh api -X DELETE "repos/${{ github.repository }}/git/refs/tags/$tag" || echo "โš ๏ธ Failed to delete tag ref $tag" + else + echo "โ„น๏ธ Tag $tag does not exist. Skipping tag deletion." + fi done env: GH_TOKEN: ${{ secrets.GH_PAT }} @@ -381,7 +386,12 @@ jobs: echo "๐Ÿ—‘๏ธ Deleting other release from the same month: $tag" gh release delete "$tag" --yes || echo "โš ๏ธ Failed to delete release $tag" - gh api -X DELETE "repos/${{ github.repository }}/git/refs/tags/$tag" || echo "โš ๏ธ Failed to delete tag ref $tag" + if git ls-remote --tags origin | grep -q "refs/tags/$tag$"; then + echo "๐Ÿ”– Tag $tag exists. Deleting..." + gh api -X DELETE "repos/${{ github.repository }}/git/refs/tags/$tag" || echo "โš ๏ธ Failed to delete tag ref $tag" + else + echo "โ„น๏ธ Tag $tag does not exist. Skipping tag deletion." + fi done env: GH_TOKEN: ${{ secrets.GH_PAT }} diff --git a/src/requirements_full_list.txt b/src/requirements_full_list.txt index 7ff2684..1369d64 100644 --- a/src/requirements_full_list.txt +++ b/src/requirements_full_list.txt @@ -1,608 +1 @@ -absl-py==2.1.0 -adal==1.2.7 -adlfs==2024.4.1 -aiofiles==24.1.0 -aiohappyeyeballs==2.4.6 -aiohttp==3.11.13 -aiosignal==1.3.2 -alembic==1.13.3 -allennlp==2.10.1 -altair==5.4.1 -aniso8601==9.0.1 -annotated-types==0.7.0 -antlr4-python3-runtime==4.9.3 -anyconfig==0.14.0 -anyio==4.8.0 -appdirs==1.4.4 -appnope==0.1.4 -argcomplete==3.5.1 -argon2-cffi==23.1.0 -argon2-cffi-bindings==21.2.0 -arrow==1.3.0 -artifacts-keyring==0.4.0 -AST==0.0.2 -astroid==3.2.4 -asttokens==2.4.1 -astunparse==1.6.3 -asyncio==3.4.3 -async-lru==2.0.4 -async-timeout==4.0.3 -attrs==24.2.0 -azure-ai-ml==1.21.1 -azure-common==1.1.28 -azure-core==1.31.0 -azure-datalake-store==0.0.53 -azure-graphrbac==0.61.1 -azure-identity==1.19.0 -azure-keyvault-secrets==4.8.0 -azure-mgmt-authorization==4.0.0 -azure-mgmt-containerregistry==10.3.0 -azure-mgmt-core==1.4.0 -azure-mgmt-keyvault==10.3.1 -azure-mgmt-network==27.0.0 -azure-mgmt-resource==23.2.0 -azure-mgmt-storage==21.2.1 -azureml-core==1.58.0 -azureml-dataprep==5.1.6 -azureml-dataprep-native==41.0.0 -azureml-dataprep-rslex==2.22.4 -azureml-featurestore==1.1.0 -azureml-fsspec==1.3.1 -azureml-interpret==1.58.0 -azure-storage-blob==12.23.1 -azure-storage-file-datalake==12.17.0 -azure-storage-file-share==12.19.0 -babel==2.16.0 -backoff==2.2.1 -backports.tempfile==1 -backports.weakref==1.0.post1 -bandit==1.7.9 -bcrypt==4.2.0 -beanie==1.26.0 -beautifulsoup4==4.12.3 -bert-score==0.3.13 -binaryornot==0.4.4 -black==24.4.2 -bleach==6.1.0 -blinker==1.8.2 -blis==1.0.1 -boilerpy3==1.0.7 -bs4==0.0.2 -build==1.2.2.post1 -CacheControl==0.14.0 -cachetools==5.5.0 -catalogue==2.0.10 -category-encoders==2.6.4 -cattrs==24.1.2 -certifi==2025.1.31 -cffi==1.17.1 -cfgv==3.4.0 -chardet==5.2.0 -charset-normalizer==3.4.1 -cleo==2.1.0 -click==8.1.7 -click-default-group==1.2.4 -cloudpathlib==0.19.0 -cloudpickle==3.1.0 -colorama==0.4.6 -coloredlogs==15.0.1 -colorlog==6.8.2 -comm==0.2.2 -confection==0.1.5 -configparser==7.0.0 -contextlib2==21.6.0 -contourpy==1.3.0 -cookiecutter==2.6.0 -coverage==7.6.4 -crashtest==0.4.1 -cryptography==44.0.2 -cycler==0.12.1 -cymem==2.0.8 -Cython==3.0.11 -dash==2.18.1 -dash-core-components==2.0.0 -dash-html-components==2.0.0 -dash-table==5.0.0 -databricks-sdk==0.33.0 -dataclasses-json==0.6.7 -datasets==2.19.1 -debugpy==1.8.7 -decorator==5.1.1 -deepchecks==0.18.1 -deepdiff==8.0.1 -defusedxml==0.7.1 -Deprecated==1.2.14 -deprecation==2.1.0 -dill==0.3.9 -dirtyjson==1.0.8 -distlib==0.3.9 -distro==1.9.0 -dnspython==2.7.0 -docker==7.1.0 -docutils==0.21.2 -docx==0.2.4 -dulwich==0.21.7 -dynaconf==3.2.6 -elasticsearch==8.13.1 -elastic-transport==8.15.0 -email-validator==2.2.0 -emoji==2.12.1 -entrypoints==0.4 -et-xmlfile==1.1.0 -Events==0.5 -evidently==0.4.16 -exceptiongroup==1.2.2 -executing==2.1.0 -faiss==1.5.3 -faiss-cpu==1.7.4 -faiss-gpu==1.7.2 -Faker==26.3.0 -farm-haystack==1.25.5 -fastapi==0.111.1 -fastapi-cli==0.0.5 -fastjsonschema==2.20.0 -filelock==3.16.1 -filetype==1.2.0 -flake8==7.0.0 -Flask==3.0.3 -Flask-HTTPAuth==3.3.0 -Flask-SQLAlchemy==2.4.1 -flask-swagger-ui==4.11.1 -flatbuffers==24.3.25 -fonttools==4.54.1 -fqdn==1.5.1 -frozenlist==1.5.0 -fsspec==2024.10.0 -future==1.0.0 -fuzzywuzzy==0.18.0 -gast==0.6.0 -gensim==3.8.3 -gitdb==4.0.11 -GitPython==3.1.43 -google-ai-generativelanguage==0.3.3 -google-api-core==2.21.0 -googleapis-common-protos==1.65.0 -google-auth==2.35.0 -google-generativeai==0.2.1 -google-pasta==0.2.0 -graphene==3.3 -graphframes==0.6 -graphql-core==3.2.4 -graphql-relay==3.2.0 -great-expectations==1.1.3 -greenlet==3.1.1 -grpcio==1.66.2 -grpcio-status==1.62.3 -gunicorn==23.0.0 -h11==0.16.0 -h5py==3.12.1 -html2text==2020.1.16 -httpcore==1.0.7 -httptools==0.6.1 -httpx==0.28.1 -huggingface-hub==0.26.1 -humanfriendly==10 -identify==2.6.1 -idna==3.1 -imbalanced-learn==0.12.3 -importlib-metadata==8.5.0 -importlib-resources==6.4.0 -inflect==7.4.0 -iniconfig==2.0.0 -installer==0.7.0 -interpret-community==0.31.0 -interpret-core==0.5.0 -invoke==2.2.0 -ipykernel==6.29.5 -ipython==8.28.0 -ipython-genutils==0.2.0 -ipywidgets==8.1.5 -isodate==0.7.2 -isoduration==20.11.0 -isort==5.13.2 -iterative-telemetry==0.0.8 -itsdangerous==2.2.0 -jaraco.classes==3.4.0 -jaraco.context==6.0.1 -jaraco.functools==4.1.0 -jedi==0.19.1 -jeepney==0.8.0 -jellyfish==1.1.0 -Jinja2==3.1.6 -jiter==0.6.1 -jmespath==1.0.1 -joblib==1.4.2 -json5==0.9.25 -jsonpatch==1.33 -jsonpath-ng==1.6.1 -jsonpath-python==1.0.6 -jsonpickle==3.3.0 -jsonpointer==3.0.0 -jsonschema==4.23.0 -jsonschema-specifications==2024.10.1 -jupyter-client==8.6.3 -jupyter-core==5.7.2 -jupyter-events==0.10.0 -jupyterlab==4.2.5 -jupyterlab-pygments==0.3.0 -jupyterlab-server==2.27.3 -jupyterlab-widgets==3.0.13 -jupyter-lsp==2.2.5 -jupyter-server==2.14.2 -jupyter-server-terminals==0.5.3 -kaleido==0.2.1 -kedro==0.19.12 -kedro-azureml==0.8.0.1 -kedro-boot==0.2.2 -kedro-datasets==4.0.0 -kedro-docker==0.6.0 -kedro-fast-api==0.6.1 -kedro-telemetry==0.5.0 -kedro-viz==9.1.0 -keras==3.5.0 -keyring==25.4.1 -kiwisolver==1.4.7 -knack==0.12.0 -lancedb==0.11.0 -langchain==0.3.19 -langchain-community==0.2.12 -langchain-core==0.3.40 -langchain-openai==0.1.22 -langchain-text-splitters==0.3.6 -langcodes==3.4.1 -langdetect==1.0.9 -langsmith==0.3.11 -language-data==1.2.0 -lazy-imports==0.3.1 -lazy-loader==0.4 -lazy-model==0.2.0 -ldap3==2.9.1 -libclang==18.1.1 -lightfm==1.17 -lightgbm==4.3.0 -lime==0.2.0.1 -litestar==2.13.0 -llama-cloud==0.1.0 -llama-hub==0.0.79.post1 -llama-index==0.11.14 -llama-index-agent-openai==0.3.4 -llama-index-cli==0.3.1 -llama-index-core==0.11.14 -llama-index-embeddings-azure-openai==0.1.6 -llama-index-embeddings-openai==0.2.5 -llama-index-indices-managed-llama-cloud==0.4.0 -llama-index-legacy==0.9.48.post3 -llama-index-llms-azure-openai==0.1.10 -llama-index-llms-openai==0.2.9 -llama-index-multi-modal-llms-openai==0.2.1 -llama-index-program-openai==0.2.0 -llamaindex-py-client==0.1.19 -llama-index-question-gen-openai==0.2.0 -llama-index-readers-file==0.2.2 -llama-index-readers-json==0.1.5 -llama-index-readers-llama-parse==0.3.0 -llama-index-vector-stores-azurecosmosmongo==0.1.3 -llama-parse==0.5.6 -llvmlite==0.43.0 -lxml==5.3.0 -Mako==1.3.5 -marisa-trie==1.2.0 -Markdown==3.7 -markdown-it-py==3.0.0 -MarkupSafe==3.0.2 -marshmallow==3.23.0 -matplotlib==3.9.2 -matplotlib-inline==0.1.7 -mccabe==0.7.0 -mdurl==0.1.2 -mistune==3.0.2 -ml-dtypes==0.5.0 -mlflow==2.15.1 -mlflow-skinny==2.15.1 -mltable==1.6.1 -ml-wrappers==0.5.6 -mongomock==4.1.2 -mongomock-motor==0.0.29 -monotonic==1.6 -more-itertools==10.5.0 -motor==3.6.0 -motor-types==1.0.0b4 -mpmath==1.3.0 -msal==1.31.0 -msal-extensions==1.2.0 -msgpack==1.1.0 -msgspec==0.18.6 -msrest==0.7.1 -msrestazure==0.6.4.post1 -multidict==6.1.0 -multiprocess==0.70.16 -murmurhash==1.0.10 -mypy==1.10.0 -mypy-extensions==1.0.0 -namex==0.0.8 -narwhals==1.9.0 -nbclient==0.10.0 -nbconvert==7.16.4 -nbformat==5.10.4 -ndg-httpsclient==0.5.1 -neo4j==5.24.0 -nest-asyncio==1.6.0 -networkx==3.4.2 -nh3==0.2.18 -nltk==3.9.1 -nodeenv==1.9.1 -nose==1.3.7 -notebook==7.2.2 -notebook-shim==0.2.4 -num2words==0.5.6 -numba==0.60.0 -numpy==2.2.3 -oauthlib==3.2.2 -olefile==0.47 -omegaconf==2.3.0 -onnx==1.17.0 -onnxruntime==1.18.0 -openai==1.51.2 -opencensus==0.11.4 -opencensus-context==0.1.3 -opencensus-ext-azure==1.1.13 -opencensus-ext-logging==0.1.1 -opencv-python==4.2.0.34 -openpyxl==3.1.2 -opensearch-py==2.5.0 -opentelemetry-api==1.27.0 -opentelemetry-sdk==1.27.0 -opentelemetry-semantic-conventions==0.48b0 -opt-einsum==3.4.0 -optree==0.12.1 -optuna==3.6.1 -orderly-set==5.2.2 -orjson==3.10.7 -outcome==1.3.0.post0 -overrides==7.7.0 -packaging==24.2 -pandas==2.2.3 -pandocfilters==1.5.1 -paramiko==3.5.0 -parse==1.20.2 -parso==0.8.4 -pathspec==0.12.1 -patsy==0.5.6 -pbr==6.1.0 -pdf2image==1.13.1 -pdfminer==20191125 -pdfrw==0.4 -pexpect==4.9.0 -pillow==11.0.0 -pip==24 -pkginfo==1.11.2 -platformdirs==4.3.6 -plotly==5.24.1 -plotly-resampler==0.10.0 -pluggy==1.5.0 -ply==3.11 -pmdarima==2.0.4 -poetry==1.8.3 -poetry-core==1.9.0 -poetry-plugin-export==1.8.0 -polyfactory==2.16.2 -portalocker==2.10.1 -posthog==3.6.6 -pre-commit==3.8.0 -pre-commit-hooks==4.6.0 -preshed==3.0.9 -prometheus-client==0.21.0 -prompthub-py==4.0.0 -prompt-toolkit==3.0.48 -propcache==0.3.0 -protobuf==5.28.3 -proto-plus==1.25.0 -psutil==6.1.0 -ptyprocess==0.7.0 -pure-eval==0.2.3 -py==1.11.0 -pyaml==23.12.0 -pyarrow==19.0.1 -pyarrow-hotfix==0.6 -pyasn1==0.6.1 -pyasn1-modules==0.4.1 -pycodestyle==2.11.1 -pycparser==2.22 -pycryptodome==3.20.0 -pyctuator==1.2.0 -pydantic==2.9.2 -pydantic-core==2.23.4 -pydantic-settings==2.2.1 -pydash==8.0.3 -pydeck==0.9.1 -pyflakes==3.2.0 -Pygments==2.18.0 -PyHive==0.6.2 -PyJWT==2.9.0 -pylance==0.15.0 -pylint==3.2.6 -pyltr==0.2.6 -pymongo==4.10.1 -PyMuPDF==1.24.4 -PyMuPDFb==1.24.3 -PyNaCl==1.5.0 -PyNomaly==0.3.4 -pyodbc==5.1.0 -pyOpenSSL==24.2.1 -pyparsing==3.2.0 -pypdf==5.0.1 -pyproject-api==1.8.0 -pyproject-hooks==1.2.0 -PySocks==1.7.1 -pytesseract==0.3.4 -pytest==8.3.3 -pytest-asyncio==0.23.6 -pytest-cov==5.0.0 -pytest-httpx==0.28.0 -pytest-mock==1.13.0 -pytest-sugar==1.0.0 -python-dateutil==2.9.0.post0 -python-dotenv==1.0.1 -python-iso639==2024.4.27 -python-json-logger==2.0.7 -python-ldap==3.4.3 -python-magic==0.4.27 -python-multipart==0.0.19 -python-oxmsg==0.0.1 -python-slugify==8.0.4 -python-utils==3.9.0 -pytoolconfig==1.3.1 -pytz==2024.2 -pywin32==307 -pywin32-ctypes==0.2.3 -PyYAML==6.0.2 -pyzmq==26.2.0 -quantulum3==0.9.2 -querystring-parser==1.2.4 -raiutils==0.4.2 -rank-bm25==0.2.2 -RapidFuzz==3.10.0 -ratelimiter==1.2.0.post0 -readme-renderer==44 -recordlinkage==0.16 -referencing==0.35.1 -regex==2024.9.11 -reportlab==4.2.0 -requests==2.32.3 -requests-cache==0.9.8 -requests-oauthlib==2.0.0 -requests-toolbelt==1.0.0 -retry==0.9.2 -retrying==1.3.4 -rfc3339-validator==0.1.4 -rfc3986==2.0.0 -rfc3986-validator==0.1.1 -rich==13.9.2 -rich-click==1.8.3 -rope==1.13.0 -rpds-py==0.20.0 -rsa==4.9 -ruamel.yaml==0.18.6 -ruamel.yaml.clib==0.2.12 -ruff==0.5.7 -safetensors==0.4.5 -schemdraw==0.15 -scikit-base==0.10.1 -scikit-learn==1.5.2 -scikit-plot==0.3.7 -scipy==1.14.1 -seaborn==0.13.2 -SecretStorage==3.3.3 -secure==0.3.0 -selenium==4.21.0 -semver==2.13.0 -Send2Trash==1.8.3 -sentencepiece==0.2.0 -sentence-transformers==2.2.2 -sentinels==1.0.1 -setuptools==75.2.0 -shap==0.46.0 -shellingham==1.5.4 -simplejson==3.19.2 -six==1.17.0 -sktime==0.26.0 -slicer==0.0.8 -smart-open==7.0.4 -smmap==5.0.1 -sniffio==1.3.1 -sortedcontainers==2.4.0 -soupsieve==2.6 -spacy==3.8.2 -spacy-legacy==3.0.12 -spacy-loggers==1.0.5 -sparse-dot-topn==1.1.1 -SQLAlchemy==2.0.38 -sqlparse==0.5.1 -srsly==2.4.8 -sseclient-py==1.8.0 -stack-data==0.6.3 -starlette==0.40.0 -statsmodels==0.14.4 -stevedore==5.3.0 -strawberry-graphql==0.243.0 -streamlit==1.37.1 -strictyaml==1.7.3 -striprtf==0.0.26 -strsimpy==0.2.1 -sympy==1.13.3 -tabula-py==2.1.1 -tabulate==0.9.0 -tantivy==0.22.0 -tbats==1.1.3 -tenacity==9.0.0 -tensorboard==2.16.2 -tensorboard-data-server==0.7.2 -tensorflow==2.16.1 -tensorflow-io-gcs-filesystem==0.37.1 -termcolor==2.4.0 -terminado==0.18.1 -textblob==0.15.3 -text-unidecode==1.3 -tf2onnx==1.16.1 -thinc==8.3.2 -threadpoolctl==3.5.0 -tiktoken==0.7.0 -tinycss2==1.3.0 -tokenizers==0.20.1 -toml==0.10.2 -tomli==2.0.2 -tomlkit==0.13.2 -toolz==1.0.0 -toposort==1.1 -torch==2.4.0 -torchvision==0.17.2 -tornado==6.5.0 -tox==4.15.0 -tqdm==4.67.1 -traitlets==5.14.3 -transformers==4.46.0 -trio==0.26.2 -trio-websocket==0.11.1 -trove-classifiers==2024.9.12 -tsdownsample==0.1.3 -twine==5.1.1 -typeguard==4.3.0 -typer==0.12.5 -types-python-dateutil==2.9.0.20241003 -typing-extensions==4.12.2 -typing-inspect==0.9.0 -tzdata==2024.2 -tzlocal==5.2 -ujson==5.10.0 -unicorn==2.0.1.post1 -unstructured==0.14.2 -unstructured-client==0.25.8 -uri-template==1.3.0 -urllib3==2.2.3 -url-normalize==1.4.3 -uvicorn==0.31.0 -uvloop==0.20.0 -virtualenv==20.27.0 -wasabi==1.1.3 -watchdog==4.0.1 -watchfiles==0.24.0 -watchgod==0.8.2 -wcwidth==0.2.13 -weasel==0.4.1 -webcolors==24.8.0 -webencodings==0.5.1 -websocket-client==1.8.0 -websockets==13.1 -Werkzeug==3.0.4 -wheel==0.44.0 -widgetsnbextension==4.0.13 -wrapt==1.16.0 -wsproto==1.2.0 -wurlitzer==3.1.1 -xattr==1.1.0 -xgboost==1.7.6 -xxhash==3.5.0 -yarl==1.18.3 -yellowbrick==1.5 -zipp==3.20.2 -zstandard==0.23.0 \ No newline at end of file +absl-py==2.1.0 \ No newline at end of file diff --git a/utils/ConfigUtils.py b/utils/ConfigUtils.py index 5dfd1e6..fc0f246 100644 --- a/utils/ConfigUtils.py +++ b/utils/ConfigUtils.py @@ -118,20 +118,20 @@ def load_base_packages() -> set: logger.warning(f"Failed to load base package list: {e}") return base_set -def parse_requirements(requirements_file: str) -> dict: +def parse_requirements(RequirementsFile: str) -> dict: """ Parse a requirements.txt file into a dictionary. Supports basic parsing of version constraints like ==, >=, <=, ~=, !=. Args: - requirements_file (str): Path to a pip requirements file. + RequirementsFile (str): Path to a pip requirements file. Returns: dict: Mapping of package names to their specified version strings. """ pkgs = {} - with open(requirements_file, encoding='utf-8') as f: + with open(RequirementsFile, encoding='utf-8') as f: for line in f: line = line.strip() if not line or line.startswith('#'): @@ -140,7 +140,7 @@ def parse_requirements(requirements_file: str) -> dict: m = re.search(r"(==|>=|<=|~=|!=)(.+)", line) ver = m.group(2).strip() if m else 'unknown' pkgs[name] = ver - logger.info(f"Parsed {len(pkgs)} packages from {requirements_file}") + logger.info(f"Parsed {len(pkgs)} packages from {RequirementsFile}") return pkgs def extract_dependencies(info: dict) -> list: diff --git a/utils/CustodianUtils.py b/utils/CustodianUtils.py index cfeae4f..a234c98 100644 --- a/utils/CustodianUtils.py +++ b/utils/CustodianUtils.py @@ -57,15 +57,15 @@ def load_custodian_map(path: str) -> dict: reader = csv.DictReader(f) for row in reader: pkg = row.get("Package Name", "").strip().lower() - custodian = row.get("Custodian", "").strip() - pkg_type = row.get("Package Type", "").strip() + Custodian = row.get("Custodian", "").strip() + PkgType = row.get("Package Type", "").strip() if pkg: - mapping[pkg] = (custodian, pkg_type) + mapping[pkg] = (Custodian, PkgType) except Exception as e: logger.error(f"Failed to load custodian map: {e}") return mapping -def custom_sort_key(row: dict, custom_order: dict) -> tuple: +def custom_sort_key(row: dict, CustomOrder: dict) -> tuple: """ Generate a composite sorting key for a package report row based on custodian and package type. @@ -76,18 +76,18 @@ def custom_sort_key(row: dict, custom_order: dict) -> tuple: Args: row (dict): A dictionary representing a single row in the report. - custom_order (dict): Mapping from custodian name to sort rank (e.g. {"Org1": 0, "Org2": 1}). + CustomOrder (dict): Mapping from custodian name to sort rank (e.g. {"Org1": 0, "Org2": 1}). Returns: - tuple: Sorting key as (custodian_rank, package_type_rank, package_name_lower) + tuple: Sorting key as (CustodianRank, package_type_rank, package_name_lower) """ - custodian = row.get("Custodian", "") - custodian_rank = custom_order.get(custodian, len(custom_order)) + Custodian = row.get("Custodian", "") + CustodianRank = CustomOrder.get(Custodian, len(CustomOrder)) type_order = {"Base Package": 0, "Dependency Package": 1} - pkg_type = row.get("Package Type", "") - pkg_type_rank = type_order.get(pkg_type, 2) + PkgType = row.get("Package Type", "") + PkgTypeRank = type_order.get(PkgType, 2) - pkg_name = row.get("Package Name", "").lower() + PkgName = row.get("Package Name", "").lower() - return (custodian_rank, pkg_type_rank, pkg_name) \ No newline at end of file + return (CustodianRank, PkgTypeRank, PkgName) \ No newline at end of file diff --git a/utils/UpgradeInstruction.py b/utils/UpgradeInstruction.py index 37aa5ad..30b8d7c 100644 --- a/utils/UpgradeInstruction.py +++ b/utils/UpgradeInstruction.py @@ -126,13 +126,13 @@ async def get_safe_dependency_versions(dependencies: list[str]) -> dict[str, str except Exception as e: logger.warning(f"Failed to schedule version check for {dep}: {e}") - safe_versions = await asyncio.gather(*tasks, return_exceptions=True) + SafeVersions = await asyncio.gather(*tasks, return_exceptions=True) # fill in real values - for (pkg_name, safe) in zip(results.keys(), safe_versions): + for (PkgName, safe) in zip(results.keys(), SafeVersions): if isinstance(safe, Exception) or safe in (None, "Up-to-date"): continue - results[pkg_name] = safe + results[PkgName] = safe return results @@ -152,11 +152,11 @@ def generate_upgrade_instruction(base_package: str, target_version: str) -> dict # logger.info(f"{base_package}=={target_version} requires: {requires_dist}") # Use asyncio.run to avoid 'event loop already running' issues - safe_versions = asyncio.run(get_safe_dependency_versions(requires_dist)) + SafeVersions = asyncio.run(get_safe_dependency_versions(requires_dist)) instruction = { "base_package": f"{base_package}=={target_version}", - "dependencies": [f"{k}=={v}" for k, v in safe_versions.items() if v] + "dependencies": [f"{k}=={v}" for k, v in SafeVersions.items() if v] } return instruction From 83db88c6bf2dd0de85ea41f40b8d210a8da4886b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Jun 2025 11:16:15 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=F0=9F=93=9D=20Update=20WeeklyReport=20on?= =?UTF-8?q?=202025-06-04=2011:16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WeeklyReport_20250604_111614.csv | 2 + .../WeeklyReport_20250604_111614.html | 234 ++++++++++++++++++ .../WeeklyReport_20250604_111614.json | 22 ++ 3 files changed, 258 insertions(+) create mode 100644 WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.csv create mode 100644 WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.html create mode 100644 WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.json diff --git a/WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.csv b/WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.csv new file mode 100644 index 0000000..ecd9f8d --- /dev/null +++ b/WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.csv @@ -0,0 +1,2 @@ +๏ปฟPackage Name,Package Type,Custodian,Current Version,Dependencies for Current,Newer Versions,Dependencies for Latest,Latest Version,Current Version Vulnerable?,Current Version Vulnerability Details,Upgrade Version Vulnerable?,Upgrade Vulnerability Details,Suggested Upgrade,Upgrade Instruction,Remarks +absl-py,Dependency Package,I&S,2.1.0,,"2.2.0, 2.2.1, 2.2.2, 2.3.0",,2.3.0,No,,No,None,2.3.0,"{'base_package': 'absl-py==2.3.0', 'dependencies': []}", diff --git a/WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.html b/WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.html new file mode 100644 index 0000000..eda40c0 --- /dev/null +++ b/WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.html @@ -0,0 +1,234 @@ + + + + + Weekly Python Package Report +

Report generated at 2025-06-04 11:16:15 +08

+ + + + + + + +

Dependency Upgrade Report

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Package NamePackage TypeCustodianCurrent VersionDependencies for CurrentNewer VersionsDependencies for LatestLatest VersionCurrent Version Vulnerable?Current Version Vulnerability DetailsUpgrade Version Vulnerable?Upgrade Vulnerability DetailsSuggested UpgradeUpgrade InstructionRemarks
Package NamePackage TypeCustodianCurrent VersionDependencies for CurrentNewer VersionsDependencies for LatestLatest VersionCurrent Version Vulnerable?Current Version Vulnerability DetailsUpgrade Version Vulnerable?Upgrade Vulnerability DetailsSuggested UpgradeUpgrade InstructionRemarks
absl-pyDependency PackageI&S2.1.02.2.0, 2.2.1, 2.2.2, 2.3.02.3.0NoNoNone2.3.0{'base_package': 'absl-py==2.3.0', 'dependencies': []}
+ + + + \ No newline at end of file diff --git a/WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.json b/WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.json new file mode 100644 index 0000000..9e573bc --- /dev/null +++ b/WeeklyReport/2025-06-02/WeeklyReport_20250604_111614.json @@ -0,0 +1,22 @@ +[ + { + "Package Name": "absl-py", + "Package Type": "Dependency Package", + "Custodian": "I&S", + "Current Version": "2.1.0", + "Dependencies for Current": "", + "Newer Versions": "2.2.0, 2.2.1, 2.2.2, 2.3.0", + "Dependencies for Latest": "", + "Latest Version": "2.3.0", + "Current Version Vulnerable?": "No", + "Current Version Vulnerability Details": "", + "Upgrade Version Vulnerable?": "No", + "Upgrade Vulnerability Details": "None", + "Suggested Upgrade": "2.3.0", + "Upgrade Instruction": { + "base_package": "absl-py==2.3.0", + "dependencies": [] + }, + "Remarks": "" + } +] \ No newline at end of file From 36ecfc796486a8f47b591c9d3f9737fc38a8cf2b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Jun 2025 11:16:15 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=F0=9F=93=8A=20Update=20MonthlyReport=20on?= =?UTF-8?q?=202025-06-04=2011:16?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025-06/MonthlyReport-202506-04-1116.xlsx | Bin 0 -> 19378 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 MonthlyReport/2025-06/MonthlyReport-202506-04-1116.xlsx diff --git a/MonthlyReport/2025-06/MonthlyReport-202506-04-1116.xlsx b/MonthlyReport/2025-06/MonthlyReport-202506-04-1116.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..255a1323f3f72c2a3d4ccf6d5ac18c8cca1f8b24 GIT binary patch literal 19378 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 Date: Wed, 4 Jun 2025 03:18:18 +0000 Subject: [PATCH 4/9] Change monthly release order --- .github/workflows/GenerateReport.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/GenerateReport.yml b/.github/workflows/GenerateReport.yml index 0caaa02..43cedba 100644 --- a/.github/workflows/GenerateReport.yml +++ b/.github/workflows/GenerateReport.yml @@ -367,6 +367,14 @@ jobs: env: GH_TOKEN: ${{ secrets.GH_PAT }} + - name: Create GitHub Release + run: | + gh release create "$RELEASE_TAG" \ + "$REPORT_FILE#${REPORT_NAME}" \ + --title "Monthly Report - $RELEASE_TAG" \ + --notes "Automated monthly report" + env: + GH_TOKEN: ${{ secrets.GH_PAT }} - name: Remove old releases for the same month run: | @@ -395,12 +403,3 @@ jobs: done env: GH_TOKEN: ${{ secrets.GH_PAT }} - - - name: Create GitHub Release - run: | - gh release create "$RELEASE_TAG" \ - "$REPORT_FILE#${REPORT_NAME}" \ - --title "Monthly Report - $RELEASE_TAG" \ - --notes "Automated monthly report" - env: - GH_TOKEN: ${{ secrets.GH_PAT }} From 0beac10cfb1d6dbd79913a5456e4fed0aadf907c Mon Sep 17 00:00:00 2001 From: Ted Date: Wed, 4 Jun 2025 03:19:44 +0000 Subject: [PATCH 5/9] Change Dev action name --- .github/workflows/GenerateReport-Dev.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/GenerateReport-Dev.yml b/.github/workflows/GenerateReport-Dev.yml index 7d6b6e8..87b620b 100644 --- a/.github/workflows/GenerateReport-Dev.yml +++ b/.github/workflows/GenerateReport-Dev.yml @@ -1,4 +1,4 @@ -name: Generate Report +name: Generate Report (Dev) on: schedule: From b8806c961f71b1b7d0030940580caa5987f35993 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Jun 2025 11:20:38 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=F0=9F=93=9D=20Update=20WeeklyReport=20on?= =?UTF-8?q?=202025-06-04=2011:20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WeeklyReport_20250604_112037.csv | 2 + .../WeeklyReport_20250604_112037.html | 234 ++++++++++++++++++ .../WeeklyReport_20250604_112037.json | 22 ++ 3 files changed, 258 insertions(+) create mode 100644 WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.csv create mode 100644 WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.html create mode 100644 WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.json diff --git a/WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.csv b/WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.csv new file mode 100644 index 0000000..ecd9f8d --- /dev/null +++ b/WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.csv @@ -0,0 +1,2 @@ +๏ปฟPackage Name,Package Type,Custodian,Current Version,Dependencies for Current,Newer Versions,Dependencies for Latest,Latest Version,Current Version Vulnerable?,Current Version Vulnerability Details,Upgrade Version Vulnerable?,Upgrade Vulnerability Details,Suggested Upgrade,Upgrade Instruction,Remarks +absl-py,Dependency Package,I&S,2.1.0,,"2.2.0, 2.2.1, 2.2.2, 2.3.0",,2.3.0,No,,No,None,2.3.0,"{'base_package': 'absl-py==2.3.0', 'dependencies': []}", diff --git a/WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.html b/WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.html new file mode 100644 index 0000000..9566bfd --- /dev/null +++ b/WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.html @@ -0,0 +1,234 @@ + + + + + Weekly Python Package Report +

Report generated at 2025-06-04 11:20:38 +08

+ + + + + + + +

Dependency Upgrade Report

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Package NamePackage TypeCustodianCurrent VersionDependencies for CurrentNewer VersionsDependencies for LatestLatest VersionCurrent Version Vulnerable?Current Version Vulnerability DetailsUpgrade Version Vulnerable?Upgrade Vulnerability DetailsSuggested UpgradeUpgrade InstructionRemarks
Package NamePackage TypeCustodianCurrent VersionDependencies for CurrentNewer VersionsDependencies for LatestLatest VersionCurrent Version Vulnerable?Current Version Vulnerability DetailsUpgrade Version Vulnerable?Upgrade Vulnerability DetailsSuggested UpgradeUpgrade InstructionRemarks
absl-pyDependency PackageI&S2.1.02.2.0, 2.2.1, 2.2.2, 2.3.02.3.0NoNoNone2.3.0{'base_package': 'absl-py==2.3.0', 'dependencies': []}
+ + + + \ No newline at end of file diff --git a/WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.json b/WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.json new file mode 100644 index 0000000..9e573bc --- /dev/null +++ b/WeeklyReport/2025-06-02/WeeklyReport_20250604_112037.json @@ -0,0 +1,22 @@ +[ + { + "Package Name": "absl-py", + "Package Type": "Dependency Package", + "Custodian": "I&S", + "Current Version": "2.1.0", + "Dependencies for Current": "", + "Newer Versions": "2.2.0, 2.2.1, 2.2.2, 2.3.0", + "Dependencies for Latest": "", + "Latest Version": "2.3.0", + "Current Version Vulnerable?": "No", + "Current Version Vulnerability Details": "", + "Upgrade Version Vulnerable?": "No", + "Upgrade Vulnerability Details": "None", + "Suggested Upgrade": "2.3.0", + "Upgrade Instruction": { + "base_package": "absl-py==2.3.0", + "dependencies": [] + }, + "Remarks": "" + } +] \ No newline at end of file From 638adca5f6e1c13faba437224fe60d61c6adbd96 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Jun 2025 11:20:38 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=F0=9F=93=8A=20Update=20MonthlyReport=20on?= =?UTF-8?q?=202025-06-04=2011:20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025-06/MonthlyReport-202506-04-1120.xlsx | Bin 0 -> 19378 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 MonthlyReport/2025-06/MonthlyReport-202506-04-1120.xlsx diff --git a/MonthlyReport/2025-06/MonthlyReport-202506-04-1120.xlsx b/MonthlyReport/2025-06/MonthlyReport-202506-04-1120.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..def7ee0cd3aeeb412796f50567aa842ee644becf GIT binary patch literal 19378 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 literal 0 HcmV?d00001 From 060d9da16b904b0a918fdc38720c47ab060540c6 Mon Sep 17 00:00:00 2001 From: Ted Date: Wed, 4 Jun 2025 03:22:19 +0000 Subject: [PATCH 8/9] Recover to full file list --- src/requirements_full_list.txt | 609 ++++++++++++++++++++++++++++++++- 1 file changed, 608 insertions(+), 1 deletion(-) diff --git a/src/requirements_full_list.txt b/src/requirements_full_list.txt index 1369d64..7ff2684 100644 --- a/src/requirements_full_list.txt +++ b/src/requirements_full_list.txt @@ -1 +1,608 @@ -absl-py==2.1.0 \ No newline at end of file +absl-py==2.1.0 +adal==1.2.7 +adlfs==2024.4.1 +aiofiles==24.1.0 +aiohappyeyeballs==2.4.6 +aiohttp==3.11.13 +aiosignal==1.3.2 +alembic==1.13.3 +allennlp==2.10.1 +altair==5.4.1 +aniso8601==9.0.1 +annotated-types==0.7.0 +antlr4-python3-runtime==4.9.3 +anyconfig==0.14.0 +anyio==4.8.0 +appdirs==1.4.4 +appnope==0.1.4 +argcomplete==3.5.1 +argon2-cffi==23.1.0 +argon2-cffi-bindings==21.2.0 +arrow==1.3.0 +artifacts-keyring==0.4.0 +AST==0.0.2 +astroid==3.2.4 +asttokens==2.4.1 +astunparse==1.6.3 +asyncio==3.4.3 +async-lru==2.0.4 +async-timeout==4.0.3 +attrs==24.2.0 +azure-ai-ml==1.21.1 +azure-common==1.1.28 +azure-core==1.31.0 +azure-datalake-store==0.0.53 +azure-graphrbac==0.61.1 +azure-identity==1.19.0 +azure-keyvault-secrets==4.8.0 +azure-mgmt-authorization==4.0.0 +azure-mgmt-containerregistry==10.3.0 +azure-mgmt-core==1.4.0 +azure-mgmt-keyvault==10.3.1 +azure-mgmt-network==27.0.0 +azure-mgmt-resource==23.2.0 +azure-mgmt-storage==21.2.1 +azureml-core==1.58.0 +azureml-dataprep==5.1.6 +azureml-dataprep-native==41.0.0 +azureml-dataprep-rslex==2.22.4 +azureml-featurestore==1.1.0 +azureml-fsspec==1.3.1 +azureml-interpret==1.58.0 +azure-storage-blob==12.23.1 +azure-storage-file-datalake==12.17.0 +azure-storage-file-share==12.19.0 +babel==2.16.0 +backoff==2.2.1 +backports.tempfile==1 +backports.weakref==1.0.post1 +bandit==1.7.9 +bcrypt==4.2.0 +beanie==1.26.0 +beautifulsoup4==4.12.3 +bert-score==0.3.13 +binaryornot==0.4.4 +black==24.4.2 +bleach==6.1.0 +blinker==1.8.2 +blis==1.0.1 +boilerpy3==1.0.7 +bs4==0.0.2 +build==1.2.2.post1 +CacheControl==0.14.0 +cachetools==5.5.0 +catalogue==2.0.10 +category-encoders==2.6.4 +cattrs==24.1.2 +certifi==2025.1.31 +cffi==1.17.1 +cfgv==3.4.0 +chardet==5.2.0 +charset-normalizer==3.4.1 +cleo==2.1.0 +click==8.1.7 +click-default-group==1.2.4 +cloudpathlib==0.19.0 +cloudpickle==3.1.0 +colorama==0.4.6 +coloredlogs==15.0.1 +colorlog==6.8.2 +comm==0.2.2 +confection==0.1.5 +configparser==7.0.0 +contextlib2==21.6.0 +contourpy==1.3.0 +cookiecutter==2.6.0 +coverage==7.6.4 +crashtest==0.4.1 +cryptography==44.0.2 +cycler==0.12.1 +cymem==2.0.8 +Cython==3.0.11 +dash==2.18.1 +dash-core-components==2.0.0 +dash-html-components==2.0.0 +dash-table==5.0.0 +databricks-sdk==0.33.0 +dataclasses-json==0.6.7 +datasets==2.19.1 +debugpy==1.8.7 +decorator==5.1.1 +deepchecks==0.18.1 +deepdiff==8.0.1 +defusedxml==0.7.1 +Deprecated==1.2.14 +deprecation==2.1.0 +dill==0.3.9 +dirtyjson==1.0.8 +distlib==0.3.9 +distro==1.9.0 +dnspython==2.7.0 +docker==7.1.0 +docutils==0.21.2 +docx==0.2.4 +dulwich==0.21.7 +dynaconf==3.2.6 +elasticsearch==8.13.1 +elastic-transport==8.15.0 +email-validator==2.2.0 +emoji==2.12.1 +entrypoints==0.4 +et-xmlfile==1.1.0 +Events==0.5 +evidently==0.4.16 +exceptiongroup==1.2.2 +executing==2.1.0 +faiss==1.5.3 +faiss-cpu==1.7.4 +faiss-gpu==1.7.2 +Faker==26.3.0 +farm-haystack==1.25.5 +fastapi==0.111.1 +fastapi-cli==0.0.5 +fastjsonschema==2.20.0 +filelock==3.16.1 +filetype==1.2.0 +flake8==7.0.0 +Flask==3.0.3 +Flask-HTTPAuth==3.3.0 +Flask-SQLAlchemy==2.4.1 +flask-swagger-ui==4.11.1 +flatbuffers==24.3.25 +fonttools==4.54.1 +fqdn==1.5.1 +frozenlist==1.5.0 +fsspec==2024.10.0 +future==1.0.0 +fuzzywuzzy==0.18.0 +gast==0.6.0 +gensim==3.8.3 +gitdb==4.0.11 +GitPython==3.1.43 +google-ai-generativelanguage==0.3.3 +google-api-core==2.21.0 +googleapis-common-protos==1.65.0 +google-auth==2.35.0 +google-generativeai==0.2.1 +google-pasta==0.2.0 +graphene==3.3 +graphframes==0.6 +graphql-core==3.2.4 +graphql-relay==3.2.0 +great-expectations==1.1.3 +greenlet==3.1.1 +grpcio==1.66.2 +grpcio-status==1.62.3 +gunicorn==23.0.0 +h11==0.16.0 +h5py==3.12.1 +html2text==2020.1.16 +httpcore==1.0.7 +httptools==0.6.1 +httpx==0.28.1 +huggingface-hub==0.26.1 +humanfriendly==10 +identify==2.6.1 +idna==3.1 +imbalanced-learn==0.12.3 +importlib-metadata==8.5.0 +importlib-resources==6.4.0 +inflect==7.4.0 +iniconfig==2.0.0 +installer==0.7.0 +interpret-community==0.31.0 +interpret-core==0.5.0 +invoke==2.2.0 +ipykernel==6.29.5 +ipython==8.28.0 +ipython-genutils==0.2.0 +ipywidgets==8.1.5 +isodate==0.7.2 +isoduration==20.11.0 +isort==5.13.2 +iterative-telemetry==0.0.8 +itsdangerous==2.2.0 +jaraco.classes==3.4.0 +jaraco.context==6.0.1 +jaraco.functools==4.1.0 +jedi==0.19.1 +jeepney==0.8.0 +jellyfish==1.1.0 +Jinja2==3.1.6 +jiter==0.6.1 +jmespath==1.0.1 +joblib==1.4.2 +json5==0.9.25 +jsonpatch==1.33 +jsonpath-ng==1.6.1 +jsonpath-python==1.0.6 +jsonpickle==3.3.0 +jsonpointer==3.0.0 +jsonschema==4.23.0 +jsonschema-specifications==2024.10.1 +jupyter-client==8.6.3 +jupyter-core==5.7.2 +jupyter-events==0.10.0 +jupyterlab==4.2.5 +jupyterlab-pygments==0.3.0 +jupyterlab-server==2.27.3 +jupyterlab-widgets==3.0.13 +jupyter-lsp==2.2.5 +jupyter-server==2.14.2 +jupyter-server-terminals==0.5.3 +kaleido==0.2.1 +kedro==0.19.12 +kedro-azureml==0.8.0.1 +kedro-boot==0.2.2 +kedro-datasets==4.0.0 +kedro-docker==0.6.0 +kedro-fast-api==0.6.1 +kedro-telemetry==0.5.0 +kedro-viz==9.1.0 +keras==3.5.0 +keyring==25.4.1 +kiwisolver==1.4.7 +knack==0.12.0 +lancedb==0.11.0 +langchain==0.3.19 +langchain-community==0.2.12 +langchain-core==0.3.40 +langchain-openai==0.1.22 +langchain-text-splitters==0.3.6 +langcodes==3.4.1 +langdetect==1.0.9 +langsmith==0.3.11 +language-data==1.2.0 +lazy-imports==0.3.1 +lazy-loader==0.4 +lazy-model==0.2.0 +ldap3==2.9.1 +libclang==18.1.1 +lightfm==1.17 +lightgbm==4.3.0 +lime==0.2.0.1 +litestar==2.13.0 +llama-cloud==0.1.0 +llama-hub==0.0.79.post1 +llama-index==0.11.14 +llama-index-agent-openai==0.3.4 +llama-index-cli==0.3.1 +llama-index-core==0.11.14 +llama-index-embeddings-azure-openai==0.1.6 +llama-index-embeddings-openai==0.2.5 +llama-index-indices-managed-llama-cloud==0.4.0 +llama-index-legacy==0.9.48.post3 +llama-index-llms-azure-openai==0.1.10 +llama-index-llms-openai==0.2.9 +llama-index-multi-modal-llms-openai==0.2.1 +llama-index-program-openai==0.2.0 +llamaindex-py-client==0.1.19 +llama-index-question-gen-openai==0.2.0 +llama-index-readers-file==0.2.2 +llama-index-readers-json==0.1.5 +llama-index-readers-llama-parse==0.3.0 +llama-index-vector-stores-azurecosmosmongo==0.1.3 +llama-parse==0.5.6 +llvmlite==0.43.0 +lxml==5.3.0 +Mako==1.3.5 +marisa-trie==1.2.0 +Markdown==3.7 +markdown-it-py==3.0.0 +MarkupSafe==3.0.2 +marshmallow==3.23.0 +matplotlib==3.9.2 +matplotlib-inline==0.1.7 +mccabe==0.7.0 +mdurl==0.1.2 +mistune==3.0.2 +ml-dtypes==0.5.0 +mlflow==2.15.1 +mlflow-skinny==2.15.1 +mltable==1.6.1 +ml-wrappers==0.5.6 +mongomock==4.1.2 +mongomock-motor==0.0.29 +monotonic==1.6 +more-itertools==10.5.0 +motor==3.6.0 +motor-types==1.0.0b4 +mpmath==1.3.0 +msal==1.31.0 +msal-extensions==1.2.0 +msgpack==1.1.0 +msgspec==0.18.6 +msrest==0.7.1 +msrestazure==0.6.4.post1 +multidict==6.1.0 +multiprocess==0.70.16 +murmurhash==1.0.10 +mypy==1.10.0 +mypy-extensions==1.0.0 +namex==0.0.8 +narwhals==1.9.0 +nbclient==0.10.0 +nbconvert==7.16.4 +nbformat==5.10.4 +ndg-httpsclient==0.5.1 +neo4j==5.24.0 +nest-asyncio==1.6.0 +networkx==3.4.2 +nh3==0.2.18 +nltk==3.9.1 +nodeenv==1.9.1 +nose==1.3.7 +notebook==7.2.2 +notebook-shim==0.2.4 +num2words==0.5.6 +numba==0.60.0 +numpy==2.2.3 +oauthlib==3.2.2 +olefile==0.47 +omegaconf==2.3.0 +onnx==1.17.0 +onnxruntime==1.18.0 +openai==1.51.2 +opencensus==0.11.4 +opencensus-context==0.1.3 +opencensus-ext-azure==1.1.13 +opencensus-ext-logging==0.1.1 +opencv-python==4.2.0.34 +openpyxl==3.1.2 +opensearch-py==2.5.0 +opentelemetry-api==1.27.0 +opentelemetry-sdk==1.27.0 +opentelemetry-semantic-conventions==0.48b0 +opt-einsum==3.4.0 +optree==0.12.1 +optuna==3.6.1 +orderly-set==5.2.2 +orjson==3.10.7 +outcome==1.3.0.post0 +overrides==7.7.0 +packaging==24.2 +pandas==2.2.3 +pandocfilters==1.5.1 +paramiko==3.5.0 +parse==1.20.2 +parso==0.8.4 +pathspec==0.12.1 +patsy==0.5.6 +pbr==6.1.0 +pdf2image==1.13.1 +pdfminer==20191125 +pdfrw==0.4 +pexpect==4.9.0 +pillow==11.0.0 +pip==24 +pkginfo==1.11.2 +platformdirs==4.3.6 +plotly==5.24.1 +plotly-resampler==0.10.0 +pluggy==1.5.0 +ply==3.11 +pmdarima==2.0.4 +poetry==1.8.3 +poetry-core==1.9.0 +poetry-plugin-export==1.8.0 +polyfactory==2.16.2 +portalocker==2.10.1 +posthog==3.6.6 +pre-commit==3.8.0 +pre-commit-hooks==4.6.0 +preshed==3.0.9 +prometheus-client==0.21.0 +prompthub-py==4.0.0 +prompt-toolkit==3.0.48 +propcache==0.3.0 +protobuf==5.28.3 +proto-plus==1.25.0 +psutil==6.1.0 +ptyprocess==0.7.0 +pure-eval==0.2.3 +py==1.11.0 +pyaml==23.12.0 +pyarrow==19.0.1 +pyarrow-hotfix==0.6 +pyasn1==0.6.1 +pyasn1-modules==0.4.1 +pycodestyle==2.11.1 +pycparser==2.22 +pycryptodome==3.20.0 +pyctuator==1.2.0 +pydantic==2.9.2 +pydantic-core==2.23.4 +pydantic-settings==2.2.1 +pydash==8.0.3 +pydeck==0.9.1 +pyflakes==3.2.0 +Pygments==2.18.0 +PyHive==0.6.2 +PyJWT==2.9.0 +pylance==0.15.0 +pylint==3.2.6 +pyltr==0.2.6 +pymongo==4.10.1 +PyMuPDF==1.24.4 +PyMuPDFb==1.24.3 +PyNaCl==1.5.0 +PyNomaly==0.3.4 +pyodbc==5.1.0 +pyOpenSSL==24.2.1 +pyparsing==3.2.0 +pypdf==5.0.1 +pyproject-api==1.8.0 +pyproject-hooks==1.2.0 +PySocks==1.7.1 +pytesseract==0.3.4 +pytest==8.3.3 +pytest-asyncio==0.23.6 +pytest-cov==5.0.0 +pytest-httpx==0.28.0 +pytest-mock==1.13.0 +pytest-sugar==1.0.0 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.1 +python-iso639==2024.4.27 +python-json-logger==2.0.7 +python-ldap==3.4.3 +python-magic==0.4.27 +python-multipart==0.0.19 +python-oxmsg==0.0.1 +python-slugify==8.0.4 +python-utils==3.9.0 +pytoolconfig==1.3.1 +pytz==2024.2 +pywin32==307 +pywin32-ctypes==0.2.3 +PyYAML==6.0.2 +pyzmq==26.2.0 +quantulum3==0.9.2 +querystring-parser==1.2.4 +raiutils==0.4.2 +rank-bm25==0.2.2 +RapidFuzz==3.10.0 +ratelimiter==1.2.0.post0 +readme-renderer==44 +recordlinkage==0.16 +referencing==0.35.1 +regex==2024.9.11 +reportlab==4.2.0 +requests==2.32.3 +requests-cache==0.9.8 +requests-oauthlib==2.0.0 +requests-toolbelt==1.0.0 +retry==0.9.2 +retrying==1.3.4 +rfc3339-validator==0.1.4 +rfc3986==2.0.0 +rfc3986-validator==0.1.1 +rich==13.9.2 +rich-click==1.8.3 +rope==1.13.0 +rpds-py==0.20.0 +rsa==4.9 +ruamel.yaml==0.18.6 +ruamel.yaml.clib==0.2.12 +ruff==0.5.7 +safetensors==0.4.5 +schemdraw==0.15 +scikit-base==0.10.1 +scikit-learn==1.5.2 +scikit-plot==0.3.7 +scipy==1.14.1 +seaborn==0.13.2 +SecretStorage==3.3.3 +secure==0.3.0 +selenium==4.21.0 +semver==2.13.0 +Send2Trash==1.8.3 +sentencepiece==0.2.0 +sentence-transformers==2.2.2 +sentinels==1.0.1 +setuptools==75.2.0 +shap==0.46.0 +shellingham==1.5.4 +simplejson==3.19.2 +six==1.17.0 +sktime==0.26.0 +slicer==0.0.8 +smart-open==7.0.4 +smmap==5.0.1 +sniffio==1.3.1 +sortedcontainers==2.4.0 +soupsieve==2.6 +spacy==3.8.2 +spacy-legacy==3.0.12 +spacy-loggers==1.0.5 +sparse-dot-topn==1.1.1 +SQLAlchemy==2.0.38 +sqlparse==0.5.1 +srsly==2.4.8 +sseclient-py==1.8.0 +stack-data==0.6.3 +starlette==0.40.0 +statsmodels==0.14.4 +stevedore==5.3.0 +strawberry-graphql==0.243.0 +streamlit==1.37.1 +strictyaml==1.7.3 +striprtf==0.0.26 +strsimpy==0.2.1 +sympy==1.13.3 +tabula-py==2.1.1 +tabulate==0.9.0 +tantivy==0.22.0 +tbats==1.1.3 +tenacity==9.0.0 +tensorboard==2.16.2 +tensorboard-data-server==0.7.2 +tensorflow==2.16.1 +tensorflow-io-gcs-filesystem==0.37.1 +termcolor==2.4.0 +terminado==0.18.1 +textblob==0.15.3 +text-unidecode==1.3 +tf2onnx==1.16.1 +thinc==8.3.2 +threadpoolctl==3.5.0 +tiktoken==0.7.0 +tinycss2==1.3.0 +tokenizers==0.20.1 +toml==0.10.2 +tomli==2.0.2 +tomlkit==0.13.2 +toolz==1.0.0 +toposort==1.1 +torch==2.4.0 +torchvision==0.17.2 +tornado==6.5.0 +tox==4.15.0 +tqdm==4.67.1 +traitlets==5.14.3 +transformers==4.46.0 +trio==0.26.2 +trio-websocket==0.11.1 +trove-classifiers==2024.9.12 +tsdownsample==0.1.3 +twine==5.1.1 +typeguard==4.3.0 +typer==0.12.5 +types-python-dateutil==2.9.0.20241003 +typing-extensions==4.12.2 +typing-inspect==0.9.0 +tzdata==2024.2 +tzlocal==5.2 +ujson==5.10.0 +unicorn==2.0.1.post1 +unstructured==0.14.2 +unstructured-client==0.25.8 +uri-template==1.3.0 +urllib3==2.2.3 +url-normalize==1.4.3 +uvicorn==0.31.0 +uvloop==0.20.0 +virtualenv==20.27.0 +wasabi==1.1.3 +watchdog==4.0.1 +watchfiles==0.24.0 +watchgod==0.8.2 +wcwidth==0.2.13 +weasel==0.4.1 +webcolors==24.8.0 +webencodings==0.5.1 +websocket-client==1.8.0 +websockets==13.1 +Werkzeug==3.0.4 +wheel==0.44.0 +widgetsnbextension==4.0.13 +wrapt==1.16.0 +wsproto==1.2.0 +wurlitzer==3.1.1 +xattr==1.1.0 +xgboost==1.7.6 +xxhash==3.5.0 +yarl==1.18.3 +yellowbrick==1.5 +zipp==3.20.2 +zstandard==0.23.0 \ No newline at end of file From 10007a3165ea8babaf94f7cf8de70cffb1502be2 Mon Sep 17 00:00:00 2001 From: Ted Date: Wed, 4 Jun 2025 03:25:08 +0000 Subject: [PATCH 9/9] Add test list --- src/requirements_test_list.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/requirements_test_list.txt diff --git a/src/requirements_test_list.txt b/src/requirements_test_list.txt new file mode 100644 index 0000000..1369d64 --- /dev/null +++ b/src/requirements_test_list.txt @@ -0,0 +1 @@ +absl-py==2.1.0 \ No newline at end of file