Skip to content

Commit

Permalink
fix several deprecation warnings
Browse files Browse the repository at this point in the history
adding -Werror flag to pytest configuration
so we can flush all of those with the test we have
so we won't have user of the driver running into those
and get them fixed address as soon as we support new
python versions
  • Loading branch information
fruch committed Dec 26, 2024
1 parent c3c8b89 commit 787f97c
Show file tree
Hide file tree
Showing 30 changed files with 117 additions and 58 deletions.
2 changes: 1 addition & 1 deletion cassandra/cqlengine/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ def setup(
:param int consistency: The global default :class:`~.ConsistencyLevel` - default is the same as :attr:`.Session.default_consistency_level`
:param bool lazy_connect: True if should not connect until first use
:param bool retry_connect: True if we should retry to connect even if there was a connection failure initially
:param \*\*kwargs: Pass-through keyword arguments for :class:`cassandra.cluster.Cluster`
:param kwargs: Pass-through keyword arguments for :class:`cassandra.cluster.Cluster`
"""

from cassandra.cqlengine import models
Expand Down
8 changes: 4 additions & 4 deletions cassandra/cqlengine/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,8 @@ def add_callback(self, fn, *args, **kwargs):
:param fn: Callable object
:type fn: callable
:param \*args: Positional arguments to be passed to the callback at the time of execution
:param \*\*kwargs: Named arguments to be passed to the callback at the time of execution
:param args: Positional arguments to be passed to the callback at the time of execution
:param kwargs: Named arguments to be passed to the callback at the time of execution
"""
if not callable(fn):
raise ValueError("Value for argument 'fn' is {0} and is not a callable object.".format(type(fn)))
Expand Down Expand Up @@ -276,8 +276,8 @@ class ContextQuery(object):
A Context manager to allow a Model to switch context easily. Presently, the context only
specifies a keyspace for model IO.
:param \*args: One or more models. A model should be a class type, not an instance.
:param \*\*kwargs: (optional) Context parameters: can be *keyspace* or *connection*
:param args: One or more models. A model should be a class type, not an instance.
:param kwargs: (optional) Context parameters: can be *keyspace* or *connection*
For example:
Expand Down
4 changes: 2 additions & 2 deletions cassandra/datastax/cloud/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

_HAS_SSL = True
try:
from ssl import SSLContext, PROTOCOL_TLS, CERT_REQUIRED
from ssl import SSLContext, PROTOCOL_TLS_CLIENT, CERT_REQUIRED
except:
_HAS_SSL = False

Expand Down Expand Up @@ -169,7 +169,7 @@ def parse_metadata_info(config, http_data):


def _ssl_context_from_cert(ca_cert_location, cert_location, key_location):
ssl_context = SSLContext(PROTOCOL_TLS)
ssl_context = SSLContext(PROTOCOL_TLS_CLIENT)
ssl_context.load_verify_locations(ca_cert_location)
ssl_context.verify_mode = CERT_REQUIRED
ssl_context.load_cert_chain(certfile=cert_location, keyfile=key_location)
Expand Down
2 changes: 1 addition & 1 deletion cassandra/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
from cassandra import DriverException

DATETIME_EPOC = datetime.datetime(1970, 1, 1)
UTC_DATETIME_EPOC = datetime.datetime.utcfromtimestamp(0)
UTC_DATETIME_EPOC = datetime.datetime.fromtimestamp(0, tz=datetime.timezone.utc)

_nan = float('nan')

Expand Down
17 changes: 17 additions & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,20 @@ log_format = %(asctime)s.%(msecs)03d %(levelname)s [%(module)s:%(lineno)s]: %(me
log_level = DEBUG
log_date_format = %Y-%m-%d %H:%M:%S
xfail_strict=true

filterwarnings =
error
ignore::pytest.PytestCollectionWarning
ignore::ResourceWarning
ignore:distutils Version classes are deprecated:DeprecationWarning:eventlet.support.greenlets
ignore:X509Extension support in pyOpenSSL is deprecated.:DeprecationWarning
ignore:CRL support in pyOpenSSL is deprecated:DeprecationWarning
ignore:sign\(\) is deprecated:DeprecationWarning
ignore:verify\(\) is deprecated:DeprecationWarning
ignore:pkg_resources is deprecated as an API:DeprecationWarning:gevent.events
ignore:.*pkg_resources.declare_namespace.*:DeprecationWarning
ignore:"@coroutine" decorator is deprecated since Python 3.8:DeprecationWarning:asynctest.*
ignore:The asyncore module is deprecated and will be removed in Python 3.12.*:DeprecationWarning
ignore:CSR support in pyOpenSSL is deprecated.*:DeprecationWarning
ignore:get_elliptic_curves is deprecated:DeprecationWarning
ignore:get_elliptic_curve is deprecated:DeprecationWarning
2 changes: 1 addition & 1 deletion tests/integration/cqlengine/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ def wrapped_function(*args, **kwargs):
# DeMonkey Patch our code
cassandra.cqlengine.connection.execute = original_function
# Check to see if we have a pre-existing test case to work from.
if len(args) is 0:
if len(args) == 0:
test_case = unittest.TestCase("__init__")
else:
test_case = args[0]
Expand Down
10 changes: 5 additions & 5 deletions tests/integration/cqlengine/columns/test_counter_column.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ def tearDownClass(cls):

def test_updates(self):
""" Tests that counter updates work as intended """
instance = TestCounterModel.create()
instance = TestCounterModel()
instance.counter += 5
instance.save()
instance.update()

actual = TestCounterModel.get(partition=instance.partition)
assert actual.counter == 5
Expand All @@ -103,7 +103,7 @@ def test_update_from_none(self):
""" Tests that updating from None uses a create statement """
instance = TestCounterModel()
instance.counter += 1
instance.save()
instance.update()

new = TestCounterModel.get(partition=instance.partition)
assert new.counter == 1
Expand All @@ -115,15 +115,15 @@ def test_new_instance_defaults_to_zero(self):

def test_save_after_no_update(self):
expected_value = 15
instance = TestCounterModel.create()
instance = TestCounterModel()
instance.update(counter=expected_value)

# read back
instance = TestCounterModel.get(partition=instance.partition)
self.assertEqual(instance.counter, expected_value)

# save after doing nothing
instance.save()
instance.update()
self.assertEqual(instance.counter, expected_value)

# make sure there was no increment
Expand Down
4 changes: 3 additions & 1 deletion tests/integration/cqlengine/connections/test_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
# limitations under the License.

import unittest
import pytest


from cassandra import ConsistencyLevel
Expand Down Expand Up @@ -130,7 +131,8 @@ class ConnectionModel(Model):
key = columns.Integer(primary_key=True)
some_data = columns.Text()


@pytest.mark.filterwarnings("ignore:Setting the consistency level at the session level will be removed")
@pytest.mark.filterwarnings("ignore:Legacy execution parameters will be removed")
class ConnectionInitTest(unittest.TestCase):
def test_default_connection_uses_legacy(self):
connection.default()
Expand Down
2 changes: 2 additions & 0 deletions tests/integration/cqlengine/management/test_management.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import unittest
import pytest

import mock
import logging
Expand Down Expand Up @@ -382,6 +383,7 @@ class TestIndexSetModel(Model):
mixed_tuple = columns.Tuple(columns.Text, columns.Integer, columns.Text, index=True)


@pytest.mark.filterwarnings("ignore:Model __table_name_case_sensitive__ will be removed")
class IndexTests(BaseCassEngTestCase):

def setUp(self):
Expand Down
2 changes: 2 additions & 0 deletions tests/integration/cqlengine/model/test_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import unittest
import pytest

from mock import patch

Expand Down Expand Up @@ -125,6 +126,7 @@ class TestModel(Model):
# .. but we can still get the bare CF name
self.assertEqual(TestModel.column_family_name(include_keyspace=False), "test_model")

@pytest.mark.filterwarnings("ignore:__table_name_case_sensitive__ will be removed")
def test_column_family_case_sensitive(self):
"""
Test to ensure case sensitivity is honored when __table_name_case_sensitive__ flag is set
Expand Down
4 changes: 2 additions & 2 deletions tests/integration/cqlengine/query/test_queryoperators.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,6 @@ def test_named_table_pk_token_function(self):
query = named.all().limit(1)
first_page = list(query)
last = first_page[-1]
self.assertTrue(len(first_page) is 1)
self.assertTrue(len(first_page) == 1)
next_page = list(query.filter(pk__token__gt=functions.Token(last.key)))
self.assertTrue(len(next_page) is 1)
self.assertTrue(len(next_page) == 1)
7 changes: 4 additions & 3 deletions tests/integration/standard/test_cluster.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

# Copyright DataStax, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -150,7 +151,7 @@ def test_raise_error_on_control_connection_timeout(self):
get_node(1).pause()
cluster = TestCluster(contact_points=['127.0.0.1'], connect_timeout=1)

with self.assertRaisesRegex(NoHostAvailable, "OperationTimedOut\('errors=Timed out creating connection \(1 seconds\)"):
with self.assertRaisesRegex(NoHostAvailable, r"OperationTimedOut\('errors=Timed out creating connection \(1 seconds\)"):
cluster.connect()
cluster.shutdown()

Expand Down Expand Up @@ -1566,7 +1567,7 @@ def test_deprecation_warnings_legacy_parameters(self):
@test_category logs
"""
with warnings.catch_warnings(record=True) as w:
with warnings.catch_warnings(record=True, action='once') as w:
TestCluster(load_balancing_policy=RoundRobinPolicy())
logging.info(w)
self.assertGreaterEqual(len(w), 1)
Expand All @@ -1585,7 +1586,7 @@ def test_deprecation_warnings_meta_refreshed(self):
@test_category logs
"""
with warnings.catch_warnings(record=True) as w:
with warnings.catch_warnings(record=True, action='once') as w:
cluster = TestCluster()
cluster.set_meta_refresh_enabled(True)
logging.info(w)
Expand Down
4 changes: 2 additions & 2 deletions tests/integration/standard/test_connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ def wait_for_connections(self, host, cluster):
while(retry < 300):
retry += 1
connections = self.fetch_connections(host, cluster)
if len(connections) is not 0:
if len(connections) != 0:
return connections
time.sleep(.1)
self.fail("No new connections found")
Expand All @@ -192,7 +192,7 @@ def wait_for_no_connections(self, host, cluster):
while(retry < 100):
retry += 1
connections = self.fetch_connections(host, cluster)
if len(connections) is 0:
if len(connections) == 0:
return
time.sleep(.5)
self.fail("Connections never cleared")
Expand Down
6 changes: 3 additions & 3 deletions tests/integration/standard/test_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -1677,7 +1677,7 @@ def test_function_no_parameters(self):

with self.VerifiedFunction(self, **kwargs) as vf:
fn_meta = self.keyspace_function_meta[vf.signature]
self.assertRegex(fn_meta.as_cql_query(), "CREATE FUNCTION.*%s\(\) .*" % kwargs['name'])
self.assertRegex(fn_meta.as_cql_query(), r"CREATE FUNCTION.*%s\(\) .*" % kwargs['name'])

def test_functions_follow_keyspace_alter(self):
"""
Expand Down Expand Up @@ -1725,12 +1725,12 @@ def test_function_cql_called_on_null(self):
kwargs['called_on_null_input'] = True
with self.VerifiedFunction(self, **kwargs) as vf:
fn_meta = self.keyspace_function_meta[vf.signature]
self.assertRegex(fn_meta.as_cql_query(), "CREATE FUNCTION.*\) CALLED ON NULL INPUT RETURNS .*")
self.assertRegex(fn_meta.as_cql_query(), r"CREATE FUNCTION.*\) CALLED ON NULL INPUT RETURNS .*")

kwargs['called_on_null_input'] = False
with self.VerifiedFunction(self, **kwargs) as vf:
fn_meta = self.keyspace_function_meta[vf.signature]
self.assertRegex(fn_meta.as_cql_query(), "CREATE FUNCTION.*\) RETURNS NULL ON NULL INPUT RETURNS .*")
self.assertRegex(fn_meta.as_cql_query(), r"CREATE FUNCTION.*\) RETURNS NULL ON NULL INPUT RETURNS .*")


@requires_java_udf
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/standard/test_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ def test_client_ip_in_trace(self):
client_ip = trace.client

# Ip address should be in the local_host range
pat = re.compile("127.0.0.\d{1,3}")
pat = re.compile(r"127.0.0.\d{1,3}")

# Ensure that ip is set
self.assertIsNotNone(client_ip, "Client IP was not set in trace with C* >= 2.2")
Expand Down
5 changes: 4 additions & 1 deletion tests/integration/standard/test_scylla_cloud.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import warnings
import os.path
from unittest import TestCase
from ccmlib.utils.ssl_utils import generate_ssl_stores
Expand All @@ -11,7 +12,9 @@
from cassandra.io.libevreactor import LibevConnection
supported_connection_classes = [LibevConnection, TwistedConnection]
try:
from cassandra.io.asyncorereactor import AsyncoreConnection
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=DeprecationWarning, message="The asyncore module is deprecated")
from cassandra.io.asyncorereactor import AsyncoreConnection
supported_connection_classes += [AsyncoreConnection]
except ImportError:
pass
Expand Down
1 change: 1 addition & 0 deletions tests/unit/advanced/test_graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ def test_with_graph_protocol(self):

def test_init_unknown_kwargs(self):
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
GraphOptions(unknown_param=42)
self.assertEqual(len(w), 1)
self.assertRegex(str(w[0].message), r"^Unknown keyword.*GraphOptions.*")
Expand Down
2 changes: 2 additions & 0 deletions tests/unit/advanced/test_insights.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@


import unittest
import pytest

import logging
from mock import sentinel
Expand Down Expand Up @@ -103,6 +104,7 @@ def superclass_sentinel_serializer(obj):
class TestConfigAsDict(unittest.TestCase):

# graph/query.py
@pytest.mark.filterwarnings("ignore:Unknown keyword argument received for GraphOptions:UserWarning")
def test_graph_options(self):
self.maxDiff = None

Expand Down
2 changes: 2 additions & 0 deletions tests/unit/advanced/test_policies.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
import unittest
import pytest

from mock import Mock

Expand All @@ -29,6 +30,7 @@ def get_host(self, addr):
return self.hosts.get(addr)


@pytest.mark.filterwarnings("ignore:DSELoadBalancingPolicy will be removed:DeprecationWarning")
class DSELoadBalancingPolicyTest(unittest.TestCase):

def test_no_target(self):
Expand Down
2 changes: 2 additions & 0 deletions tests/unit/cython/bytesio_testhelper.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.

# cython: language_level=3

from cassandra.bytesio cimport BytesIOReader

def test_read1(assert_equal, assert_raises):
Expand Down
2 changes: 2 additions & 0 deletions tests/unit/cython/types_testhelper.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.

# cython: language_level=3

import calendar
import datetime
import time
Expand Down
2 changes: 2 additions & 0 deletions tests/unit/cython/utils_testhelper.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.

# cython: language_level=3

import datetime

from cassandra.cython_utils cimport datetime_from_timestamp
Expand Down
9 changes: 6 additions & 3 deletions tests/unit/io/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ def submit_and_wait_for_completion(unit_test, create_timer, start, end, incremen
pending_callbacks.append(callback)

# wait for all the callbacks associated with the timers to be invoked
while len(pending_callbacks) is not 0:
while len(pending_callbacks) != 0:
for callback in pending_callbacks:
if callback.was_invoked():
pending_callbacks.remove(callback)
Expand Down Expand Up @@ -232,7 +232,7 @@ def make_error_body(self, code, msg):
def make_msg(self, header, body=bytes()):
return header + uint32_pack(len(body)) + body

def test_successful_connection(self):
def _test_successful_connection(self):
c = self.make_connection()

# let it write the OptionsMessage
Expand All @@ -254,6 +254,9 @@ def test_successful_connection(self):
self.assertTrue(c.connected_event.is_set())
return c

def test_successful_connection(self):
self._test_successful_connection()

def test_eagain_on_buffer_size(self):
self._check_error_recovery_on_buffer_size(errno.EAGAIN)

Expand All @@ -271,7 +274,7 @@ def test_sslwantwrite_on_buffer_size(self):
error_class=ssl.SSLError)

def _check_error_recovery_on_buffer_size(self, error_code, error_class=socket_error):
c = self.test_successful_connection()
c = self._test_successful_connection()

# current data, used by the recv side_effect
message_chunks = None
Expand Down
Loading

0 comments on commit 787f97c

Please sign in to comment.