From f3829df92a317a3588fa387f1bdd7333ea15f99f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 17:22:08 -0700 Subject: [PATCH 1/6] Bump actions/checkout from 4 to 5 (#362) Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check-coverage.yml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/generate-metadata.yml | 2 +- .github/workflows/package.yml | 2 +- .github/workflows/publish-pypi.yml | 2 +- .github/workflows/run-e2-tests.yml | 2 +- .github/workflows/run-tests.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check-coverage.yml b/.github/workflows/check-coverage.yml index 3d4996e4..46bf83ab 100644 --- a/.github/workflows/check-coverage.yml +++ b/.github/workflows/check-coverage.yml @@ -18,7 +18,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} uses: actions/setup-python@v5 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 0cb6f814..06d92ba4 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/generate-metadata.yml b/.github/workflows/generate-metadata.yml index 53449eb9..ac809320 100644 --- a/.github/workflows/generate-metadata.yml +++ b/.github/workflows/generate-metadata.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python uses: actions/setup-python@v5 diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index d9b65a93..ed9d2752 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -60,7 +60,7 @@ jobs: UPLOAD_FILE_NAME: tabcmd steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: actions/setup-python@v5 with: diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index bc101762..6fa73f02 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -15,7 +15,7 @@ jobs: name: Build dist files for PyPi runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 - uses: actions/setup-python@v5 diff --git a/.github/workflows/run-e2-tests.yml b/.github/workflows/run-e2-tests.yml index 81ebb4f6..4ae77785 100644 --- a/.github/workflows/run-e2-tests.yml +++ b/.github/workflows/run-e2-tests.yml @@ -23,7 +23,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} uses: actions/setup-python@v5 diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 4e9d279a..df7cdc7f 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -20,7 +20,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} uses: actions/setup-python@v5 From e9c640c45cb5cf1152ec0ff79597c4cf00da5553 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:52:52 -0700 Subject: [PATCH 2/6] Bump actions/setup-python from 5 to 6 (#363) Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/check-coverage.yml | 2 +- .github/workflows/generate-metadata.yml | 2 +- .github/workflows/package.yml | 2 +- .github/workflows/publish-pypi.yml | 2 +- .github/workflows/python-app.yml | 2 +- .github/workflows/run-e2-tests.yml | 2 +- .github/workflows/run-tests.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check-coverage.yml b/.github/workflows/check-coverage.yml index 46bf83ab..fe9b244d 100644 --- a/.github/workflows/check-coverage.yml +++ b/.github/workflows/check-coverage.yml @@ -21,7 +21,7 @@ jobs: - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/generate-metadata.yml b/.github/workflows/generate-metadata.yml index ac809320..7e59af3e 100644 --- a/.github/workflows/generate-metadata.yml +++ b/.github/workflows/generate-metadata.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v5 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '3.12' diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index ed9d2752..fe851902 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -62,7 +62,7 @@ jobs: steps: - uses: actions/checkout@v5 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: 3.12 diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index 6fa73f02..96400505 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -18,7 +18,7 @@ jobs: - uses: actions/checkout@v5 with: fetch-depth: 0 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: 3.12 - name: Build dist files diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index 023a4a7d..c294aff4 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -24,7 +24,7 @@ jobs: steps: - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - name: pip install Tabcmd diff --git a/.github/workflows/run-e2-tests.yml b/.github/workflows/run-e2-tests.yml index 4ae77785..0f04cdab 100644 --- a/.github/workflows/run-e2-tests.yml +++ b/.github/workflows/run-e2-tests.yml @@ -26,7 +26,7 @@ jobs: - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index df7cdc7f..fca98373 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -23,7 +23,7 @@ jobs: - uses: actions/checkout@v5 - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} From 3cd02655fd27be6c5d0063a5468d95325866c377 Mon Sep 17 00:00:00 2001 From: Jim Jagielski Date: Mon, 10 Nov 2025 09:50:23 -0500 Subject: [PATCH 3/6] Upload required file(s) for compliance --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..8d46b0b4 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +404: Not Found#ECCN:Open Source From 903e2cb9123f5ac8cd7207f448ecb7c2e97a5b9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Nov 2025 11:46:50 +0000 Subject: [PATCH 4/6] Bump actions/checkout from 5 to 6 Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/check-coverage.yml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/generate-metadata.yml | 2 +- .github/workflows/package.yml | 2 +- .github/workflows/publish-pypi.yml | 2 +- .github/workflows/run-e2-tests.yml | 2 +- .github/workflows/run-tests.yml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check-coverage.yml b/.github/workflows/check-coverage.yml index fe9b244d..f02be570 100644 --- a/.github/workflows/check-coverage.yml +++ b/.github/workflows/check-coverage.yml @@ -18,7 +18,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} uses: actions/setup-python@v6 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 06d92ba4..e2796a6c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v5 + uses: actions/checkout@v6 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/generate-metadata.yml b/.github/workflows/generate-metadata.yml index 7e59af3e..85a9a698 100644 --- a/.github/workflows/generate-metadata.yml +++ b/.github/workflows/generate-metadata.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up Python uses: actions/setup-python@v6 diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index fe851902..7c00bee5 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -60,7 +60,7 @@ jobs: UPLOAD_FILE_NAME: tabcmd steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml index 96400505..bf912399 100644 --- a/.github/workflows/publish-pypi.yml +++ b/.github/workflows/publish-pypi.yml @@ -15,7 +15,7 @@ jobs: name: Build dist files for PyPi runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: fetch-depth: 0 - uses: actions/setup-python@v6 diff --git a/.github/workflows/run-e2-tests.yml b/.github/workflows/run-e2-tests.yml index 0f04cdab..1d7c3e17 100644 --- a/.github/workflows/run-e2-tests.yml +++ b/.github/workflows/run-e2-tests.yml @@ -23,7 +23,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} uses: actions/setup-python@v6 diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index fca98373..b21f2da4 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -20,7 +20,7 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} uses: actions/setup-python@v6 From fc04f0ad90372443b559e7f5ccc08174e88d2e1b Mon Sep 17 00:00:00 2001 From: Jac Date: Thu, 12 Feb 2026 22:49:23 -0800 Subject: [PATCH 5/6] Update CODEOWNERS to correct formatting --- CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 8d46b0b4..00cd7bd1 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1 @@ -404: Not Found#ECCN:Open Source +#ECCN:Open Source From 3e932282a1cdbc41f81fcab95ba117b998470bd7 Mon Sep 17 00:00:00 2001 From: Jac Date: Mon, 13 Apr 2026 13:09:09 -0700 Subject: [PATCH 6/6] Update to not use pkg_resources anywhere (#379) * remove dependency on pkg-resources --------- Co-authored-by: Jim Jagielski Co-authored-by: Jim Jagielski --- bin/license-checker.py | 45 ++++++++++++++++++++++++++---------- pyproject.toml | 30 +++++++++++++----------- tabcmd/execution/localize.py | 8 +------ tabcmd/version.py | 8 +++---- 4 files changed, 53 insertions(+), 38 deletions(-) diff --git a/bin/license-checker.py b/bin/license-checker.py index b9bc00df..9f600ad5 100644 --- a/bin/license-checker.py +++ b/bin/license-checker.py @@ -3,19 +3,19 @@ # Modified version of https://stackoverflow.com/a/44090218 from __future__ import print_function from collections import defaultdict -import pkg_resources +from pathlib import Path +from importlib.metadata import distributions -def get_pkg_license(pkg): +def get_pkg_license(dist): + # Match original behavior: scan text lines for "License:" only try: - lines = pkg.get_metadata_lines('METADATA') - except: - lines = pkg.get_metadata_lines('PKG-INFO') - + lines = dist.read_text('METADATA').splitlines() + except Exception: + lines = (dist.read_text('PKG-INFO') or '').splitlines() for line in lines: if line.startswith('License:'): - return line[9:] + return line[9:].strip() return '(Licence not found)' - exit() def print_table(table): column_index_to_max_width = defaultdict(int) @@ -38,15 +38,36 @@ def print_table(table): print("-" * len(line)) -def get_directory(package_name): - return pkg_resources.working_set.find(pkg_resources.Requirement.parse(package_name)).location +def get_location(dist): + # Try to locate the site-packages directory containing this distribution + files = list(dist.files or []) + # Prefer metadata files to infer the base + meta_file = next((f for f in files if getattr(f, 'name', None) in ('METADATA', 'PKG-INFO')), None) + if meta_file is not None: + abs_path = Path(dist.locate_file(meta_file)) + # .../site-packages/.dist-info/METADATA -> site-packages + return str(abs_path.parent.parent) + if files: + some_file = Path(dist.locate_file(files[0])) + return str(some_file.parent) + return '(Unknown)' def print_packages_and_licenses(): table = [] table.append(['Package', 'License', 'Location']) - for pkg in sorted(pkg_resources.working_set): - table.append([str(pkg).rjust(25)[:25], get_pkg_license(pkg)[:25], pkg.location]) + # Sort by distribution name + dists = [] + for dist in distributions(): + name = (dist.metadata.get('Name') or '').strip() + dists.append((name.lower(), dist)) + for _, dist in sorted(dists, key=lambda t: t[0]): + name = (dist.metadata.get('Name') or 'UNKNOWN').strip() + version = getattr(dist, 'version', '') + pkg_display = f"{name} {version}".strip() + license_value = get_pkg_license(dist)[:25] + location_value = get_location(dist) + table.append([pkg_display.rjust(25)[:25], license_value, location_value]) print_table(table) diff --git a/pyproject.toml b/pyproject.toml index 3bdce842..fcab3277 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [build-system] -requires = ["build", "setuptools>=62", "wheel", "setuptools_scm>=6.2"] +requires = ["build", "setuptools", "setuptools_scm"] build-backend = "setuptools.build_meta" [tool.setuptools_scm] local_scheme = "no-local-version" # require pypi supported versions always @@ -29,7 +29,8 @@ name="tabcmd" dynamic = ["version"] description="A command line client for working with Tableau Server." authors = [{name="Tableau", email="github@tableau.com"}] -license = {file = "LICENSE"} +license = "MIT" +license-files = ["LICENSE"] readme = "res/README.md" requires-python = ">=3.9" # https://devguide.python.org/versions/ classifiers = [ @@ -43,17 +44,9 @@ classifiers = [ ] dependencies = [ "appdirs", - "doit", - "ftfy", - "pyinstaller_versionfile", - "pytest-order", "requests>=2.25,<3.0", - "setuptools_scm", - "types-appdirs", - "types-mock", - "types-requests", - "types-setuptools", - "tableauserverclient==0.37", + "setuptools", + "tableauserverclient==0.40", "urllib3", ] [project.optional-dependencies] @@ -65,9 +58,18 @@ test = [ "pytest-cov", "pytest-order", "pytest-runner", - "requests-mock>=1.0,<2.0"] + "requests-mock>=1.0,<2.0", + "types-appdirs", + "types-mock", + "types-requests", + "types-setuptools", + # these last three are required for the versioning step + "doit", + "pyinstaller_versionfile", + "setuptools_scm" +] localize = ["doit", "ftfy"] -package = ["pyinstaller==5.13", "doit"] +package = ["doit", "pyinstaller==5.13"] [project.urls] repository = "https://github.com/tableau/tabcmd" [project.scripts] diff --git a/tabcmd/execution/localize.py b/tabcmd/execution/localize.py index 1a8d3d2d..cc8baf1c 100644 --- a/tabcmd/execution/localize.py +++ b/tabcmd/execution/localize.py @@ -83,13 +83,7 @@ def _load_language(current_locale, domain, logger): def _get_default_locale(): - # c:\dev\tabcmd\tabcmd\execution\localize.py:85: DeprecationWarning 'locale.getdefaultlocale' is deprecated - # see test_localize for details - import logging - - logging.captureWarnings(True) - current_locale, encoding = locale.getdefaultlocale() - logging.captureWarnings(False) + current_locale = locale.setlocale(locale.LC_CTYPE, None) current_locale = _validate_lang(current_locale) return current_locale diff --git a/tabcmd/version.py b/tabcmd/version.py index e6e2d0f1..f7c977ca 100644 --- a/tabcmd/version.py +++ b/tabcmd/version.py @@ -1,9 +1,7 @@ -# when we drop python 3.8, this could be replaced with this lighter weight option -# from importlib.metadata import version, PackageNotFoundError -from pkg_resources import get_distribution, DistributionNotFound +from importlib.metadata import version as get_version, PackageNotFoundError try: - version = get_distribution("tabcmd").version -except DistributionNotFound: + version = get_version("tabcmd") +except PackageNotFoundError: version = "2.0.0" pass