From 2f6d27a52a3c3b2c716f775cfe2557f9a5b1b5e2 Mon Sep 17 00:00:00 2001
From: percyjw-2 <joris.wachsmuth@gmx.de>
Date: Mon, 25 Jul 2022 18:21:52 +0200
Subject: [PATCH] Changed Imports to prevent circular dependencies

---
 swarm/ConnectionManager.py           | 35 ++--------------------------
 swarm/ConnectionManagerTCPHandler.py |  2 +-
 swarm/__init__.py                    |  2 +-
 swarm/statics.py                     | 33 ++++++++++++++++++++++++++
 tests/test_connection_manager.py     | 12 ++++++----
 5 files changed, 44 insertions(+), 40 deletions(-)
 create mode 100644 swarm/statics.py

diff --git a/swarm/ConnectionManager.py b/swarm/ConnectionManager.py
index 6b62ee9..3d6753c 100644
--- a/swarm/ConnectionManager.py
+++ b/swarm/ConnectionManager.py
@@ -2,12 +2,11 @@ import socket
 import socketserver
 import time
 import threading
-from enum import Enum
-import re
 from functools import partial
 from typing import List, Callable, Optional, Tuple
 
-from swarm.ConnectionManagerTCPHandler import ConnectionManagerTCPHandler
+from .statics import StandardMessages, MessageToBig, _string_to_ip_and_port
+from .ConnectionManagerTCPHandler import ConnectionManagerTCPHandler
 
 try:
     from time import time_ns
@@ -19,36 +18,6 @@ except ImportError:
         return int(now.timestamp() * 1e9)
 
 
-class StandardMessages(Enum):
-    ANNOUNCE = "announce"
-    UPDATE_LAUNCH = "update"
-    ACKNOWLEDGED = "acknowledged"
-    HEARTBEAT = "heartbeat"
-    GET_ADDRESSES = "addresses"
-    GET_MASTER = "master"
-
-
-class MessageToBig(Exception):
-    pass
-
-
-class InvalidIPString(Exception):
-    pass
-
-
-def _string_to_ip_and_port(message: str) -> Tuple[str, int]:
-    valid_ipv4 = re.compile(r"^(\d?\d?\d.){3}\d?\d?\d:(\d?){4}\d$")
-    valid_ipv6 = re.compile(r"^([a-f\d:]+:+)+[a-f\d]+:(\d?){4}\d$")
-    valid_address = re.compile(r"^(localhost)|(\*+.\*):(\d?){4}\d$")
-    if (not valid_ipv4.match(message)) and (not valid_ipv6.match(message)) and (not valid_address.match(message)):
-        raise InvalidIPString(f"'{message}' is not an valid ip address")
-    msg_split = message.split(":")
-    port = msg_split[-1]
-    ip = ":".join(msg_split[0:-1])
-    port = int(port)
-    return ip, port
-
-
 class ConnectionManager:
     def __init__(self,
                  addr="localhost",
diff --git a/swarm/ConnectionManagerTCPHandler.py b/swarm/ConnectionManagerTCPHandler.py
index 8605a21..bf6ca1d 100644
--- a/swarm/ConnectionManagerTCPHandler.py
+++ b/swarm/ConnectionManagerTCPHandler.py
@@ -2,7 +2,7 @@ import socket
 import socketserver
 from typing import Union
 
-from swarm import _string_to_ip_and_port, StandardMessages
+from .statics import _string_to_ip_and_port, StandardMessages
 
 
 class ConnectionManagerTCPHandler(socketserver.BaseRequestHandler):
diff --git a/swarm/__init__.py b/swarm/__init__.py
index 5f7d96d..04a135a 100644
--- a/swarm/__init__.py
+++ b/swarm/__init__.py
@@ -8,6 +8,6 @@ __author__ = 'Joris Wachsmuth'
 from .ConnectionManager import\
     ConnectionManager,\
     StandardMessages,\
-    InvalidIPString,\
     MessageToBig,\
     _string_to_ip_and_port
+from .statics import InvalidIPString
diff --git a/swarm/statics.py b/swarm/statics.py
new file mode 100644
index 0000000..e5bb625
--- /dev/null
+++ b/swarm/statics.py
@@ -0,0 +1,33 @@
+import re
+from enum import Enum
+from typing import Tuple
+
+
+class StandardMessages(Enum):
+    ANNOUNCE = "announce"
+    UPDATE_LAUNCH = "update"
+    ACKNOWLEDGED = "acknowledged"
+    HEARTBEAT = "heartbeat"
+    GET_ADDRESSES = "addresses"
+    GET_MASTER = "master"
+
+
+class MessageToBig(Exception):
+    pass
+
+
+class InvalidIPString(Exception):
+    pass
+
+
+def _string_to_ip_and_port(message: str) -> Tuple[str, int]:
+    valid_ipv4 = re.compile(r"^(\d?\d?\d.){3}\d?\d?\d:(\d?){4}\d$")
+    valid_ipv6 = re.compile(r"^([a-f\d:]+:+)+[a-f\d]+:(\d?){4}\d$")
+    valid_address = re.compile(r"^(localhost)|(\*+.\*):(\d?){4}\d$")
+    if (not valid_ipv4.match(message)) and (not valid_ipv6.match(message)) and (not valid_address.match(message)):
+        raise InvalidIPString(f"'{message}' is not an valid ip address")
+    msg_split = message.split(":")
+    port = msg_split[-1]
+    ip = ":".join(msg_split[0:-1])
+    port = int(port)
+    return ip, port
diff --git a/tests/test_connection_manager.py b/tests/test_connection_manager.py
index fe15486..c465f33 100644
--- a/tests/test_connection_manager.py
+++ b/tests/test_connection_manager.py
@@ -6,27 +6,29 @@ import socket
 from ipaddress import IPv4Address, IPv6Address
 from typing import List
 
+import swarm.statics
+
 
 class TestStatics(TestCase):
     def test_ipv4_str_parsing(self):
         for i in range(1000):
             addr_str = str(IPv4Address(random.getrandbits(32)))
             port = random.randint(1, 65535)
-            (ip, port_e) = swarm._string_to_ip_and_port(addr_str + ":" + str(port))
+            (ip, port_e) = swarm.statics._string_to_ip_and_port(addr_str + ":" + str(port))
             self.assertEqual((ip, port_e), (addr_str, port))
 
     def test_ipv6_str_parsing(self):
         for i in range(1000):
             addr_str = str(IPv6Address(random.getrandbits(128)))
             port = random.randint(1, 65535)
-            (ip, port_e) = swarm._string_to_ip_and_port(addr_str + ":" + str(port))
+            (ip, port_e) = swarm.statics._string_to_ip_and_port(addr_str + ":" + str(port))
             self.assertEqual((ip, port_e), (addr_str, port))
 
     def test_invalid_str_parsing(self):
         invalid_sting = "invalid"
         try:
-            swarm._string_to_ip_and_port(invalid_sting)
-        except swarm.InvalidIPString:
+            swarm.statics._string_to_ip_and_port(invalid_sting)
+        except swarm.statics.InvalidIPString:
             return
         self.assertTrue(False)
 
@@ -51,7 +53,7 @@ class TestConnections(TestCase):
             conn_mans[ip_str].connect(to_connect)
             to_connect.append(ip_str)
 
-        master = swarm._string_to_ip_and_port(to_connect[0])
+        master = swarm.statics._string_to_ip_and_port(to_connect[0])
         for manager in conn_mans.values():
             self.assertEqual(master, manager.get_current_master())
         for manager in conn_mans.values():
-- 
GitLab