Fix #9007: Make dbt-core compatible with Python 3.12 (#9612)

This commit is contained in:
Kshitij Aranke
2024-02-26 20:27:47 +00:00
committed by GitHub
parent 4b6c57cede
commit b337e0b726
7 changed files with 48 additions and 12 deletions

View File

@@ -0,0 +1,6 @@
kind: Under the Hood
body: Make dbt-core compatible with Python 3.12
time: 2024-02-21T14:50:58.983559Z
custom:
Author: l1xnan aranke
Issue: "9007"

View File

@@ -74,7 +74,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: ["3.8", "3.9", "3.10", "3.11"] python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12" ]
env: env:
TOXENV: "unit" TOXENV: "unit"
@@ -157,7 +157,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: ["3.8", "3.9", "3.10", "3.11"] python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12" ]
os: [ubuntu-20.04] os: [ubuntu-20.04]
split-group: ${{ fromJson(needs.integration-metadata.outputs.split-groups) }} split-group: ${{ fromJson(needs.integration-metadata.outputs.split-groups) }}
include: ${{ fromJson(needs.integration-metadata.outputs.include) }} include: ${{ fromJson(needs.integration-metadata.outputs.include) }}

View File

@@ -1,12 +1,10 @@
from distutils.util import strtobool
import agate import agate
import daff import daff
import io import io
import json import json
import re import re
from dataclasses import dataclass from dataclasses import dataclass
from dbt.utils import _coerce_decimal from dbt.utils import _coerce_decimal, strtobool
from dbt_common.events.format import pluralize from dbt_common.events.format import pluralize
from dbt_common.dataclass_schema import dbtClassMixin from dbt_common.dataclass_schema import dbtClassMixin
import threading import threading

View File

@@ -369,3 +369,21 @@ def args_to_dict(args):
dict_args[key] = var_args[key] dict_args[key] = var_args[key]
return dict_args return dict_args
# Taken from https://github.com/python/cpython/blob/3.11/Lib/distutils/util.py
# This is a copy of the function from distutils.util, which was removed in Python 3.12.
def strtobool(val: str) -> bool:
"""Convert a string representation of truth to True or False.
True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if
'val' is anything else.
"""
val = val.lower()
if val in ("y", "yes", "t", "true", "on", "1"):
return True
elif val in ("n", "no", "f", "false", "off", "0"):
return False
else:
raise ValueError("invalid truth value %r" % (val,))

View File

@@ -95,6 +95,7 @@ setup(
"Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
], ],
python_requires=">=3.8", python_requires=">=3.8",
) )

View File

@@ -7,3 +7,4 @@ env_files =
testpaths = testpaths =
tests/functional tests/functional
tests/unit tests/unit
pythonpath = core

View File

@@ -101,13 +101,25 @@ class TestPluginManager:
nodes = pm.get_nodes() nodes = pm.get_nodes()
assert len(nodes.models) == 2 assert len(nodes.models) == 2
assert tracking.track_plugin_get_nodes.called_once_with(
{ expected_calls = [
"plugin_name": get_nodes_plugins[0].name, mock.call(
"num_model_nodes": 2, {
"num_model_packages": 1, "plugin_name": get_nodes_plugins[0].name,
} "num_model_nodes": 1,
) "num_model_packages": 1,
}
),
mock.call(
{
"plugin_name": get_nodes_plugins[1].name,
"num_model_nodes": 1,
"num_model_packages": 1,
}
),
]
tracking.track_plugin_get_nodes.assert_has_calls(expected_calls)
def test_get_manifest_artifact(self, get_artifacts_plugins): def test_get_manifest_artifact(self, get_artifacts_plugins):
pm = PluginManager(plugins=get_artifacts_plugins) pm = PluginManager(plugins=get_artifacts_plugins)