Skip to content

Commit

Permalink
fix some issues
Browse files Browse the repository at this point in the history
  • Loading branch information
wuan committed Sep 22, 2024
1 parent 3f0eb56 commit d0a1cf4
Show file tree
Hide file tree
Showing 18 changed files with 89 additions and 74 deletions.
2 changes: 1 addition & 1 deletion blitzortung/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class Error(Exception):
from . import db
from . import geom
from . import util
from . import types
from . import base

INJECTOR = injector.Injector(
[config.ConfigModule(), db.DbModule()])
Expand Down
File renamed without changes.
23 changes: 13 additions & 10 deletions blitzortung/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,21 +74,14 @@ def get(self, cached_object_creator, *args, **kwargs):
current_time = int(time.time())

if cache_key in self.cache:
count = 0
if self.size is not None:
count = self.keys[cache_key]
del self.keys[cache_key]
entry = self.cache[cache_key]
if entry.is_valid(current_time):
if self.size is not None:
self.keys[cache_key] = count + 1
self.track_usage(cache_key)
self.total_hit_count += 1
return entry.get_payload()
elif self.size is not None:
if len(self.keys) >= self.size:
expired_key = next(iter(self.keys))
del self.keys[expired_key]
del self.cache[expired_key]
elif self.size is not None and len(self.keys) >= self.size:
self.remove_oldest_entry()

expires = current_time + self.__ttl_seconds
payload = cached_object_creator(*args, **kwargs)
Expand All @@ -99,6 +92,16 @@ def get(self, cached_object_creator, *args, **kwargs):

return entry.get_payload()

def remove_oldest_entry(self):
expired_key = next(iter(self.keys))
del self.keys[expired_key]
del self.cache[expired_key]

def track_usage(self, cache_key):
count = self.keys[cache_key]
del self.keys[cache_key]
self.keys[cache_key] = count + 1

def clear(self):
self.total_count = 0
self.total_hit_count = 0
Expand Down
52 changes: 26 additions & 26 deletions blitzortung/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,21 @@
import datetime
import math

from . import types
from . import base
from .geom import GridElement


class Timestamp(types.EqualityAndHash):
class Timestamp(base.EqualityAndHash):
timestamp_string_minimal_fractional_seconds_length = 20
timestamp_string_microseconds_length = 26

__slots__ = ['datetime', 'nanosecond']

def __init__(self, date_time=datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc), nanosecond=0):
if type(date_time) == str:
def __init__(self, date_time=datetime.datetime.now(datetime.timezone.utc), nanosecond=0):
if isinstance(date_time, str):
date_time, date_time_nanosecond = Timestamp.from_timestamp(date_time)
nanosecond += date_time_nanosecond
elif type(date_time) == int:
elif isinstance(date_time, int):
date_time, date_time_nanosecond = Timestamp.from_nanoseconds(date_time)
nanosecond += date_time_nanosecond

Expand Down Expand Up @@ -73,7 +73,7 @@ def from_nanoseconds(total_nanoseconds):
return datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc) + \
datetime.timedelta(seconds=total_seconds,
microseconds=residual_microseconds), \
residual_nanoseconds
residual_nanoseconds

@property
def year(self):
Expand Down Expand Up @@ -107,7 +107,7 @@ def microsecond(self):
def tzinfo(self):
return self.datetime.tzinfo

epoch = datetime.datetime.utcfromtimestamp(0).replace(tzinfo=datetime.timezone.utc)
epoch = datetime.datetime.fromtimestamp(0, datetime.timezone.utc)

@property
def value(self):
Expand All @@ -122,48 +122,48 @@ def __ne__(self, other):
return self.datetime != other.datetime or self.nanosecond != other.nanosecond

def __lt__(self, other):
if type(other) == datetime.datetime:
if isinstance(other, datetime.datetime):
return self.datetime < other
else:
return self.datetime < other.datetime or (
self.datetime == other.datetime and self.nanosecond < other.nanosecond)

def __le__(self, other):
if type(other) == datetime.datetime:
if isinstance(other, datetime.datetime):
return self.datetime <= other
else:
return self.datetime < other.datetime or (
self.datetime == other.datetime and self.nanosecond <= other.nanosecond)

def __gt__(self, other):
if type(other) == datetime.datetime:
if isinstance(other, datetime.datetime):
return self.datetime > other
else:
return self.datetime > other.datetime or (
self.datetime == other.datetime and self.nanosecond > other.nanosecond)

def __ge__(self, other):
if type(other) == datetime.datetime:
if isinstance(other, datetime.datetime):
return self.datetime >= other
else:
return self.datetime > other.datetime or (
self.datetime == other.datetime and self.nanosecond >= other.nanosecond)

def __add__(self, other):
if type(other) == Timedelta:
if isinstance(other, Timedelta):
return Timestamp(self.datetime + other.timedelta, self.nanosecond + other.nanodelta)
elif type(other) == datetime.timedelta:
elif isinstance(other, datetime.timedelta):
return Timestamp(self.datetime + other, self.nanosecond)
elif type(other) == int:
elif isinstance(other, int):
return Timestamp(self.datetime, self.nanosecond + other)
return NotImplemented

def __sub__(self, other):
if type(other) == Timestamp:
if isinstance(other, Timestamp):
return Timedelta(self.datetime - other.datetime, self.nanosecond - other.nanosecond)
elif type(other) == datetime.timedelta:
elif isinstance(other, datetime.timedelta):
return Timestamp(self.datetime - other, self.nanosecond)
elif type(other) == int:
elif isinstance(other, int):
return Timestamp(self.datetime, self.nanosecond - other)
return NotImplemented

Expand All @@ -185,7 +185,7 @@ def __repr__(self):
NaT = Timestamp(None)


class Timedelta(types.EqualityAndHash):
class Timedelta(base.EqualityAndHash):
def __init__(self, timedelta=datetime.timedelta(), nanodelta=0):
if nanodelta < 0 or nanodelta > 999:
microdelta = nanodelta // 1000
Expand All @@ -206,7 +206,7 @@ def __repr__(self):
return "Timedelta({}, {})".format(self.timedelta, self.nanodelta)


class Event(types.Point):
class Event(base.Point):
time_format = '%Y-%m-%d %H:%M:%S'
time_format_fractional_seconds = time_format + '.%f'

Expand Down Expand Up @@ -234,10 +234,10 @@ def has_same_location(self, other):

@property
def is_valid(self):
return (self.x != 0.0 or self.y != 0.0) \
and -180 <= self.x <= 180 \
and -90 < self.y < 90 \
and self.has_valid_timestamp
return (not math.isclose(self.x, 0.0, rel_tol=1e-09, abs_tol=1e-09) or not math.isclose(self.y, 0.0, rel_tol=1e-09)) \
and -180 <= self.x <= 180 \
and -90 < self.y < 90 \
and self.has_valid_timestamp

@property
def has_valid_timestamp(self):
Expand All @@ -257,12 +257,12 @@ def __str__(self):
timestamp_string = "NaT"

return "%s %.4f %.4f" \
% (timestamp_string, self.x, self.y)
% (timestamp_string, self.x, self.y)

@property
def uuid(self):
return "%s-%05.0f-%05.0f" \
% (str(self.timestamp().value), self.x * 100, self.y * 100)
% (str(self.timestamp().value), self.x * 100, self.y * 100)


class RawWaveformEvent(Event):
Expand Down Expand Up @@ -314,7 +314,7 @@ def __ne__(self, other):
@property
def is_valid(self):
return super().is_valid \
and self.number > 0
and self.number > 0

@property
def is_offline(self):
Expand Down
2 changes: 1 addition & 1 deletion blitzortung/dataimport/strike.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def __init__(self, data_transport: HttpFileTransport, data_url: BlitzortungDataP

def get_strikes_since(self, latest_strike=None, region=1):
latest_strike = latest_strike if latest_strike else \
(datetime.datetime.utcnow() - datetime.timedelta(hours=6)).replace(tzinfo=datetime.timezone.utc)
datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(hours=6)
logger.debug("import strikes since %s" % latest_strike)

for url_path in self.url_path_generator.get_paths(latest_strike):
Expand Down
3 changes: 1 addition & 2 deletions blitzortung/service/general.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@


def create_time_interval(minute_length, minute_offset):
end_time = datetime.datetime.utcnow()
end_time = end_time.replace(tzinfo=datetime.timezone.utc)
end_time = datetime.datetime.now(datetime.timezone.utc)
end_time = end_time.replace(microsecond=0)
end_time += datetime.timedelta(minutes=minute_offset)
start_time = end_time - datetime.timedelta(minutes=minute_length)
Expand Down
3 changes: 1 addition & 2 deletions blitzortung/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,7 @@ def time_intervals(start_time, duration, end_time=None):
"""
current_time = round_time(start_time, duration)
if not end_time:
end_time = datetime.datetime.utcnow()
end_time = end_time.replace(tzinfo=datetime.timezone.utc)
end_time = datetime.datetime.now(datetime.timezone.utc)
end_time = round_time(end_time, duration)

while current_time <= end_time:
Expand Down
4 changes: 2 additions & 2 deletions tests/db/test_db_mapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def setUp(self):
self.strike_builder = Mock(name="strike_builder", spec=blitzortung.builder.Strike)
self.strike_mapper = blitzortung.db.mapper.Strike(self.strike_builder)

self.timestamp = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
self.timestamp = datetime.datetime.now(datetime.timezone.utc)
self.result = {
'id': 12,
'timestamp': self.timestamp,
Expand Down Expand Up @@ -92,7 +92,7 @@ def setUp(self):
self.station_builder = Mock(name="station_builder", spec=blitzortung.builder.Station)
self.strike_mapper = blitzortung.db.mapper.Station(self.station_builder)

self.timestamp = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc)
self.timestamp = datetime.datetime.now(datetime.timezone.utc)
self.result = {
'number': 31,
'user': '<user>',
Expand Down
2 changes: 1 addition & 1 deletion tests/db/test_db_query.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def test_exception_when_start_is_not_integer(self):

def test_exception_when_end_is_not_integer(self):
with pytest.raises(ValueError):
blitzortung.db.query.TimeInterval(datetime.datetime.utcnow(), "asdf")
blitzortung.db.query.TimeInterval(datetime.datetime.now(datetime.timezone.utc), "asdf")


class QueryTest(TestCase):
Expand Down
4 changes: 2 additions & 2 deletions tests/db/test_db_query_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
class StrikeTest(object):
def setUp(self):
self.query_builder = blitzortung.db.query_builder.Strike()
self.end_time = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc, second=0, microsecond=0)
self.end_time = datetime.datetime.now(datetime.timezone.utc).replace(second=0, microsecond=0)
self.start_time = self.end_time - datetime.timedelta(minutes=10)
self.srid = 1234

Expand Down Expand Up @@ -97,7 +97,7 @@ def test_grid_query_with_count_threshold(self):
class StrikeClusterTest(object):
def setUp(self):
self.query_builder = blitzortung.db.query_builder.StrikeCluster()
self.end_time = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc, second=0, microsecond=0)
self.end_time = datetime.datetime.now(datetime.timezone.utc).replace(second=0, microsecond=0)
self.interval_duration = datetime.timedelta(minutes=10)
self.srid = "<srid>"

Expand Down
8 changes: 4 additions & 4 deletions tests/test_types.py → tests/test_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@

import math

import blitzortung.types
import blitzortung.base


class PointTest(object):
def setUp(self):
self.point1 = blitzortung.types.Point(11, 49)
self.point2 = blitzortung.types.Point(12, 49)
self.point3 = blitzortung.types.Point(11, 50)
self.point1 = blitzortung.base.Point(11, 49)
self.point2 = blitzortung.base.Point(12, 49)
self.point3 = blitzortung.base.Point(11, 50)
self.radians_factor = math.pi / 180

def test_get_coordinate_components(self):
Expand Down
6 changes: 3 additions & 3 deletions tests/test_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -151,15 +151,15 @@ def test_set_id(self):

self.builder.set_x(0.0)
self.builder.set_y(0.0)
self.builder.set_timestamp(datetime.datetime.utcnow())
self.builder.set_timestamp(datetime.datetime.now(datetime.timezone.utc))
self.builder.set_amplitude(1.0)
self.builder.set_lateral_error(5.0)
self.builder.set_station_count(10)

assert_that(self.builder.build().id).is_equal_to(1234)

def test_set_timestamp(self):
timestamp = datetime.datetime.utcnow()
timestamp = datetime.datetime.now(datetime.timezone.utc)
self.builder.set_timestamp(timestamp)

self.builder.set_x(0.0)
Expand Down Expand Up @@ -270,7 +270,7 @@ def test_build_station_offline(self):
self.builder.set_id(364)
self.builder.set_number(123)

end = datetime.datetime.utcnow() - datetime.timedelta(hours=1)
end = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(hours=1)
begin = end - datetime.timedelta(hours=1)
self.builder.set_begin(begin)
self.builder.set_end(end)
Expand Down
15 changes: 15 additions & 0 deletions tests/test_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,3 +194,18 @@ def test_auto_expiry(self):
time.sleep(1)
_ = self.cache.get(CachedObject, name="bar")
assert_that(self.cache.get_size()).is_equal_to(1)

def test_bench_object_cache_get(benchmark):
cache = ObjectCache()
benchmark.pedantic(cache.get, args=(CachedObject, "foo"), rounds=1000, iterations=100)

def test_bench_object_cache_with_size_get(benchmark):
cache = ObjectCache(size=2)
benchmark.pedantic(cache.get, args=(CachedObject, "foo"), rounds=1000, iterations=100)

def test_bench_object_cache_generate_cache_key(benchmark):
cache = ObjectCache()
benchmark.pedantic(cache.generate_cache_key, args=(CachedObject, ("foo", "bar"), {"baz": "asdf", "qux": "quux"}), rounds=1000, iterations=100)

print("hit count", cache.total_hit_count)

2 changes: 1 addition & 1 deletion tests/test_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ def test_get_status(self):

class TestGridData(object):
def setup_method(self):
self.reference_time = datetime.datetime.utcnow()
self.reference_time = datetime.datetime.now(datetime.timezone.utc)
self.grid = blitzortung.geom.Grid(-5, 4, -3, 2, 0.5, 1.25)
self.grid_data = blitzortung.data.GridData(self.grid)

Expand Down
2 changes: 1 addition & 1 deletion tests/test_data_benchmark.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from blitzortung.data import Timestamp, Event
from blitzortung.geom import Envelope
from blitzortung.types import Point
from blitzortung.base import Point


@pytest.fixture
Expand Down
Loading

0 comments on commit d0a1cf4

Please sign in to comment.