prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Check if ThreadLocalRuntimeContext can be removed since python3.4 support is dropped
  https://github.com/open-telemetry/opentelemetry-python/blob/master/opentelemetry-api/src/opentelemetry/context/threadlocal_context.py#L21
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `opentelemetry-api/src/opentelemetry/context/threadlocal_context.py`
  Content:
  ```
  1 # Copyright The OpenTelemetry Authors
  2 #
  3 # Licensed under the Apache License, Version 2.0 (the "License");
  4 # you may not use this file except in compliance with the License.
  5 # You may obtain a copy of the License at
  6 #
  7 #     http://www.apache.org/licenses/LICENSE-2.0
  8 #
  9 # Unless required by applicable law or agreed to in writing, software
  10 # distributed under the License is distributed on an "AS IS" BASIS,
  11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12 # See the License for the specific language governing permissions and
  13 # limitations under the License.
  14 
  15 import threading
  16 
  17 from opentelemetry.context.context import Context, RuntimeContext
  18 
  19 
  20 class ThreadLocalRuntimeContext(RuntimeContext):
  21     """An implementation of the RuntimeContext interface
  22     which uses thread-local storage under the hood. This
  23     implementation is available for usage with Python 3.4.
  24     """
  25 
  26     class Token:
  27         def __init__(self, context: Context) -> None:
  28             self._context = context
  29 
  30     _CONTEXT_KEY = "current_context"
  31 
  32     def __init__(self) -> None:
  33         self._current_context = threading.local()
  34 
  35     def attach(self, context: Context) -> object:
  36         """See `opentelemetry.context.RuntimeContext.attach`."""
  37         current = self.get_current()
  38         setattr(self._current_context, self._CONTEXT_KEY, context)
  39         return self.Token(current)
  40 
  41     def get_current(self) -> Context:
  42         """See `opentelemetry.context.RuntimeContext.get_current`."""
  43         if not hasattr(self._current_context, self._CONTEXT_KEY):
  44             setattr(
  45                 self._current_context, self._CONTEXT_KEY, Context(),
  46             )
  47         context = getattr(
  48             self._current_context, self._CONTEXT_KEY
  49         )  # type: Context
  50         return context
  51 
  52     def detach(self, token: object) -> None:
  53         """See `opentelemetry.context.RuntimeContext.detach`."""
  54         if not isinstance(token, self.Token):
  55             raise ValueError("invalid token")
  56         # pylint: disable=protected-access
  57         setattr(self._current_context, self._CONTEXT_KEY, token._context)
  58 
  59 
  60 __all__ = ["ThreadLocalRuntimeContext"]
  61
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/opentelemetry-api/src/opentelemetry/context/threadlocal_context.py b/opentelemetry-api/src/opentelemetry/context/threadlocal_context.py
  deleted file mode 100644
  --- a/opentelemetry-api/src/opentelemetry/context/threadlocal_context.py
  +++ /dev/null
  @@ -1,60 +0,0 @@
  -# Copyright The OpenTelemetry Authors
  -#
  -# Licensed under the Apache License, Version 2.0 (the "License");
  -# you may not use this file except in compliance with the License.
  -# You may obtain a copy of the License at
  -#
  -#     http://www.apache.org/licenses/LICENSE-2.0
  -#
  -# Unless required by applicable law or agreed to in writing, software
  -# distributed under the License is distributed on an "AS IS" BASIS,
  -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  -# See the License for the specific language governing permissions and
  -# limitations under the License.
  -
  -import threading
  -
  -from opentelemetry.context.context import Context, RuntimeContext
  -
  -
  -class ThreadLocalRuntimeContext(RuntimeContext):
  -    """An implementation of the RuntimeContext interface
  -    which uses thread-local storage under the hood. This
  -    implementation is available for usage with Python 3.4.
  -    """
  -
  -    class Token:
  -        def __init__(self, context: Context) -> None:
  -            self._context = context
  -
  -    _CONTEXT_KEY = "current_context"
  -
  -    def __init__(self) -> None:
  -        self._current_context = threading.local()
  -
  -    def attach(self, context: Context) -> object:
  -        """See `opentelemetry.context.RuntimeContext.attach`."""
  -        current = self.get_current()
  -        setattr(self._current_context, self._CONTEXT_KEY, context)
  -        return self.Token(current)
  -
  -    def get_current(self) -> Context:
  -        """See `opentelemetry.context.RuntimeContext.get_current`."""
  -        if not hasattr(self._current_context, self._CONTEXT_KEY):
  -            setattr(
  -                self._current_context, self._CONTEXT_KEY, Context(),
  -            )
  -        context = getattr(
  -            self._current_context, self._CONTEXT_KEY
  -        )  # type: Context
  -        return context
  -
  -    def detach(self, token: object) -> None:
  -        """See `opentelemetry.context.RuntimeContext.detach`."""
  -        if not isinstance(token, self.Token):
  -            raise ValueError("invalid token")
  -        # pylint: disable=protected-access
  -        setattr(self._current_context, self._CONTEXT_KEY, token._context)
  -
  -
  -__all__ = ["ThreadLocalRuntimeContext"]
  
verification_info: {"golden_diff": "diff --git a/opentelemetry-api/src/opentelemetry/context/threadlocal_context.py b/opentelemetry-api/src/opentelemetry/context/threadlocal_context.py\ndeleted file mode 100644\n--- a/opentelemetry-api/src/opentelemetry/context/threadlocal_context.py\n+++ /dev/null\n@@ -1,60 +0,0 @@\n-# Copyright The OpenTelemetry Authors\n-#\n-# Licensed under the Apache License, Version 2.0 (the \"License\");\n-# you may not use this file except in compliance with the License.\n-# You may obtain a copy of the License at\n-#\n-#     http://www.apache.org/licenses/LICENSE-2.0\n-#\n-# Unless required by applicable law or agreed to in writing, software\n-# distributed under the License is distributed on an \"AS IS\" BASIS,\n-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n-# See the License for the specific language governing permissions and\n-# limitations under the License.\n-\n-import threading\n-\n-from opentelemetry.context.context import Context, RuntimeContext\n-\n-\n-class ThreadLocalRuntimeContext(RuntimeContext):\n-    \"\"\"An implementation of the RuntimeContext interface\n-    which uses thread-local storage under the hood. This\n-    implementation is available for usage with Python 3.4.\n-    \"\"\"\n-\n-    class Token:\n-        def __init__(self, context: Context) -> None:\n-            self._context = context\n-\n-    _CONTEXT_KEY = \"current_context\"\n-\n-    def __init__(self) -> None:\n-        self._current_context = threading.local()\n-\n-    def attach(self, context: Context) -> object:\n-        \"\"\"See `opentelemetry.context.RuntimeContext.attach`.\"\"\"\n-        current = self.get_current()\n-        setattr(self._current_context, self._CONTEXT_KEY, context)\n-        return self.Token(current)\n-\n-    def get_current(self) -> Context:\n-        \"\"\"See `opentelemetry.context.RuntimeContext.get_current`.\"\"\"\n-        if not hasattr(self._current_context, self._CONTEXT_KEY):\n-            setattr(\n-                self._current_context, self._CONTEXT_KEY, Context(),\n-            )\n-        context = getattr(\n-            self._current_context, self._CONTEXT_KEY\n-        )  # type: Context\n-        return context\n-\n-    def detach(self, token: object) -> None:\n-        \"\"\"See `opentelemetry.context.RuntimeContext.detach`.\"\"\"\n-        if not isinstance(token, self.Token):\n-            raise ValueError(\"invalid token\")\n-        # pylint: disable=protected-access\n-        setattr(self._current_context, self._CONTEXT_KEY, token._context)\n-\n-\n-__all__ = [\"ThreadLocalRuntimeContext\"]\n", "issue": "Check if ThreadLocalRuntimeContext can be removed since python3.4 support is dropped\nhttps://github.com/open-telemetry/opentelemetry-python/blob/master/opentelemetry-api/src/opentelemetry/context/threadlocal_context.py#L21\n", "before_files": [{"content": "# Copyright The OpenTelemetry Authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\nimport threading\n\nfrom opentelemetry.context.context import Context, RuntimeContext\n\n\nclass ThreadLocalRuntimeContext(RuntimeContext):\n    \"\"\"An implementation of the RuntimeContext interface\n    which uses thread-local storage under the hood. This\n    implementation is available for usage with Python 3.4.\n    \"\"\"\n\n    class Token:\n        def __init__(self, context: Context) -> None:\n            self._context = context\n\n    _CONTEXT_KEY = \"current_context\"\n\n    def __init__(self) -> None:\n        self._current_context = threading.local()\n\n    def attach(self, context: Context) -> object:\n        \"\"\"See `opentelemetry.context.RuntimeContext.attach`.\"\"\"\n        current = self.get_current()\n        setattr(self._current_context, self._CONTEXT_KEY, context)\n        return self.Token(current)\n\n    def get_current(self) -> Context:\n        \"\"\"See `opentelemetry.context.RuntimeContext.get_current`.\"\"\"\n        if not hasattr(self._current_context, self._CONTEXT_KEY):\n            setattr(\n                self._current_context, self._CONTEXT_KEY, Context(),\n            )\n        context = getattr(\n            self._current_context, self._CONTEXT_KEY\n        )  # type: Context\n        return context\n\n    def detach(self, token: object) -> None:\n        \"\"\"See `opentelemetry.context.RuntimeContext.detach`.\"\"\"\n        if not isinstance(token, self.Token):\n            raise ValueError(\"invalid token\")\n        # pylint: disable=protected-access\n        setattr(self._current_context, self._CONTEXT_KEY, token._context)\n\n\n__all__ = [\"ThreadLocalRuntimeContext\"]\n", "path": "opentelemetry-api/src/opentelemetry/context/threadlocal_context.py"}], "after_files": [{"content": null, "path": "opentelemetry-api/src/opentelemetry/context/threadlocal_context.py"}]}