Skip to content

Commit 192ccc5

Browse files
authored
feat: enable mypy session for ndb (#16691)
This PR enables the mypy session in noxfile.py for ndb and aligns it with the GAPIC generator template.
1 parent 399d90b commit 192ccc5

21 files changed

+291
-142
lines changed

packages/google-cloud-ndb/google/cloud/ndb/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
from google.cloud.ndb import version
2525

26-
__version__ = version.__version__
26+
__version__: str = version.__version__
2727

2828
from google.cloud.ndb.client import Client
2929
from google.cloud.ndb.context import AutoBatcher

packages/google-cloud-ndb/google/cloud/ndb/_cache.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -117,18 +117,18 @@ def done_callback(self, cache_call):
117117
"""
118118
exception = cache_call.exception()
119119
if exception:
120-
for future in self.futures:
120+
for future in self.futures: # type: ignore[attr-defined]
121121
future.set_exception(exception)
122122

123123
else:
124-
for future in self.futures:
124+
for future in self.futures: # type: ignore[attr-defined]
125125
future.set_result(None)
126126

127127
def make_call(self):
128128
"""Make the actual call to the global cache. To be overridden."""
129129
raise NotImplementedError
130130

131-
def future_info(self, key):
131+
def future_info(self, key, value=None):
132132
"""Generate info string for Future. To be overridden."""
133133
raise NotImplementedError
134134

@@ -279,7 +279,7 @@ def make_call(self):
279279
"""Call :method:`GlobalCache.get`."""
280280
return _global_cache().get(self.keys)
281281

282-
def future_info(self, key):
282+
def future_info(self, key, value=None):
283283
"""Generate info string for Future."""
284284
return "GlobalCache.get({})".format(key)
285285

@@ -373,7 +373,7 @@ def make_call(self):
373373
"""Call :method:`GlobalCache.set`."""
374374
return _global_cache().set(self.todo, expires=self.expires)
375375

376-
def future_info(self, key, value):
376+
def future_info(self, key, value=None):
377377
"""Generate info string for Future."""
378378
return "GlobalCache.set({}, {})".format(key, value)
379379

@@ -436,7 +436,7 @@ def make_call(self):
436436
"""Call :method:`GlobalCache.set`."""
437437
return _global_cache().set_if_not_exists(self.todo, expires=self.expires)
438438

439-
def future_info(self, key, value):
439+
def future_info(self, key, value=None):
440440
"""Generate info string for Future."""
441441
return "GlobalCache.set_if_not_exists({}, {})".format(key, value)
442442

@@ -482,7 +482,7 @@ def make_call(self):
482482
"""Call :method:`GlobalCache.delete`."""
483483
return _global_cache().delete(self.keys)
484484

485-
def future_info(self, key):
485+
def future_info(self, key, value=None):
486486
"""Generate info string for Future."""
487487
return "GlobalCache.delete({})".format(key)
488488

@@ -513,7 +513,7 @@ def make_call(self):
513513
"""Call :method:`GlobalCache.watch`."""
514514
return _global_cache().watch(self.todo)
515515

516-
def future_info(self, key, value):
516+
def future_info(self, key, value=None):
517517
"""Generate info string for Future."""
518518
return "GlobalCache.watch({}, {})".format(key, value)
519519

@@ -543,7 +543,7 @@ def make_call(self):
543543
"""Call :method:`GlobalCache.unwatch`."""
544544
return _global_cache().unwatch(self.keys)
545545

546-
def future_info(self, key):
546+
def future_info(self, key, value=None):
547547
"""Generate info string for Future."""
548548
return "GlobalCache.unwatch({})".format(key)
549549

@@ -580,7 +580,7 @@ def make_call(self):
580580
"""Call :method:`GlobalCache.compare_and_swap`."""
581581
return _global_cache().compare_and_swap(self.todo, expires=self.expires)
582582

583-
def future_info(self, key, value):
583+
def future_info(self, key, value=None):
584584
"""Generate info string for Future."""
585585
return "GlobalCache.compare_and_swap({}, {})".format(key, value)
586586

@@ -627,8 +627,7 @@ def global_lock_for_write(key):
627627
tasklets.Future: Eventual result will be a lock value to be used later with
628628
:func:`global_unlock`.
629629
"""
630-
lock = "." + str(uuid.uuid4())
631-
lock = lock.encode("ascii")
630+
lock = ("." + str(uuid.uuid4())).encode("ascii")
632631
utils.logging_debug(log, "lock for write: {}", lock)
633632

634633
def new_value(old_value):

packages/google-cloud-ndb/google/cloud/ndb/_datastore_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ def lookup(key, options):
168168
if use_global_cache and not key_locked:
169169
if entity_pb is not _NOT_FOUND:
170170
expires = context._global_cache_timeout(key, options)
171-
serialized = entity_pb._pb.SerializeToString()
171+
serialized = entity_pb._pb.SerializeToString() # type: ignore[attr-defined]
172172
yield _cache.global_compare_and_swap(
173173
cache_key, serialized, expires=expires
174174
)

packages/google-cloud-ndb/google/cloud/ndb/_datastore_query.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,10 @@ def has_next_async(self):
342342
if self._batch is None:
343343
yield self._next_batch() # First time
344344

345+
if self._batch is None:
346+
raise TypeError("self._batch cannot be None")
347+
if self._index is None:
348+
raise TypeError("self._index cannot be None")
345349
if self._index < len(self._batch):
346350
raise tasklets.Return(True)
347351

@@ -359,7 +363,9 @@ def probably_has_next(self):
359363
return (
360364
self._batch is None # Haven't even started yet
361365
or self._has_next_batch # There's another batch to fetch
362-
or self._index < len(self._batch) # Not done with current batch
366+
or (
367+
self._index is not None and self._index < len(self._batch)
368+
) # Not done with current batch
363369
)
364370

365371
@tasklets.tasklet
@@ -421,6 +427,10 @@ def next(self):
421427
self._cursor_before = None
422428
raise StopIteration
423429

430+
if self._batch is None:
431+
raise TypeError("self._batch cannot be None")
432+
if self._index is None:
433+
raise TypeError("self._index cannot be None")
424434
# Won't block
425435
next_result = self._batch[self._index]
426436
self._index += 1
@@ -446,7 +456,7 @@ def _peek(self):
446456
batch = self._batch
447457
index = self._index
448458

449-
if batch and index < len(batch):
459+
if batch and index is not None and index < len(batch):
450460
return batch[index]
451461

452462
raise KeyError(index)
@@ -554,6 +564,8 @@ def next(self):
554564
if not self.has_next():
555565
raise StopIteration()
556566

567+
if self._next_result is None:
568+
raise TypeError("self._next_result cannot be None")
557569
# Won't block
558570
next_result = self._next_result
559571
self._next_result = None
@@ -718,6 +730,8 @@ def next(self):
718730
if not self.has_next():
719731
raise StopIteration()
720732

733+
if self._next_result is None:
734+
raise TypeError("self._next_result cannot be None")
721735
# Won't block
722736
next_result = self._next_result
723737
self._next_result = None
@@ -949,7 +963,7 @@ def _query_to_protobuf(query):
949963
filter_pb = ancestor_filter_pb
950964

951965
elif isinstance(filter_pb, query_pb2.CompositeFilter):
952-
filter_pb.filters._pb.add(property_filter=ancestor_filter_pb._pb)
966+
filter_pb.filters._pb.add(property_filter=ancestor_filter_pb._pb) # type: ignore[attr-defined]
953967

954968
else:
955969
filter_pb = query_pb2.CompositeFilter(

packages/google-cloud-ndb/google/cloud/ndb/_eventloop.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,15 @@ class EventLoop(object):
116116
"""
117117

118118
def __init__(self):
119-
self.current = collections.deque()
120-
self.idlers = collections.deque()
119+
self._init()
120+
121+
def _init(self):
122+
self.current: collections.deque = collections.deque()
123+
self.idlers: collections.deque = collections.deque()
121124
self.inactive = 0
122125
self.queue = []
123126
self.rpcs = {}
124-
self.rpc_results = queue.Queue()
127+
self.rpc_results: queue.Queue = queue.Queue()
125128

126129
def clear(self):
127130
"""Remove all pending events without running any."""
@@ -139,7 +142,7 @@ def clear(self):
139142
utils.logging_debug(log, " queue = {}", queue)
140143
if rpcs:
141144
utils.logging_debug(log, " rpcs = {}", rpcs)
142-
self.__init__()
145+
self._init()
143146
current.clear()
144147
idlers.clear()
145148
queue[:] = []

packages/google-cloud-ndb/google/cloud/ndb/_gql.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
import re
33
import time
4+
from typing import Any
45

56
from google.cloud.ndb import context as context_module
67
from google.cloud.ndb import exceptions
@@ -408,7 +409,8 @@ def _AddProcessedParameterFilter(self, identifier, condition, operator, paramete
408409
if identifier.lower() == "ancestor":
409410
self._has_ancestor = True
410411
filter_rule = (self._ANCESTOR, "is")
411-
assert condition.lower() == "is"
412+
if condition.lower() != "is":
413+
raise ValueError("condition must be 'is'")
412414

413415
if operator == "list" and condition.lower() not in ["in", "not_in"]:
414416
self._Error("Only IN can process a list of values, given '%s'" % condition)
@@ -485,7 +487,7 @@ def _Literal(self):
485487
a string, integer, floating point value, boolean or None).
486488
"""
487489

488-
literal = None
490+
literal: Any = None
489491

490492
if self._next_symbol < len(self._symbols):
491493
try:
@@ -770,27 +772,38 @@ def _raise_cast_error(message):
770772

771773

772774
def _time_function(values):
775+
t_tuple: tuple[int, ...]
773776
if len(values) == 1:
774777
value = values[0]
775778
if isinstance(value, str):
776779
try:
777-
time_tuple = time.strptime(value, "%H:%M:%S")
780+
parsed_time = time.strptime(value, "%H:%M:%S")
778781
except ValueError as error:
779782
_raise_cast_error(
780783
"Error during time conversion, {}, {}".format(error, values)
781784
)
782-
time_tuple = time_tuple[3:]
783-
time_tuple = time_tuple[0:3]
785+
t_tuple = (
786+
parsed_time.tm_hour,
787+
parsed_time.tm_min,
788+
parsed_time.tm_sec,
789+
)
784790
elif isinstance(value, int):
785-
time_tuple = (value,)
791+
t_tuple = (value,)
786792
else:
787793
_raise_cast_error("Invalid argument for time(), {}".format(value))
788794
elif len(values) < 4:
789-
time_tuple = tuple(values)
795+
t_tuple = tuple(values)
790796
else:
791797
_raise_cast_error("Too many arguments for time(), {}".format(values))
792798
try:
793-
return datetime.time(*time_tuple)
799+
if len(t_tuple) == 1:
800+
return datetime.time(t_tuple[0])
801+
elif len(t_tuple) == 2:
802+
return datetime.time(t_tuple[0], t_tuple[1])
803+
elif len(t_tuple) == 3:
804+
return datetime.time(t_tuple[0], t_tuple[1], t_tuple[2])
805+
else:
806+
_raise_cast_error("Invalid arguments for time()")
794807
except ValueError as error:
795808
_raise_cast_error("Error during time conversion, {}, {}".format(error, values))
796809

packages/google-cloud-ndb/google/cloud/ndb/_legacy_entity_pb.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -389,11 +389,10 @@ class Property(ProtocolBuffer.ProtocolMessage):
389389
24: "EMPTY_LIST",
390390
}
391391

392+
@classmethod
392393
def Meaning_Name(cls, x):
393394
return cls._Meaning_NAMES.get(x, "")
394395

395-
Meaning_Name = classmethod(Meaning_Name)
396-
397396
has_meaning_ = 0
398397
meaning_ = 0
399398
has_meaning_uri_ = 0
@@ -526,7 +525,7 @@ class Path_Element(ProtocolBuffer.ProtocolMessage):
526525
def type(self):
527526
# Force legacy byte-str to be a str.
528527
if type(self.type_) is bytes:
529-
return self.type_.decode()
528+
return self.type_.decode() # type: ignore[attr-defined]
530529
return self.type_
531530

532531
def set_type(self, x):

packages/google-cloud-ndb/google/cloud/ndb/_legacy_protocol_buffer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ def MergePartialFromString(self, s):
3232
d = Decoder(a, 0, len(a))
3333
self.TryMerge(d)
3434

35+
def TryMerge(self, d):
36+
raise NotImplementedError
37+
3538

3639
class Decoder:
3740
NUMERIC = 0

packages/google-cloud-ndb/google/cloud/ndb/_options.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,16 @@
1919
import logging
2020

2121
from google.cloud.ndb import exceptions
22+
from typing import Any
2223

2324
log = logging.getLogger(__name__)
2425

2526

2627
class Options(object):
28+
max_memcache_items: Any
29+
force_writes: Any
30+
propagation: Any
31+
2732
__slots__ = (
2833
# Supported
2934
"retries",

packages/google-cloud-ndb/google/cloud/ndb/_remote.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def __init__(self, future, info):
4141
self.future = future
4242
self.info = info
4343
self.start_time = time.time()
44-
self.elapsed_time = 0
44+
self.elapsed_time = 0.0
4545

4646
def record_time(future):
4747
self.elapsed_time = time.time() - self.start_time

0 commit comments

Comments
 (0)