10 Commits
Author SHA1 Message Date
semantic-release-bot e7a932f716 chore(release): 0.2.2 [skip ci]
## [0.2.2](https://github.com/asepharyana/corex/compare/v0.2.1...v0.2.2) (2026-08-28)

### Bug Fixes

* **release:** dispatch publish via gh api in exec successCmd ([3c04aa4](https://github.com/asepharyana/corex/commit/3c04aa44b6110c8ce15278d7dc76828c44dfc8d9))
2026-08-28 10:15:48 +00:00
asepharyana 3c04aa44b6 fix(release): dispatch publish via gh api in exec successCmd
gh workflow run failed inside successCmd (exit 1, no output shown).
Switch to gh api REST dispatch which is transparent and reliable.
successCmd only runs after semantic-release actually publishes a new
version, so this fires once per release, exactly on the new tag.
Remove the separate Detect step (it depended on git state that is not
updated by semantic-release).
2026-08-28 17:15:12 +07:00
semantic-release-bot 5a2bb634a1 chore(release): 0.2.1 [skip ci]
## [0.2.1](https://github.com/asepharyana/corex/compare/v0.2.0...v0.2.1) (2026-08-28)

### Bug Fixes

* **release:** dispatch publish via exec successCmd not step output ([6c8c98e](https://github.com/asepharyana/corex/commit/6c8c98e86cf27b6a998124e3de3b226a78c82f66))
2026-08-28 10:10:44 +00:00
asepharyana 6c8c98e86c fix(release): dispatch publish via exec successCmd not step output
CI / Rustfmt (push) Canceled after 0s
CI / Clippy (push) Canceled after 0s
CI / Test (default features) (push) Canceled after 0s
CI / Test (all features) (push) Canceled after 0s
CI / Test (bg only) (push) Canceled after 0s
CI / Test (compute only) (push) Canceled after 0s
CI / Test (io only) (push) Canceled after 0s
CI / Run example (push) Canceled after 0s
CI / Docs check (push) Canceled after 0s
CI / Cargo package dry-run (push) Canceled after 0s
Release / Semantic Release (push) Canceled after 0s
The prior pattern relying on steps.semantic-release.outputs did not
fire. Move the publish dispatch into @semantic-release/exec successCmd,
which runs only after a release is actually published and has
nextRelease.version available. Also add GH_TOKEN env for gh CLI
(GITHUB_TOKEN alone is not read by gh).
2026-08-28 17:10:16 +07:00
semantic-release-bot c995b2b937 chore(release): 0.2.0 [skip ci]
# [0.2.0](https://github.com/asepharyana/corex/compare/v0.1.0...v0.2.0) (2026-08-28)

### Bug Fixes

* **release:** remove --locked from cargo check in release prepare ([90322b5](https://github.com/asepharyana/corex/commit/90322b5f970aaf48b6da0adaf89c2f516aec0e4c))

### Features

* **release:** add semantic-release auto versioning ([12a1ab1](https://github.com/asepharyana/corex/commit/12a1ab10d04dec40f8b93edb51bb6104f6a75bcb))
2026-08-28 10:07:22 +00:00
asepharyana 90322b5f97 fix(release): remove --locked from cargo check in release prepare
cargo check --locked fails after bumping version in Cargo.toml because
Cargo.lock needs to be regenerated with the new root package version.
Semantic-release bump then committed Cargo.toml+CHANGELOG but lockfile
stayed stale, so the whole prepare step errored out.
2026-08-28 17:06:51 +07:00
asepharyana 8a3869773c chore(release): add workflow_dispatch trigger for manual release test 2026-08-28 17:05:28 +07:00
asepharyana 12a1ab10d0 feat(release): add semantic-release auto versioning
- Add .releaserc.json: conventional commits -> semantic version bump
  (major/minor/patch), updates Cargo.toml + Cargo.lock version, writes
  CHANGELOG.md, commits as 'chore(release): X.Y.Z [skip ci]'
- Add release.yml: runs semantic-release on main push, then triggers
  publish.yml via workflow_dispatch with the new tag
- Update publish.yml: add workflow_dispatch input (tag) so release
  workflow can trigger publish directly (GITHUB_TOKEN tag pushes do not
  trigger 'on: push: tags'); still supports manual tag pushes
2026-08-28 17:03:12 +07:00
asepharyana b344828d73 Fix ambiguous intra-doc links for compute function/module
CI / Rustfmt (push) Canceled after 0s
CI / Clippy (push) Canceled after 0s
CI / Test (default features) (push) Canceled after 0s
CI / Test (all features) (push) Canceled after 0s
CI / Test (bg only) (push) Canceled after 0s
CI / Test (compute only) (push) Canceled after 0s
CI / Test (io only) (push) Canceled after 0s
CI / Run example (push) Canceled after 0s
CI / Docs check (push) Canceled after 0s
CI / Cargo package dry-run (push) Canceled after 0s
Publish to crates.io / Publish (push) Canceled after 0s
2026-08-28 16:46:50 +07:00
asepharyana d8354d6cec Rename crate to mytheclipse and flatten workspace to single crate
- Rename corex -> mytheclipse (corex name taken on crates.io by an
  unrelated crate published by David-Kunz in 2023)
- Flatten corex + corex-core workspace into a single crate; all modules
  (context/error/io/compute/bg) now live directly under src/
- Update Cargo.toml metadata: real repo URL, docs.rs, author
- Update README, example, doc comments, tracing span names
- Fix CI: single package dry-run (corex-core no longer separate)
- Fix publish workflow: single cargo publish step
2026-08-28 16:44:28 +07:00
19 changed files with 593 additions and 164 deletions

No files matched your search

+7 -9
View File
@@ -29,9 +29,9 @@ jobs:
with: with:
components: clippy components: clippy
- name: Clippy (all features) - name: Clippy (all features)
run: cargo clippy --workspace --all-features -- -D warnings run: cargo clippy --all-features -- -D warnings
- name: Clippy (no default features) - name: Clippy (no default features)
run: cargo clippy --workspace --no-default-features -- -D warnings run: cargo clippy --no-default-features -- -D warnings
test-matrix: test-matrix:
name: Test (${{ matrix.name }}) name: Test (${{ matrix.name }})
@@ -54,9 +54,9 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@stable
- name: Build - name: Build
run: cargo build --workspace ${{ matrix.flags }} run: cargo build --all-targets ${{ matrix.flags }}
- name: Test - name: Test
run: cargo test --workspace ${{ matrix.flags }} run: cargo test ${{ matrix.flags }}
example: example:
name: Run example name: Run example
@@ -72,7 +72,7 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@stable
- run: RUSTDOCFLAGS="-D warnings" cargo doc --workspace --all-features --no-deps - run: RUSTDOCFLAGS="-D warnings" cargo doc --all-features --no-deps
package: package:
name: Cargo package dry-run name: Cargo package dry-run
@@ -80,7 +80,5 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@stable
- name: Package corex-core - name: Package
run: cargo package -p corex-core --no-verify run: cargo package --no-verify
- name: Package corex
run: cargo package -p corex --no-verify
+16 -8
View File
@@ -3,6 +3,15 @@ name: Publish to crates.io
on: on:
push: push:
tags: ["v*.*.*"] tags: ["v*.*.*"]
workflow_dispatch:
inputs:
tag:
description: "Git tag to publish (e.g. v0.2.0). Defaults to latest tag."
required: false
type: string
permissions:
contents: read
jobs: jobs:
publish: publish:
@@ -10,14 +19,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
with:
ref: ${{ inputs.tag || github.event.ref || github.ref }}
fetch-depth: 0
- uses: dtolnay/rust-toolchain@stable - uses: dtolnay/rust-toolchain@stable
- name: Publish corex-core
run: cargo publish -p corex-core --allow-dirty --no-verify - name: Publish mytheclipse
env: run: cargo publish --allow-dirty --no-verify
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
- name: Wait for crates.io indexing
run: sleep 30
- name: Publish corex
run: cargo publish -p corex --allow-dirty --no-verify
env: env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
+45
View File
@@ -0,0 +1,45 @@
name: Release
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: write
issues: write
pull-requests: write
jobs:
release:
name: Semantic Release
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "lts/*"
- name: Install semantic-release
run: |
npm install -D \
semantic-release \
@semantic-release/exec \
@semantic-release/git \
@semantic-release/changelog \
@semantic-release/github
- name: Run semantic-release
id: semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: npx semantic-release
-6
View File
@@ -1,11 +1,5 @@
# Cargo build artifacts # Cargo build artifacts
/target /target
/crates/*/target
# corex is a library workspace: the lockfile is not committed, per Rust's
# convention for libraries (binaries/applications should commit theirs).
# Cargo regenerates it locally and in CI on every build.
Cargo.lock
# Editor / OS noise # Editor / OS noise
.DS_Store .DS_Store
+19
View File
@@ -0,0 +1,19 @@
{
"branches": ["main"],
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"@semantic-release/changelog",
["@semantic-release/exec", {
"prepareCmd": "sed -i 's/^version = \\\"[^\\\"]*\\\"/version = \\\"${nextRelease.version}\\\"/' Cargo.toml && cargo check",
"successCmd": "gh api -X POST repos/${GITHUB_REPOSITORY}/actions/workflows/publish.yml/dispatches -f ref=main -f 'inputs[tag]=v${nextRelease.version}'"
}],
["@semantic-release/git", {
"assets": ["Cargo.toml", "Cargo.lock", "CHANGELOG.md"],
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
}],
["@semantic-release/github", {
"assets": []
}]
]
}
+25
View File
@@ -0,0 +1,25 @@
## [0.2.2](https://github.com/asepharyana/corex/compare/v0.2.1...v0.2.2) (2026-08-28)
### Bug Fixes
* **release:** dispatch publish via gh api in exec successCmd ([3c04aa4](https://github.com/asepharyana/corex/commit/3c04aa44b6110c8ce15278d7dc76828c44dfc8d9))
## [0.2.1](https://github.com/asepharyana/corex/compare/v0.2.0...v0.2.1) (2026-08-28)
### Bug Fixes
* **release:** dispatch publish via exec successCmd not step output ([6c8c98e](https://github.com/asepharyana/corex/commit/6c8c98e86cf27b6a998124e3de3b226a78c82f66))
# [0.2.0](https://github.com/asepharyana/corex/compare/v0.1.0...v0.2.0) (2026-08-28)
### Bug Fixes
* **release:** remove --locked from cargo check in release prepare ([90322b5](https://github.com/asepharyana/corex/commit/90322b5f970aaf48b6da0adaf89c2f516aec0e4c))
### Features
* **release:** add semantic-release auto versioning ([12a1ab1](https://github.com/asepharyana/corex/commit/12a1ab10d04dec40f8b93edb51bb6104f6a75bcb))
Generated
+408
View File
@@ -0,0 +1,408 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "bitflags"
version = "2.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
[[package]]
name = "bytes"
version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
[[package]]
name = "cfg-if"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "crossbeam-deque"
version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb"
dependencies = [
"crossbeam-epoch",
"crossbeam-utils",
]
[[package]]
name = "crossbeam-epoch"
version = "0.9.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "crossbeam-utils"
version = "0.8.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17"
[[package]]
name = "either"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e5e8f6c15a24b9a3ee5efec809ccd006d3b30e8b3bb63c39af737c7f87daa1d"
[[package]]
name = "errno"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys",
]
[[package]]
name = "hermit-abi"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.189"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
[[package]]
name = "lock_api"
version = "0.4.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
dependencies = [
"scopeguard",
]
[[package]]
name = "log"
version = "0.4.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
[[package]]
name = "mio"
version = "1.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427"
dependencies = [
"libc",
"wasi",
"windows-sys",
]
[[package]]
name = "mytheclipse"
version = "0.2.2"
dependencies = [
"num_cpus",
"rayon",
"tokio",
"tracing",
"tracing-subscriber",
]
[[package]]
name = "nu-ansi-term"
version = "0.50.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
dependencies = [
"windows-sys",
]
[[package]]
name = "num_cpus"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b"
dependencies = [
"hermit-abi",
"libc",
]
[[package]]
name = "once_cell"
version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
[[package]]
name = "parking_lot"
version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
dependencies = [
"lock_api",
"parking_lot_core",
]
[[package]]
name = "parking_lot_core"
version = "0.9.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
"windows-link",
]
[[package]]
name = "pin-project-lite"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
[[package]]
name = "proc-macro2"
version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
dependencies = [
"proc-macro2",
]
[[package]]
name = "rayon"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d"
dependencies = [
"either",
"rayon-core",
]
[[package]]
name = "rayon-core"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
dependencies = [
"crossbeam-deque",
"crossbeam-utils",
]
[[package]]
name = "redox_syscall"
version = "0.5.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
dependencies = [
"bitflags",
]
[[package]]
name = "scopeguard"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "sharded-slab"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
dependencies = [
"lazy_static",
]
[[package]]
name = "signal-hook-registry"
version = "1.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
dependencies = [
"errno",
"libc",
]
[[package]]
name = "smallvec"
version = "1.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
[[package]]
name = "socket2"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
dependencies = [
"libc",
"windows-sys",
]
[[package]]
name = "syn"
version = "2.0.119"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "syn"
version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "thread_local"
version = "1.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ad99c4c6d32803332c548b1af0540b357b3f5fc0be8f6c6bfe8b2e6ae784070"
dependencies = [
"cfg-if",
]
[[package]]
name = "tokio"
version = "1.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed"
dependencies = [
"bytes",
"libc",
"mio",
"parking_lot",
"pin-project-lite",
"signal-hook-registry",
"socket2",
"tokio-macros",
"windows-sys",
]
[[package]]
name = "tokio-macros"
version = "2.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e"
dependencies = [
"proc-macro2",
"quote",
"syn 3.0.3",
]
[[package]]
name = "tracing"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
dependencies = [
"pin-project-lite",
"tracing-attributes",
"tracing-core",
]
[[package]]
name = "tracing-attributes"
version = "0.1.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.119",
]
[[package]]
name = "tracing-core"
version = "0.1.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
dependencies = [
"once_cell",
"valuable",
]
[[package]]
name = "tracing-log"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
dependencies = [
"log",
"once_cell",
"tracing-core",
]
[[package]]
name = "tracing-subscriber"
version = "0.3.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319"
dependencies = [
"nu-ansi-term",
"sharded-slab",
"smallvec",
"thread_local",
"tracing-core",
"tracing-log",
]
[[package]]
name = "unicode-ident"
version = "1.0.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
[[package]]
name = "valuable"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]
+19 -41
View File
@@ -1,57 +1,35 @@
[workspace] [package]
resolver = "2" name = "mytheclipse"
members = ["crates/corex-core"] version = "0.2.2"
[workspace.package]
version = "0.1.0"
edition = "2021" edition = "2021"
rust-version = "1.75" rust-version = "1.75"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
repository = "https://github.com/username/corex" repository = "https://github.com/asepharyana/corex"
homepage = "https://github.com/username/corex" homepage = "https://github.com/asepharyana/corex"
documentation = "https://docs.rs/corex" documentation = "https://docs.rs/mytheclipse"
authors = ["The corex Authors"] authors = ["asepharyana <superaseph@gmail.com>"]
[workspace.dependencies]
tokio = { version = "1.53", features = ["full"] }
rayon = "1.12"
num_cpus = "1.17"
tracing = "0.1"
corex-core = { path = "crates/corex-core", version = "0.1.0", default-features = false }
[package]
name = "corex"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
documentation.workspace = true
authors.workspace = true
description = "Resource-aware abstractions for async I/O, heavy compute, and background queue management." description = "Resource-aware abstractions for async I/O, heavy compute, and background queue management."
readme = "README.md" readme = "README.md"
keywords = ["async", "concurrency", "rayon", "tokio", "resource-management"] keywords = ["async", "concurrency", "rayon", "tokio", "resource-management"]
categories = ["asynchronous", "concurrency", "rust-patterns"] categories = ["asynchronous", "concurrency", "rust-patterns"]
[lib] [dependencies]
name = "corex" tokio = { version = "1.53", features = ["full"], optional = true }
path = "src/lib.rs" rayon = { version = "1.12", optional = true }
num_cpus = "1.17"
tracing = "0.1"
[dev-dependencies]
tokio = { version = "1.53", features = ["full"] }
tracing-subscriber = "0.3"
[features] [features]
default = [] default = []
io = ["corex-core/io"] io = ["dep:tokio"]
compute = ["corex-core/compute"] compute = ["dep:rayon"]
bg = ["corex-core/bg"] bg = ["dep:tokio"]
full = ["io", "compute", "bg"] full = ["io", "compute", "bg"]
[dependencies]
corex-core = { workspace = true }
[dev-dependencies]
tokio = { workspace = true }
tracing-subscriber = "0.3"
[[example]] [[example]]
name = "main" name = "main"
path = "examples/main.rs" path = "examples/main.rs"
+11 -11
View File
@@ -1,7 +1,7 @@
# corex # mytheclipse
[![Crates.io](https://img.shields.io/crates/v/corex.svg)](https://crates.io/crates/corex) [![Crates.io](https://img.shields.io/crates/v/mytheclipse.svg)](https://crates.io/crates/mytheclipse)
[![Documentation](https://docs.rs/corex/badge.svg)](https://docs.rs/corex) [![Documentation](https://docs.rs/mytheclipse/badge.svg)](https://docs.rs/mytheclipse)
[![License](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)](LICENSE-MIT) [![License](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)](LICENSE-MIT)
Resource-aware execution primitives for Rust: async I/O, heavy compute, and background queue management, sized automatically from the host's logical core count and exposed through a single, lazily-initialized engine context. Resource-aware execution primitives for Rust: async I/O, heavy compute, and background queue management, sized automatically from the host's logical core count and exposed through a single, lazily-initialized engine context.
@@ -18,9 +18,9 @@ Given $N$ logical cores (via `num_cpus::get()`):
## Features ## Features
- **`io`**: enables `corex::spawn_io`, instrumented async task spawning. - **`io`**: enables `mytheclipse::spawn_io`, instrumented async task spawning.
- **`compute`**: enables `corex::compute`, panic-isolated execution on a sized Rayon pool. - **`compute`**: enables `mytheclipse::compute`, panic-isolated execution on a sized Rayon pool.
- **`bg`**: enables `corex::spawn_bg`, semaphore-bounded background tasks. - **`bg`**: enables `mytheclipse::spawn_bg`, semaphore-bounded background tasks.
- **`full`**: enables all three subsystems. - **`full`**: enables all three subsystems.
Zero features enabled by default (`default = []`), so you only pull in the dependencies your application actually uses. Zero features enabled by default (`default = []`), so you only pull in the dependencies your application actually uses.
@@ -31,7 +31,7 @@ Add to your `Cargo.toml`:
```toml ```toml
[dependencies] [dependencies]
corex = { version = "0.1", features = ["full"] } mytheclipse = { version = "0.1", features = ["full"] }
``` ```
Use the entry points directly: Use the entry points directly:
@@ -41,23 +41,23 @@ Use the entry points directly:
async fn main() { async fn main() {
// Optional explicit bootstrap: logs or validates resource sizing upfront. // Optional explicit bootstrap: logs or validates resource sizing upfront.
// Omit it and the first call to any primitive below will initialize it lazily. // Omit it and the first call to any primitive below will initialize it lazily.
let ctx = corex::init(); let ctx = mytheclipse::init();
println!( println!(
"io_threads={} compute_threads={} bg_concurrency={}", "io_threads={} compute_threads={} bg_concurrency={}",
ctx.io_threads, ctx.compute_threads, ctx.bg_concurrency ctx.io_threads, ctx.compute_threads, ctx.bg_concurrency
); );
// 1. Async I/O (instrumented with tracing) // 1. Async I/O (instrumented with tracing)
let io = corex::spawn_io(async { let io = mytheclipse::spawn_io(async {
// ... network / disk work ... // ... network / disk work ...
42 42
}); });
// 2. Heavy Compute (isolated from worker panics) // 2. Heavy Compute (isolated from worker panics)
let sum = corex::compute(|| (1..=1_000_000u64).sum::<u64>())?; let sum = mytheclipse::compute(|| (1..=1_000_000u64).sum::<u64>())?;
// 3. Background Queue (concurrency-bounded) // 3. Background Queue (concurrency-bounded)
let bg = corex::spawn_bg(async { let bg = mytheclipse::spawn_bg(async {
// ... deferred cleanup / telemetry ... // ... deferred cleanup / telemetry ...
}).await; }).await;
-31
View File
@@ -1,31 +0,0 @@
[package]
name = "corex-core"
version.workspace = true
edition.workspace = true
rust-version.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
documentation.workspace = true
authors.workspace = true
description = "Core allocation logic and execution primitives for corex."
readme = "README.md"
keywords = ["async", "concurrency", "rayon", "tokio", "resource-management"]
categories = ["asynchronous", "concurrency", "rust-patterns"]
[features]
default = []
io = ["dep:tokio"]
compute = ["dep:rayon"]
bg = ["dep:tokio"]
full = ["io", "compute", "bg"]
[dependencies]
tokio = { workspace = true, optional = true }
rayon = { workspace = true, optional = true }
num_cpus = { workspace = true }
tracing = { workspace = true }
[package.metadata.docs.rs]
all-features = true
rustdoc-args = ["--cfg", "docsrs"]
-9
View File
@@ -1,9 +0,0 @@
# corex-core
Core allocation logic, global context initialization, and execution primitives for [`corex`](https://crates.io/crates/corex).
Applications should depend on the `corex` facade crate rather than this crate directly.
## License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
-19
View File
@@ -1,19 +0,0 @@
//! Core allocation logic, global context initialization, and execution
//! primitives for [corex](https://docs.rs/corex).
//!
//! This crate is not typically consumed directly; applications should
//! depend on the `corex` facade crate instead, which re-exports the pieces
//! of this crate behind feature flags.
pub mod context;
#[cfg(feature = "compute")]
pub mod error;
#[cfg(feature = "io")]
pub mod io;
#[cfg(feature = "compute")]
pub mod compute;
#[cfg(feature = "bg")]
pub mod bg;
+7 -7
View File
@@ -1,30 +1,30 @@
//! Demonstrates `corex`'s three execution primitives end to end, including //! Demonstrates `mytheclipse`'s three execution primitives end to end, including
//! automatic recovery from a panicking compute closure. //! automatic recovery from a panicking compute closure.
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
let ctx = corex::init(); let ctx = mytheclipse::init();
println!( println!(
"engine context: io_threads={} compute_threads={} bg_concurrency={}", "engine context: io_threads={} compute_threads={} bg_concurrency={}",
ctx.io_threads, ctx.compute_threads, ctx.bg_concurrency ctx.io_threads, ctx.compute_threads, ctx.bg_concurrency
); );
let io_handle = corex::spawn_io(async { let io_handle = mytheclipse::spawn_io(async {
tokio::time::sleep(std::time::Duration::from_millis(50)).await; tokio::time::sleep(std::time::Duration::from_millis(50)).await;
42u64 42u64
}); });
let sum_result = corex::compute(|| (1..=1_000u64).sum::<u64>()); let sum_result = mytheclipse::compute(|| (1..=1_000u64).sum::<u64>());
let panic_result: Result<u64, corex::CorexError> = corex::compute(|| { let panic_result: Result<u64, mytheclipse::CorexError> = mytheclipse::compute(|| {
panic!("intentional panic to demonstrate isolation"); panic!("intentional panic to demonstrate isolation");
}); });
let recovery_result = corex::compute(|| 2u64 + 2u64); let recovery_result = mytheclipse::compute(|| 2u64 + 2u64);
let bg_handle = corex::spawn_bg(async { let bg_handle = mytheclipse::spawn_bg(async {
tokio::time::sleep(std::time::Duration::from_millis(10)).await; tokio::time::sleep(std::time::Duration::from_millis(10)).await;
"bg-task-done" "bg-task-done"
}) })
+2 -2
View File
@@ -30,8 +30,8 @@ where
.bg_semaphore .bg_semaphore
.acquire() .acquire()
.await .await
.expect("corex: bg semaphore closed unexpectedly"); .expect("mytheclipse: bg semaphore closed unexpectedly");
let span = tracing::info_span!("corex_bg_task"); let span = tracing::info_span!("mytheclipse_bg_task");
tokio::spawn( tokio::spawn(
async move { async move {
let _permit = permit; let _permit = permit;
File renamed without changes.
@@ -10,7 +10,7 @@ static CONTEXT: OnceLock<EngineContext> = OnceLock::new();
/// The global, lazily-initialized engine context. /// The global, lazily-initialized engine context.
/// ///
/// Holds the computed thread and concurrency counts for each corex /// Holds the computed thread and concurrency counts for each mytheclipse
/// subsystem, along with the resource pools those counts were used to /// subsystem, along with the resource pools those counts were used to
/// build. The context lives for the lifetime of the process once /// build. The context lives for the lifetime of the process once
/// initialized: it is stored in a `'static` [`OnceLock`] and is never /// initialized: it is stored in a `'static` [`OnceLock`] and is never
@@ -46,9 +46,9 @@ impl EngineContext {
#[cfg(feature = "compute")] #[cfg(feature = "compute")]
let compute_pool = rayon::ThreadPoolBuilder::new() let compute_pool = rayon::ThreadPoolBuilder::new()
.num_threads(compute_threads) .num_threads(compute_threads)
.thread_name(|index| format!("corex-compute-{index}")) .thread_name(|index| format!("mytheclipse-compute-{index}"))
.build() .build()
.expect("corex: failed to build rayon compute thread pool"); .expect("mytheclipse: failed to build rayon compute thread pool");
#[cfg(feature = "bg")] #[cfg(feature = "bg")]
let bg_semaphore = tokio::sync::Semaphore::new(bg_concurrency); let bg_semaphore = tokio::sync::Semaphore::new(bg_concurrency);
@@ -1,6 +1,6 @@
//! Shared error type for corex execution primitives. //! Shared error type for mytheclipse execution primitives.
/// Errors surfaced by corex's panic-isolated execution primitives. /// Errors surfaced by mytheclipse's panic-isolated execution primitives.
/// ///
/// Marked `#[non_exhaustive]` so new variants can be added without a /// Marked `#[non_exhaustive]` so new variants can be added without a
/// breaking change; downstream `match` expressions should include a /// breaking change; downstream `match` expressions should include a
+3 -3
View File
@@ -3,11 +3,11 @@
use tracing::Instrument; use tracing::Instrument;
/// Spawns `future` onto the ambient Tokio runtime, wrapped in a /// Spawns `future` onto the ambient Tokio runtime, wrapped in a
/// `corex_io_task` tracing span. /// `mytheclipse_io_task` tracing span.
/// ///
/// # Panics /// # Panics
/// ///
/// Panics if called outside the context of a running Tokio runtime; corex /// Panics if called outside the context of a running Tokio runtime; mytheclipse
/// does not construct or own a runtime of its own, it schedules onto /// does not construct or own a runtime of its own, it schedules onto
/// whichever runtime the caller is already inside. /// whichever runtime the caller is already inside.
pub fn spawn_io<F>(future: F) -> tokio::task::JoinHandle<F::Output> pub fn spawn_io<F>(future: F) -> tokio::task::JoinHandle<F::Output>
@@ -15,7 +15,7 @@ where
F: std::future::Future + Send + 'static, F: std::future::Future + Send + 'static,
F::Output: Send + 'static, F::Output: Send + 'static,
{ {
let span = tracing::info_span!("corex_io_task"); let span = tracing::info_span!("mytheclipse_io_task");
tokio::spawn(future.instrument(span)) tokio::spawn(future.instrument(span))
} }
+26 -13
View File
@@ -1,4 +1,4 @@
//! # corex //! # mytheclipse
//! //!
//! Resource-aware abstractions for async I/O, heavy compute, and //! Resource-aware abstractions for async I/O, heavy compute, and
//! background queue management, built on a single lazily-initialized //! background queue management, built on a single lazily-initialized
@@ -9,31 +9,44 @@
//! feature-gated entry points your workload needs: //! feature-gated entry points your workload needs:
//! //!
//! - [`spawn_io`] (feature `io`) — spawn an async I/O task, tracing-instrumented. //! - [`spawn_io`] (feature `io`) — spawn an async I/O task, tracing-instrumented.
//! - [`compute`] (feature `compute`) — run CPU-bound work on a sized Rayon pool, panic-isolated. //! - [`compute()`] (feature `compute`) — run CPU-bound work on a sized Rayon pool, panic-isolated.
//! - [`spawn_bg`] (feature `bg`) — spawn a background task under bounded concurrency. //! - [`spawn_bg`] (feature `bg`) — spawn a background task under bounded concurrency.
//! //!
//! Enable the `full` feature to pull in all three at once. //! Enable the `full` feature to pull in all three at once.
pub use corex_core::context::{context, EngineContext}; pub mod context;
#[cfg(feature = "compute")] #[cfg(feature = "compute")]
pub use corex_core::error::CorexError; pub mod error;
#[cfg(feature = "io")] #[cfg(feature = "io")]
pub use corex_core::io::spawn_io; pub mod io;
#[cfg(feature = "compute")] #[cfg(feature = "compute")]
pub use corex_core::compute::compute; pub mod compute;
#[cfg(feature = "bg")] #[cfg(feature = "bg")]
pub use corex_core::bg::spawn_bg; pub mod bg;
/// Bootstraps the global corex [`EngineContext`]. pub use context::{context, EngineContext};
#[cfg(feature = "compute")]
pub use error::CorexError;
#[cfg(feature = "io")]
pub use io::spawn_io;
#[cfg(feature = "compute")]
pub use compute::compute;
#[cfg(feature = "bg")]
pub use bg::spawn_bg;
/// Bootstraps the global [`EngineContext`].
/// ///
/// See [`corex_core::context::init`] for full semantics: this is safe to /// See [`context::init`] for full semantics: this is safe to call any
/// call any number of times, from any thread, and is equivalent to letting /// number of times, from any thread, and is equivalent to letting the
/// the first call to [`spawn_io`], [`compute`], or [`spawn_bg`] trigger /// first call to [`spawn_io`], [`compute()`], or [`spawn_bg`] trigger
/// initialization implicitly. /// initialization implicitly.
pub fn init() -> &'static EngineContext { pub fn init() -> &'static EngineContext {
corex_core::context::init() context::init()
} }