Skip to content

Commit 2b5816d

Browse files
authored
Merge pull request #15 from justmobilize/update-docs
Update docs
2 parents 1531496 + 72fdd31 commit 2b5816d

File tree

2 files changed

+58
-34
lines changed

2 files changed

+58
-34
lines changed

adafruit_connection_manager.py

+48-24
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,13 @@ def create_fake_ssl_context(
9999

100100

101101
_global_connection_managers = {}
102+
_global_key_by_socketpool = {}
102103
_global_socketpools = {}
103104
_global_ssl_contexts = {}
104105

105106

106107
def get_radio_socketpool(radio):
107-
"""Helper to get a socket pool for common boards
108+
"""Helper to get a socket pool for common boards.
108109
109110
Currently supported:
110111
@@ -151,14 +152,15 @@ def get_radio_socketpool(radio):
151152
else:
152153
raise AttributeError(f"Unsupported radio class: {class_name}")
153154

155+
_global_key_by_socketpool[pool] = class_name
154156
_global_socketpools[class_name] = pool
155157
_global_ssl_contexts[class_name] = ssl_context
156158

157159
return _global_socketpools[class_name]
158160

159161

160162
def get_radio_ssl_context(radio):
161-
"""Helper to get ssl_contexts for common boards
163+
"""Helper to get ssl_contexts for common boards.
162164
163165
Currently supported:
164166
@@ -175,7 +177,7 @@ def get_radio_ssl_context(radio):
175177

176178

177179
class ConnectionManager:
178-
"""Connection manager for sharing open sockets (aka connections)."""
180+
"""A library for managing sockets accross libraries."""
179181

180182
def __init__(
181183
self,
@@ -228,16 +230,20 @@ def _get_connected_socket( # pylint: disable=too-many-arguments
228230

229231
@property
230232
def available_socket_count(self) -> int:
231-
"""Get the count of freeable open sockets"""
233+
"""Get the count of available (freed) managed sockets."""
232234
return len(self._available_sockets)
233235

234236
@property
235237
def managed_socket_count(self) -> int:
236-
"""Get the count of open sockets"""
238+
"""Get the count of managed sockets."""
237239
return len(self._managed_socket_by_key)
238240

239241
def close_socket(self, socket: SocketType) -> None:
240-
"""Close a previously opened socket."""
242+
"""
243+
Close a previously managed and connected socket.
244+
245+
- **socket_pool** *(SocketType)* – The socket you want to close
246+
"""
241247
if socket not in self._managed_socket_by_key.values():
242248
raise RuntimeError("Socket not managed")
243249
socket.close()
@@ -247,7 +253,7 @@ def close_socket(self, socket: SocketType) -> None:
247253
self._available_sockets.remove(socket)
248254

249255
def free_socket(self, socket: SocketType) -> None:
250-
"""Mark a previously opened socket as available so it can be reused if needed."""
256+
"""Mark a managed socket as available so it can be reused."""
251257
if socket not in self._managed_socket_by_key.values():
252258
raise RuntimeError("Socket not managed")
253259
self._available_sockets.add(socket)
@@ -263,7 +269,20 @@ def get_socket(
263269
is_ssl: bool = False,
264270
ssl_context: Optional[SSLContextType] = None,
265271
) -> CircuitPythonSocketType:
266-
"""Get a new socket and connect"""
272+
"""
273+
Get a new socket and connect.
274+
275+
- **host** *(str)* – The host you are want to connect to: "www.adaftuit.com"
276+
- **port** *(int)* – The port you want to connect to: 80
277+
- **proto** *(str)* – The protocal you want to use: "http:"
278+
- **session_id** *(Optional[str])* – A unique Session ID, when wanting to have multiple open
279+
connections to the same host
280+
- **timeout** *(float)* – Time timeout used for connecting
281+
- **is_ssl** *(bool)* – If the connection is to be over SSL (auto set when proto is
282+
"https:")
283+
- **ssl_context** *(Optional[SSLContextType])* – The SSL context to use when making SSL
284+
requests
285+
"""
267286
if session_id:
268287
session_id = str(session_id)
269288
key = (host, port, proto, session_id)
@@ -315,7 +334,14 @@ def get_socket(
315334
def connection_manager_close_all(
316335
socket_pool: Optional[SocketpoolModuleType] = None, release_references: bool = False
317336
) -> None:
318-
"""Close all open sockets for pool"""
337+
"""
338+
Close all open sockets for pool, optionally release references.
339+
340+
- **socket_pool** *(Optional[SocketpoolModuleType])* – A specifc SocketPool you want to close
341+
sockets for, leave blank for all SocketPools
342+
- **release_references** *(bool)* – Set to True if you want to also clear stored references to
343+
the SocketPool and SSL contexts
344+
"""
319345
if socket_pool:
320346
socket_pools = [socket_pool]
321347
else:
@@ -328,26 +354,24 @@ def connection_manager_close_all(
328354

329355
connection_manager._free_sockets(force=True) # pylint: disable=protected-access
330356

331-
if release_references:
332-
radio_key = None
333-
for radio_check, pool_check in _global_socketpools.items():
334-
if pool == pool_check:
335-
radio_key = radio_check
336-
break
357+
if not release_references:
358+
continue
337359

338-
if radio_key:
339-
if radio_key in _global_socketpools:
340-
del _global_socketpools[radio_key]
360+
key = _global_key_by_socketpool.pop(pool)
361+
if key:
362+
_global_socketpools.pop(key, None)
363+
_global_ssl_contexts.pop(key, None)
341364

342-
if radio_key in _global_ssl_contexts:
343-
del _global_ssl_contexts[radio_key]
344-
345-
if pool in _global_connection_managers:
346-
del _global_connection_managers[pool]
365+
_global_connection_managers.pop(pool, None)
347366

348367

349368
def get_connection_manager(socket_pool: SocketpoolModuleType) -> ConnectionManager:
350-
"""Get the ConnectionManager singleton for the given pool"""
369+
"""
370+
Get the ConnectionManager singleton for the given pool.
371+
372+
- **socket_pool** *(Optional[SocketpoolModuleType])* – The SocketPool you want the
373+
ConnectionManager for
374+
"""
351375
if socket_pool not in _global_connection_managers:
352376
_global_connection_managers[socket_pool] = ConnectionManager(socket_pool)
353377
return _global_connection_managers[socket_pool]

examples/connectionmanager_helpers.py

+10-10
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
connection_manager = adafruit_connection_manager.get_connection_manager(pool)
2828
print("-" * 40)
2929
print("Nothing yet opened")
30-
print(f"Open Sockets: {connection_manager.managed_socket_count}")
31-
print(f"Freeable Open Sockets: {connection_manager.available_socket_count}")
30+
print(f"Managed Sockets: {connection_manager.managed_socket_count}")
31+
print(f"Available Managed Sockets: {connection_manager.available_socket_count}")
3232

3333
# make request
3434
print("-" * 40)
@@ -38,24 +38,24 @@
3838
print(f"Text Response {response_text}")
3939

4040
print("-" * 40)
41-
print("1 request, opened and freed")
42-
print(f"Open Sockets: {connection_manager.managed_socket_count}")
43-
print(f"Freeable Open Sockets: {connection_manager.available_socket_count}")
41+
print("1 request, opened and closed")
42+
print(f"Managed Sockets: {connection_manager.managed_socket_count}")
43+
print(f"Available Managed Sockets: {connection_manager.available_socket_count}")
4444

4545
print("-" * 40)
4646
print(f"Fetching from {TEXT_URL} not in a context handler")
4747
response = requests.get(TEXT_URL)
4848

4949
print("-" * 40)
50-
print("1 request, opened but not freed")
51-
print(f"Open Sockets: {connection_manager.managed_socket_count}")
52-
print(f"Freeable Open Sockets: {connection_manager.available_socket_count}")
50+
print("1 request, opened but not closed")
51+
print(f"Managed Sockets: {connection_manager.managed_socket_count}")
52+
print(f"Available Managed Sockets: {connection_manager.available_socket_count}")
5353

5454
print("-" * 40)
5555
print("Closing everything in the pool")
5656
adafruit_connection_manager.connection_manager_close_all(pool)
5757

5858
print("-" * 40)
5959
print("Everything closed")
60-
print(f"Open Sockets: {connection_manager.managed_socket_count}")
61-
print(f"Freeable Open Sockets: {connection_manager.available_socket_count}")
60+
print(f"Managed Sockets: {connection_manager.managed_socket_count}")
61+
print(f"Available Managed Sockets: {connection_manager.available_socket_count}")

0 commit comments

Comments
 (0)