publish as catena-corpus on PyPI and npm

Both registries already have a `catena`: an HPE blockchain client on PyPI,
and a JavaScript OOP wrapper at 2.2.0 on npm. Neither is going anywhere, so
the distributions take a name that is free on both.

The Python import is unaffected — a distribution name and a module name are
independent there, so `pip install catena-corpus` still gives `import
catena`, and nothing in the examples or the bindings changes. On npm the
package name is the import specifier, so that one does change: `import
{ chunkMarkdown } from "catena-corpus"`.

The crates keep their own names. `catena` is free on crates.io.
This commit is contained in:
funkpower
2026-09-21 08:15:26 -04:00
parent 58be244478
commit 57bc4356ab
9 changed files with 16 additions and 16 deletions
+2 -2
View File
@@ -77,8 +77,8 @@ callable in process from three languages:
| | Install | Import |
|---|---|---|
| **Python** | `pip install catena` | `import catena` |
| **JavaScript** | `npm install catena` | `import { chunkMarkdown } from "catena"` |
| **Python** | `pip install catena-corpus` | `import catena` |
| **JavaScript** | `npm install catena-corpus` | `import { chunkMarkdown } from "catena-corpus"` |
| **C** | build the `capi` feature | `#include <catena.h>` |
```python
+4 -4
View File
@@ -25,7 +25,7 @@ call the same Rust and hand back the same records.
## Python
```sh
pip install catena
pip install catena-corpus
```
```python
@@ -100,11 +100,11 @@ server, and none of that is cheaper in process.
## JavaScript
```sh
npm install catena
npm install catena-corpus
```
```js
import { chunkMarkdown, scrub, countTokens, fuseHits } from "catena";
import { chunkMarkdown, scrub, countTokens, fuseHits } from "catena-corpus";
const chunks = chunkMarkdown(markdown, 512, 64);
chunks[0].page; // 41
@@ -125,7 +125,7 @@ Two builds, because the loaders differ — node reads the `.wasm` off disk at
import, the web build takes a URL a bundler rewrites:
```js
import { chunkMarkdown } from "catena"; // resolves per environment
import { chunkMarkdown } from "catena-corpus"; // resolves per environment
import { chunkMarkdown } from "catena/node"; // or pick one
import { chunkMarkdown } from "catena/web";
```
+3 -3
View File
@@ -4,11 +4,11 @@ Turn a pile of files into a searchable corpus: chunking, scrubbing, subtitles
and rank fusion, as WebAssembly.
```sh
npm install catena
npm install catena-corpus
```
```js
import { chunkMarkdown, scrub, countTokens, fuseHits } from "catena";
import { chunkMarkdown, scrub, countTokens, fuseHits } from "catena-corpus";
const chunks = chunkMarkdown(markdown, 512, 64);
chunks[0].page; // 41
@@ -60,7 +60,7 @@ at compile time. Those stay command-line tools.
## Node and the web
```js
import { chunkMarkdown } from "catena"; // resolves per environment
import { chunkMarkdown } from "catena-corpus"; // resolves per environment
import { chunkMarkdown } from "catena/node"; // or pick one
import { chunkMarkdown } from "catena/web";
```
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "catena",
"name": "catena-corpus",
"version": "@VERSION@",
"description": "Turn a pile of files into a searchable corpus: chunking, scrubbing, subtitles and rank fusion, as WebAssembly",
"license": "MPL-2.0",
+1 -1
View File
@@ -3,7 +3,7 @@ requires = ["maturin>=1.9,<2.0"]
build-backend = "maturin"
[project]
name = "catena"
name = "catena-corpus"
description = "The catena libraries behind one surface, for calling in process rather than as a subprocess"
readme = "README.md"
license = "MPL-2.0"
+2 -2
View File
@@ -75,12 +75,12 @@ convert, then loop, and what is left is the part that is actually about your
schema.
```sh
pip install catena
pip install catena-corpus
python examples/python/book_to_citations.py
```
```sh
pip install catena psycopg
pip install catena-corpus psycopg
DATABASE_URL=postgresql://user@host/db \
python examples/python/search_and_rerank.py "why did the empire decline"
```
+1 -1
View File
@@ -7,7 +7,7 @@
"search": "node --experimental-strip-types src/search-and-rerank.ts"
},
"dependencies": {
"catena": "file:../../crates/bindings/npm/dist"
"catena-corpus": "file:../../crates/bindings/npm/dist"
},
"devDependencies": {
"@types/node": "^22"
@@ -11,7 +11,7 @@
// broadcast — a work of the US government, so public domain.
import { readFileSync } from "node:fs";
import { parseSubtitles, segmentCues, packCues, countTokens } from "catena";
import { parseSubtitles, segmentCues, packCues, countTokens } from "catena-corpus";
const SAMPLE = `WEBVTT
+1 -1
View File
@@ -12,7 +12,7 @@
// vector database and whatever else. What they came from does not matter
// here; only where each of them placed does.
import { fuseHits, type Hit } from "catena";
import { fuseHits, type Hit } from "catena-corpus";
// `payload` is whatever you want carried alongside — rrf hands it back
// untouched, so a hit can arrive here with the row it came from attached.