Repository: SneaksAndData/adapta (language: python)

Issue:
[FEATURE] Move ESD services connectors to a separate project
**Is your feature request related to a problem? Please describe.**
In order to OS this repo we must move ESD-specific stuff out.

**Describe the solution you'd like**
Beast, Arcane, Crystal connectors should go to a new repo which relies on Proteus instead. Name suggestion `esd-services-api-client`



Discussion / hints:
fyi @matt035343 @s-vitaliy 

Fix patch:
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 0f2ea8a3..3b368cff 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -17,16 +17,14 @@ jobs:
         with:
           python-version: '3.9.x' # Version range or exact version of a Python version to use, using SemVer's version range syntax
           architecture: 'x64' # optional x64 or x86. Defaults to x64 if not specified
-      - name: Install Poetry
-        run: |
-          set -euxo pipefail
-          
-          curl -sSL https://install.python-poetry.org | python3 - --preview
-      - name: Install Dependencies
-        run: |
-          set -euxo pipefail
-          
-          poetry install --extras "azure datadog boxer databases"
+      - name: Install Poetry and dependencies
+        uses: SneaksAndData/github-actions/install_poetry@v0.0.7
+        with:
+          pypi_repo_url: ${{ secrets.AZOPS_PYPI_REPO_URL }}
+          pypi_token_username: ${{ secrets.AZOPS_PAT_USER }}
+          pypi_token: ${{ secrets.AZOPS_PAT }}
+          install_extras: all
+          install_preview: True
       - name: Lint
         run: |
           set -euxo pipefail
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index da976980..4f4468c1 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -13,7 +13,7 @@ jobs:
         with:
           fetch-depth: 0
       - name: Create Release
-        uses: SneaksAndData/github-actions/semver_release@v0.0.2
+        uses: SneaksAndData/github-actions/semver_release@v0.0.7
         with:
-          major_v: 0
-          minor_v: 6
+          major_v: 1
+          minor_v: 0
diff --git a/poetry.lock b/poetry.lock
index 52450d29..66499bc3 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -46,7 +46,7 @@ multidict = ">=4.5,<7.0"
 yarl = ">=1.0,<2.0"
 
 [package.extras]
-speedups = ["cchardet", "brotli", "aiodns"]
+speedups = ["Brotli", "aiodns", "cchardet"]
 
 [[package]]
 name = "aiosignal"
@@ -100,10 +100,10 @@ optional = false
 python-versions = ">=3.5"
 
 [package.extras]
-tests_no_zope = ["cloudpickle", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"]
-tests = ["cloudpickle", "zope-interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"]
-docs = ["sphinx-notfound-page", "zope-interface", "sphinx", "furo"]
-dev = ["cloudpickle", "pre-commit", "sphinx-notfound-page", "sphinx", "furo", "zope-interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"]
+dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"]
+docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"]
+tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"]
+tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"]
 
 [[package]]
 name = "azure-common"
@@ -115,7 +115,7 @@ python-versions = "*"
 
 [[package]]
 name = "azure-core"
-version = "1.25.0"
+version = "1.25.1"
 description = "Microsoft Azure Core Library for Python"
 category = "main"
 optional = true
@@ -290,12 +290,12 @@ python-versions = ">=3.6"
 cffi = ">=1.12"
 
 [package.extras]
-docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"]
-docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"]
+docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx_rtd_theme"]
+docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"]
 pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"]
 sdist = ["setuptools_rust (>=0.11.4)"]
 ssh = ["bcrypt (>=3.1.5)"]
-test = ["pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"]
+test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"]
 
 [[package]]
 name = "dataclasses-json"
@@ -311,7 +311,7 @@ marshmallow-enum = ">=1.5.1,<2.0.0"
 typing-inspect = ">=0.4.0"
 
 [package.extras]
-dev = ["pytest (>=6.2.3)", "ipython", "mypy (>=0.710)", "hypothesis", "portray", "flake8", "simplejson", "types-dataclasses"]
+dev = ["flake8", "hypothesis", "ipython", "mypy (>=0.710)", "portray", "pytest (>=6.2.3)", "simplejson", "types-dataclasses"]
 
 [[package]]
 name = "datadog"
@@ -338,9 +338,9 @@ python-dateutil = "*"
 urllib3 = ">=1.15"
 
 [package.extras]
-tests = ["types-python-dateutil", "mypy", "python-dateutil", "pytest-recording", "pytest-randomly", "pytest-asyncio", "pytest-bdd (>=5.0.0)", "pytest", "jinja2", "glom", "aiosonic"]
-async = ["aiosonic"]
 apm = ["ddtrace (>=1.0.0rc1)"]
+async = ["aiosonic"]
+tests = ["aiosonic", "glom", "jinja2", "mypy", "pytest", "pytest-asyncio", "pytest-bdd (>=5.0.0)", "pytest-randomly", "pytest-recording", "python-dateutil", "types-python-dateutil"]
 
 [[package]]
 name = "deltalake"
@@ -354,9 +354,9 @@ python-versions = ">=3.7"
 pyarrow = ">=7"
 
 [package.extras]
-devel = ["toml", "sphinx-rtd-theme", "sphinx (<=4.5)", "pytest-timeout", "pytest-cov", "pytest-mock", "pytest", "packaging (>=20)", "isort", "black", "mypy"]
-pyspark = ["delta-spark", "pyspark"]
+devel = ["black", "isort", "mypy", "packaging (>=20)", "pytest", "pytest-cov", "pytest-mock", "pytest-timeout", "sphinx (<=4.5)", "sphinx-rtd-theme", "toml"]
 pandas = ["pandas"]
+pyspark = ["delta-spark", "pyspark"]
 
 [[package]]
 name = "dill"
@@ -390,7 +390,7 @@ abfs = ["adlfs"]
 adl = ["adlfs"]
 arrow = ["pyarrow (>=1)"]
 dask = ["dask", "distributed"]
-dropbox = ["dropboxdrivefs", "requests", "dropbox"]
+dropbox = ["dropbox", "dropboxdrivefs", "requests"]
 entrypoints = ["importlib-metadata"]
 fuse = ["fusepy"]
 gcs = ["gcsfs"]
@@ -399,7 +399,7 @@ github = ["requests"]
 gs = ["gcsfs"]
 gui = ["panel"]
 hdfs = ["pyarrow (>=1)"]
-http = ["requests", "aiohttp (!=4.0.0a0,!=4.0.0a1)"]
+http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"]
 libarchive = ["libarchive-c"]
 oci = ["ocifs"]
 s3 = ["s3fs"]
@@ -423,7 +423,7 @@ rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""}
 six = ">=1.9.0"
 
 [package.extras]
-aiohttp = ["requests (>=2.20.0,<3.0.0dev)", "aiohttp (>=3.6.2,<4.0.0dev)"]
+aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "requests (>=2.20.0,<3.0.0dev)"]
 enterprise_cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"]
 pyopenssl = ["pyopenssl (>=20.0.0)"]
 reauth = ["pyu2f (>=0.1.5)"]
@@ -437,7 +437,7 @@ optional = true
 python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
 
 [package.extras]
-docs = ["sphinx"]
+docs = ["Sphinx"]
 
 [[package]]
 name = "idna"
@@ -475,13 +475,13 @@ optional = false
 python-versions = ">=3.6.1,<4.0"
 
 [package.extras]
-plugins = ["setuptools"]
 colors = ["colorama (>=0.4.3,<0.5.0)"]
+pipfile_deprecated_finder = ["pipreqs", "requirementslib"]
+plugins = ["setuptools"]
 requirements_deprecated_finder = ["pip-api", "pipreqs"]
-pipfile_deprecated_finder = ["requirementslib", "pipreqs"]
 
 [[package]]
-name = "json-log-formatter"
+name = "JSON-log-formatter"
 version = "0.5.1"
 description = "JSON log formatter"
 category = "main"
@@ -531,9 +531,9 @@ python-versions = ">=3.7"
 packaging = ">=17.0"
 
 [package.extras]
-dev = ["pytest", "pytz", "simplejson", "mypy (==0.971)", "flake8 (==5.0.4)", "flake8-bugbear (==22.8.22)", "pre-commit (>=2.4,<3.0)", "tox"]
-docs = ["sphinx (==5.1.1)", "sphinx-issues (==3.0.1)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.9)"]
-lint = ["mypy (==0.971)", "flake8 (==5.0.4)", "flake8-bugbear (==22.8.22)", "pre-commit (>=2.4,<3.0)"]
+dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.8.22)", "mypy (==0.971)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"]
+docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.1.1)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"]
+lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.8.22)", "mypy (==0.971)", "pre-commit (>=2.4,<3.0)"]
 tests = ["pytest", "pytz", "simplejson"]
 
 [[package]]
@@ -599,7 +599,7 @@ requests = ">=2.16,<3.0"
 requests-oauthlib = ">=0.5.0"
 
 [package.extras]
-async = ["aiohttp (>=3.0)", "aiodns"]
+async = ["aiodns", "aiohttp (>=3.0)"]
 
 [[package]]
 name = "multidict"
@@ -634,9 +634,9 @@ optional = true
 python-versions = ">=3.6"
 
 [package.extras]
-signedtoken = ["pyjwt (>=2.0.0,<3)", "cryptography (>=3.0.0)"]
-signals = ["blinker (>=1.4.0)"]
 rsa = ["cryptography (>=3.0.0)"]
+signals = ["blinker (>=1.4.0)"]
+signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
 
 [[package]]
 name = "packaging"
@@ -679,8 +679,8 @@ optional = false
 python-versions = ">=3.7"
 
 [package.extras]
-test = ["pytest (>=6)", "pytest-mock (>=3.6)", "pytest-cov (>=2.7)", "appdirs (==1.4.4)"]
-docs = ["sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)", "proselint (>=0.10.2)", "furo (>=2021.7.5b38)"]
+docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"]
+test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"]
 
 [[package]]
 name = "pluggy"
@@ -691,8 +691,8 @@ optional = false
 python-versions = ">=3.6"
 
 [package.extras]
-testing = ["pytest-benchmark", "pytest"]
-dev = ["tox", "pre-commit"]
+dev = ["pre-commit", "tox"]
+testing = ["pytest", "pytest-benchmark"]
 
 [[package]]
 name = "portalocker"
@@ -706,9 +706,9 @@ python-versions = ">=3.5"
 pywin32 = {version = ">=226", markers = "platform_system == \"Windows\""}
 
 [package.extras]
-tests = ["redis", "pytest-mypy (>=0.8.0)", "sphinx (>=3.0.3)", "pytest-timeout (>=2.1.0)", "pytest-cov (>=2.8.1)", "pytest (>=5.4.1)"]
-redis = ["redis"]
 docs = ["sphinx (>=1.7.1)"]
+redis = ["redis"]
+tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=3.0.3)"]
 
 [[package]]
 name = "py"
@@ -757,15 +757,7 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
 
 [[package]]
-name = "pycryptodome"
-version = "3.15.0"
-description = "Cryptographic library for Python"
-category = "main"
-optional = true
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-
-[[package]]
-name = "pyjwt"
+name = "PyJWT"
 version = "2.4.0"
 description = "JSON Web Token implementation in Python"
 category = "main"
@@ -776,10 +768,10 @@ python-versions = ">=3.6"
 cryptography = {version = ">=3.3.1", optional = true, markers = "extra == \"crypto\""}
 
 [package.extras]
-tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"]
-docs = ["zope-interface", "sphinx-rtd-theme", "sphinx"]
-dev = ["pre-commit", "mypy", "coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)", "cryptography (>=3.3.1)", "zope-interface", "sphinx-rtd-theme", "sphinx"]
 crypto = ["cryptography (>=3.3.1)"]
+dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.3.1)", "mypy", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"]
+docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"]
+tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"]
 
 [[package]]
 name = "pylint"
@@ -842,7 +834,7 @@ py = ">=1.8.2"
 toml = "*"
 
 [package.extras]
-testing = ["xmlschema", "requests", "nose", "mock", "hypothesis (>=3.56)", "argcomplete"]
+testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
 
 [[package]]
 name = "pytest-cov"
@@ -858,7 +850,7 @@ pytest = ">=4.6"
 toml = "*"
 
 [package.extras]
-testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"]
+testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
 
 [[package]]
 name = "pytest-mock"
@@ -872,7 +864,7 @@ python-versions = ">=3.6"
 pytest = ">=5.0"
 
 [package.extras]
-dev = ["pre-commit", "tox", "pytest-asyncio"]
+dev = ["pre-commit", "pytest-asyncio", "tox"]
 
 [[package]]
 name = "python-dateutil"
@@ -902,7 +894,7 @@ optional = true
 python-versions = "*"
 
 [[package]]
-name = "pyyaml"
+name = "PyYAML"
 version = "6.0"
 description = "YAML parser and emitter for Python"
 category = "main"
@@ -962,9 +954,9 @@ optional = true
 python-versions = ">=3.7"
 
 [package.extras]
-docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)", "sphinx-notfound-page (==0.8.3)", "sphinx-hoverxref (<2)", "pygments-github-lexers (==0.0.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-reredirects", "sphinxcontrib-towncrier", "furo"]
-testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "flake8 (<5)", "pytest-enabler (>=1.3)", "pytest-perf", "mock", "flake8-2020", "virtualenv (>=13.0.0)", "wheel", "pip (>=19.1)", "jaraco.envs (>=2.2)", "pytest-xdist", "jaraco.path (>=3.2.0)", "build", "filelock (>=3.4.0)", "pip-run (>=8.8)", "ini2toml[lite] (>=0.9)", "tomli-w (>=1.0.0)", "pytest-black (>=0.3.7)", "pytest-cov", "pytest-mypy (>=0.9.1)"]
-testing-integration = ["pytest", "pytest-xdist", "pytest-enabler", "virtualenv (>=13.0.0)", "tomli", "wheel", "jaraco.path (>=3.2.0)", "jaraco.envs (>=2.2)", "build", "filelock (>=3.4.0)"]
+docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
+testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
+testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
 
 [[package]]
 name = "six"
@@ -975,7 +967,7 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
 
 [[package]]
-name = "sqlalchemy"
+name = "SQLAlchemy"
 version = "1.4.40"
 description = "Database Abstraction Library"
 category = "main"
@@ -986,25 +978,25 @@ python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
 greenlet = {version = "!=0.4.17", markers = "python_version >= \"3\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"}
 
 [package.extras]
-aiomysql = ["greenlet (!=0.4.17)", "aiomysql"]
-aiosqlite = ["typing_extensions (!=3.10.0.1)", "greenlet (!=0.4.17)", "aiosqlite"]
+aiomysql = ["aiomysql", "greenlet (!=0.4.17)"]
+aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"]
 asyncio = ["greenlet (!=0.4.17)"]
-asyncmy = ["greenlet (!=0.4.17)", "asyncmy (>=0.2.3,!=0.2.4)"]
+asyncmy = ["asyncmy (>=0.2.3,!=0.2.4)", "greenlet (!=0.4.17)"]
 mariadb_connector = ["mariadb (>=1.0.1,!=1.1.2)"]
 mssql = ["pyodbc"]
 mssql_pymssql = ["pymssql"]
 mssql_pyodbc = ["pyodbc"]
-mypy = ["sqlalchemy2-stubs", "mypy (>=0.910)"]
-mysql = ["mysqlclient (>=1.4.0,<2)", "mysqlclient (>=1.4.0)"]
+mypy = ["mypy (>=0.910)", "sqlalchemy2-stubs"]
+mysql = ["mysqlclient (>=1.4.0)", "mysqlclient (>=1.4.0,<2)"]
 mysql_connector = ["mysql-connector-python"]
-oracle = ["cx_oracle (>=7,<8)", "cx_oracle (>=7)"]
+oracle = ["cx_oracle (>=7)", "cx_oracle (>=7,<8)"]
 postgresql = ["psycopg2 (>=2.7)"]
-postgresql_asyncpg = ["greenlet (!=0.4.17)", "asyncpg"]
+postgresql_asyncpg = ["asyncpg", "greenlet (!=0.4.17)"]
 postgresql_pg8000 = ["pg8000 (>=1.16.6,!=1.29.0)"]
 postgresql_psycopg2binary = ["psycopg2-binary"]
 postgresql_psycopg2cffi = ["psycopg2cffi"]
-pymysql = ["pymysql (<1)", "pymysql"]
-sqlcipher = ["sqlcipher3-binary"]
+pymysql = ["pymysql", "pymysql (<1)"]
+sqlcipher = ["sqlcipher3_binary"]
 
 [[package]]
 name = "toml"
@@ -1071,8 +1063,8 @@ optional = false
 python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4"
 
 [package.extras]
-brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"]
-secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "urllib3-secure-extra", "ipaddress"]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
+secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
 socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
 
 [[package]]
@@ -1084,9 +1076,9 @@ optional = true
 python-versions = ">=3.7"
 
 [package.extras]
+docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"]
+optional = ["python-socks", "wsaccel"]
 test = ["websockets"]
-optional = ["wsaccel", "python-socks"]
-docs = ["sphinx-rtd-theme (>=0.5)", "Sphinx (>=3.4)"]
 
 [[package]]
 name = "wrapt"
@@ -1110,14 +1102,13 @@ multidict = ">=4.0"
 
 [extras]
 azure = ["azure-identity", "azure-storage-blob", "azure-mgmt-storage", "azure-keyvault-secrets", "azure-servicebus", "adlfs"]
-boxer = ["pycryptodome", "pyjwt"]
 databases = ["SQLAlchemy", "pyodbc"]
 datadog = ["datadog", "datadog-api-client", "kubernetes"]
 
 [metadata]
 lock-version = "1.1"
 python-versions = "^3.8"
-content-hash = "72b279081c31b9efd733625ccada3258c25fcbf8c2d245c724eb630e2479d3af"
+content-hash = "9b2d9692fb4e926da6ff72c954ce71e47f46680f2a8b43672b02353ce982d22d"
 
 [metadata.files]
 adal = [
@@ -1225,8 +1216,8 @@ azure-common = [
     {file = "azure_common-1.1.28-py2.py3-none-any.whl", hash = "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad"},
 ]
 azure-core = [
-    {file = "azure-core-1.25.0.zip", hash = "sha256:c4a7d0d9e63a70dbde502b5d0cbe58b52244db4fbf247cca6768899e45fa3336"},
-    {file = "azure_core-1.25.0-py3-none-any.whl", hash = "sha256:c26ad5f3612b8a2207cf2be0ef67e478a74acfa450b8d25d778c939921f650dc"},
+    {file = "azure-core-1.25.1.zip", hash = "sha256:3c1cf368650e76ec009c07cd1174a95cdcb471b247bb72d18245f7d56c1809b2"},
+    {file = "azure_core-1.25.1-py3-none-any.whl", hash = "sha256:b0d62e67ec6d47365eebb12c50bc96f7b22d06b359f56ce7f904b095cb46b195"},
 ]
 azure-datalake-store = [
     {file = "azure-datalake-store-0.0.52.tar.gz", hash = "sha256:4198ddb32614d16d4502b43d5c9739f81432b7e0e4d75d30e05149fe6007fea2"},
@@ -1577,7 +1568,7 @@ isort = [
     {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"},
     {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"},
 ]
-json-log-formatter = [
+JSON-log-formatter = [
     {file = "JSON-log-formatter-0.5.1.tar.gz", hash = "sha256:53246bcc5be5452bd46020326c50556ac6d35be20f00733d7235e0ca90d0c5f1"},
 ]
 kubernetes = [
@@ -1851,39 +1842,7 @@ pycparser = [
     {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
     {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
 ]
-pycryptodome = [
-    {file = "pycryptodome-3.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff7ae90e36c1715a54446e7872b76102baa5c63aa980917f4aa45e8c78d1a3ec"},
-    {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2ffd8b31561455453ca9f62cb4c24e6b8d119d6d531087af5f14b64bee2c23e6"},
-    {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2ea63d46157386c5053cfebcdd9bd8e0c8b7b0ac4a0507a027f5174929403884"},
-    {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c9ed8aa31c146bef65d89a1b655f5f4eab5e1120f55fc297713c89c9e56ff0b"},
-    {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:5099c9ca345b2f252f0c28e96904643153bae9258647585e5e6f649bb7a1844a"},
-    {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:2ec709b0a58b539a4f9d33fb8508264c3678d7edb33a68b8906ba914f71e8c13"},
-    {file = "pycryptodome-3.15.0-cp27-cp27m-win32.whl", hash = "sha256:fd2184aae6ee2a944aaa49113e6f5787cdc5e4db1eb8edb1aea914bd75f33a0c"},
-    {file = "pycryptodome-3.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:7e3a8f6ee405b3bd1c4da371b93c31f7027944b2bcce0697022801db93120d83"},
-    {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b9c5b1a1977491533dfd31e01550ee36ae0249d78aae7f632590db833a5012b8"},
-    {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0926f7cc3735033061ef3cf27ed16faad6544b14666410727b31fea85a5b16eb"},
-    {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:2aa55aae81f935a08d5a3c2042eb81741a43e044bd8a81ea7239448ad751f763"},
-    {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c3640deff4197fa064295aaac10ab49a0d55ef3d6a54ae1499c40d646655c89f"},
-    {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:045d75527241d17e6ef13636d845a12e54660aa82e823b3b3341bcf5af03fa79"},
-    {file = "pycryptodome-3.15.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9ee40e2168f1348ae476676a2e938ca80a2f57b14a249d8fe0d3cdf803e5a676"},
-    {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4c3ccad74eeb7b001f3538643c4225eac398c77d617ebb3e57571a897943c667"},
-    {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:1b22bcd9ec55e9c74927f6b1f69843cb256fb5a465088ce62837f793d9ffea88"},
-    {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:57f565acd2f0cf6fb3e1ba553d0cb1f33405ec1f9c5ded9b9a0a5320f2c0bd3d"},
-    {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:4b52cb18b0ad46087caeb37a15e08040f3b4c2d444d58371b6f5d786d95534c2"},
-    {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:092a26e78b73f2530b8bd6b3898e7453ab2f36e42fd85097d705d6aba2ec3e5e"},
-    {file = "pycryptodome-3.15.0-cp35-abi3-win32.whl", hash = "sha256:e244ab85c422260de91cda6379e8e986405b4f13dc97d2876497178707f87fc1"},
-    {file = "pycryptodome-3.15.0-cp35-abi3-win_amd64.whl", hash = "sha256:c77126899c4b9c9827ddf50565e93955cb3996813c18900c16b2ea0474e130e9"},
-    {file = "pycryptodome-3.15.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:9eaadc058106344a566dc51d3d3a758ab07f8edde013712bc8d22032a86b264f"},
-    {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:ff287bcba9fbeb4f1cccc1f2e90a08d691480735a611ee83c80a7d74ad72b9d9"},
-    {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:60b4faae330c3624cc5a546ba9cfd7b8273995a15de94ee4538130d74953ec2e"},
-    {file = "pycryptodome-3.15.0-pp27-pypy_73-win32.whl", hash = "sha256:a8f06611e691c2ce45ca09bbf983e2ff2f8f4f87313609d80c125aff9fad6e7f"},
-    {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b9cc96e274b253e47ad33ae1fccc36ea386f5251a823ccb50593a935db47fdd2"},
-    {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:ecaaef2d21b365d9c5ca8427ffc10cebed9d9102749fd502218c23cb9a05feb5"},
-    {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:d2a39a66057ab191e5c27211a7daf8f0737f23acbf6b3562b25a62df65ffcb7b"},
-    {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:9c772c485b27967514d0df1458b56875f4b6d025566bf27399d0c239ff1b369f"},
-    {file = "pycryptodome-3.15.0.tar.gz", hash = "sha256:9135dddad504592bcc18b0d2d95ce86c3a5ea87ec6447ef25cfedea12d6018b8"},
-]
-pyjwt = [
+PyJWT = [
     {file = "PyJWT-2.4.0-py3-none-any.whl", hash = "sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf"},
     {file = "PyJWT-2.4.0.tar.gz", hash = "sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba"},
 ]
@@ -1949,7 +1908,7 @@ pywin32 = [
     {file = "pywin32-304-cp39-cp39-win32.whl", hash = "sha256:25746d841201fd9f96b648a248f731c1dec851c9a08b8e33da8b56148e4c65cc"},
     {file = "pywin32-304-cp39-cp39-win_amd64.whl", hash = "sha256:d24a3382f013b21aa24a5cfbfad5a2cd9926610c0affde3e8ab5b3d7dbcf4ac9"},
 ]
-pyyaml = [
+PyYAML = [
     {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
     {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
     {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
@@ -2004,7 +1963,7 @@ six = [
     {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
     {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
 ]
-sqlalchemy = [
+SQLAlchemy = [
     {file = "SQLAlchemy-1.4.40-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:b07fc38e6392a65935dc8b486229679142b2ea33c94059366b4d8b56f1e35a97"},
     {file = "SQLAlchemy-1.4.40-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fb4edb6c354eac0fcc07cb91797e142f702532dbb16c1d62839d6eec35f814cf"},
     {file = "SQLAlchemy-1.4.40-cp27-cp27m-win32.whl", hash = "sha256:2026632051a93997cf8f6fda14360f99230be1725b7ab2ef15be205a4b8a5430"},
diff --git a/proteus/connectors/arcane/__init__.py b/proteus/connectors/arcane/__init__.py
deleted file mode 100644
index ac0b7fc7..00000000
--- a/proteus/connectors/arcane/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-"""
- Import index.
-"""
-
-from proteus.connectors.arcane._models import *
-from proteus.connectors.arcane._connector import *
diff --git a/proteus/connectors/arcane/_connector.py b/proteus/connectors/arcane/_connector.py
deleted file mode 100644
index 1e4e01ac..00000000
--- a/proteus/connectors/arcane/_connector.py
+++ /dev/null
@@ -1,158 +0,0 @@
-"""
-  Connector for Arcane Streaming API.
-"""
-import os
-from http.client import HTTPException
-from typing import Optional, List, Dict, Iterable
-
-from requests.auth import HTTPBasicAuth
-
-from proteus.connectors.arcane._models import StreamInfo, StreamState, StreamConfiguration
-from proteus.utils import session_with_retries, doze
-
-
-class ArcaneConnector:
-    """
-      Arcane Streaming API connector
-    """
-
-    def __init__(self, *, base_url, retry_attempts=10):
-        """
-          Creates Arcane Streaming connector, capable of managing Akka streams launched via Arcane.
-
-        :param base_url: Base URL for Arcane Streaming endpoint.
-        :param retry_attempts: Number of retries for Arcane-specific error messages.
-        """
-        self.base_url = base_url
-        self.http = session_with_retries()
-        self.http.auth = HTTPBasicAuth(os.environ.get('ARCANE_USER'), os.environ.get('ARCANE_PASSWORD'))
-        self.retry_attempts = retry_attempts
-
-    def start_stream(self, conf: StreamConfiguration) -> StreamInfo:
-        """
-         Starts a new stream again Sql Server table with change tracking enabled.
-
-        :param conf: Stream configuration
-        :return:
-        """
-        attempts = 0
-        while attempts < self.retry_attempts:
-            request_json = conf.to_dict()
-            submission_result = self.http.post(f"{self.base_url}/stream/{conf.url_path}", json=request_json)
-            submission_json = submission_result.json()
-
-            if submission_result.status_code == 200 and submission_json:
-                print(
-                    f"Stream activated: {submission_json['id']}")
-
-                return StreamInfo.from_dict(submission_json)
-
-            if submission_result.status_code == 503:
-                attempts += 1
-                retry_after_seconds = int(submission_result.headers.get('Retry-After'))
-
-                print(f"Target instance full, will retry in {retry_after_seconds}")
-
-                doze(retry_after_seconds)
-
-                continue
-
-            raise HTTPException(
-                f"Error {submission_result.status_code} when submitting a request: {submission_result.text}")
-
-        raise TimeoutError("Timed out waiting for Arcane to accept the stream start request")
-
-    def get_stream(self, source: str, stream_id: str) -> Optional[StreamInfo]:
-        """
-          Reads information about the specified stream and source.
-
-        :param source: Stream source.
-        :param stream_id: Stream identifier.
-        :return:
-        """
-        info = self.http.get(f"{self.base_url}/stream/info/{source}/{stream_id}")
-        info.raise_for_status()
-
-        return StreamInfo.from_dict(info.json())
-
-    def get_streams_by_tag(self, source: str, tag: str) -> List[StreamInfo]:
-        """
-         Reads streams matching the provided tag.
-
-        :param source: Source for searched streams.
-        :param tag: Tag assigned to streams.
-        :return:
-        """
-        info = self.http.get(f"{self.base_url}/stream/info/{source}/tags/{tag}")
-        info.raise_for_status()
-
-        return [StreamInfo.from_dict(stream_info) for stream_info in info.json()]
-
-    def restart_stream(self, conf: Dict, source: str, stream_id: str) -> Optional[StreamInfo]:
-        """
-          Requests a stream restart with a new configuration.
-
-        :param conf: Stream configuration to apply
-        :param source: Source for this stream.
-        :param stream_id: Stream identifier.
-        :return:
-        """
-        info = self.http.post(f"{self.base_url}/stream/restart/{source}/{stream_id}", json=conf)
-        info.raise_for_status()
-
-        return StreamInfo.from_dict(info.json())
-
-    def stop_stream(self, source: str, stream_id: str) -> Optional[StreamInfo]:
-        """
-          Requests a stream stop.
-
-        :param source: Source for this stream.
-        :param stream_id: Stream identifier.
-        :return:
-        """
-        info = self.http.post(f"{self.base_url}/stream/stop/{source}/{stream_id}")
-        info.raise_for_status()
-
-        return StreamInfo.from_dict(info.json())
-
-    def stop_streams_with_tag(self, source: str, tag: str) -> Iterable[StreamInfo]:
-        """
-          Stops streams with a matching client tag.
-
-        :param source: Stream source.
-        :param tag: Client tag to look for.
-        :return: A list of stopped streams
-        """
-
-        active_streams = [
-            stream for stream in
-            self.get_streams_by_tag(
-                source,
-                tag
-            ) if stream.stream_state == StreamState.RUNNING.value
-        ]
-
-        for active_stream in active_streams:
-            info = self.http.post(f"{self.base_url}/stream/stop/{source}/{active_stream.id}")
-            if info.status_code == 202:
-                yield info.json()
-
-    def transfer_stream(self, source: str, stream_id: str, new_owner: str) -> Optional[StreamInfo]:
-        """
-          Requests a stream transfer to another host.
-
-        :param source: Source for this stream.
-        :param stream_id: Stream identifier.
-        :param new_owner: A new host that should run this stream.
-        :return:
-        """
-
-        transfer_response = self.http.post(f"{self.base_url}/transfer/{source}/{stream_id}/{new_owner}")
-
-        transfer_response.raise_for_status()
-
-        try:
-            return StreamInfo.from_dict(transfer_response.json())
-        except ValueError as ex:
-            print(ex)
-            return None
diff --git a/proteus/connectors/arcane/_models.py b/proteus/connectors/arcane/_models.py
deleted file mode 100644
index aab6ac19..00000000
--- a/proteus/connectors/arcane/_models.py
+++ /dev/null
@@ -1,191 +0,0 @@
-"""
- Models for Arcane
-"""
-from abc import ABC, abstractmethod
-from enum import Enum
-from typing import Dict, Optional
-from dataclasses import dataclass
-
-from dataclasses_json import DataClassJsonMixin, dataclass_json, LetterCase
-
-
-class StreamConfiguration(ABC):
-    """
-     Base configuration for all streams.
-    """
-
-    @abstractmethod
-    def to_dict(self):
-        """
-          Converts this to the payload accepted by streaming start endpoint.
-        :return:
-        """
-
-    @property
-    @abstractmethod
-    def url_path(self):
-        """
-         Url path for streams matching this configuration.
-        :return:
-        """
-
-
-@dataclass
-class SqlServerStreamConfiguration(StreamConfiguration):
-    """
-     Stream configuration for Sql Server Change Tracking Source.
-    """
-    connection_string: str
-    schema: str
-    table: str
-    rows_per_group: int
-    grouping_interval: str
-    groups_per_file: int
-    sink_location: str
-    sink_filename: str
-    full_load_on_start: bool
-    client_tag: str
-    lookback_interval: int = 86400
-    change_capture_interval: str = "0.00:00:15"
-    command_timeout: int = 3600
-
-    @property
-    def url_path(self) -> str:
-        return "start/sqlserverct"
-
-    def to_dict(self) -> Dict:
-        return {
-            "ConnectionString": self.connection_string,
-            "Schema": self.schema,
-            "Table": self.table,
-            "RowsPerGroup": self.rows_per_group,
-            "GroupingInterval": self.grouping_interval,
-            "GroupsPerFile": self.groups_per_file,
-            "SinkLocation": self.sink_location,
-            "SinkFileName": self.sink_filename,
-            "FullLoadOnStart": self.full_load_on_start,
-            "ClientTag": self.client_tag,
-            "LookbackInterval": self.lookback_interval,
-            "ChangeCaptureInterval": self.change_capture_interval,
-            "CommandTimeout": self.command_timeout
-        }
-
-
-@dataclass
-class CdmChangeFeedStreamConfiguration(StreamConfiguration):
-    """
-     Stream configuration for Sql Server Change Tracking Source.
-    """
-    storage_account_connection_string: str
-    base_location: str
-    entity_name: str
-    rows_per_group: int
-    grouping_interval: str
-    groups_per_file: int
-    sink_location: str
-    sink_filename: str
-    full_load_on_start: bool
-    client_tag: str
-    http_client_max_retries: int = 3
-    http_client_retry_delay: str = "0.00:00:01"
-    change_capture_interval: str = "0.00:00:15"
-
-    @property
-    def url_path(self) -> str:
-        return "start/microsoft_cdm"
-
-    def to_dict(self) -> Dict:
-        return {
-            "StorageAccountConnectionString": self.storage_account_connection_string,
-            "HttpClientMaxRetries": self.http_client_max_retries,
-            "HttpClientRetryDelay": self.http_client_retry_delay,
-            "BaseLocation": self.base_location,
-            "EntityName": self.entity_name,
-            "FullLoadOnStart": self.full_load_on_start,
-            "ChangeCaptureInterval": self.change_capture_interval,
-            "RowsPerGroup": self.rows_per_group,
-            "GroupingInterval": self.grouping_interval,
-            "GroupsPerFile": self.groups_per_file,
-            "SinkLocation": self.sink_location,
-            "SinkFileName": self.sink_filename,
-            "ClientTag": self.client_tag
-        }
-
-
-@dataclass
-class BigQueryStreamConfiguration(StreamConfiguration):
-    """
-     Stream configuration for Sql Server Change Tracking Source.
-    """
-    project: str
-    dataset: str
-    table: str
-    entity_name: str
-    secret: str
-    partition_column_name: str
-    change_capture_interval: str
-    lookback_interval: str
-    full_load_on_start: str
-    sink_location: str
-    partition_column_name_format: str
-    client_tag: str
-
-    @property
-    def url_path(self) -> str:
-        return "start/bigquery"
-
-    def to_dict(self) -> Dict:
-        return {
-            "Project": self.project,
-            "Dataset": self.dataset,
-            "Table": self.table,
-            "EntityName": self.entity_name,
-            "Secret": self.secret,
-            "PartitionColumnName": self.partition_column_name,
-            "ChangeCaptureInterval": self.change_capture_interval,
-            "LookbackInterval": self.lookback_interval,
-            "FullLoadOnStart": self.full_load_on_start,
-            "SinkLocation": self.sink_location,
-            "PartitionColumnNameFormat": self.partition_column_name_format,
-            "ClientTag": self.client_tag
-        }
-
-
-@dataclass_json(letter_case=LetterCase.CAMEL)
-@dataclass
-class StreamError(DataClassJsonMixin):
-    """
-     Arcane stream failure information.
-    """
-    error_type: str
-    error_message: str
-    error_stack: str
-
-
-@dataclass_json(letter_case=LetterCase.CAMEL)
-@dataclass
-class StreamInfo(DataClassJsonMixin):
-    """
-      Arcane stream information.
-    """
-    id: str  # pylint: disable=C0103
-    stream_source: str
-    started_at: str
-    owner: str
-    tag: str
-    stream_configuration: str
-    stream_metadata: str
-    stream_state: str
-    error: StreamError
-    stopped_at: Optional[str] = None
-
-
-class StreamState(Enum):
-    """
-     Stream states in Arcane.
-    """
-    RUNNING = 'RUNNING'
-    STOPPED = 'STOPPED'
-    TERMINATING = 'TERMINATING'
-    RESTARTING = 'RESTARTING'
-    FAILED = 'FAILED'
diff --git a/proteus/connectors/beast/__init__.py b/proteus/connectors/beast/__init__.py
deleted file mode 100644
index 16f91e71..00000000
--- a/proteus/connectors/beast/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-"""init file"""
-
-from proteus.connectors.beast._connector import BeastConnector
-from proteus.connectors.beast._models import *
diff --git a/proteus/connectors/beast/_auth.py b/proteus/connectors/beast/_auth.py
deleted file mode 100644
index 70562626..00000000
--- a/proteus/connectors/beast/_auth.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""
- Beast Auth class
- Based on https://docs.python-requests.org/en/master/user/advanced/#custom-authentication
-"""
-from datetime import datetime
-from typing import Optional
-
-from requests.auth import AuthBase
-
-from azure.identity import DefaultAzureCredential
-
-
-class BeastAuth(AuthBase):
-    """Attaches HTTP Bearer Authentication to the given Request object sent to Beast"""
-
-    def __init__(self, token_cache: Optional[list] = None, token_lifetime=3600):
-        # setup any auth-related data here
-        self.cache = token_cache or []
-        self.token_lifetime = token_lifetime
-
-    def _fetch_token(self) -> str:
-        """
-          Fetches a token from the cloud
-
-        :return:
-        """
-        credential = DefaultAzureCredential(exclude_shared_token_cache_credential=True)
-        token: str = credential.get_token("https://management.core.windows.net/.default").token
-        self.cache.append((token, datetime.utcnow()))
-
-        return token
-
-    def _fetch_cached_token(self) -> Optional[str]:
-        """
-          Fetches a token from in-memory cache, if not expired
-
-        :return:
-        """
-        if self.cache:
-            valid_tokens = [(token, created_at) for token, created_at in self.cache if
-                            (datetime.utcnow() - created_at).seconds < self.token_lifetime]
-            if valid_tokens:
-                return valid_tokens[0][0]
-
-            self.cache.clear()
-            return None
-
-        return None
-
-    def __call__(self, r):
-        """
-          Auth entrypoint
-
-        :param r: Request to authorize
-        :return: Request with Auth header set
-        """
-        cached_token = self._fetch_cached_token()
-        if cached_token:
-            r.headers['Authorization'] = f"Bearer {cached_token}"
-        else:
-            r.headers['Authorization'] = f"Bearer {self._fetch_token()}"
-
-        return r
diff --git a/proteus/connectors/beast/_connector.py b/proteus/connectors/beast/_connector.py
deleted file mode 100644
index e5265bcb..00000000
--- a/proteus/connectors/beast/_connector.py
+++ /dev/null
@@ -1,177 +0,0 @@
-"""
-  Connector for Beast Workload Manager (Spark AKS)
-"""
-import json
-from http.client import HTTPException
-from typing import Optional
-
-from proteus.connectors.beast._auth import BeastAuth
-from proteus.connectors.beast._models import JobRequest, BeastJobParams
-from proteus.utils import doze, session_with_retries
-
-
-class BeastConnector:
-    """
-      Beast API connector
-    """
-
-    __SUPPORTED_BEAST_RELEASE__ = "1.2.*"
-
-    def __init__(self, *, base_url, code_root="/ecco/dist", lifecycle_check_interval: int = 60,
-                 failure_type: Optional[Exception] = None):
-        """
-          Creates a Beast connector, capable of submitting/status tracking etc.
-
-        :param base_url: Base URL for Beast Workload Manager.
-        :param code_root: Root folder for code deployments.
-        :param lifecycle_check_interval: Time to wait between lifecycle checks for submissions/cancellations etc.
-        """
-        self.base_url = base_url
-        self.code_root = code_root
-        self.lifecycle_check_interval = lifecycle_check_interval
-        self.failed_stages = ["FAILED", "SCHEDULING_FAILED", "RETRIES_EXCEEDED", "SUBMISSION_FAILED", "STALE"]
-        self.success_stages = ["COMPLETED"]
-        self.http = session_with_retries()
-        self.http.auth = BeastAuth()
-        self._failure_type = failure_type or Exception
-
-    @staticmethod
-    def redact_sensitive(json_str: str) -> str:
-        """
-          Redacts sensitive info when preparing a request to be printed
-
-        :param json_str: Serialized JobRequest to print
-        :return:
-        """
-        request_json = json.loads(json_str)
-
-        for arg_key, _ in request_json['extraArgs'].items():
-            if 'password' in arg_key or 'secret' in arg_key:
-                request_json['extraArgs'][arg_key] = '***'
-        return json.dumps(request_json)
-
-    def _submit(self, request: JobRequest) -> (str, str):
-        request_json = request.to_json()
-
-        print(f"Submitting request: {self.redact_sensitive(json.dumps(request_json))}")
-
-        submission_result = self.http.post(f"{self.base_url}/job/submit", json=request_json)
-        submission_json = submission_result.json()
-
-        if submission_result.status_code == 202 and submission_json:
-            print(
-                f"Beast has accepted the request, stage: {submission_json['lifeCycleStage']}, id: {submission_json['id']}")
-        else:
-            raise HTTPException(
-                f"Error {submission_result.status_code} when submitting a request: {submission_result.text}")
-
-        return submission_json['id'], submission_json['lifeCycleStage']
-
-    def _existing_submission(self, submitted_tag: str, project: str) -> (Optional[str], Optional[str]):
-        print(f"Looking for existing submissions of {submitted_tag}")
-
-        existing_submissions = self.http.get(f"{self.base_url}/job/requests/{project}/tags/{submitted_tag}").json()
-
-        if len(existing_submissions) == 0:
-            print(f"No previous submissions found for {submitted_tag}")
-            return None, None
-
-        running_submissions = []
-        for submission_request_id in existing_submissions:
-            submission_lifecycle = self.http.get(
-                f"{self.base_url}/job/requests/{submission_request_id}").json()['lifeCycleStage']
-            if submission_lifecycle not in self.success_stages and submission_lifecycle not in self.failed_stages:
-                print(f"Found a running submission of {submitted_tag}: {submission_request_id}.")
-                running_submissions.append((submission_request_id, submission_lifecycle))
-
-        if len(running_submissions) == 0:
-            print("None of found submissions are active")
-            return None, None
-
-        if len(running_submissions) == 1:
-            return running_submissions[0][0], running_submissions[0][1]
-
-        raise self._failure_type(
-            f"Fatal: more than one submission of {submitted_tag} is running: {running_submissions}. Please review their status restart/terminate the task accordingly")
-
-    def run_job(self, job_params: BeastJobParams):
-        """
-          Runs a job through Beast
-
-        :param job_params: Parameters for Beast Job body.
-        :return: A JobRequest for Beast.
-        """
-
-        (request_id, request_lifecycle) = self._existing_submission(submitted_tag=job_params.client_tag,
-                                                                    project=job_params.project_name)
-
-        if request_id:
-            print(f"Resuming watch for {request_id}")
-
-        if not request_id:
-            prepared_arguments = {key: str(value) for (key, value) in job_params.extra_arguments.items()}
-
-            submit_request = JobRequest(
-                root_path=self.code_root,
-                project_name=job_params.project_name,
-                runnable=job_params.project_runnable,
-                version=job_params.project_version,
-                inputs=job_params.project_inputs,
-                outputs=job_params.project_outputs,
-                overwrite=job_params.overwrite_outputs,
-                extra_args=prepared_arguments,
-                client_tag=job_params.client_tag,
-                cost_optimized=job_params.cost_optimized,
-                job_size=job_params.size_hint,
-                flexible_driver=job_params.flexible_driver,
-                max_runtime_hours=job_params.max_runtime_hours,
-                runtime_tags=job_params.runtime_tags,
-                execution_group=job_params.execution_group
-            )
-
-            (request_id, request_lifecycle) = self._submit(submit_request)
-
-        while request_lifecycle not in self.success_stages and request_lifecycle not in self.failed_stages:
-            doze(self.lifecycle_check_interval)
-            request_lifecycle = self.http.get(f"{self.base_url}/job/requests/{request_id}").json()['lifeCycleStage']
-            print(f"Request: {request_id}, current state: {request_lifecycle}")
-
-        if request_lifecycle in self.failed_stages:
-            raise self._failure_type(
-                f"Execution failed, please find request's log at: {self.base_url}/job/logs/{request_id}")
-
-    def start_job(self, job_params: BeastJobParams) -> Optional[str]:
-        """
-          Starts a job through Beast.
-
-        :param job_params: Parameters for Beast Job body.
-        :return: A JobRequest for Beast.
-        """
-
-        (request_id, _) = self._existing_submission(submitted_tag=job_params.client_tag,
-                                                    project=job_params.project_name)
-
-        if not request_id:
-            prepared_arguments = {key: str(value) for (key, value) in job_params.extra_arguments.items()}
-
-            submit_request = JobRequest(
-                root_path=self.code_root,
-                project_name=job_params.project_name,
-                runnable=job_params.project_runnable,
-                version=job_params.project_version,
-                inputs=job_params.project_inputs,
-                outputs=job_params.project_outputs,
-                overwrite=job_params.overwrite_outputs,
-                extra_args=prepared_arguments,
-                client_tag=job_params.client_tag,
-                cost_optimized=job_params.cost_optimized,
-                job_size=job_params.size_hint,
-                flexible_driver=job_params.flexible_driver,
-                max_runtime_hours=job_params.max_runtime_hours,
-                runtime_tags=job_params.runtime_tags,
-                execution_group=job_params.execution_group
-            )
-
-            request_id, _ = self._submit(submit_request)
-
-        return request_id
diff --git a/proteus/connectors/beast/_models.py b/proteus/connectors/beast/_models.py
deleted file mode 100644
index 2ae31374..00000000
--- a/proteus/connectors/beast/_models.py
+++ /dev/null
@@ -1,245 +0,0 @@
-"""
-  Models for Beast connector
-"""
-import os
-from dataclasses import dataclass, field
-from enum import Enum, auto
-from typing import List, Dict, Optional, Union
-from warnings import warn
-
-from cryptography.fernet import Fernet
-
-
-@dataclass
-class JobSocket:
-    """
-     Input/Output data map
-
-     Attributes:
-         alias: mapping key to be used by a consumer
-         data_path: fully qualified path to actual data, i.e. abfss://..., s3://... etc.
-         data_format: data format, i.e. csv, json, delta etc.
-    """
-    alias: str
-    data_path: str
-    data_format: str
-
-    def to_utils_format(self) -> str:
-        """Serializes JobSocket to string"""
-        warn('This method is deprecated. Use serialize method instead', DeprecationWarning)
-        return self.serialize()
-
-    def serialize(self) -> str:
-        """Serializes JobSocket to string"""
-        return f"{self.alias}|{self.data_path}|{self.data_format}"
-
-    @classmethod
-    def deserialize(cls, job_socket: str) -> 'JobSocket':
-        """Deserializes JobSocket from string"""
-        vals = job_socket.split('|')
-        return cls(alias=vals[0], data_path=vals[1], data_format=vals[2])
-
-    @staticmethod
-    def from_list(sockets: List['JobSocket'], alias: str) -> 'JobSocket':
-        """Fetches a job socket from list of sockets.
-        :param sockets: List of sockets
-        :param alias: Alias to look up
-
-        :returns: Socket with alias 'alias'
-        """
-        socket = [s for s in sockets if s.alias == alias]
-
-        if len(socket) > 1:
-            raise ValueError(f'Multiple job sockets exist with alias {alias}')
-        if len(socket) == 0:
-            raise ValueError(f'No job sockets exist with alias {alias}')
-        return socket[0]
-
-
-class JobSize(Enum):
-    """
-      Job size hints for Beast.
-
-      TINY - jobs running DDL or hive imports or any tiny workload. Should receive minimum allowed resources (1 core, 1g ram per executor)
-      SMALL - small workloads, one or 30% pod cores, 30% pod memory per executor
-      MEDIUM - medium workloads, one or 30% pod cores, 50% pod memory per executor
-      LARGE - large workloads, one or 30% pod cores, all available executor memory
-      XLARGE - extra large workload, two or 60% pod cores, all available executor memory
-      XXLARGE - x-extra large workloads, all available cores, all available memory
-    """
-    TINY = auto()
-    SMALL = auto()
-    MEDIUM = auto()
-    LARGE = auto()
-    XLARGE = auto()
-    XXLARGE = auto()
-
-
-@dataclass
-class JobRequest:
-    """
-     Request body for a Beast submission
-    """
-    root_path: str
-    project_name: str
-    version: str
-    runnable: str
-    inputs: List[JobSocket]
-    outputs: List[JobSocket]
-    overwrite: bool
-    extra_args: Dict[str, str]
-    client_tag: str
-    cost_optimized: Optional[bool]
-    job_size: Optional[JobSize]
-    execution_group: Optional[str]
-    flexible_driver: Optional[bool]
-    max_runtime_hours: Optional[int]
-    runtime_tags: Optional[Dict[str, str]]
-
-    def to_json(self) -> Dict:
-        """
-         Converts this to POST body sent to Beast.
-        :return:
-        """
-        base_request = {
-            "rootPath": self.root_path,
-            "projectName": self.project_name,
-            "version": self.version,
-            "runnable": self.runnable,
-            "inputs": list(map(lambda js: {
-                "alias": js.alias,
-                "dataPath": js.data_path,
-                "dataFormat": js.data_format
-            }, self.inputs)),
-            "outputs": list(map(lambda js: {
-                "alias": js.alias,
-                "dataPath": js.data_path,
-                "dataFormat": js.data_format
-            }, self.outputs)),
-            "overwrite": self.overwrite,
-            "extraArgs": self.extra_args,
-            "clientTag": self.client_tag
-        }
-
-        if self.cost_optimized:
-            base_request.setdefault("costOptimized", self.cost_optimized)
-
-        if self.job_size:
-            base_request.setdefault("jobSize", self.job_size.name)
-
-        if self.flexible_driver:
-            base_request.setdefault("flexibleDriver", self.flexible_driver)
-
-        if self.max_runtime_hours:
-            base_request.setdefault("maxRuntimeHours", str(self.max_runtime_hours))
-
-        if self.runtime_tags:
-            base_request.setdefault("runtimeTags", self.runtime_tags)
-
-        if self.execution_group:
-            base_request.setdefault('executionGroup', self.execution_group)
-
-        return base_request
-
-
-class ArgumentValue:
-    """
-      Wrapper around job argument value. Supports fernet encryption.
-    """
-
-    def __init__(self, *, value: str, encrypt=False, quote=False, is_env=False):
-        """
-          Initializes a new ArgumentValue
-
-        :param value: Plain text value.
-        :param encrypt: If set to True, value will be replaced with a fernet-encrypted value.
-        :param quote: Whether a value should be quoted when it is stringified.
-        :param is_env: whether value should be derived from env instead, using value as var name.
-        """
-        self._is_env = is_env
-        self._encrypt = encrypt
-        self._quote = quote
-        self._value = value
-
-    @property
-    def value(self):
-        """
-          Returns the wrapped value
-
-        :return:
-        """
-        if self._is_env:
-            result = os.getenv(self._value)
-        else:
-            result = self._value
-
-        if self._encrypt:
-            result = self._encrypt_value(result)
-
-        return result
-
-    @staticmethod
-    def _encrypt_value(value: str) -> str:
-        """
-          Encrypts a provided string
-
-        :param value: payload to decrypt
-        :return: Encrypted payload
-        """
-        encryption_key = os.environ.get('RUNTIME_ENCRYPTION_KEY', None).encode('utf-8')
-
-        if not encryption_key:
-            raise ValueError(
-                'Encryption key not found, but a value is set to be encrypted. Either disable encryption or map RUNTIME_ENCRYPTION_KEY on this container from airflow secrets.')
-
-        fernet = Fernet(encryption_key)
-        return fernet.encrypt(value.encode('utf-8')).decode('utf-8')
-
-    def __str__(self):
-        """
-         Stringifies the value and optionally wraps it in quotes.
-
-        :return:
-        """
-        if self._quote:
-            return f"'{str(self.value)}'"
-
-        return self.value
-
-
-@dataclass
-class BeastJobParams:
-    """
-     Parameters for Beast jobs.
-    """
-    project_name: str = field(metadata={
-        'description': 'Repository name that contains a runnable. Must be deployed to a Beast-managed cluster beforehand.'})
-    project_version: str = field(metadata={
-        'description': 'Semantic version of a runnable.'})
-    project_runnable: str = field(metadata={
-        'description': 'Path to a runnable, for example src/folder1/my_script.py.'})
-    project_inputs: List[JobSocket] = field(metadata={
-        'description': 'List of job inputs.'})
-    project_outputs: List[JobSocket] = field(metadata={
-        'description': 'List of job outputs.'})
-    overwrite_outputs: bool = field(metadata={
-        'description': 'Whether to wipe existing data before writing new out.'})
-    extra_arguments: Dict[str, Union[ArgumentValue, str]] = field(metadata={
-        'description': 'Extra arguments for a submission, defined by an author.'})
-    client_tag: str = field(metadata={
-        'description': 'Client-assigned identifier for this request'
-    })
-    size_hint: Optional[JobSize] = field(metadata={
-        'description': 'Job size hint for Beast.'}, default=JobSize.SMALL)
-    execution_group: Optional[str] = field(metadata={
-        'description': 'Spark scheduler pool that should be used for this request'}, default=None)
-    cost_optimized: Optional[bool] = field(metadata={
-        'description': 'Job will run on a discounted workload (spot capacity).'}, default=True)
-    flexible_driver: Optional[bool] = field(metadata={
-        'description': 'Whether to use fixed-size driver or derive driver memory from master node max memory.'},
-        default=False)
-    max_runtime_hours: Optional[int] = field(metadata={
-        'description': 'Sets maximum allowed job run duration. Server-side default is 12 hours'}, default=None)
-    runtime_tags: Optional[Dict[str, str]] = field(metadata={
-        'description': 'Limits available runtimes to provided tags'
-    }, default=None)
diff --git a/proteus/connectors/boxer/README.md b/proteus/connectors/boxer/README.md
deleted file mode 100644
index 95405550..00000000
--- a/proteus/connectors/boxer/README.md
+++ /dev/null
@@ -1,70 +0,0 @@
-# Boxer API Connector
-
-Conenctor for working with [Boxer](https://github.com/SneaksAndData/boxer) AuthZ/AuthN API. 
-
-## Usage
-
-Two environment variables must be set before you can use this connector:
-
-```shell
-export BOXER_CONSUMER_ID="my_app_consumer"
-export BOXER_PRIVATE_KEY="MIIEpAIBAA..."
-```
-
-### Retrieving User Claims:
-
-```python
-from proteus.connectors.boxer._connector import BoxerConnector
-conn = BoxerConnector(base_url="https://boxer.test.sneaksanddata.com")
-claims = conn.get_claims_by_user("user@domain.tld")
-for claim in claims:
-    print(claim.to_dict())
-```
-
-### Retrieving Claims by Type:
-
-```python
-from proteus.connectors.boxer._connector import BoxerConnector
-conn = BoxerConnector(base_url="https://boxer.test.sneaksanddata.com")
-claims = conn.get_claims_by_type("App1.AccessPolicy")
-```
-
-### Retrieving Group Claims:
-
-```python
-from proteus.connectors.boxer._connector import BoxerConnector
-conn = BoxerConnector(base_url="https://boxer.test.sneaksanddata.com")
-claims = conn.get_claims_by_group("ad_group_name")
-```
-
-### Setting a user claim:
-```python
-from proteus.connectors.boxer._connector import BoxerConnector
-from proteus.connectors.boxer._models import BoxerClaim
-claim = BoxerClaim(issuer="App1", claim_type="App1.CanManageConsumers", claim_value="true")
-conn = BoxerConnector(base_url="https://boxer.test.sneaksanddata.com")
-conn.push_user_claim(claim, "app1admin")
-```
-
-### Setting a group claim:
-```python
-from proteus.connectors.boxer._connector import BoxerConnector
-from proteus.connectors.boxer._models import BoxerClaim
-claim = BoxerClaim(issuer="App1", claim_type="App1.CanManageConsumers", claim_value="true")
-conn = BoxerConnector(base_url="https://boxer.test.sneaksanddata.com")
-conn.push_group_claim(claim, "ad_group_name")
-```
-
-### Creating a new Auth Consumer (obtaining private key):
-```python
-from proteus.connectors.boxer._connector import BoxerConnector
-conn = BoxerConnector(base_url="https://boxer.test.sneaksanddata.com")
-priv_key = conn.create_consumer("app_consumer")
-```
-
-### Getting Consumer's public key:
-```python
-from proteus.connectors.boxer._connector import BoxerConnector
-conn = BoxerConnector(base_url="https://boxer.test.sneaksanddata.com")
-pub_key = conn.get_consumer_public_key("app_consumer")
-```
diff --git a/proteus/connectors/boxer/__init__.py b/proteus/connectors/boxer/__init__.py
deleted file mode 100644
index ac0b7fc7..00000000
--- a/proteus/connectors/boxer/__init__.py
+++ /dev/null
@@ -1,6 +0,0 @@
-"""
- Import index.
-"""
-
-from proteus.connectors.arcane._models import *
-from proteus.connectors.arcane._connector import *
diff --git a/proteus/connectors/boxer/_auth.py b/proteus/connectors/boxer/_auth.py
deleted file mode 100644
index 6c6c0491..00000000
--- a/proteus/connectors/boxer/_auth.py
+++ /dev/null
@@ -1,52 +0,0 @@
-"""
- Boxer Auth class
- Based on https://docs.python-requests.org/en/master/user/advanced/#custom-authentication
-"""
-import base64
-
-from requests.auth import AuthBase
-from Crypto.PublicKey import RSA
-from Crypto.Signature.PKCS1_v1_5 import new as signature_factory
-from Crypto.Hash.SHA256 import new as sha256_get_instance
-
-
-class BoxerAuth(AuthBase):
-    """Attaches HTTP Bearer Authentication to the given Request object sent to Boxer"""
-
-    def __init__(self, *, private_key_base64: str, consumer_id: str):
-        # setup any auth-related data here
-        self._sign_key = private_key_base64
-        self._consumer_id = consumer_id
-
-    def _sign_string(self, input_string: str) -> str:
-        """
-          Signs input for Boxer
-
-        :param input_string: input to generate signature for
-        :return:
-        """
-        msg_bytes = input_string.encode('utf-8')
-        digest = sha256_get_instance()
-
-        private_key_bytes = base64.b64decode(self._sign_key)
-        rsa_key = RSA.importKey(private_key_bytes, '')
-        signer = signature_factory(rsa_key)
-
-        digest.update(msg_bytes)
-        signed = signer.sign(digest)
-        return base64.b64encode(signed).decode('utf-8')
-
-    def __call__(self, r):
-        """
-          Auth entrypoint
-
-        :param r: Request to authorize
-        :return: Request with Auth header set
-        """
-        payload = r.url.replace('https://', '').split('?')[0]
-        signature_base64 = self._sign_string(payload)
-        r.headers['Authorization'] = f"Signature {signature_base64}"
-        r.headers['X-Boxer-ConsumerId'] = self._consumer_id
-        r.headers['X-Boxer-Payload'] = payload
-
-        return r
diff --git a/proteus/connectors/boxer/_connector.py b/proteus/connectors/boxer/_connector.py
deleted file mode 100644
index 273eb8c2..00000000
--- a/proteus/connectors/boxer/_connector.py
+++ /dev/null
@@ -1,117 +0,0 @@
-"""
-  Connector for Boxer Auth API.
-"""
-import os
-from typing import Iterator
-
-import jwt
-from proteus.connectors.boxer._auth import BoxerAuth
-from proteus.connectors.boxer._helpers import (_iterate_user_claims_response,
-                                               _iterate_boxer_claims_response)
-from proteus.connectors.boxer._models import BoxerClaim, UserClaim
-from proteus.utils import session_with_retries
-
-
-class BoxerConnector:
-    """
-      Boxer Auth API connector
-    """
-
-    def __init__(self, *, base_url, retry_attempts=10):
-        """ Creates Boxer Auth connector, capable of managing claims/consumers
-        :param base_url: Base URL for Boxer Auth endpoint
-        :param retry_attempts: Number of retries for Boxer-specific error messages
-        """
-        self.base_url = base_url
-        self.http = session_with_retries()
-        assert os.environ.get('BOXER_CONSUMER_ID'), "Environment BOXER_CONSUMER_ID not set"
-        assert os.environ.get('BOXER_PRIVATE_KEY'), "Environment BOXER_PRIVATE_KEY not set"
-        self.http.auth = BoxerAuth(private_key_base64=os.environ.get('BOXER_PRIVATE_KEY'),
-                                   consumer_id=os.environ.get('BOXER_CONSUMER_ID'))
-        self.retry_attempts = retry_attempts
-
-    def push_user_claim(self, claim: BoxerClaim, user_id: str):
-        """ Adds/Overwrites a new Boxer Claim to a user
-        :param claim: Boxer Claim
-        :param user_id: User's UPN
-        :return:
-        """
-        target_url = f"{self.base_url}/claims/user/{user_id}"
-        claim_json = claim.to_dict()
-        response = self.http.post(target_url, json=claim_json)
-        response.raise_for_status()
-        print(f"Successfully pushed user claim for user {user_id}")
-
-    def push_group_claim(self, claim: BoxerClaim, group_name: str):
-        """ Adds/Overwrites a new Boxer Claim to a user
-        :param claim: Boxer Claim
-        :param group_name: Group Name
-        :return:
-        """
-        target_url = f"{self.base_url}/claims/group/{group_name}"
-        claim_json = claim.to_dict()
-        response = self.http.post(target_url, json=claim_json)
-        response.raise_for_status()
-        print(f"Successfully pushed user claim for group {group_name}")
-
-    def get_claims_by_type(self, claims_type: str) -> Iterator[UserClaim]:
-        """Reads claims of specified type from Boxer.
-        :param claims_type: claim type to filter claims by.
-        :return: Iterator[UserClaim]
-        """
-        target_url = f"{self.base_url}/claims/type/{claims_type}"
-        response = self.http.get(target_url)
-        response.raise_for_status()
-        return _iterate_user_claims_response(response)
-
-    def get_claims_by_user(self, user_id: str) -> Iterator[BoxerClaim]:
-        """ Reads user claims from Boxer
-        :param user_id: user upn to load claims for
-        :return: Iterator[UserClaim]
-        """
-        empty_user_token = jwt.encode({"upn": user_id}, "_", algorithm="HS256")
-        target_url = f"{self.base_url}/claims/user/{empty_user_token}"
-        response = self.http.get(target_url)
-        response.raise_for_status()
-        return _iterate_boxer_claims_response(response)
-
-    def get_claims_by_group(self, group_name: str) -> Iterator[BoxerClaim]:
-        """ Reads group claims from Boxer
-        :param group_name: group name to load claims for
-        :return: Iterator[UserClaim]
-        """
-        target_url = f"{self.base_url}/claims/group/{group_name}"
-        response = self.http.get(target_url)
-        response.raise_for_status()
-        return _iterate_boxer_claims_response(response)
-
-    def get_claims_for_token(self, jwt_token: str) -> Iterator[BoxerClaim]:
-        """ Reads user claims from Boxer based on jwt token
-        :param jwt_token: jwt token with UPN set
-        :return: Iterator[UserClaim]
-        """
-        target_url = f"{self.base_url}/claims/user/{jwt_token}"
-        response = self.http.get(target_url)
-        response.raise_for_status()
-        return _iterate_boxer_claims_response(response)
-
-    def create_consumer(self, consumer_id: str, overwrite: bool = False) -> str:
-        """ Adds/Overwrites a new Boxer Claim to a user
-        :param consumer_id: Consumer ID of new consumer
-        :param overwrite: Flag to overwrite if consumer with given consumer_id already exists
-        :return: New consumer's private key (Base64 Encoded)
-        """
-        target_url = f"{self.base_url}/consumer/{consumer_id}?overwrite={overwrite}"
-        response = self.http.post(target_url, json={})
-        response.raise_for_status()
-        return response.text
-
-    def get_consumer_public_key(self, consumer_id: str) -> str:
-        """ Reads Consumer's public key
-        :param consumer_id: Boxer Claim
-        :return: public key (Base64 Encoded)
-        """
-        target_url = f"{self.base_url}/consumer/publicKey/{consumer_id}"
-        response = self.http.get(target_url, json={})
-        response.raise_for_status()
-        return response.text
diff --git a/proteus/connectors/boxer/_helpers.py b/proteus/connectors/boxer/_helpers.py
deleted file mode 100644
index 4bcd0a30..00000000
--- a/proteus/connectors/boxer/_helpers.py
+++ /dev/null
@@ -1,30 +0,0 @@
-""" Helper functions to parse responses
-"""
-from requests import Response
-
-from proteus.connectors.boxer._models import UserClaim, BoxerClaim
-
-
-def _iterate_user_claims_response(user_claim_response: Response):
-    """ Creates an iterator to iterate user claims from Json Response
-    :param user_claim_response: HTTP Response containing json array of type UserClaim
-    """
-    response_json = user_claim_response.json()
-
-    if response_json:
-        for api_response_item in response_json:
-            yield UserClaim.from_dict(api_response_item)
-    else:
-        raise ValueError('Expected response body of type application/json')
-
-def _iterate_boxer_claims_response(boxer_claim_response: Response):
-    """ Creates an iterator to iterate user claims from Json Response
-    :param boxer_claim_response: HTTP Response containing json array of type BoxerClaim
-    """
-    response_json = boxer_claim_response.json()
-
-    if response_json:
-        for api_response_item in response_json:
-            yield BoxerClaim.from_dict(api_response_item)
-    else:
-        raise ValueError('Expected response body of type application/json')
diff --git a/proteus/connectors/boxer/_models.py b/proteus/connectors/boxer/_models.py
deleted file mode 100644
index 54fd69fb..00000000
--- a/proteus/connectors/boxer/_models.py
+++ /dev/null
@@ -1,99 +0,0 @@
-"""
- Models for Boxer
-"""
-from dataclasses import dataclass
-from typing import Dict
-
-
-@dataclass
-class BoxerClaim:
-    """
-     Boxer Claim
-    """
-    claim_type: str
-    claim_value: str
-    issuer: str
-
-    def to_dict(self) -> Dict:
-        """ Convert to Dictionary
-        :return: Dictionary
-        """
-        return {
-            "claimType": self.claim_type,
-            "claimValue": self.claim_value,
-            "issuer": self.issuer
-        }
-
-    @classmethod
-    def from_dict(cls, json_data: Dict):
-        """ Initialize from Dictionary
-        :param json_data: Dictionary
-        :return:
-        """
-        return BoxerClaim(
-            claim_type=json_data['claimType'],
-            claim_value=json_data['claimValue'],
-            issuer=json_data['issuer']
-        )
-
-@dataclass
-class UserClaim:
-    """
-     Boxer User Claim
-    """
-    user_id: str
-    user_claim_id: str
-    claim: BoxerClaim
-
-    def to_dict(self) -> Dict:
-        """ Convert to Dictionary
-        :return: Dictionary
-        """
-        return {
-            "userId": self.user_id,
-            "userClaimId": self.user_claim_id,
-            "claim": self.claim.to_dict()
-        }
-
-    @classmethod
-    def from_dict(cls, json_data: Dict):
-        """ Initialize from Dictionary
-        :param json_data: Dictionary
-        :return:
-        """
-        return UserClaim(
-            user_id=json_data['userId'],
-            user_claim_id=json_data['userClaimId'],
-            claim=BoxerClaim.from_dict(json_data['claim'])
-        )
-
-@dataclass
-class GroupClaim:
-    """
-     Boxer Group Claim
-    """
-    group_name: str
-    group_claim_id: str
-    claim: BoxerClaim
-
-    def to_dict(self) -> Dict:
-        """ Convert to Dictionary
-        :return: Dictionary
-        """
-        return {
-            "groupName": self.group_name,
-            "groupClaimId": self.group_claim_id,
-            "claim": self.claim.to_dict()
-        }
-
-    @classmethod
-    def from_dict(cls, json_data: Dict):
-        """ Initialize from Dictionary
-        :param json_data: Dictionary
-        :return:
-        """
-        return GroupClaim(
-            group_name=json_data['groupName'],
-            group_claim_id=json_data['groupClaimId'],
-            claim=BoxerClaim.from_dict(json_data['claim'])
-        )
diff --git a/proteus/connectors/crystal/__init__.py b/proteus/connectors/crystal/__init__.py
deleted file mode 100644
index 12bebc6a..00000000
--- a/proteus/connectors/crystal/__init__.py
+++ /dev/null
@@ -1,4 +0,0 @@
-"""init file"""
-
-from proteus.connectors.crystal._connector import CrystalConnector
-from proteus.connectors.crystal._models import AlgorithmRunResult, RequestLifeCycleStage, RequestResult
diff --git a/proteus/connectors/crystal/_connector.py b/proteus/connectors/crystal/_connector.py
deleted file mode 100644
index a16c6ff2..00000000
--- a/proteus/connectors/crystal/_connector.py
+++ /dev/null
@@ -1,137 +0,0 @@
-"""
-  Connector for Crystal Job Runtime (AKS)
-"""
-import os
-from typing import Dict, Optional, Type, TypeVar
-
-from requests.auth import HTTPBasicAuth
-
-from proteus.utils import session_with_retries, CrystalEntrypointArguments
-from proteus.connectors.crystal._models import RequestResult, AlgorithmRunResult
-from proteus.storage.models.format import SerializationFormat
-
-T = TypeVar('T')  # pylint: disable=C0103
-
-
-class CrystalConnector:
-    """
-      Crystal API connector
-    """
-
-    def __init__(self, *, base_url: str, user: Optional[str] = None, password: Optional[str] = None):
-        self.base_url = base_url
-        self.http = session_with_retries()
-        if user is not None and password is not None:
-            self.http.auth = HTTPBasicAuth(user, password)
-
-    @staticmethod
-    def create_authenticated(*, base_url: str, user: Optional[str] = None, password: Optional[str] = None):
-        """Creates Crystal connector with basic authentication.
-        For connecting to Crystal outside the Crystal kubernetes cluster, e.g.
-        from other cluster or Airflow environment.
-        """
-        return CrystalConnector(base_url=base_url,
-                                user=user or os.environ.get('CRYSTAL_USER'),
-                                password=password or os.environ.get('CRYSTAL_PASSWORD'))
-
-    @staticmethod
-    def create_anonymous(*, base_url: str):
-        """Creates Crystal connector with no authentication.
-         This should be use for accessing Crystal from inside a hosting cluster."""
-        return CrystalConnector(base_url=base_url, user=None, password=None)
-
-    def __enter__(self):
-        return self
-
-    def __exit__(self, exc_type, exc_val, exc_tb):
-        self.dispose()
-
-    def create_run(self, algorithm: str, payload: Dict, api_version: str = "v1.1") -> str:
-        """
-          Creates a Crystal job run against the latest API version.
-
-        :param algorithm: Name of a connected algorithm.
-        :param payload: Algorithm payload.
-        :param api_version: Crystal API version.
-        :return: Request identifier assigned to the job by Crystal.
-        """
-        run_body = {
-            "AlgorithmName": algorithm,
-            "AlgorithmParameters": payload
-        }
-
-        print(f"Sending the following configuration for algorithm {algorithm}: {run_body}")
-
-        run_response = self.http.post(f"{self.base_url}/algorithm/{api_version}/run", json=run_body)
-
-        # raise if not successful
-        run_response.raise_for_status()
-
-        run_id = run_response.json()['requestId']
-
-        print(
-            f"Algorithm run initiated: {run_id}. Check status at {self.base_url}/algorithm/{api_version}/run/{run_id}/result")
-
-        return run_id
-
-    def retrieve_run(self, run_id: str, api_version: str = "v1.1") -> RequestResult:
-        """
-        Retrieves a submitted Crystal job.
-
-        :param run_id: Request identifier assigned to the job by Crystal.
-        :param api_version: Crystal API version.
-        """
-        url = f'{self.base_url}/algorithm/{api_version}/run/{run_id}/result'
-
-        response = self.http.get(url=url)
-
-        # raise if not successful
-        response.raise_for_status()
-
-        crystal_result = RequestResult.from_dict(response.json())
-
-        return crystal_result
-
-    def submit_result(self, result: AlgorithmRunResult, url: str) -> None:
-        """
-        Submit a result of an algorithm back to Crystal.
-        Notice, this method is only intended to be used within Crystal.
-
-        :param result: The result of the algorithm.
-        :param url: URL of the results receiver.
-        """
-        payload = {
-            'cause': result.cause,
-            'message': result.message,
-            'requestId': result.run_id,
-            'sasUri': result.sas_uri,
-        }
-
-        run_response = self.http.post(
-            url=url,
-            json=payload
-        )
-
-        # raise if not successful
-        run_response.raise_for_status()
-
-    @staticmethod
-    def read_input(*, crystal_arguments: CrystalEntrypointArguments,
-                   serialization_format: Type[SerializationFormat[T]]) -> T:
-        """
-        Read Crystal input given in the SAS URI provided in the CrystalEntrypointArguments
-        :param crystal_arguments: The arguments given to the Crystal job.
-        :param serialization_format: The format used to deserialize the contents of the SAS URI.
-        :return: The deserialized input data.
-        """
-        http_session = session_with_retries()
-        http_response = http_session.get(url=crystal_arguments.sas_uri)
-        http_response.raise_for_status()
-        http_session.close()
-        return serialization_format().deserialize(http_response.content)
-
-    def dispose(self) -> None:
-        """
-        Gracefully dispose object.
-        """
-        self.http.close()
diff --git a/proteus/connectors/crystal/_models.py b/proteus/connectors/crystal/_models.py
deleted file mode 100644
index a7d49d96..00000000
--- a/proteus/connectors/crystal/_models.py
+++ /dev/null
@@ -1,58 +0,0 @@
-"""
-  Models for Crystal connector
-"""
-from enum import Enum
-from dataclasses import dataclass
-from typing import Optional
-
-
-class RequestLifeCycleStage(Enum):
-    """
-     Crystal status states.
-    """
-    NEW = 'NEW'
-    BUFFERED = 'BUFFERED'
-    RUNNING = 'RUNNING'
-    COMPLETED = 'COMPLETED'
-    FAILED = 'FAILED'
-    SCHEDULING_TIMEOUT = 'SCHEDULING_TIMEOUT'
-    DEADLINE_EXCEEDED = 'DEADLINE_EXCEEDED'
-    THROTTLED = 'THROTTLED'
-
-
-@dataclass
-class RequestResult:
-    """
-    The Crystal result when retrieving an existing run.
-    """
-    run_id: str
-    status: RequestLifeCycleStage
-    result_uri: Optional[str] = None
-    run_error_message: Optional[str] = None
-
-    @classmethod
-    def from_dict(cls, dict_: dict):
-        """
-        Constructs a CrystalResult object from a dictionary containing the
-        keys from the /result HTTP GET request.
-
-        :param dict_: The (JSON) dict from the HTTP request.
-        :return: The corresponding CrystalResult object.
-        """
-        return RequestResult(
-            run_id=dict_['requestId'],
-            status=RequestLifeCycleStage(dict_['status']),
-            result_uri=dict_['resultUri'],
-            run_error_message=dict_['runErrorMessage'],
-        )
-
-
-@dataclass
-class AlgorithmRunResult:
-    """
-    The result of an algorithm to be submitted to Crystal.
-    """
-    run_id: str
-    cause: Optional[str] = None
-    message: Optional[str] = None
-    sas_uri: Optional[str] = None
diff --git a/pyproject.toml b/pyproject.toml
index 72b9b931..10a4a967 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -31,9 +31,6 @@ kubernetes = { version = "24.2.0", optional = true }
 
 JSON-log-formatter = "~0.5.1"
 
-pycryptodome = { version = "~3.15", optional = true }
-pyjwt = { version = "~2.4.0", optional = true }
-
 SQLAlchemy = { version = "~1.4", optional = true }
 pyodbc = { version = "~4.0", optional = true }
 
@@ -51,10 +48,6 @@ datadog = [
     'datadog-api-client',
     'kubernetes'
 ]
-boxer = [
-    'pycryptodome',
-    'pyjwt'
-]
 databases = [
     'SQLAlchemy',
     'pyodbc'


Test patch:
diff --git a/tests/test_crystal_connector.py b/tests/test_crystal_connector.py
deleted file mode 100644
index 10218fec..00000000
--- a/tests/test_crystal_connector.py
+++ /dev/null
@@ -1,57 +0,0 @@
-import pytest
-from typing import Type
-import pandas
-from proteus.storage.models.format import DictJsonSerializationFormat, SerializationFormat, \
-    DataFrameParquetSerializationFormat, DataFrameJsonSerializationFormat
-from proteus.connectors.crystal import CrystalConnector
-from proteus.utils import CrystalEntrypointArguments
-
-
-class MockHttpResponse:
-    def __init__(self, data: bytes):
-        self.content = data
-
-    def raise_for_status(self):
-        pass
-
-
-class MockHttpConnection:
-    def __init__(self, response: MockHttpResponse):
-        self.response = response
-
-    def get(self, *args: any, **kwargs: any):
-        return self.response
-
-    def close(self):
-        pass
-
-
-@pytest.mark.parametrize(
-    'serializer, data',
-    [
-        (DictJsonSerializationFormat, {'test': 'test'}),
-        (DataFrameParquetSerializationFormat, pandas.DataFrame(data={'test': [1, 2, 3]})),
-        (DataFrameJsonSerializationFormat, pandas.DataFrame(data={'test': [1, 2, 3]}))
-    ]
-)
-def test_crystal_read_input(mocker, serializer: Type[SerializationFormat], data: any):
-    """
-    Test that the function `read_input` in the `CrystalConnector` object deserializes and returns the correct data.
-    """
-    mocker.patch(
-        'proteus.connectors.crystal._connector.session_with_retries',
-        return_value=MockHttpConnection(MockHttpResponse(serializer().serialize(data)))
-    )
-
-    args = CrystalEntrypointArguments(
-        sas_uri='https://some.sas.url.com',
-        request_id='test-id',
-        results_receiver='https://some.url.com'
-    )
-
-    read_data = CrystalConnector.read_input(crystal_arguments=args, serialization_format=serializer)
-
-    if isinstance(data, pandas.DataFrame):
-        assert data.equals(read_data)
-    else:
-        assert data == read_data
diff --git a/tests/test_job_socket.py b/tests/test_job_socket.py
deleted file mode 100644
index af41b84c..00000000
--- a/tests/test_job_socket.py
+++ /dev/null
@@ -1,39 +0,0 @@
-import copy
-
-import pytest
-
-from proteus.connectors.beast import JobSocket
-
-
-def _assert_socket_is_equal(socket_1: JobSocket, socket_2: JobSocket):
-    assert socket_1.alias == socket_2.alias
-    assert socket_1.data_path == socket_2.data_path
-    assert socket_1.data_format == socket_2.data_format
-    assert isinstance(socket_1, JobSocket)
-    assert isinstance(socket_2, JobSocket)
-
-
-def test_job_socket_serialization():
-    socket = JobSocket(alias='foo', data_path='bar', data_format='baz')
-    socket_deserialized = JobSocket.deserialize(socket.serialize())
-
-    _assert_socket_is_equal(socket, socket_deserialized)
-
-
-def test_socket_from_list():
-
-    foo_socket = JobSocket(alias='foo', data_path='foo_path', data_format='foo_format')
-    bar_socket = JobSocket(alias='bar', data_path='bar_path', data_format='bar_format')
-    baz_socket = JobSocket(alias='baz', data_path='baz_path', data_format='baz_format')
-    sockets = [foo_socket, bar_socket, baz_socket]
-
-    _assert_socket_is_equal(foo_socket, JobSocket.from_list(sockets, 'foo'))
-    _assert_socket_is_equal(bar_socket, JobSocket.from_list(sockets, 'bar'))
-    _assert_socket_is_equal(baz_socket, JobSocket.from_list(sockets, 'baz'))
-
-    sockets.append(copy.deepcopy(foo_socket))
-    with pytest.raises(ValueError):
-        JobSocket.from_list(sockets, 'foo')
-
-    with pytest.raises(ValueError):
-        JobSocket.from_list(sockets, 'non-existing')