diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index fc45c872e..7091b2aa2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,4 +4,4 @@ # in the repository, i.e. bar/baz will match /bar/baz and /foo/bar/baz. # The default owners for everything that is not overridden by specific patterns below. -* @microsoft/debugpy-CodeReviewers +* @microsoft/debugpy-CodeReviewers @microsoft/pyrx-admins diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e25104d5a..89197fa08 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -114,7 +114,7 @@ In order to update the source, you would: You might need to regenerate the Cython modules after any changes. This can be done by: -- Install Python latest (3.12 as of this writing) +- Install Python latest (3.14 as of this writing) - pip install cython 'django>=1.9' 'setuptools>=0.9' 'wheel>0.21' twine - On a windows machine: - set FORCE_PYDEVD_VC_VARS=C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build\vcvars64.bat diff --git a/azure-pipelines/pipelines.yaml b/azure-pipelines/pipelines.yaml index 196126510..f041cf236 100644 --- a/azure-pipelines/pipelines.yaml +++ b/azure-pipelines/pipelines.yaml @@ -135,6 +135,8 @@ stages: python.version: 3.12 py313: python.version: 3.13 + py314: + python.version: 3.14.0-rc.2 steps: @@ -178,6 +180,8 @@ stages: python.version: 3.12 py313: python.version: 3.13 + py314: + python.version: 3.14.0-rc.2 steps: @@ -224,6 +228,8 @@ stages: python.version: 3.12 py313: python.version: 3.13 + py314: + python.version: 3.14.0-rc.2 steps: diff --git a/azure-pipelines/templates/run_tests.yml b/azure-pipelines/templates/run_tests.yml index 2efca2012..475b6ff91 100644 --- a/azure-pipelines/templates/run_tests.yml +++ b/azure-pipelines/templates/run_tests.yml @@ -3,11 +3,19 @@ steps: displayName: Setup Python packages - pwsh: | - $toxEnv = '$(python.version)' - if (-not $toxEnv.startsWith('pypy')) { - $toxEnv = 'py' + $toxEnv.Replace('.', '') + $raw = '$(python.version)' + if ($raw.StartsWith('pypy')) { + # For PyPy keep original pattern stripping dots after first two numeric components if needed later. + $toxEnv = 'py' + ($raw -replace '^pypy(\d+)\.(\d+).*$','$1$2') } - echo 'tox environment: $toxEnv' + else { + # Extract major.minor even from prerelease like 3.14.0-rc.2 -> 3.14 + $mm = [regex]::Match($raw,'^(\d+)\.(\d+)') + if (-not $mm.Success) { throw "Unable to parse python.version '$raw'" } + $toxEnv = 'py' + $mm.Groups[1].Value + $mm.Groups[2].Value + } + Write-Host "python.version raw: $raw" + Write-Host "Derived tox environment: $toxEnv" python -m tox -e $toxEnv -- --junitxml=$(Build.ArtifactStagingDirectory)/tests.xml --debugpy-log-dir=$(Build.ArtifactStagingDirectory)/logs tests displayName: Run tests using tox env: diff --git a/azure-pipelines/templates/use_python.yml b/azure-pipelines/templates/use_python.yml index 78afa7558..ecb69656c 100644 --- a/azure-pipelines/templates/use_python.yml +++ b/azure-pipelines/templates/use_python.yml @@ -3,4 +3,5 @@ steps: inputs: versionSpec: $(python.version) architecture: $(architecture) + allowUnstable: true displayName: Use Python $(python.version) $(architecture) diff --git a/setup.py b/setup.py index 2c4b9b8eb..e01f675ae 100644 --- a/setup.py +++ b/setup.py @@ -78,14 +78,12 @@ def finalize_options(self): "Compiling pydevd Cython extension modules (set SKIP_CYTHON_BUILD=1 to omit)." ) try: - subprocess.check_call( - [ - sys.executable, - os.path.join(PYDEVD_ROOT, "setup_pydevd_cython.py"), - "build_ext", - "--inplace", - ] - ) + subprocess.check_call([ + sys.executable, + os.path.join(PYDEVD_ROOT, "setup_pydevd_cython.py"), + "build_ext", + "--inplace", + ]) except subprocess.SubprocessError: # pydevd Cython extensions are optional performance enhancements, and debugpy is # usable without them. Thus, we want to ignore build errors here by default, so @@ -170,6 +168,8 @@ def tail_is(*suffixes): "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Software Development :: Debuggers", "Operating System :: Microsoft :: Windows", "Operating System :: MacOS", @@ -186,7 +186,7 @@ def tail_is(*suffixes): "debugpy._vendored", ], package_data={ - "debugpy": ["ThirdPartyNotices.txt"], + "debugpy": ["ThirdPartyNotices.txt", "py.typed"], "debugpy._vendored": [ # pydevd extensions must be built before this list can be computed properly, # so it is populated in the overridden build_py.finalize_options(). @@ -202,5 +202,5 @@ def tail_is(*suffixes): "debugpy-adapter = debugpy.adapter.__main__:main", ], }, - **extras + **extras, ) diff --git a/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py b/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py index c0cf39542..0f35b8caf 100644 --- a/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py +++ b/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_filtering.py @@ -155,7 +155,8 @@ def _get_default_library_roots(cls): # Make sure we always get at least the standard library location (based on the `os` and # `threading` modules -- it's a bit weird that it may be different on the ci, but it happens). - roots.append(os.path.dirname(os.__file__)) + if hasattr(os, "__file__"): + roots.append(os.path.dirname(os.__file__)) roots.append(os.path.dirname(threading.__file__)) if IS_PYPY: # On PyPy 3.6 (7.3.1) it wrongly says that sysconfig.get_path('stdlib') is diff --git a/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp b/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp index 712684cf3..15c05537c 100644 --- a/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp +++ b/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/common/py_version.hpp @@ -24,6 +24,7 @@ enum PythonVersion { PythonVersion_311 = 0x030B, PythonVersion_312 = 0x030C, PythonVersion_313 = 0x030D, + PythonVersion_314 = 0x030E, }; @@ -78,6 +79,9 @@ static PythonVersion GetPythonVersion(void *module) { if(version[3] == '3'){ return PythonVersion_313; } + if(version[3] == '4'){ + return PythonVersion_314; + } } return PythonVersion_Unknown; // we don't care about 3.1 anymore... diff --git a/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh b/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh index 37204f50a..97cab104b 100755 --- a/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh +++ b/src/debugpy/_vendored/pydevd/pydevd_attach_to_process/linux_and_mac/compile_linux.sh @@ -8,4 +8,4 @@ case $ARCH in esac SRC="$(dirname "$0")/.." -g++ -std=c++11 -shared -fPIC -O2 -D_FORTIFY_SOURCE=2 -nostartfiles --stack-protector-strong $SRC/linux_and_mac/attach.cpp -o $SRC/attach_linux_$SUFFIX.so +g++ -std=c++11 -shared -fPIC -O2 -D_FORTIFY_SOURCE=2 -nostartfiles -fstack-protector-strong $SRC/linux_and_mac/attach.cpp -o $SRC/attach_linux_$SUFFIX.so diff --git a/src/debugpy/_vendored/pydevd/pydevd_file_utils.py b/src/debugpy/_vendored/pydevd/pydevd_file_utils.py index 390f903ce..7ca383444 100644 --- a/src/debugpy/_vendored/pydevd/pydevd_file_utils.py +++ b/src/debugpy/_vendored/pydevd/pydevd_file_utils.py @@ -88,7 +88,14 @@ def _get_library_dir(): break if library_dir is None or not os_path_exists(library_dir): - library_dir = os.path.dirname(os.__file__) + if hasattr(os, "__file__"): + # "os" is a frozen import an thus "os.__file__" is not always set. + # See https://github.com/python/cpython/pull/28656 + library_dir = os.path.dirname(os.__file__) + else: + # "threading" is not a frozen import an thus "threading.__file__" is always set. + import threading + library_dir = os.path.dirname(threading.__file__) return library_dir diff --git a/src/debugpy/_vendored/pydevd/pydevd_tracing.py b/src/debugpy/_vendored/pydevd/pydevd_tracing.py index 41135d7dc..09b3dc44b 100644 --- a/src/debugpy/_vendored/pydevd/pydevd_tracing.py +++ b/src/debugpy/_vendored/pydevd/pydevd_tracing.py @@ -250,7 +250,9 @@ def get_python_helper_lib_filename(): else: suffix = suffix_32 - if IS_WINDOWS or IS_MAC: # just the extension changes + if IS_WINDOWS: # just the extension changes + prefix = "attach_" + elif IS_MAC: prefix = "attach" suffix = "" elif IS_LINUX: # diff --git a/src/debugpy/py.typed b/src/debugpy/py.typed new file mode 100644 index 000000000..e69de29bb diff --git a/tox.ini b/tox.ini index 6a0d21eba..2a5ea04a2 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{38,39,310,311,312,313}{,-cov} +envlist = py{38,39,310,311,312,313,314}{,-cov} [testenv] deps = -rtests/requirements.txt @@ -10,5 +10,5 @@ commands_pre = python build_attach_binaries.py commands = py{38,39}-!cov: python -m pytest {posargs} py{38,39}-cov: python -m pytest --cov --cov-append --cov-config=.coveragerc {posargs} - py{310,311,312,313}-!cov: python -Xfrozen_modules=off -m pytest {posargs} - py{310,311,312,313}-cov: python -Xfrozen_modules=off -m pytest --cov --cov-append --cov-config=.coveragerc {posargs} + py{310,311,312,313,314}-!cov: python -Xfrozen_modules=off -m pytest {posargs} + py{310,311,312,313,314}-cov: python -Xfrozen_modules=off -m pytest --cov --cov-append --cov-config=.coveragerc {posargs}