{"record":{"id":"b7d1d645c70ecd57","repo":"cocoindex-io/cocoindex","slug":"an-app-named-name-is-already-registered-in-thi","errorCode":null,"errorMessage":"An app named '{name}' is already registered in this environment.","messagePattern":"An app named '(.+?)' is already registered in this environment\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"python/cocoindex/_internal/environment.py","lineNumber":153,"sourceCode":"\n    __slots__ = (\"_env_ref\", \"_app_registry\", \"_app_registry_lock\")\n\n    _env_ref: weakref.ReferenceType[Environment | LazyEnvironment]\n    _app_registry: weakref.WeakValueDictionary[str, App[Any, Any]]\n    _app_registry_lock: threading.Lock\n\n    def __init__(self, env: Environment | LazyEnvironment) -> None:\n        self._env_ref = weakref.ref(env)\n        self._app_registry = weakref.WeakValueDictionary()\n        self._app_registry_lock = threading.Lock()\n        with _environment_info_lock:\n            _environment_infos.append(self)\n\n    def register_app(self, name: str, app: App[Any, Any]) -> None:\n        \"\"\"Register an app with this environment.\"\"\"\n        with self._app_registry_lock:\n            if name in self._app_registry:\n                raise ValueError(\n                    f\"An app named '{name}' is already registered in this environment.\"\n                )\n            self._app_registry[name] = app\n\n    def get_apps(self) -> list[App[Any, Any]]:\n        \"\"\"Get all registered apps for this environment.\"\"\"\n        with self._app_registry_lock:\n            return list(self._app_registry.values())\n\n    @property\n    def env(self) -> Environment | LazyEnvironment | None:\n        \"\"\"The environment, or None if it has been garbage collected.\"\"\"\n        return self._env_ref()\n\n    @property\n    def env_name(self) -> str | None:\n        \"\"\"The environment name, or None if it has been garbage collected.\"\"\"\n        env = self.env","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/cocoindex-io/cocoindex/blob/e84aa99b3292c5270a4b313b2a7137ad9ce8ab3b/python/cocoindex/_internal/environment.py#L135-L171","documentation":"Environment.register_app keeps a name-keyed registry of Apps per environment and rejects duplicate names under a lock. Registering a second App with the same name would make lookups ambiguous, so a ValueError is raised.","triggerScenarios":"Constructing and registering coco.App(AppConfig(name=\"X\"), ...) twice in the same Environment — e.g. re-running app setup in a notebook, a script that creates the App in a loop, or module re-import without clearing the environment.","commonSituations":"Jupyter notebook cell re-execution, test suites building apps per test with the same name, hot-reloading dev servers that re-run module code while the environment persists.","solutions":["Use a unique app name per registration (e.g. include a timestamp or test id)","Drop or close the existing app/environment before re-registering","Reuse the already-registered App instead of creating a new one","Call env.drop()/reset so the registry is cleared between runs"],"exampleFix":"# before\napp = coco.App(coco.AppConfig(name=\"FilesTransform\"), app_main)\n\n# after (re-run-safe)\nname = f\"FilesTransform-{uuid.uuid4().hex[:8]}\"\napp = coco.App(coco.AppConfig(name=name), app_main)","handlingStrategy":"validation","validationCode":"existing = {a.name for a in env.get_apps()}\nassert app_name not in existing, f\"app {app_name} already registered\"","typeGuard":null,"tryCatchPattern":"try:\n    env.register_app(name, app)\nexcept ValueError:\n    app = env.get_apps()[[a.name for a in env.get_apps()].index(name)]  # reuse existing","preventionTips":["Generate unique app names in notebooks/tests (uuid suffix)","Reuse a module-level singleton App instead of re-creating it","Tear down the environment between runs"],"tags":["python","duplicate-registration","environment"],"backgroundTag":"file-already-exists","analyzedSha":"e84aa99b3292c5270a4b313b2a7137ad9ce8ab3b","analyzedAt":"2026-09-08T15:59:19.997Z","contentChangedAt":"2026-09-08T15:59:19.997Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}