mirror of
https://github.com/craigerl/aprsd.git
synced 2024-11-25 09:28:38 -05:00
Compare commits
1 Commits
a66554b0a1
...
4313fb8940
Author | SHA1 | Date | |
---|---|---|---|
|
4313fb8940 |
1299
ChangeLog.md
1299
ChangeLog.md
File diff suppressed because it is too large
Load Diff
@ -12,7 +12,6 @@ from aprsd import cli_helper, packets
|
|||||||
from aprsd import conf # noqa : F401
|
from aprsd import conf # noqa : F401
|
||||||
from aprsd.client import client_factory
|
from aprsd.client import client_factory
|
||||||
from aprsd.main import cli
|
from aprsd.main import cli
|
||||||
import aprsd.packets # noqa : F401
|
|
||||||
from aprsd.packets import collector
|
from aprsd.packets import collector
|
||||||
from aprsd.threads import tx
|
from aprsd.threads import tx
|
||||||
|
|
||||||
@ -95,6 +94,10 @@ def send_message(
|
|||||||
else:
|
else:
|
||||||
LOG.info(f"L'{aprs_login}' To'{tocallsign}' C'{command}'")
|
LOG.info(f"L'{aprs_login}' To'{tocallsign}' C'{command}'")
|
||||||
|
|
||||||
|
packets.PacketList()
|
||||||
|
packets.WatchList()
|
||||||
|
packets.SeenList()
|
||||||
|
|
||||||
got_ack = False
|
got_ack = False
|
||||||
got_response = False
|
got_response = False
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ from oslo_config import cfg
|
|||||||
import aprsd
|
import aprsd
|
||||||
from aprsd import cli_helper
|
from aprsd import cli_helper
|
||||||
from aprsd import main as aprsd_main
|
from aprsd import main as aprsd_main
|
||||||
from aprsd import plugin, threads, utils
|
from aprsd import packets, plugin, threads, utils
|
||||||
from aprsd.client import client_factory
|
from aprsd.client import client_factory
|
||||||
from aprsd.main import cli
|
from aprsd.main import cli
|
||||||
from aprsd.packets import collector as packet_collector
|
from aprsd.packets import collector as packet_collector
|
||||||
@ -87,24 +87,29 @@ def server(ctx, flush):
|
|||||||
LOG.error("APRS client is not properly configured in config file.")
|
LOG.error("APRS client is not properly configured in config file.")
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
if not CONF.enable_seen_list:
|
|
||||||
# just deregister the class from the packet collector
|
|
||||||
packet_collector.PacketCollector().unregister(seen_list.SeenList)
|
|
||||||
|
|
||||||
# Now load the msgTrack from disk if any
|
# Now load the msgTrack from disk if any
|
||||||
|
packets.PacketList()
|
||||||
if flush:
|
if flush:
|
||||||
LOG.debug("Flushing All packet tracking objects.")
|
LOG.debug("Deleting saved MsgTrack.")
|
||||||
packet_collector.PacketCollector().flush()
|
packets.PacketTrack().flush()
|
||||||
|
packets.WatchList().flush()
|
||||||
|
packets.SeenList().flush()
|
||||||
|
packets.PacketList().flush()
|
||||||
else:
|
else:
|
||||||
# Try and load saved MsgTrack list
|
# Try and load saved MsgTrack list
|
||||||
LOG.debug("Loading saved packet tracking data.")
|
LOG.debug("Loading saved MsgTrack object.")
|
||||||
packet_collector.PacketCollector().load()
|
packets.PacketTrack().load()
|
||||||
|
packets.WatchList().load()
|
||||||
# Now start all the main processing threads.
|
packets.SeenList().load()
|
||||||
|
packets.PacketList().load()
|
||||||
|
|
||||||
keepalive = keep_alive.KeepAliveThread()
|
keepalive = keep_alive.KeepAliveThread()
|
||||||
keepalive.start()
|
keepalive.start()
|
||||||
|
|
||||||
|
if not CONF.enable_seen_list:
|
||||||
|
# just deregister the class from the packet collector
|
||||||
|
packet_collector.PacketCollector().unregister(seen_list.SeenList)
|
||||||
|
|
||||||
stats_store_thread = stats_thread.APRSDStatsStoreThread()
|
stats_store_thread = stats_thread.APRSDStatsStoreThread()
|
||||||
stats_store_thread.start()
|
stats_store_thread.start()
|
||||||
|
|
||||||
|
@ -62,6 +62,8 @@ def signal_handler(sig, frame):
|
|||||||
threads.APRSDThreadList().stop_all()
|
threads.APRSDThreadList().stop_all()
|
||||||
if "subprocess" not in str(frame):
|
if "subprocess" not in str(frame):
|
||||||
time.sleep(1.5)
|
time.sleep(1.5)
|
||||||
|
# packets.WatchList().save()
|
||||||
|
# packets.SeenList().save()
|
||||||
stats.stats_collector.collect()
|
stats.stats_collector.collect()
|
||||||
LOG.info("Telling flask to bail.")
|
LOG.info("Telling flask to bail.")
|
||||||
signal.signal(signal.SIGTERM, sys.exit(0))
|
signal.signal(signal.SIGTERM, sys.exit(0))
|
||||||
@ -645,6 +647,11 @@ def webchat(ctx, flush, port):
|
|||||||
LOG.error("APRS client is not properly configured in config file.")
|
LOG.error("APRS client is not properly configured in config file.")
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
|
packets.PacketList()
|
||||||
|
packets.PacketTrack()
|
||||||
|
packets.WatchList()
|
||||||
|
packets.SeenList()
|
||||||
|
|
||||||
keepalive = keep_alive.KeepAliveThread()
|
keepalive = keep_alive.KeepAliveThread()
|
||||||
LOG.info("Start KeepAliveThread")
|
LOG.info("Start KeepAliveThread")
|
||||||
keepalive.start()
|
keepalive.start()
|
||||||
|
4
aprsd/messaging.py
Normal file
4
aprsd/messaging.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# What to return from a plugin if we have processed the message
|
||||||
|
# and it's ok, but don't send a usage string back
|
||||||
|
|
||||||
|
# REMOVE THIS FILE
|
@ -1,4 +1,3 @@
|
|||||||
from aprsd.packets import collector
|
|
||||||
from aprsd.packets.core import ( # noqa: F401
|
from aprsd.packets.core import ( # noqa: F401
|
||||||
AckPacket, BeaconPacket, BulletinPacket, GPSPacket, MessagePacket,
|
AckPacket, BeaconPacket, BulletinPacket, GPSPacket, MessagePacket,
|
||||||
MicEPacket, ObjectPacket, Packet, RejectPacket, StatusPacket,
|
MicEPacket, ObjectPacket, Packet, RejectPacket, StatusPacket,
|
||||||
@ -10,11 +9,4 @@ from aprsd.packets.tracker import PacketTrack # noqa: F401
|
|||||||
from aprsd.packets.watch_list import WatchList # noqa: F401
|
from aprsd.packets.watch_list import WatchList # noqa: F401
|
||||||
|
|
||||||
|
|
||||||
# Register all the packet tracking objects.
|
|
||||||
collector.PacketCollector().register(PacketList)
|
|
||||||
collector.PacketCollector().register(SeenList)
|
|
||||||
collector.PacketCollector().register(PacketTrack)
|
|
||||||
collector.PacketCollector().register(WatchList)
|
|
||||||
|
|
||||||
|
|
||||||
NULL_MESSAGE = -1
|
NULL_MESSAGE = -1
|
||||||
|
@ -20,14 +20,6 @@ class PacketMonitor(Protocol):
|
|||||||
"""When we send a packet out the network."""
|
"""When we send a packet out the network."""
|
||||||
...
|
...
|
||||||
|
|
||||||
def flush(self) -> None:
|
|
||||||
"""Flush out any data."""
|
|
||||||
...
|
|
||||||
|
|
||||||
def load(self) -> None:
|
|
||||||
"""Load any data."""
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
@singleton
|
@singleton
|
||||||
class PacketCollector:
|
class PacketCollector:
|
||||||
@ -35,45 +27,30 @@ class PacketCollector:
|
|||||||
self.monitors: list[Callable] = []
|
self.monitors: list[Callable] = []
|
||||||
|
|
||||||
def register(self, monitor: Callable) -> None:
|
def register(self, monitor: Callable) -> None:
|
||||||
if not isinstance(monitor, PacketMonitor):
|
|
||||||
raise TypeError(f"Monitor {monitor} is not a PacketMonitor")
|
|
||||||
self.monitors.append(monitor)
|
self.monitors.append(monitor)
|
||||||
|
|
||||||
def unregister(self, monitor: Callable) -> None:
|
def unregister(self, monitor: Callable) -> None:
|
||||||
if not isinstance(monitor, PacketMonitor):
|
|
||||||
raise TypeError(f"Monitor {monitor} is not a PacketMonitor")
|
|
||||||
self.monitors.remove(monitor)
|
self.monitors.remove(monitor)
|
||||||
|
|
||||||
def rx(self, packet: type[core.Packet]) -> None:
|
def rx(self, packet: type[core.Packet]) -> None:
|
||||||
for name in self.monitors:
|
for name in self.monitors:
|
||||||
cls = name()
|
cls = name()
|
||||||
|
if isinstance(cls, PacketMonitor):
|
||||||
try:
|
try:
|
||||||
cls.rx(packet)
|
cls.rx(packet)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.error(f"Error in monitor {name} (rx): {e}")
|
LOG.error(f"Error in monitor {name} (rx): {e}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
raise TypeError(f"Monitor {name} is not a PacketMonitor")
|
||||||
|
|
||||||
def tx(self, packet: type[core.Packet]) -> None:
|
def tx(self, packet: type[core.Packet]) -> None:
|
||||||
for name in self.monitors:
|
for name in self.monitors:
|
||||||
cls = name()
|
cls = name()
|
||||||
|
if isinstance(cls, PacketMonitor):
|
||||||
try:
|
try:
|
||||||
cls.tx(packet)
|
cls.tx(packet)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.error(f"Error in monitor {name} (tx): {e}")
|
LOG.error(f"Error in monitor {name} (tx): {e}")
|
||||||
|
else:
|
||||||
def flush(self):
|
raise TypeError(f"Monitor {name} is not a PacketMonitor")
|
||||||
"""Call flush on the objects. This is used to flush out any data."""
|
|
||||||
for name in self.monitors:
|
|
||||||
cls = name()
|
|
||||||
try:
|
|
||||||
cls.flush()
|
|
||||||
except Exception as e:
|
|
||||||
LOG.error(f"Error in monitor {name} (flush): {e}")
|
|
||||||
|
|
||||||
def load(self):
|
|
||||||
"""Call load on the objects. This is used to load any data."""
|
|
||||||
for name in self.monitors:
|
|
||||||
cls = name()
|
|
||||||
try:
|
|
||||||
cls.load()
|
|
||||||
except Exception as e:
|
|
||||||
LOG.error(f"Error in monitor {name} (load): {e}")
|
|
||||||
|
@ -101,6 +101,7 @@ def log(packet, tx: Optional[bool] = False, header: Optional[bool] = True) -> No
|
|||||||
if header:
|
if header:
|
||||||
if tx:
|
if tx:
|
||||||
via_color = "red"
|
via_color = "red"
|
||||||
|
# arrow = f"<{via_color}>-></{via_color}>"
|
||||||
arrow = f"<{via_color}>\u2192</{via_color}>"
|
arrow = f"<{via_color}>\u2192</{via_color}>"
|
||||||
logit.append(
|
logit.append(
|
||||||
f"<red>TX\u2191</red> "
|
f"<red>TX\u2191</red> "
|
||||||
@ -110,6 +111,7 @@ def log(packet, tx: Optional[bool] = False, header: Optional[bool] = True) -> No
|
|||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
via_color = "fg #1AA730"
|
via_color = "fg #1AA730"
|
||||||
|
#arrow = f"<{via_color}>-></{via_color}>"
|
||||||
arrow = f"<{via_color}>\u2192</{via_color}>"
|
arrow = f"<{via_color}>\u2192</{via_color}>"
|
||||||
f"<{via_color}><-</{via_color}>"
|
f"<{via_color}><-</{via_color}>"
|
||||||
logit.append(
|
logit.append(
|
||||||
|
@ -3,7 +3,7 @@ import logging
|
|||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
from aprsd.packets import core
|
from aprsd.packets import collector, core
|
||||||
from aprsd.utils import objectstore
|
from aprsd.utils import objectstore
|
||||||
|
|
||||||
|
|
||||||
@ -108,3 +108,9 @@ class PacketList(objectstore.ObjectStoreMixin):
|
|||||||
"packets": pkts,
|
"packets": pkts,
|
||||||
}
|
}
|
||||||
return stats
|
return stats
|
||||||
|
|
||||||
|
|
||||||
|
# Now register the PacketList with the collector
|
||||||
|
# every packet we RX and TX goes through the collector
|
||||||
|
# for processing for whatever reason is needed.
|
||||||
|
collector.PacketCollector().register(PacketList)
|
||||||
|
@ -3,7 +3,7 @@ import logging
|
|||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
from aprsd.packets import core
|
from aprsd.packets import collector, core
|
||||||
from aprsd.utils import objectstore
|
from aprsd.utils import objectstore
|
||||||
|
|
||||||
|
|
||||||
@ -47,3 +47,8 @@ class SeenList(objectstore.ObjectStoreMixin):
|
|||||||
|
|
||||||
def tx(self, packet: type[core.Packet]):
|
def tx(self, packet: type[core.Packet]):
|
||||||
"""We don't care about TX packets."""
|
"""We don't care about TX packets."""
|
||||||
|
|
||||||
|
|
||||||
|
# Register with the packet collector so we can process the packet
|
||||||
|
# when we get it off the client (network)
|
||||||
|
collector.PacketCollector().register(SeenList)
|
||||||
|
@ -3,7 +3,7 @@ import logging
|
|||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
from aprsd.packets import core
|
from aprsd.packets import collector, core
|
||||||
from aprsd.utils import objectstore
|
from aprsd.utils import objectstore
|
||||||
|
|
||||||
|
|
||||||
@ -101,3 +101,9 @@ class PacketTrack(objectstore.ObjectStoreMixin):
|
|||||||
del self.data[key]
|
del self.data[key]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
# Now register the PacketList with the collector
|
||||||
|
# every packet we RX and TX goes through the collector
|
||||||
|
# for processing for whatever reason is needed.
|
||||||
|
collector.PacketCollector().register(PacketTrack)
|
||||||
|
@ -4,7 +4,7 @@ import logging
|
|||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
from aprsd import utils
|
from aprsd import utils
|
||||||
from aprsd.packets import core
|
from aprsd.packets import collector, core
|
||||||
from aprsd.utils import objectstore
|
from aprsd.utils import objectstore
|
||||||
|
|
||||||
|
|
||||||
@ -117,3 +117,6 @@ class WatchList(objectstore.ObjectStoreMixin):
|
|||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
collector.PacketCollector().register(WatchList)
|
||||||
|
@ -25,13 +25,14 @@ class Collector:
|
|||||||
stats = {}
|
stats = {}
|
||||||
for name in self.producers:
|
for name in self.producers:
|
||||||
cls = name()
|
cls = name()
|
||||||
|
if isinstance(cls, StatsProducer):
|
||||||
try:
|
try:
|
||||||
stats[cls.__class__.__name__] = cls.stats(serializable=serializable).copy()
|
stats[cls.__class__.__name__] = cls.stats(serializable=serializable).copy()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
LOG.error(f"Error in producer {name} (stats): {e}")
|
LOG.error(f"Error in producer {name} (stats): {e}")
|
||||||
|
else:
|
||||||
|
raise TypeError(f"{cls} is not an instance of StatsProducer")
|
||||||
return stats
|
return stats
|
||||||
|
|
||||||
def register_producer(self, producer_name: Callable):
|
def register_producer(self, producer_name: Callable):
|
||||||
if not isinstance(producer_name, StatsProducer):
|
|
||||||
raise TypeError(f"Producer {producer_name} is not a StatsProducer")
|
|
||||||
self.producers.append(producer_name)
|
self.producers.append(producer_name)
|
||||||
|
@ -175,18 +175,18 @@ def load_entry_points(group):
|
|||||||
|
|
||||||
|
|
||||||
def calculate_initial_compass_bearing(start, end):
|
def calculate_initial_compass_bearing(start, end):
|
||||||
if (type(start) != tuple) or (type(end) != tuple): # noqa: E721
|
if (type(start) != tuple) or (type(end) != tuple):
|
||||||
raise TypeError("Only tuples are supported as arguments")
|
raise TypeError("Only tuples are supported as arguments")
|
||||||
|
|
||||||
lat1 = math.radians(float(start[0]))
|
lat1 = math.radians(float(start[0]))
|
||||||
lat2 = math.radians(float(end[0]))
|
lat2 = math.radians(float(end[0]))
|
||||||
|
|
||||||
diff_long = math.radians(float(end[1]) - float(start[1]))
|
diffLong = math.radians(float(end[1]) - float(start[1]))
|
||||||
|
|
||||||
x = math.sin(diff_long) * math.cos(lat2)
|
x = math.sin(diffLong) * math.cos(lat2)
|
||||||
y = math.cos(lat1) * math.sin(lat2) - (
|
y = math.cos(lat1) * math.sin(lat2) - (
|
||||||
math.sin(lat1)
|
math.sin(lat1)
|
||||||
* math.cos(lat2) * math.cos(diff_long)
|
* math.cos(lat2) * math.cos(diffLong)
|
||||||
)
|
)
|
||||||
|
|
||||||
initial_bearing = math.atan2(x, y)
|
initial_bearing = math.atan2(x, y)
|
||||||
@ -202,17 +202,17 @@ def calculate_initial_compass_bearing(start, end):
|
|||||||
|
|
||||||
def degrees_to_cardinal(bearing, full_string=False):
|
def degrees_to_cardinal(bearing, full_string=False):
|
||||||
if full_string:
|
if full_string:
|
||||||
directions = [
|
DIRECTIONS = [
|
||||||
"North", "North-Northeast", "Northeast", "East-Northeast", "East", "East-Southeast",
|
"North", "North-Northeast", "Northeast", "East-Northeast", "East", "East-Southeast",
|
||||||
"Southeast", "South-Southeast", "South", "South-Southwest", "Southwest", "West-Southwest",
|
"Southeast", "South-Southeast", "South", "South-Southwest", "Southwest", "West-Southwest",
|
||||||
"West", "West-Northwest", "Northwest", "North-Northwest", "North",
|
"West", "West-Northwest", "Northwest", "North-Northwest", "North",
|
||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
directions = [
|
DIRECTIONS = [
|
||||||
"N", "NNE", "NE", "ENE", "E", "ESE",
|
"N", "NNE", "NE", "ENE", "E", "ESE",
|
||||||
"SE", "SSE", "S", "SSW", "SW", "WSW",
|
"SE", "SSE", "S", "SSW", "SW", "WSW",
|
||||||
"W", "WNW", "NW", "NNW", "N",
|
"W", "WNW", "NW", "NNW", "N",
|
||||||
]
|
]
|
||||||
|
|
||||||
cardinal = directions[round(bearing / 22.5)]
|
cardinal = DIRECTIONS[round(bearing / 22.5)]
|
||||||
return cardinal
|
return cardinal
|
||||||
|
@ -8,23 +8,23 @@ add-trailing-comma==3.1.0 # via gray
|
|||||||
alabaster==1.0.0 # via sphinx
|
alabaster==1.0.0 # via sphinx
|
||||||
autoflake==1.5.3 # via gray
|
autoflake==1.5.3 # via gray
|
||||||
babel==2.16.0 # via sphinx
|
babel==2.16.0 # via sphinx
|
||||||
black==24.10.0 # via gray
|
black==24.8.0 # via gray
|
||||||
build==1.2.2.post1 # via -r requirements-dev.in, check-manifest, pip-tools
|
build==1.2.2 # via -r requirements-dev.in, check-manifest, pip-tools
|
||||||
cachetools==5.5.0 # via tox
|
cachetools==5.5.0 # via tox
|
||||||
certifi==2024.8.30 # via requests
|
certifi==2024.8.30 # via requests
|
||||||
cfgv==3.4.0 # via pre-commit
|
cfgv==3.4.0 # via pre-commit
|
||||||
chardet==5.2.0 # via tox
|
chardet==5.2.0 # via tox
|
||||||
charset-normalizer==3.4.0 # via requests
|
charset-normalizer==3.3.2 # via requests
|
||||||
check-manifest==0.50 # via -r requirements-dev.in
|
check-manifest==0.49 # via -r requirements-dev.in
|
||||||
click==8.1.7 # via black, fixit, moreorless, pip-tools
|
click==8.1.7 # via black, fixit, moreorless, pip-tools
|
||||||
colorama==0.4.6 # via tox
|
colorama==0.4.6 # via tox
|
||||||
commonmark==0.9.1 # via rich
|
commonmark==0.9.1 # via rich
|
||||||
configargparse==1.7 # via gray
|
configargparse==1.7 # via gray
|
||||||
coverage[toml]==7.6.3 # via pytest-cov
|
coverage[toml]==7.6.1 # via pytest-cov
|
||||||
distlib==0.3.9 # via virtualenv
|
distlib==0.3.8 # via virtualenv
|
||||||
docutils==0.21.2 # via m2r, sphinx
|
docutils==0.21.2 # via m2r, sphinx
|
||||||
exceptiongroup==1.2.2 # via pytest
|
exceptiongroup==1.2.2 # via pytest
|
||||||
filelock==3.16.1 # via tox, virtualenv
|
filelock==3.16.0 # via tox, virtualenv
|
||||||
fixit==2.1.0 # via gray
|
fixit==2.1.0 # via gray
|
||||||
flake8==7.1.1 # via -r requirements-dev.in, pep8-naming
|
flake8==7.1.1 # via -r requirements-dev.in, pep8-naming
|
||||||
gray==0.15.0 # via -r requirements-dev.in
|
gray==0.15.0 # via -r requirements-dev.in
|
||||||
@ -34,35 +34,35 @@ imagesize==1.4.1 # via sphinx
|
|||||||
iniconfig==2.0.0 # via pytest
|
iniconfig==2.0.0 # via pytest
|
||||||
isort==5.13.2 # via -r requirements-dev.in, gray
|
isort==5.13.2 # via -r requirements-dev.in, gray
|
||||||
jinja2==3.1.4 # via sphinx
|
jinja2==3.1.4 # via sphinx
|
||||||
libcst==1.5.0 # via fixit
|
libcst==1.4.0 # via fixit
|
||||||
m2r==0.3.1 # via -r requirements-dev.in
|
m2r==0.3.1 # via -r requirements-dev.in
|
||||||
markupsafe==3.0.2 # via jinja2
|
markupsafe==2.1.5 # via jinja2
|
||||||
mccabe==0.7.0 # via flake8
|
mccabe==0.7.0 # via flake8
|
||||||
mistune==0.8.4 # via m2r
|
mistune==0.8.4 # via m2r
|
||||||
moreorless==0.4.0 # via fixit
|
moreorless==0.4.0 # via fixit
|
||||||
mypy==1.12.0 # via -r requirements-dev.in
|
mypy==1.11.2 # via -r requirements-dev.in
|
||||||
mypy-extensions==1.0.0 # via black, mypy
|
mypy-extensions==1.0.0 # via black, mypy
|
||||||
nodeenv==1.9.1 # via pre-commit
|
nodeenv==1.9.1 # via pre-commit
|
||||||
packaging==24.1 # via black, build, fixit, pyproject-api, pytest, sphinx, tox
|
packaging==24.1 # via black, build, fixit, pyproject-api, pytest, sphinx, tox
|
||||||
pathspec==0.12.1 # via black, trailrunner
|
pathspec==0.12.1 # via black, trailrunner
|
||||||
pep8-naming==0.14.1 # via -r requirements-dev.in
|
pep8-naming==0.14.1 # via -r requirements-dev.in
|
||||||
pip-tools==7.4.1 # via -r requirements-dev.in
|
pip-tools==7.4.1 # via -r requirements-dev.in
|
||||||
platformdirs==4.3.6 # via black, tox, virtualenv
|
platformdirs==4.3.3 # via black, tox, virtualenv
|
||||||
pluggy==1.5.0 # via pytest, tox
|
pluggy==1.5.0 # via pytest, tox
|
||||||
pre-commit==4.0.1 # via -r requirements-dev.in
|
pre-commit==3.8.0 # via -r requirements-dev.in
|
||||||
pycodestyle==2.12.1 # via flake8
|
pycodestyle==2.12.1 # via flake8
|
||||||
pyflakes==3.2.0 # via autoflake, flake8
|
pyflakes==3.2.0 # via autoflake, flake8
|
||||||
pygments==2.18.0 # via rich, sphinx
|
pygments==2.18.0 # via rich, sphinx
|
||||||
pyproject-api==1.8.0 # via tox
|
pyproject-api==1.7.1 # via tox
|
||||||
pyproject-hooks==1.2.0 # via build, pip-tools
|
pyproject-hooks==1.1.0 # via build, pip-tools
|
||||||
pytest==8.3.3 # via -r requirements-dev.in, pytest-cov
|
pytest==8.3.3 # via -r requirements-dev.in, pytest-cov
|
||||||
pytest-cov==5.0.0 # via -r requirements-dev.in
|
pytest-cov==5.0.0 # via -r requirements-dev.in
|
||||||
pyupgrade==3.18.0 # via gray
|
pyupgrade==3.17.0 # via gray
|
||||||
pyyaml==6.0.2 # via libcst, pre-commit
|
pyyaml==6.0.2 # via libcst, pre-commit
|
||||||
requests==2.32.3 # via sphinx
|
requests==2.32.3 # via sphinx
|
||||||
rich==12.6.0 # via gray
|
rich==12.6.0 # via gray
|
||||||
snowballstemmer==2.2.0 # via sphinx
|
snowballstemmer==2.2.0 # via sphinx
|
||||||
sphinx==8.1.3 # via -r requirements-dev.in
|
sphinx==8.0.2 # via -r requirements-dev.in
|
||||||
sphinxcontrib-applehelp==2.0.0 # via sphinx
|
sphinxcontrib-applehelp==2.0.0 # via sphinx
|
||||||
sphinxcontrib-devhelp==2.0.0 # via sphinx
|
sphinxcontrib-devhelp==2.0.0 # via sphinx
|
||||||
sphinxcontrib-htmlhelp==2.1.0 # via sphinx
|
sphinxcontrib-htmlhelp==2.1.0 # via sphinx
|
||||||
@ -71,14 +71,14 @@ sphinxcontrib-qthelp==2.0.0 # via sphinx
|
|||||||
sphinxcontrib-serializinghtml==2.0.0 # via sphinx
|
sphinxcontrib-serializinghtml==2.0.0 # via sphinx
|
||||||
tokenize-rt==6.0.0 # via add-trailing-comma, pyupgrade
|
tokenize-rt==6.0.0 # via add-trailing-comma, pyupgrade
|
||||||
toml==0.10.2 # via autoflake
|
toml==0.10.2 # via autoflake
|
||||||
tomli==2.0.2 # via black, build, check-manifest, coverage, fixit, mypy, pip-tools, pyproject-api, pytest, sphinx, tox
|
tomli==2.0.1 # via black, build, check-manifest, coverage, fixit, mypy, pip-tools, pyproject-api, pytest, sphinx, tox
|
||||||
tox==4.23.0 # via -r requirements-dev.in
|
tox==4.18.1 # via -r requirements-dev.in
|
||||||
trailrunner==1.4.0 # via fixit
|
trailrunner==1.4.0 # via fixit
|
||||||
typing-extensions==4.12.2 # via black, mypy, tox
|
typing-extensions==4.12.2 # via black, mypy
|
||||||
unify==0.5 # via gray
|
unify==0.5 # via gray
|
||||||
untokenize==0.1.1 # via unify
|
untokenize==0.1.1 # via unify
|
||||||
urllib3==2.2.3 # via requests
|
urllib3==2.2.3 # via requests
|
||||||
virtualenv==20.27.0 # via pre-commit, tox
|
virtualenv==20.26.4 # via pre-commit, tox
|
||||||
wheel==0.44.0 # via -r requirements-dev.in, pip-tools
|
wheel==0.44.0 # via -r requirements-dev.in, pip-tools
|
||||||
|
|
||||||
# The following packages are considered to be unsafe in a requirements file:
|
# The following packages are considered to be unsafe in a requirements file:
|
||||||
|
@ -5,10 +5,12 @@ click
|
|||||||
click-params
|
click-params
|
||||||
dataclasses
|
dataclasses
|
||||||
dataclasses-json
|
dataclasses-json
|
||||||
|
eventlet
|
||||||
flask
|
flask
|
||||||
flask-httpauth
|
flask-httpauth
|
||||||
flask-socketio
|
flask-socketio
|
||||||
geopy
|
geopy
|
||||||
|
gevent
|
||||||
imapclient
|
imapclient
|
||||||
kiss3
|
kiss3
|
||||||
loguru
|
loguru
|
||||||
@ -16,6 +18,7 @@ oslo.config
|
|||||||
pluggy
|
pluggy
|
||||||
python-socketio
|
python-socketio
|
||||||
pyyaml
|
pyyaml
|
||||||
|
pytz
|
||||||
requests
|
requests
|
||||||
# Pinned due to gray needing 12.6.0
|
# Pinned due to gray needing 12.6.0
|
||||||
rich~=12.6.0
|
rich~=12.6.0
|
||||||
@ -27,4 +30,3 @@ thesmuggler
|
|||||||
tzlocal
|
tzlocal
|
||||||
update_checker
|
update_checker
|
||||||
wrapt
|
wrapt
|
||||||
pytz
|
|
||||||
|
@ -9,10 +9,10 @@ attrs==24.2.0 # via ax253, kiss3, rush
|
|||||||
ax253==0.1.5.post1 # via kiss3
|
ax253==0.1.5.post1 # via kiss3
|
||||||
beautifulsoup4==4.12.3 # via -r requirements.in
|
beautifulsoup4==4.12.3 # via -r requirements.in
|
||||||
bidict==0.23.1 # via python-socketio
|
bidict==0.23.1 # via python-socketio
|
||||||
bitarray==3.0.0 # via ax253, kiss3
|
bitarray==2.9.2 # via ax253, kiss3
|
||||||
blinker==1.8.2 # via flask
|
blinker==1.8.2 # via flask
|
||||||
certifi==2024.8.30 # via requests
|
certifi==2024.8.30 # via requests
|
||||||
charset-normalizer==3.4.0 # via requests
|
charset-normalizer==3.3.2 # via requests
|
||||||
click==8.1.7 # via -r requirements.in, click-params, flask
|
click==8.1.7 # via -r requirements.in, click-params, flask
|
||||||
click-params==0.5.0 # via -r requirements.in
|
click-params==0.5.0 # via -r requirements.in
|
||||||
commonmark==0.9.1 # via rich
|
commonmark==0.9.1 # via rich
|
||||||
@ -20,11 +20,15 @@ dataclasses==0.6 # via -r requirements.in
|
|||||||
dataclasses-json==0.6.7 # via -r requirements.in
|
dataclasses-json==0.6.7 # via -r requirements.in
|
||||||
debtcollector==3.0.0 # via oslo-config
|
debtcollector==3.0.0 # via oslo-config
|
||||||
deprecated==1.2.14 # via click-params
|
deprecated==1.2.14 # via click-params
|
||||||
|
dnspython==2.6.1 # via eventlet
|
||||||
|
eventlet==0.37.0 # via -r requirements.in
|
||||||
flask==3.0.3 # via -r requirements.in, flask-httpauth, flask-socketio
|
flask==3.0.3 # via -r requirements.in, flask-httpauth, flask-socketio
|
||||||
flask-httpauth==4.8.0 # via -r requirements.in
|
flask-httpauth==4.8.0 # via -r requirements.in
|
||||||
flask-socketio==5.4.1 # via -r requirements.in
|
flask-socketio==5.3.7 # via -r requirements.in
|
||||||
geographiclib==2.0 # via geopy
|
geographiclib==2.0 # via geopy
|
||||||
geopy==2.4.1 # via -r requirements.in
|
geopy==2.4.1 # via -r requirements.in
|
||||||
|
gevent==24.2.1 # via -r requirements.in
|
||||||
|
greenlet==3.1.0 # via eventlet, gevent
|
||||||
h11==0.14.0 # via wsproto
|
h11==0.14.0 # via wsproto
|
||||||
idna==3.10 # via requests
|
idna==3.10 # via requests
|
||||||
imapclient==3.0.1 # via -r requirements.in
|
imapclient==3.0.1 # via -r requirements.in
|
||||||
@ -33,8 +37,8 @@ itsdangerous==2.2.0 # via flask
|
|||||||
jinja2==3.1.4 # via flask
|
jinja2==3.1.4 # via flask
|
||||||
kiss3==8.0.0 # via -r requirements.in
|
kiss3==8.0.0 # via -r requirements.in
|
||||||
loguru==0.7.2 # via -r requirements.in
|
loguru==0.7.2 # via -r requirements.in
|
||||||
markupsafe==3.0.2 # via jinja2, werkzeug
|
markupsafe==2.1.5 # via jinja2, werkzeug
|
||||||
marshmallow==3.23.0 # via dataclasses-json
|
marshmallow==3.22.0 # via dataclasses-json
|
||||||
mypy-extensions==1.0.0 # via typing-inspect
|
mypy-extensions==1.0.0 # via typing-inspect
|
||||||
netaddr==1.3.0 # via oslo-config
|
netaddr==1.3.0 # via oslo-config
|
||||||
oslo-config==9.6.0 # via -r requirements.in
|
oslo-config==9.6.0 # via -r requirements.in
|
||||||
@ -45,7 +49,7 @@ pluggy==1.5.0 # via -r requirements.in
|
|||||||
pygments==2.18.0 # via rich
|
pygments==2.18.0 # via rich
|
||||||
pyserial==3.5 # via pyserial-asyncio
|
pyserial==3.5 # via pyserial-asyncio
|
||||||
pyserial-asyncio==0.6 # via kiss3
|
pyserial-asyncio==0.6 # via kiss3
|
||||||
python-engineio==4.10.1 # via python-socketio
|
python-engineio==4.9.1 # via python-socketio
|
||||||
python-socketio==5.11.4 # via -r requirements.in, flask-socketio
|
python-socketio==5.11.4 # via -r requirements.in, flask-socketio
|
||||||
pytz==2024.2 # via -r requirements.in
|
pytz==2024.2 # via -r requirements.in
|
||||||
pyyaml==6.0.2 # via -r requirements.in, oslo-config
|
pyyaml==6.0.2 # via -r requirements.in, oslo-config
|
||||||
@ -54,7 +58,7 @@ rfc3986==2.0.0 # via oslo-config
|
|||||||
rich==12.6.0 # via -r requirements.in
|
rich==12.6.0 # via -r requirements.in
|
||||||
rush==2021.4.0 # via -r requirements.in
|
rush==2021.4.0 # via -r requirements.in
|
||||||
shellingham==1.5.4 # via -r requirements.in
|
shellingham==1.5.4 # via -r requirements.in
|
||||||
simple-websocket==1.1.0 # via python-engineio
|
simple-websocket==1.0.0 # via python-engineio
|
||||||
six==1.16.0 # via -r requirements.in
|
six==1.16.0 # via -r requirements.in
|
||||||
soupsieve==2.6 # via beautifulsoup4
|
soupsieve==2.6 # via beautifulsoup4
|
||||||
stevedore==5.3.0 # via oslo-config
|
stevedore==5.3.0 # via oslo-config
|
||||||
@ -70,3 +74,8 @@ werkzeug==3.0.4 # via flask
|
|||||||
wrapt==1.16.0 # via -r requirements.in, debtcollector, deprecated
|
wrapt==1.16.0 # via -r requirements.in, debtcollector, deprecated
|
||||||
wsproto==1.2.0 # via simple-websocket
|
wsproto==1.2.0 # via simple-websocket
|
||||||
zipp==3.20.2 # via importlib-metadata
|
zipp==3.20.2 # via importlib-metadata
|
||||||
|
zope-event==5.0 # via gevent
|
||||||
|
zope-interface==7.0.3 # via gevent
|
||||||
|
|
||||||
|
# The following packages are considered to be unsafe in a requirements file:
|
||||||
|
# setuptools
|
||||||
|
Loading…
Reference in New Issue
Block a user