diff --git a/remotespark/remotesparkmagics.py b/remotespark/remotesparkmagics.py
index dda3e53..705954f 100644
--- a/remotespark/remotesparkmagics.py
+++ b/remotespark/remotesparkmagics.py
@@ -43,6 +43,8 @@ class RemoteSparkMagics(Magics):
         except KeyError:
             self.logger.error("Could not read env vars for serialization.")
 
+        self.properties = conf.session_configs()
+
         self.logger.debug("Initialized spark magics.")
 
     @magic_arguments()
@@ -120,7 +122,7 @@ class RemoteSparkMagics(Magics):
         elif subcommand == "config":
             # Would normally do " ".join(args.command[1:]) but parse_argstring removes quotes...
             rest_of_line = user_input[7:]
-            conf.override(conf.session_configs.__name__, json.loads(rest_of_line))
+            self.properties = json.loads(rest_of_line)
         # add
         elif subcommand == "add":
             if len(args.command) != 4 and len(args.command) != 5:
@@ -135,7 +137,7 @@ class RemoteSparkMagics(Magics):
             else:
                 skip = False
 
-            properties = copy.deepcopy(conf.session_configs())
+            properties = copy.deepcopy(self.properties)
             properties["kind"] = self._get_livy_kind(language)
 
             self.spark_controller.add_session(name, connection_string, skip, properties)
@@ -198,8 +200,7 @@ class RemoteSparkMagics(Magics):
 {}
     Session configs:
         {}
-""".format("\n".join(sessions_info), conf.session_configs()))
-
+""".format("\n".join(sessions_info), self.properties))
 
     def _print_endpoint_info(self, info_sessions):
         sessions_info = ["        {}".format(i) for i in info_sessions]
diff --git a/remotespark/sparkkernelbase.py b/remotespark/sparkkernelbase.py
index 8adbb03..7b700fd 100644
--- a/remotespark/sparkkernelbase.py
+++ b/remotespark/sparkkernelbase.py
@@ -13,6 +13,11 @@ class SparkKernelBase(IPythonKernel):
     config_command = "config"
     sql_command = "sql"
     hive_command = "hive"
+    info_command = "info"
+    delete_command = "delete"
+    clean_up_command = "cleanup"
+
+    force_flag = "f"
 
     def __init__(self, implementation, implementation_version, language, language_version, language_info,
                  kernel_conf_name, session_language, client_name, **kwargs):
@@ -61,7 +66,7 @@ class SparkKernelBase(IPythonKernel):
             restart_session = False
 
             if self.session_started:
-                if "f" not in flags:
+                if self.force_flag not in flags:
                     self._show_user_error("A session has already been started. In order to modify the Spark configura"
                                            "tion, please provide the '-f' flag at the beginning of the config magic:\n"
                                            "\te.g. `%config -f {}`\n\nNote that this will kill the current session and"
@@ -76,6 +81,33 @@ class SparkKernelBase(IPythonKernel):
 
             return self._run_restarting_session(code_to_run, silent, store_history, user_expressions, allow_stdin,
                                                 restart_session)
+        elif subcommand == self.info_command:
+            code_to_run = "%spark info {}".format(self.connection_string)
+            return self._run_without_session(code_to_run, silent, store_history, user_expressions, allow_stdin)
+        elif subcommand == self.delete_command:
+            if self.force_flag not in flags:
+                self._show_user_error("The session you are trying to delete could be this kernel's session. In order "
+                                      "to delete this session, please provide the '-f' flag at the beginning of the "
+                                      "delete magic:\n\te.g. `%delete -f id`\n\nAll previously run commands in the "
+                                      "session will be lost.")
+                code_to_run = ""
+            else:
+                self.session_started = False
+                code_to_run = "%spark delete {} {}".format(self.connection_string, code_to_run)
+
+            return self._run_without_session(code_to_run, silent, store_history, user_expressions, allow_stdin)
+        elif subcommand == self.clean_up_command:
+            if self.force_flag not in flags:
+                self._show_user_error("The sessions you are trying to delete could be this kernel's session or other "
+                                      "people's sessions. In order to delete them, please provide the '-f' flag at the "
+                                      "beginning of the cleanup magic:\n\te.g. `%cleanup -f`\n\nAll previously run "
+                                      "commands in the sessions will be lost.")
+                code_to_run = ""
+            else:
+                self.session_started = False
+                code_to_run = "%spark cleanup {}".format(self.connection_string)
+
+            return self._run_without_session(code_to_run, silent, store_history, user_expressions, allow_stdin)
         else:
             self._show_user_error("Magic '{}' not supported.".format(subcommand))
             return self._run_without_session("", silent, store_history, user_expressions, allow_stdin)
@@ -153,14 +185,21 @@ class SparkKernelBase(IPythonKernel):
         split_code = code.split(None, 1)
         subcommand = split_code[0].lower()
         flags = []
-        rest = split_code[1]
+        if len(split_code) > 1:
+            rest = split_code[1]
+        else:
+            rest = ""
 
         # Get all flags
         flag_split = rest.split(None, 1)
-        while len(flag_split) >= 2 and flag_split[0].startswith("-"):
-            flags.append(flag_split[0][1:].lower())
-            rest = flag_split[1]
-            flag_split = rest.split(None, 1)
+        while len(flag_split) >= 1 and flag_split[0].startswith("-"):
+            if len(flag_split) >= 2:
+                flags.append(flag_split[0][1:].lower())
+                rest = flag_split[1]
+                flag_split = rest.split(None, 1)
+            if len(flag_split) == 1:
+                flags.append(flag_split[0][1:].lower())
+                flag_split = [""]
 
         # flags to lower
         flags = [i.lower() for i in flags]
diff --git a/remotespark/utils/configuration.py b/remotespark/utils/configuration.py
index 5668901..df09e52 100644
--- a/remotespark/utils/configuration.py
+++ b/remotespark/utils/configuration.py
@@ -36,23 +36,16 @@ def load(fsrw_class = None):
         overrides = {}
     else:
         overrides = json.loads(line)
-    override_all(overrides)
+    override(overrides)
 
 
-def override_all(obj):
+def override(obj):
     """Given a dictionary representing the overrided defaults for this
     configuration, initialize the global configuration."""
     global _overrides
     _overrides = obj
 
 
-def override(config, value):
-    """Given a string representing a configuration and a value for that configuration,
-    override the configuration. Initialize the overrided configuration beforehand."""
-    initialize()
-    _overrides[config] = value
-
-
 def _override(f):
     """A decorator which first initializes the overrided configurations,
     then checks the global overrided defaults for the given configuration,

Expose livy endpoint management through wrapper kernel
diff --git a/tests/test_clientmanager.py b/tests/test_clientmanager.py
index 400fadd..e088b35 100644
--- a/tests/test_clientmanager.py
+++ b/tests/test_clientmanager.py
@@ -30,8 +30,8 @@ def test_deserialize_on_creation():
 
 
 def test_serialize_periodically():
-    conf.override_all({conf.serialize_period_seconds.__name__: 0.1,
-                       conf.serialize_periodically.__name__: True})
+    conf.override({conf.serialize_period_seconds.__name__: 0.1,
+                   conf.serialize_periodically.__name__: True})
     serializer = MagicMock()
     ClientManager(serializer)
 
diff --git a/tests/test_configuration.py b/tests/test_configuration.py
index 8cdac08..92fd020 100644
--- a/tests/test_configuration.py
+++ b/tests/test_configuration.py
@@ -27,7 +27,7 @@ def test_configuration_initialize():
 @with_setup(_setup)
 def test_configuration_initialize_lazy():
     """Tests that the initialize function has no behavior if the override dict is already initialized"""
-    conf.override_all({})
+    conf.override({})
     fsrw_class = MagicMock(side_effect=ValueError)
     conf.initialize(fsrw_class)
 
@@ -56,7 +56,7 @@ def test_configuration_load_not_lazy():
     read_lines = MagicMock(return_value=[json.dumps(config)])
     fsrw.read_lines = read_lines
     fsrw_class = MagicMock(return_value=fsrw)
-    conf.override_all({conf.default_chart_type.__name__: "bar"})
+    conf.override({ conf.default_chart_type.__name__: "bar" })
     conf.load(fsrw_class)
     assert conf._overrides is not None
     assert_equals(conf._overrides, config)
@@ -65,21 +65,9 @@ def test_configuration_load_not_lazy():
 
 @with_setup(_setup)
 def test_configuration_override():
-    kpc = { 'username': 'U', 'password': 'P', 'url': 'L' }
-    overrides = { conf.kernel_python_credentials.__name__: kpc }
-    conf.override_all(overrides)
-    conf.override(conf.execute_timeout_seconds.__name__, 1)
-    assert_equals(conf._overrides, { conf.kernel_python_credentials.__name__: kpc,
-                                     conf.execute_timeout_seconds.__name__: 1 })
-    assert_equals(conf.execute_timeout_seconds(), 1)
-    assert_equals(conf.kernel_python_credentials(), kpc)
-
-
-@with_setup(_setup)
-def test_configuration_override_all():
     z = 1500
     config = { conf.status_sleep_seconds.__name__: z }
-    conf.override_all(config)
+    conf.override(config)
     assert_equals(conf._overrides, config)
     assert_equals(conf.status_sleep_seconds(), z)
 
@@ -88,7 +76,7 @@ def test_configuration_override_all():
 def test_configuration_decorator():
     def test_f():
         return 0
-    conf.override_all({test_f.__name__: -1})
+    conf.override({test_f.__name__: -1})
     test_f_decorated = conf._override(test_f)
     assert_not_equals(test_f_decorated(), test_f())
     assert_equals(test_f_decorated(), -1)
\ No newline at end of file
diff --git a/tests/test_livysession.py b/tests/test_livysession.py
index da9168f..d406532 100644
--- a/tests/test_livysession.py
+++ b/tests/test_livysession.py
@@ -60,7 +60,7 @@ class TestLivySession:
 
     @raises(AssertionError)
     def test_constructor_throws_status_sleep_seconds(self):
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0,
             "statement_sleep_seconds": 2,
             "create_sql_context_timeout_seconds": 60
@@ -70,7 +70,7 @@ class TestLivySession:
 
     @raises(AssertionError)
     def test_constructor_throws_statement_sleep_seconds(self):
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 3,
             "statement_sleep_seconds": 0,
             "create_sql_context_timeout_seconds": 60
@@ -80,7 +80,7 @@ class TestLivySession:
 
     @raises(AssertionError)
     def test_constructor_throws_sql_create_timeout_seconds(self):
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 4,
             "statement_sleep_seconds": 2,
             "create_sql_context_timeout_seconds": 0
@@ -90,7 +90,7 @@ class TestLivySession:
 
     @raises(ValueError)
     def test_constructor_throws_invalid_session_sql_combo(self):
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 2,
             "statement_sleep_seconds": 2,
             "create_sql_context_timeout_seconds": 60
@@ -99,7 +99,7 @@ class TestLivySession:
         conf.load()
 
     def test_constructor_starts_with_existing_session(self):
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 4,
             "statement_sleep_seconds": 2,
             "create_sql_context_timeout_seconds": 60
@@ -112,7 +112,7 @@ class TestLivySession:
         assert session.started_sql_context
 
     def test_constructor_starts_with_no_session(self):
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 4,
             "statement_sleep_seconds": 2,
             "create_sql_context_timeout_seconds": 60
@@ -124,7 +124,7 @@ class TestLivySession:
         assert not session.started_sql_context
 
     def test_is_final_status(self):
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -142,7 +142,7 @@ class TestLivySession:
         http_client = MagicMock()
         http_client.post.return_value = DummyResponse(201, self.session_create_json)
 
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -161,7 +161,7 @@ class TestLivySession:
         http_client = MagicMock()
         http_client.post.return_value = DummyResponse(201, self.session_create_json)
 
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -180,7 +180,7 @@ class TestLivySession:
         http_client = MagicMock()
         http_client.post.return_value = DummyResponse(201, self.session_create_json)
 
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -197,7 +197,7 @@ class TestLivySession:
         http_client = MagicMock()
         http_client.post.return_value = DummyResponse(201, self.session_create_json)
         http_client.get.return_value = DummyResponse(200, self.ready_sessions_json)
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -218,12 +218,12 @@ class TestLivySession:
                               DummyResponse(200, self.ready_sessions_json)]
         http_client.get.side_effect = self._next_response_get
 
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
         session = self._create_session(http_client=http_client)
-        conf.override_all({})
+        conf.override({})
 
         session.start()
 
@@ -241,7 +241,7 @@ class TestLivySession:
                               DummyResponse(200, self.error_sessions_json)]
         http_client.get.side_effect = self._next_response_get
 
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.011,
             "statement_sleep_seconds": 6000
         })
@@ -261,7 +261,7 @@ class TestLivySession:
                               DummyResponse(200, self.ready_sessions_json)]
         http_client.get.side_effect = self._next_response_get
 
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.011,
             "statement_sleep_seconds": 6000
         })
@@ -275,7 +275,7 @@ class TestLivySession:
     def test_delete_session_when_active(self):
         http_client = MagicMock()
         http_client.post.return_value = DummyResponse(201, self.session_create_json)
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -291,7 +291,7 @@ class TestLivySession:
     def test_delete_session_when_not_started(self):
         http_client = MagicMock()
         http_client.post.return_value = DummyResponse(201, self.session_create_json)
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -307,7 +307,7 @@ class TestLivySession:
     def test_delete_session_when_dead_throws(self):
         http_client = MagicMock()
         http_client.post.return_value = DummyResponse(201, self.session_create_json)
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -326,7 +326,7 @@ class TestLivySession:
         self.get_responses = [DummyResponse(200, self.running_statement_json),
                               DummyResponse(200, self.ready_statement_json)]
         http_client.get.side_effect = self._next_response_get
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -356,7 +356,7 @@ class TestLivySession:
                               DummyResponse(200, self.ready_sessions_json),
                               DummyResponse(200, self.ready_statement_json)]
         http_client.get.side_effect = self._next_response_get
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -392,7 +392,7 @@ class TestLivySession:
                               DummyResponse(200, self.ready_sessions_json),
                               DummyResponse(200, self.ready_statement_json)]
         http_client.get.side_effect = self._next_response_get
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -421,7 +421,7 @@ class TestLivySession:
                               DummyResponse(200, self.ready_sessions_json),
                               DummyResponse(200, self.ready_statement_json)]
         http_client.get.side_effect = self._next_response_get
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -449,7 +449,7 @@ class TestLivySession:
                               DummyResponse(200, self.running_statement_json),
                               DummyResponse(200, self.ready_statement_json)]
         http_client.get.side_effect = self._next_response_get
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
@@ -467,7 +467,7 @@ class TestLivySession:
         http_client = MagicMock()
         http_client.connection_string = connection_string
         kind = Constants.session_kind_spark
-        conf.override_all({
+        conf.override({
             "status_sleep_seconds": 0.01,
             "statement_sleep_seconds": 0.01
         })
diff --git a/tests/test_remotesparkmagics.py b/tests/test_remotesparkmagics.py
index b8f966f..e8f2d8f 100644
--- a/tests/test_remotesparkmagics.py
+++ b/tests/test_remotesparkmagics.py
@@ -14,7 +14,7 @@ shell = None
 def _setup():
     global magic, spark_controller, shell
 
-    conf.override_all({})
+    conf.override({})
 
     shell = MagicMock()
     magic = RemoteSparkMagics(shell=None)
@@ -82,9 +82,8 @@ def test_add_sessions_command_parses():
 
 @with_setup(_setup, _teardown)
 def test_add_sessions_command_extra_properties():
-    conf.override_all({})
     magic.spark("config {\"extra\": \"yes\"}")
-    assert conf.session_configs() == {"extra": "yes"}
+    assert magic.properties == {"extra": "yes"}
 
     add_sessions_mock = MagicMock()
     spark_controller.add_session = add_sessions_mock
@@ -97,7 +96,6 @@ def test_add_sessions_command_extra_properties():
     magic.spark(line)
 
     add_sessions_mock.assert_called_once_with(name, connection_string, False, {"kind": "spark", "extra": "yes"})
-    conf.load()
 
 
 @with_setup(_setup, _teardown)
diff --git a/tests/test_sparkkernelbase.py b/tests/test_sparkkernelbase.py
index 01bf903..78d43d4 100644
--- a/tests/test_sparkkernelbase.py
+++ b/tests/test_sparkkernelbase.py
@@ -54,7 +54,7 @@ def test_get_config():
     url = "url"
 
     config = {"kernel_python_credentials": {user_ev: usr, pass_ev: pwd, url_ev: url}}
-    conf.override_all(config)
+    conf.override(config)
 
     u, p, r = kernel._get_configuration()
 
@@ -67,7 +67,7 @@ def test_get_config():
 
 @with_setup(_setup, _teardown)
 def test_get_config_not_set():
-    conf.override_all({})
+    conf.override({})
     try:
         kernel._get_configuration()
 
@@ -172,6 +172,82 @@ def test_magic_not_supported():
     kernel.do_execute(code, False)
 
 
+@with_setup(_setup, _teardown)
+def test_info():
+    code = "%info"
+
+    # Call method
+    kernel.do_execute(code, False)
+
+    # Assertions
+    assert not kernel.session_started
+    assert call("%spark info {}".format(conn_str), False, True, None, False) in execute_cell_mock.mock_calls
+
+
+@with_setup(_setup, _teardown)
+def test_delete_force():
+    code = "%delete -f 9"
+    kernel.session_started = True
+    user_error = MagicMock()
+    kernel._show_user_error = user_error
+
+    # Call method
+    kernel.do_execute(code, False)
+
+    # Assertions
+    assert not kernel.session_started
+    assert call("%spark delete {} 9".format(conn_str), False, True, None, False) in execute_cell_mock.mock_calls
+    assert len(user_error.mock_calls) == 0
+
+
+@with_setup(_setup, _teardown)
+def test_delete_not_force():
+    code = "%delete 9"
+    kernel.session_started = True
+    user_error = MagicMock()
+    kernel._show_user_error = user_error
+
+    # Call method
+    kernel.do_execute(code, False)
+
+    # Assertions
+    assert kernel.session_started
+    assert not call("%spark delete {} 9".format(conn_str), False, True, None, False) in execute_cell_mock.mock_calls
+    assert len(user_error.mock_calls) == 1
+
+
+@with_setup(_setup, _teardown)
+def test_cleanup_force():
+    code = "%cleanup -f"
+    kernel.session_started = True
+    user_error = MagicMock()
+    kernel._show_user_error = user_error
+
+    # Call method
+    kernel.do_execute(code, False)
+
+    # Assertions
+    assert not kernel.session_started
+    assert call("%spark cleanup {}".format(conn_str), False, True, None, False) in execute_cell_mock.mock_calls
+    assert len(user_error.mock_calls) == 0
+
+
+@with_setup(_setup, _teardown)
+def test_cleanup_not_force():
+    code = "%cleanup"
+    kernel.session_started = True
+    user_error = MagicMock()
+    kernel._show_user_error = user_error
+
+    # Call method
+    kernel.do_execute(code, False)
+
+    # Assertions
+    assert kernel.session_started
+    assert not call("%spark cleanup {}".format(conn_str), False, True, None, False) in execute_cell_mock.mock_calls
+    assert len(user_error.mock_calls) == 1
+
+
 @with_setup(_setup, _teardown)
 def test_call_spark():
     # Set up

pip install -e .
parse_log_pytest
requirements.txt
pytest
mkdir ~/.sparkmagic cp remotespark/default_config.json ~/.sparkmagic/config.json
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
anyio==4.9.0
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
async-lru==2.0.5
attrs==25.3.0
babel==2.17.0
beautifulsoup4==4.13.3
bleach==6.2.0
certifi==2025.1.31
cffi==1.17.1
charset-normalizer==3.4.1
comm==0.2.2
decorator==5.2.1
defusedxml==0.7.1
exceptiongroup==1.2.2
fastjsonschema==2.21.1
fqdn==1.5.1
h11==0.14.0
httpcore==1.0.7
httpx==0.28.1
idna==3.10
importlib_metadata==8.6.1
iniconfig==2.1.0
ipykernel==4.1.1
ipython==4.0.0
ipython-genutils==0.2.0
ipywidgets==7.8.5
isoduration==20.11.0
Jinja2==3.1.6
json5==0.10.0
jsonpointer==3.0.0
jsonschema==4.23.0
jsonschema-specifications==2024.10.1
jupyter-events==0.12.0
jupyter-lsp==2.2.5
jupyter_client==8.6.3
jupyter_core==5.7.2
jupyter_server==2.15.0
jupyter_server_terminals==0.5.3
jupyterlab==4.1.5
jupyterlab_pygments==0.3.0
jupyterlab_server==2.27.3
jupyterlab_widgets==1.1.11
MarkupSafe==3.0.2
mistune==3.1.3
mock==5.2.0
narwhals==1.32.0
nbclient==0.10.2
nbconvert==7.16.6
nbformat==5.10.4
nose==1.3.7
notebook==7.1.3
notebook_shim==0.2.4
numpy==2.0.2
overrides==7.7.0
packaging==24.2
pandas==2.2.3
pandocfilters==1.5.1
pexpect==4.9.0
pickleshare==0.7.5
platformdirs==4.3.7
plotly==6.0.1
pluggy==1.5.0
prometheus_client==0.21.1
ptyprocess==0.7.0
pycparser==2.22
Pygments==2.19.1
pytest==8.3.5
python-dateutil==2.9.0.post0
python-json-logger==3.3.0
pytz==2025.2
PyYAML==6.0.2
pyzmq==26.3.0
referencing==0.36.2
-e git+https://github.com/jupyter-incubator/sparkmagic.git@a2ed74cab292c2a462d2080914c5b61ec064e448#egg=remotespark
requests==2.32.3
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
rpds-py==0.24.0
Send2Trash==1.8.3
simplegeneric==0.8.1
six==1.17.0
sniffio==1.3.1
soupsieve==2.6
terminado==0.18.1
tinycss2==1.4.0
tomli==2.2.1
tornado==6.4.2
traitlets==5.14.3
types-python-dateutil==2.9.0.20241206
typing_extensions==4.13.0
tzdata==2025.2
uri-template==1.3.0
urllib3==2.3.0
webcolors==24.11.1
webencodings==0.5.1
websocket-client==1.8.0
widgetsnbextension==3.6.10
zipp==3.21.0

name: sparkmagic
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - anyio==4.9.0
      - argon2-cffi==23.1.0
      - argon2-cffi-bindings==21.2.0
      - arrow==1.3.0
      - async-lru==2.0.5
      - attrs==25.3.0
      - babel==2.17.0
      - beautifulsoup4==4.13.3
      - bleach==6.2.0
      - certifi==2025.1.31
      - cffi==1.17.1
      - charset-normalizer==3.4.1
      - comm==0.2.2
      - decorator==5.2.1
      - defusedxml==0.7.1
      - exceptiongroup==1.2.2
      - fastjsonschema==2.21.1
      - fqdn==1.5.1
      - h11==0.14.0
      - httpcore==1.0.7
      - httpx==0.28.1
      - idna==3.10
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - ipykernel==4.1.1
      - ipython==4.0.0
      - ipython-genutils==0.2.0
      - ipywidgets==7.8.5
      - isoduration==20.11.0
      - jinja2==3.1.6
      - json5==0.10.0
      - jsonpointer==3.0.0
      - jsonschema==4.23.0
      - jsonschema-specifications==2024.10.1
      - jupyter-client==8.6.3
      - jupyter-core==5.7.2
      - jupyter-events==0.12.0
      - jupyter-lsp==2.2.5
      - jupyter-server==2.15.0
      - jupyter-server-terminals==0.5.3
      - jupyterlab==4.1.5
      - jupyterlab-pygments==0.3.0
      - jupyterlab-server==2.27.3
      - jupyterlab-widgets==1.1.11
      - markupsafe==3.0.2
      - mistune==3.1.3
      - mock==5.2.0
      - narwhals==1.32.0
      - nbclient==0.10.2
      - nbconvert==7.16.6
      - nbformat==5.10.4
      - nose==1.3.7
      - notebook==7.1.3
      - notebook-shim==0.2.4
      - numpy==2.0.2
      - overrides==7.7.0
      - packaging==24.2
      - pandas==2.2.3
      - pandocfilters==1.5.1
      - pexpect==4.9.0
      - pickleshare==0.7.5
      - platformdirs==4.3.7
      - plotly==6.0.1
      - pluggy==1.5.0
      - prometheus-client==0.21.1
      - ptyprocess==0.7.0
      - pycparser==2.22
      - pygments==2.19.1
      - pytest==8.3.5
      - python-dateutil==2.9.0.post0
      - python-json-logger==3.3.0
      - pytz==2025.2
      - pyyaml==6.0.2
      - pyzmq==26.3.0
      - referencing==0.36.2
      - requests==2.32.3
      - rfc3339-validator==0.1.4
      - rfc3986-validator==0.1.1
      - rpds-py==0.24.0
      - send2trash==1.8.3
      - simplegeneric==0.8.1
      - six==1.17.0
      - sniffio==1.3.1
      - soupsieve==2.6
      - terminado==0.18.1
      - tinycss2==1.4.0
      - tomli==2.2.1
      - tornado==6.4.2
      - traitlets==5.14.3
      - types-python-dateutil==2.9.0.20241206
      - typing-extensions==4.13.0
      - tzdata==2025.2
      - uri-template==1.3.0
      - urllib3==2.3.0
      - webcolors==24.11.1
      - webencodings==0.5.1
      - websocket-client==1.8.0
      - widgetsnbextension==3.6.10
      - zipp==3.21.0
prefix: /opt/conda/envs/sparkmagic

tests/test_clientmanager.py::test_serialize_periodically tests/test_configuration.py::test_configuration_initialize_lazy tests/test_configuration.py::test_configuration_load_not_lazy tests/test_configuration.py::test_configuration_override tests/test_configuration.py::test_configuration_decorator tests/test_sparkkernelbase.py::test_get_config tests/test_sparkkernelbase.py::test_get_config_not_set
tests/test_configuration.py::test_configuration_initialize tests/test_remotesparkmagics.py::test_info_command_parses tests/test_remotesparkmagics.py::test_info_endpoint_command_parses tests/test_remotesparkmagics.py::test_add_sessions_command_parses tests/test_remotesparkmagics.py::test_add_sessions_command_extra_properties tests/test_remotesparkmagics.py::test_delete_sessions_command_parses tests/test_remotesparkmagics.py::test_cleanup_command_parses tests/test_remotesparkmagics.py::test_cleanup_endpoint_command_parses tests/test_remotesparkmagics.py::test_bad_command_throws_exception tests/test_remotesparkmagics.py::test_run_cell_command_parses tests/test_remotesparkmagics.py::test_run_cell_command_writes_to_err tests/test_remotesparkmagics.py::test_run_sql_command_parses tests/test_remotesparkmagics.py::test_run_hive_command_parses tests/test_remotesparkmagics.py::test_run_sql_command_returns_none_when_exception tests/test_remotesparkmagics.py::test_run_hive_command_returns_none_when_exception tests/test_remotesparkmagics.py::test_run_sql_command_stores_variable_in_user_ns tests/test_sparkkernelbase.py::test_do_execute_initializes_magics_if_not_run tests/test_sparkkernelbase.py::test_info tests/test_sparkkernelbase.py::test_delete_force tests/test_sparkkernelbase.py::test_cleanup_force tests/test_sparkkernelbase.py::test_cleanup_not_force tests/test_sparkkernelbase.py::test_call_spark tests/test_sparkkernelbase.py::test_execute_throws_if_fatal_error_happened tests/test_sparkkernelbase.py::test_execute_throws_if_fatal_error_happens_for_execution tests/test_sparkkernelbase.py::test_call_spark_sql_new_line tests/test_sparkkernelbase.py::test_call_spark_hive_new_line
tests/test_clientmanager.py::test_get_client_throws_when_client_not_exists tests/test_clientmanager.py::test_deserialize_on_creation tests/test_clientmanager.py::test_get_client tests/test_clientmanager.py::test_delete_client tests/test_clientmanager.py::test_delete_client_throws_when_client_not_exists tests/test_clientmanager.py::test_add_client_throws_when_client_exists tests/test_clientmanager.py::test_client_names_returned tests/test_clientmanager.py::test_get_any_client tests/test_clientmanager.py::test_get_any_client_raises_exception_with_no_client tests/test_clientmanager.py::test_get_any_client_raises_exception_with_two_clients tests/test_clientmanager.py::test_clean_up tests/test_clientmanager.py::test_clean_up_serializer tests/test_configuration.py::test_configuration_load tests/test_sparkkernelbase.py::test_initialize_magics tests/test_sparkkernelbase.py::test_start_session tests/test_sparkkernelbase.py::test_delete_session tests/test_sparkkernelbase.py::test_shutdown_cleans_up
remotespark/utils/configuration.py remotespark/sparkkernelbase.py remotespark/remotesparkmagics.py
remotespark/utils/configuration.py remotespark/sparkkernelbase.py remotespark/remotesparkmagics.py