Skip to content

ENH: freeze the shared entry-point loader mapping - #763

Open
d-chambers wants to merge 1 commit into
devfrom
free-thread-safety
Open

ENH: freeze the shared entry-point loader mapping#763
d-chambers wants to merge 1 commit into
devfrom
free-thread-safety

Conversation

@d-chambers

@d-chambers d-chambers commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Description

Last remnant of the original free-threading PR. Everything else landed through the PRs this was split into — #772, #773, #778, #779, #781, #785, #786 — and the merged versions are newer and more refined, so this branch was rebased onto dev and rescoped rather than replayed.

The one piece never split out was deduplicating concurrent plugin entry-point loading, via a synchronized cache that elected one loader per key plus a wait graph that turned mutual dependencies into a PluginLoadCycleError. That has been dropped. Its premise was that "loading a plugin imports third-party code, so running the loader more than once is not merely wasted work" — but entry_point.load() is an import, and CPython runs a module body exactly once behind its per-module import lock. Racing callers block on that lock and resolve the same already-registered class, on the free-threaded build as much as the default one. So the 195 lines of lock choreography and 500 lines of tests bought a saved entry_points() scan, and reintroduced exactly the claim/wait graph #779 deliberately declined to build in favor of holding the manager lock across plugin imports. Neither production caller needed it either: _FiberIOManager._eps only stores uncalled bound load methods and does its real loading under the manager RLock, leaving _MethodNameSpace.__getattr__ as the only racing path.

What is left is the part that survives that argument:

  • get_entry_point_loaders returns a FrozenDict. It is functools.cache'd, so every caller shares one mapping; handing out a mutable dict is a hazard regardless of threads. This matches get_registered_namespaces, which already returns a FrozenDict.
  • A comment recording why these caches stay unsynchronized, scoped to what CPython actually guarantees — a successful import of a module-level class. A failing import is dropped from sys.modules and retried by the next caller, which is the behavior we want anyway.
  • One test at the boundary: a barrier puts all four threads inside the loader before any may proceed, so a run whose calls did not really overlap fails rather than quietly asserting something weaker. They must come back with one object and one module execution, counted in a file because a second execution would build a new module object that a counter in module globals could not see.

Net effect on the branch: +701/-5 across three files becomes +96/-2 across two, and most of what remains is the test. dascore/exceptions.py is untouched again.

Checklist

I have (if applicable):

  • referenced the GitHub issue this PR closes.
  • documented the new feature with docstrings and/or appropriate doc page.
  • included tests. See testing guidelines.
  • added the "ready_for_review" tag once the PR is ready to be reviewed.

@d-chambers d-chambers added the ready_for_review PR is ready for review label Jul 22, 2026 — with ChatGPT Codex Connector

Copy link
Copy Markdown
Contributor Author

@codex review

@coderabbitai

coderabbitai Bot commented Jul 22, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The pull request adds context-local configuration, immutable cached values, lock-based coordination across registries, IO managers, remote caches, and catalogs, SQLite-backed index-map persistence, concurrency tests, and free-threaded Python CI coverage.

Changes

Concurrency and storage updates

Layer / File(s) Summary
Context-scoped configuration
dascore/config.py, tests/conftest.py, tests/test_utils/test_config.py
Configuration uses ContextVar state, SQLite becomes the default index-map format, and sync, async, and thread propagation are tested.
Immutable coordinate and spool data
dascore/core/*, tests/test_core/*
Coordinate mappings and cached arrays become immutable, while spool contents return caller-owned DataFrames.
Thread-safe registries and plugin attachment
dascore/units.py, dascore/utils/plugins.py, dascore/utils/namespace.py, tests/test_utils/test_plugins.py, tests/test_utils/test_namespace.py, tests/test_io/test_io_core.py
Registry access, plugin loading, format registration, and namespace attachment gain synchronized caches and locking.
Thread-safe IO managers and remote materialization
dascore/io/core.py, dascore/utils/io.py, dascore/utils/remote_io.py, tests/test_utils/test_io_utils.py
IO state, resource handles, and remote-file materialization use reentrant locks and coordinated cache clearing.
Serialized catalog and SQLite index-map updates
dascore/io/index/*, tests/test_io/test_index/*, tests/test_io/test_indexer.py
Catalog operations use revision locking, and index maps use transactional SQLite storage with migration, corruption recovery, and concurrent-writer coverage.
Free-threaded validation and concurrency contract
.github/workflows/runtests.yml, docs/recipes/parallelization.qmd
CI adds Python 3.14t testing, and documentation describes the updated concurrency behavior.

Possibly related PRs

Suggested labels: CI, IO, spool, patch

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 70.97% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title accurately captures one main change in the PR: freezing the shared entry-point loader mapping.
Description check ✅ Passed The description follows the template with a clear Description section and checklist, and it summarizes the scoped change well.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch free-thread-safety

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot added CI continuous integration IO Work for reading/writing different formats labels Jul 22, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 351c84c996

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread dascore/io/index/indexer.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (4)
dascore/utils/remote_io.py (1)

177-187: 🚀 Performance & Scalability | 🔵 Trivial

Global cache lock is held while blocking on a per-key download (same-key contention).

In _materialize_remote_file, state.lock.acquire() runs inside the with _REMOTE_CACHE_LOCK block. When two threads request the same key, the second thread blocks on state.lock while still holding the global _REMOTE_CACHE_LOCK; because the holder only releases state.lock after its (potentially long) download completes, other threads cannot even begin materializing different keys during that window. Lock ordering and correctness are sound, but this serializes unrelated remote downloads under same-key contention, which partially undercuts the free-threading goal. Consider a condition-variable / "leader downloads, followers await" pattern that releases the management lock before waiting.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@dascore/utils/remote_io.py` around lines 177 - 187, Update
_materialize_remote_file so it never blocks on state.lock while holding
_REMOTE_CACHE_LOCK. Keep management-lock bookkeeping and per-key state setup
inside the global lock, then release it before waiting for an existing same-key
download; use a condition-variable or equivalent leader/follower coordination so
followers await completion while unrelated keys can proceed concurrently,
preserving the current cache and cleanup correctness.
.github/workflows/runtests.yml (2)

125-232: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

New free_thread job has no explicit permissions: block.

Static analysis flags this as running with default (potentially broad) token permissions. Add a job-level permissions: block scoped to what's actually needed (this job doesn't appear to write anything besides Codecov upload).

🔒 Proposed fix
   free_thread:
     name: free_thread
     timeout-minutes: 60
     runs-on: ubuntu-latest
+    permissions:
+      contents: read
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/runtests.yml around lines 125 - 232, Add a job-level
permissions block to free_thread with the minimum required scope, keeping
repository contents read-only and granting only the permission needed by the
Codecov upload. Place it alongside the job configuration and avoid inheriting
broad default token permissions.

Source: Linters/SAST tools


139-142: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

actions/checkout doesn't disable credential persistence.

Static analysis flags this checkout step for not setting persist-credentials: false, which leaves the GitHub token in the local git config for later steps (including third-party actions) to potentially exfiltrate.

🔒 Proposed fix
       - uses: actions/checkout@v4
         with:
           fetch-tags: 'true'
           fetch-depth: '0'
+          persist-credentials: false
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/runtests.yml around lines 139 - 142, Update the
actions/checkout step to explicitly set persist-credentials to false while
preserving the existing fetch-tags and fetch-depth settings.

Source: Linters/SAST tools

dascore/io/index/catalog.py (1)

585-599: 🚀 Performance & Scalability | 🔵 Trivial | 🏗️ Heavy lift

self._syncer.ensure_updated() runs on every .backend access while holding the shared revision lock.

Since _view() shares _revision across all views of a root catalog, and every mutation/read path (to_df, add, update, remove, order_by, _ordered_ids) funnels through this backend property, any directory-sync cost incurred by ensure_updated() now serializes all concurrent catalog operations on every access, not just the first. Consider gating the sync check so it only runs when actually needed (e.g., a dedicated "last-checked" revision/timestamp) or decoupling it from the bootstrap lock so cheap reads aren't blocked behind a full directory rescan.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@dascore/io/index/catalog.py` around lines 585 - 599, The backend property
currently calls self._syncer.ensure_updated() on every access while holding the
shared self._revision lock, serializing all catalog operations behind directory
rescans. Update the backend initialization/synchronization flow around
self._backend and ensure_updated() to gate or decouple sync checks so unchanged
catalogs avoid repeated rescans and cheap reads do not remain blocked by
synchronization, while preserving invalidation when an update is detected.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@dascore/io/index/catalog.py`:
- Around line 941-972: Protect all shared-state read paths with
self._revision.lock, including _cold_live_values(), __len__(), get_patch(), and
__iter__(). Ensure cache value/revision pairs and resolver.live_entries()
iteration are read while holding the lock, relying on the RLock for safe nesting
with existing locked mutators and to_df/backend calls.

In `@dascore/utils/namespace.py`:
- Line 79: Update the nested zip calls in the namespace-building return
expression to pass strict=True, preserving the existing FrozenDict structure and
documenting that the DataFrame-derived columns must have matching lengths.

---

Nitpick comments:
In @.github/workflows/runtests.yml:
- Around line 125-232: Add a job-level permissions block to free_thread with the
minimum required scope, keeping repository contents read-only and granting only
the permission needed by the Codecov upload. Place it alongside the job
configuration and avoid inheriting broad default token permissions.
- Around line 139-142: Update the actions/checkout step to explicitly set
persist-credentials to false while preserving the existing fetch-tags and
fetch-depth settings.

In `@dascore/io/index/catalog.py`:
- Around line 585-599: The backend property currently calls
self._syncer.ensure_updated() on every access while holding the shared
self._revision lock, serializing all catalog operations behind directory
rescans. Update the backend initialization/synchronization flow around
self._backend and ensure_updated() to gate or decouple sync checks so unchanged
catalogs avoid repeated rescans and cheap reads do not remain blocked by
synchronization, while preserving invalidation when an update is detected.

In `@dascore/utils/remote_io.py`:
- Around line 177-187: Update _materialize_remote_file so it never blocks on
state.lock while holding _REMOTE_CACHE_LOCK. Keep management-lock bookkeeping
and per-key state setup inside the global lock, then release it before waiting
for an existing same-key download; use a condition-variable or equivalent
leader/follower coordination so followers await completion while unrelated keys
can proceed concurrently, preserving the current cache and cleanup correctness.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 22339d0d-fee1-4773-b029-3a2cba918c64

📥 Commits

Reviewing files that changed from the base of the PR and between 93d2707 and 351c84c.

📒 Files selected for processing (26)
  • .github/workflows/runtests.yml
  • dascore/config.py
  • dascore/core/coordmanager.py
  • dascore/core/coords.py
  • dascore/core/patch.py
  • dascore/core/spool.py
  • dascore/io/core.py
  • dascore/io/index/catalog.py
  • dascore/io/index/indexer.py
  • dascore/units.py
  • dascore/utils/io.py
  • dascore/utils/namespace.py
  • dascore/utils/plugins.py
  • dascore/utils/remote_io.py
  • docs/recipes/parallelization.qmd
  • tests/conftest.py
  • tests/test_core/test_coord_segmented.py
  • tests/test_core/test_coords.py
  • tests/test_core/test_spool.py
  • tests/test_io/test_index/test_index_edge_cases.py
  • tests/test_io/test_indexer.py
  • tests/test_io/test_io_core.py
  • tests/test_utils/test_config.py
  • tests/test_utils/test_io_utils.py
  • tests/test_utils/test_namespace.py
  • tests/test_utils/test_plugins.py

Comment thread dascore/io/index/catalog.py
Comment thread dascore/utils/namespace.py Outdated

Copy link
Copy Markdown
Contributor Author

@codex review

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/test_io/test_index/test_catalog.py`:
- Line 6: Alias the imported concurrent.futures TimeoutError to a distinct name
in test_catalog.py, then update the affected assertion around lines 90–91 to
reference that alias while preserving the existing timeout behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b552a808-747a-4949-88cd-96ec42421686

📥 Commits

Reviewing files that changed from the base of the PR and between 351c84c and 7f8e53d.

📒 Files selected for processing (9)
  • .github/workflows/runtests.yml
  • dascore/io/index/catalog.py
  • dascore/io/index/indexer.py
  • dascore/utils/namespace.py
  • dascore/utils/remote_io.py
  • tests/test_io/test_index/test_catalog.py
  • tests/test_io/test_indexer.py
  • tests/test_utils/test_config.py
  • tests/test_utils/test_io_utils.py
🚧 Files skipped from review as they are similar to previous changes (7)
  • .github/workflows/runtests.yml
  • tests/test_utils/test_config.py
  • tests/test_io/test_indexer.py
  • dascore/io/index/indexer.py
  • dascore/io/index/catalog.py
  • tests/test_utils/test_io_utils.py
  • dascore/utils/namespace.py

Comment thread tests/test_io/test_index/test_catalog.py Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7f8e53db7c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread dascore/io/index/indexer.py Outdated
Comment thread dascore/io/index/indexer.py Outdated
Comment thread dascore/io/core.py Outdated
Comment thread dascore/utils/remote_io.py Outdated

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2710ad86c5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread dascore/io/index/indexer.py Outdated
Comment thread dascore/io/index/indexer.py Outdated
Comment thread dascore/io/core.py

Copy link
Copy Markdown
Contributor Author

@codex review

@coderabbitai coderabbitai Bot added the spool related to Spool class label Jul 22, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@dascore/io/core.py`:
- Line 468: Rename the format parameter in the surrounding function to a
non-shadowing name to satisfy Ruff A001, and update all references within that
function, including the uppercasing assignment and any downstream format checks
or calls. Preserve the existing behavior when the value is None or provided.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 98908d2c-1f36-489b-827b-2ee725d0caa9

📥 Commits

Reviewing files that changed from the base of the PR and between 2710ad8 and 4eddc22.

📒 Files selected for processing (4)
  • dascore/io/core.py
  • dascore/io/index/indexer.py
  • tests/test_io/test_indexer.py
  • tests/test_io/test_io_core.py
🚧 Files skipped from review as they are similar to previous changes (2)
  • tests/test_io/test_io_core.py
  • dascore/io/index/indexer.py

Comment thread dascore/io/core.py Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4eddc22cd9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread dascore/io/core.py Outdated
Comment thread dascore/config.py Outdated
Comment thread dascore/io/index/indexer.py Outdated
Comment thread dascore/utils/remote_io.py Outdated

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9e9d657e8c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread dascore/utils/plugins.py Outdated
Comment thread dascore/config.py Outdated
Comment thread dascore/io/core.py Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9e9d657e8c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread dascore/utils/plugins.py Outdated
Comment thread dascore/config.py Outdated
Comment thread dascore/io/core.py Outdated
@coderabbitai coderabbitai Bot added the patch related to Patch class label Jul 22, 2026

Copy link
Copy Markdown
Contributor Author

@codex review

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/test_io/test_io_core.py`:
- Around line 591-596: Update the load worker’s exception handler in load to
catch Exception instead of BaseException, while preserving the existing
errors_lock synchronization and errors.append behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 98df60fe-8b5a-4681-834c-ada1aa3b28d7

📥 Commits

Reviewing files that changed from the base of the PR and between 4eddc22 and 403c20e.

📒 Files selected for processing (10)
  • dascore/config.py
  • dascore/io/core.py
  • dascore/io/index/indexer.py
  • dascore/utils/plugins.py
  • dascore/utils/remote_io.py
  • tests/test_io/test_indexer.py
  • tests/test_io/test_io_core.py
  • tests/test_utils/test_config.py
  • tests/test_utils/test_io_utils.py
  • tests/test_utils/test_plugins.py
🚧 Files skipped from review as they are similar to previous changes (7)
  • dascore/utils/remote_io.py
  • dascore/utils/plugins.py
  • dascore/config.py
  • dascore/io/core.py
  • dascore/io/index/indexer.py
  • tests/test_utils/test_io_utils.py
  • tests/test_io/test_indexer.py

Comment thread tests/test_io/test_io_core.py Outdated
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Keep it up!

Reviewed commit: 403c20e703

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a7a763265e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread dascore/config.py Outdated
@d-chambers

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8fc5d3cffa

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread dascore/io/index/catalog.py Outdated
Comment thread dascore/utils/plugins.py Outdated
Comment thread dascore/io/core.py Outdated
@d-chambers

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a4257bb96c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread dascore/utils/plugins.py Outdated
@d-chambers

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 🎉

Reviewed commit: 2930a457c5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@codecov

codecov Bot commented Jul 27, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (35f7e0d) to head (4edd9b6).

Additional details and impacted files
@@            Coverage Diff             @@
##               dev      #763    +/-   ##
==========================================
  Coverage   100.00%   100.00%            
==========================================
  Files          164       164            
  Lines        17713     17819   +106     
==========================================
+ Hits         17713     17819   +106     
Flag Coverage Δ
network 48.27% <61.26%> (+0.07%) ⬆️
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@d-chambers
d-chambers force-pushed the free-thread-safety branch from 3d21025 to 4edd9b6 Compare July 27, 2026 15:27
Return a FrozenDict from get_entry_point_loaders so the one mapping every
caller shares cannot be mutated, and document why the plugin caches stay
unsynchronized: entry_point.load() imports the plugin, and CPython runs a
module body exactly once behind its per-module import lock.
@d-chambers d-chambers changed the title ENH: deduplicate concurrent plugin entry-point loading ENH: freeze the shared entry-point loader mapping Jul 28, 2026
@d-chambers
d-chambers force-pushed the free-thread-safety branch from 4edd9b6 to 0da55a5 Compare July 28, 2026 07:23
@coderabbitai coderabbitai Bot mentioned this pull request Aug 1, 2026
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CI continuous integration IO Work for reading/writing different formats patch related to Patch class ready_for_review PR is ready for review spool related to Spool class

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant