Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
73a6f52
Add cooperative cancellation and timeouts to search
MartijnNaaijer Oct 13, 2026
a1666b7
Add thread-safe CorpusRegistry to core
MartijnNaaijer Oct 13, 2026
fec7fcd
Tidy registry and cancellation code after lint and type checks
MartijnNaaijer Oct 13, 2026
d205a25
Add cfabric.display: render trees, display config, section refs
MartijnNaaijer Oct 13, 2026
2f2495a
Add changelog entries for browser groundwork
MartijnNaaijer Oct 13, 2026
d21460c
Ignore local CLAUDE.md
MartijnNaaijer Oct 13, 2026
b861498
Add cfabric-browser server: API, search workers, CLI
MartijnNaaijer Oct 13, 2026
4671f79
Add cfabric-browser interface: read, search, inspect
MartijnNaaijer Oct 13, 2026
aa9873c
Export template features as TSV columns, plus an Excel variant
MartijnNaaijer Oct 13, 2026
1024095
Fix section value types on the first load of a corpus
MartijnNaaijer Oct 13, 2026
3f07cd5
Add multi-corpus server support: library, alignment, runtime opening
MartijnNaaijer Oct 13, 2026
5d53850
Add multi-corpus interface: panes, synced reading, library, compare
MartijnNaaijer Oct 13, 2026
a2a98e2
Let users choose a corpus version
MartijnNaaijer Oct 13, 2026
fbd2897
Add local display settings layered over app configs
MartijnNaaijer Oct 13, 2026
f54c18e
Add statistics on search results
MartijnNaaijer Oct 13, 2026
0d7c770
Let users choose extra feature columns when downloading results
MartijnNaaijer Oct 13, 2026
ecd2b21
Add saved workspaces and Text-Fabric job import
MartijnNaaijer Oct 13, 2026
d9a8342
Complete feature values and explain features in the query editor
MartijnNaaijer Oct 13, 2026
21764a7
Add citations for passages and searches
MartijnNaaijer Oct 13, 2026
75b7259
Tidy the corpus library list
MartijnNaaijer Oct 13, 2026
534a5e2
Inspect words, not signs, when clicking text
MartijnNaaijer Oct 13, 2026
5fba1b1
Show textual differences between corpora side by side
MartijnNaaijer Oct 13, 2026
4c1753b
Index the DSS by biblical book
MartijnNaaijer Oct 13, 2026
609f9aa
Read the DSS by biblical book in the browser
MartijnNaaijer Oct 13, 2026
8e119de
Compare MT and SP with each scroll of the DSS
MartijnNaaijer Oct 13, 2026
be007d9
Show lost and illegible text in the DSS as the editions do
MartijnNaaijer Oct 13, 2026
08e807a
Leave the DSS morpheme breaks out of the text
MartijnNaaijer Oct 13, 2026
436c5b8
Show which scrolls side with MT and which with SP
MartijnNaaijer Oct 13, 2026
4b5a459
Let synchronised panes without a passage follow the others
MartijnNaaijer Oct 13, 2026
518dd5a
Ignore local desktop-app notes
MartijnNaaijer Oct 14, 2026
698513d
Build the browser as a standalone program with PyInstaller
MartijnNaaijer Oct 14, 2026
b93e785
Start the browser without corpora and offer the library
MartijnNaaijer Oct 14, 2026
0fd29cf
Show the browser in a window of its own with pywebview
MartijnNaaijer Oct 14, 2026
ff9a482
Build the desktop program on Windows, macOS and Linux in CI
MartijnNaaijer Oct 14, 2026
a49936e
Take every Python off the path in the clean-Windows test
MartijnNaaijer Oct 14, 2026
10ab1c6
Give the standalone program the Context-Fabric icon
MartijnNaaijer Oct 14, 2026
555b6a7
Add a lexicon for the BHSA, and limit the test version to three corpora
MartijnNaaijer Oct 14, 2026
fb20954
Publish desktop-v* tags as a GitHub pre-release
MartijnNaaijer Oct 14, 2026
021749b
Show a word's essentials when hovering over it
MartijnNaaijer Oct 14, 2026
c00aa44
Add a second, parallel interface after Parabible's layout (phase 1)
MartijnNaaijer Oct 15, 2026
737ab1e
Show the parallel interface's texts verse by verse
MartijnNaaijer Oct 15, 2026
b5b60ea
Add the word panel, hover card and lexicon to the parallel interface
MartijnNaaijer Oct 15, 2026
759b1b8
Mark differences and agreement in the parallel interface
MartijnNaaijer Oct 15, 2026
300c01a
Search in the parallel interface, with terms made from words
MartijnNaaijer Oct 15, 2026
d73a539
Finish the parallel interface: display, workspaces, citing, phones
MartijnNaaijer Oct 15, 2026
1c52f51
Start the standalone program in the parallel interface
MartijnNaaijer Oct 15, 2026
476ef4d
Name releases by their version, and describe the parallel interface
MartijnNaaijer Oct 15, 2026
76de1ec
Make room for five interfaces
MartijnNaaijer Oct 15, 2026
6a90d62
Add the Reader, the third interface
MartijnNaaijer Oct 15, 2026
b83f5e8
Add the Interlinear, the fourth interface
MartijnNaaijer Oct 15, 2026
301d4a7
Add the Concordance, the fifth interface
MartijnNaaijer Oct 15, 2026
b380f58
Finish the five interfaces: switching, cite, phone layout
MartijnNaaijer Oct 15, 2026
ca53209
Start the Windows program when unpacked from a downloaded zip
MartijnNaaijer Oct 15, 2026
98067e9
Build the JPS 1917 translation into a corpus
MartijnNaaijer Oct 15, 2026
b0a9f88
Add and remove translations from the library
MartijnNaaijer Oct 15, 2026
17af2e2
Show translations in all five interfaces
MartijnNaaijer Oct 15, 2026
48fa855
Release notes for the JPS 1917; certificates for downloads
MartijnNaaijer Oct 15, 2026
00c7936
Test adding a translation in the standalone program on every system
MartijnNaaijer Oct 15, 2026
808fc93
Download the BHSA, SP and DSS from their GitHub releases
MartijnNaaijer Oct 15, 2026
6cdf01d
Download corpora from the library and the command line
MartijnNaaijer Oct 15, 2026
625b443
Offer the missing corpora when the program starts
MartijnNaaijer Oct 15, 2026
7a4655c
Show the licence of the SP and the DSS (CC BY-NC 4.0)
MartijnNaaijer Oct 15, 2026
063f1fd
Show the BHSA's licence too (CC BY-NC 4.0)
MartijnNaaijer Oct 15, 2026
8adcb4a
Test downloading a corpus in the standalone program; release notes
MartijnNaaijer Oct 15, 2026
d23ce82
README: the standalone program downloads the corpora; its tests
MartijnNaaijer Oct 16, 2026
4c96d7f
Link the BHSA's lexemes to BDB entries through the OSHB
MartijnNaaijer Oct 16, 2026
6aa17b8
Build the BDB dictionary file from Sefaria and Open Scriptures
MartijnNaaijer Oct 16, 2026
fed4c17
Offer only the vocalized and unvocalized text
MartijnNaaijer Oct 16, 2026
4f44a73
Check the BDB join on the full text; joins by hand, gaps at Sefaria
MartijnNaaijer Oct 16, 2026
192835b
Check BDB links against the verses BDB cites
MartijnNaaijer Oct 16, 2026
b62215c
BDB on the lexeme page; adding and removing dictionaries
MartijnNaaijer Oct 16, 2026
d8338ff
BDB elsewhere: lexicon search and order by root, card, inspector, Rea…
MartijnNaaijer Oct 16, 2026
3d4d225
Fold the stems of long BDB entries; a frequent lexeme's page in 0.5 s
MartijnNaaijer Oct 16, 2026
3d7320c
BDB file: licensed CC BY-NC 4.0, like the corpora
MartijnNaaijer Oct 16, 2026
4304bbd
BDB is published: the library downloads it from Context-Fabric/bdb v1.0
MartijnNaaijer Oct 16, 2026
edd8abb
Test adding BDB in the standalone program; release notes
MartijnNaaijer Oct 16, 2026
3e186b2
cfabric-browser --help: add and remove also dictionaries (BDB)
MartijnNaaijer Oct 16, 2026
851c604
Search in plain language, phase 1: the tools a model gets
MartijnNaaijer Oct 16, 2026
b251766
Search in plain language, phase 2: proposals in the browser
MartijnNaaijer Oct 16, 2026
e32a346
Search in plain language, phase 3: the browser as an MCP server
MartijnNaaijer Oct 16, 2026
3de998f
Search in plain language, phase 4: the BHSA guide and a question set
MartijnNaaijer Oct 16, 2026
7e2307a
Test the MCP server in the standalone program; release notes for test.8
MartijnNaaijer Oct 16, 2026
55c9513
mcp-test.sh: wait for the helper without timeout, which macOS lacks
MartijnNaaijer Oct 16, 2026
6c2520b
Release notes: how to connect Claude Desktop and Claude Code, step by…
MartijnNaaijer Oct 16, 2026
c20e9dc
The browser on the public API of either core, Python 0.5 or Rust 0.6
MartijnNaaijer Oct 16, 2026
dba4050
The standalone program on the Rust core (context-fabric 0.6.0rc1)
MartijnNaaijer Oct 16, 2026
3dc460d
Parallel: Search opens on Template instead of Search terms
MartijnNaaijer Oct 20, 2026
3046dea
Release notes: leave out the designs the interfaces follow
MartijnNaaijer Oct 20, 2026
f2a16a6
SP: words are the units to hover over, without a local display file
MartijnNaaijer Oct 20, 2026
0d5d407
download-test.sh: check that the SP's words are its units
MartijnNaaijer Oct 20, 2026
819dab9
The app is called CACCHT Explorer; its code moves to libs/explorer
MartijnNaaijer Oct 20, 2026
29385a5
A user guide in the program: skeleton, /guide and Guide to … in the menu
MartijnNaaijer Oct 20, 2026
24b5f49
Guide: chapters Getting started and The datasets; tables on the site'…
MartijnNaaijer Oct 21, 2026
22d3996
Guide: the five ways of working, reading and comparing, and words, wi…
MartijnNaaijer Oct 21, 2026
f564a72
Guide: searching, the Concordance and asking Claude; the Claude setup…
MartijnNaaijer Oct 21, 2026
97c1508
Guide: adding texts, notes and citing, problems; release notes shorte…
MartijnNaaijer Oct 21, 2026
87a4e6e
Guide, Searching: what = in a lexeme means, and finding a lexeme's sp…
MartijnNaaijer Oct 21, 2026
cb89d3c
Guide: lexemes in general unvocalized (היה, ברא); concrete forms keep…
MartijnNaaijer Oct 21, 2026
758dc76
Docs: an Explorer page on context-fabric.ai, the README pointing to t…
MartijnNaaijer Oct 21, 2026
dea16f2
Asking from ChatGPT and Codex: the helper answers the first messages …
MartijnNaaijer Oct 21, 2026
5b3ad94
Asking the question set through the apps; /where/ /have/ explained co…
MartijnNaaijer Oct 21, 2026
f2a48af
Guide: asking Claude or ChatGPT; release notes for test.15
MartijnNaaijer Oct 21, 2026
a4dff0f
Guide: connecting ChatGPT by address, and the config.toml for a Mac
MartijnNaaijer Oct 21, 2026
6d20ff5
Changelog: the ChatGPT setup in the guide
MartijnNaaijer Oct 21, 2026
7d5cbe9
Explorer: fixes from the code review (round 1)
MartijnNaaijer Oct 26, 2026
38490e0
Explorer: no secret for proposals
MartijnNaaijer Oct 26, 2026
1816e44
Explorer: faster (code review, round 2)
MartijnNaaijer Oct 26, 2026
00c1c31
Explorer: the API in routes/, one module per area
MartijnNaaijer Oct 26, 2026
64e5138
Explorer: net.py and words.py for code that was written two or three …
MartijnNaaijer Oct 26, 2026
5b17196
Explorer: shared frontend hooks, a slimmer registry, more pool tests
MartijnNaaijer Oct 26, 2026
043dabb
Explorer: the command caccht-explorer, and the extras window and build
MartijnNaaijer Oct 26, 2026
05df4d3
Release notes for desktop test.16
MartijnNaaijer Oct 26, 2026
f393315
gitignore: local notes in .git/info/exclude, not in the shared file
MartijnNaaijer Oct 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 178 additions & 0 deletions .github/workflows/browser-desktop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
name: Browser desktop program

# Builds cfabric-browser as a standalone program (PyInstaller, pywebview) on
# Windows, macOS and Linux, smoke-tests each build, and tests the Windows build
# once more on a runner where Python is out of reach. A tag desktop-v* (such as
# desktop-v0.1.0-test.1) also publishes the builds as a GitHub pre-release, with
# libs/explorer/packaging/RELEASE_NOTES.md as its text. Not browser-v*: that tag
# publishes the package on PyPI (publish.yml).

on:
push:
branches: [master, main, 'browser-*', 'desktop-*']
tags: ['desktop-v*']
paths:
- 'libs/explorer/**'
- 'libs/core/cfabric/**'
- '.github/workflows/browser-desktop.yml'
pull_request:
branches: [master, main]
paths:
- 'libs/explorer/**'
- 'libs/core/cfabric/**'
- '.github/workflows/browser-desktop.yml'
workflow_dispatch:

jobs:
build:
name: Build on ${{ matrix.name }}
strategy:
fail-fast: false
matrix:
include:
- { name: windows, os: windows-latest }
- { name: macos-arm64, os: macos-latest }
- { name: macos-x64, os: macos-15-intel }
- { name: linux, os: ubuntu-latest }
runs-on: ${{ matrix.os }}
defaults:
run:
shell: bash
working-directory: libs/explorer
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.13'
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm
cache-dependency-path: libs/explorer/frontend/package-lock.json
- name: Build the interface
working-directory: libs/explorer/frontend
run: |
npm ci
npm run build
# the Rust core from PyPI (searches several times faster), not editable:
# PyInstaller does not see editable installs
- name: Install
run: |
pip install "context-fabric==0.6.0rc1" ../mcp ".[build]"
python -c "import importlib.metadata as m; print('context-fabric', m.version('context-fabric'))"
- name: Build the program
run: pyinstaller packaging/cfabric-browser.spec --noconfirm
- name: Smoke test
run: |
program=dist/cfabric-browser/cfabric-browser
[ -f "$program.exe" ] && program=$program.exe
bash packaging/smoke-test.sh "$program" tests/fixtures/display_corpus
- name: Add a translation (downloads the JPS 1917 from Sefaria)
run: |
program=dist/cfabric-browser/cfabric-browser
[ -f "$program.exe" ] && program=$program.exe
# on macOS the program as people start it, inside the app
[ -d "dist/CACCHT Explorer.app" ] && program="dist/CACCHT Explorer.app/Contents/MacOS/cfabric-browser"
bash packaging/translation-test.sh "$program"
- name: Download a corpus (the SP, from its GitHub release)
run: |
program=dist/cfabric-browser/cfabric-browser
[ -f "$program.exe" ] && program=$program.exe
[ -d "dist/CACCHT Explorer.app" ] && program="dist/CACCHT Explorer.app/Contents/MacOS/cfabric-browser"
bash packaging/download-test.sh "$program"
- name: Add a dictionary (BDB, from the release of Context-Fabric/bdb)
run: |
program=dist/cfabric-browser/cfabric-browser
[ -f "$program.exe" ] && program=$program.exe
[ -d "dist/CACCHT Explorer.app" ] && program="dist/CACCHT Explorer.app/Contents/MacOS/cfabric-browser"
bash packaging/dictionary-test.sh "$program"
- name: Serve an AI app (MCP over HTTP and over stdio)
run: |
program=dist/cfabric-browser/cfabric-browser
[ -f "$program.exe" ] && program=$program.exe
[ -d "dist/CACCHT Explorer.app" ] && program="dist/CACCHT Explorer.app/Contents/MacOS/cfabric-browser"
bash packaging/mcp-test.sh "$program"
- name: Size
run: du -sh dist/*
- name: Pack (keeps file permissions)
run: |
mkdir -p ../../out
case "${{ matrix.name }}" in
windows) 7z a -tzip ../../out/CACCHT-Explorer-windows.zip ./dist/cfabric-browser > /dev/null ;;
macos-*) ditto -c -k --keepParent "dist/CACCHT Explorer.app" ../../out/CACCHT-Explorer-${{ matrix.name }}.zip ;;
linux) tar -czf ../../out/CACCHT-Explorer-linux.tar.gz -C dist cfabric-browser ;;
esac
ls -l ../../out
- uses: actions/upload-artifact@v4
with:
name: cfabric-browser-${{ matrix.name }}
path: out/*
retention-days: 14

clean-windows:
name: Run on Windows without Python
needs: build
runs-on: windows-latest
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: |
libs/explorer/packaging
libs/explorer/tests/fixtures
- uses: actions/download-artifact@v4
with:
name: cfabric-browser-windows
- name: Unpack
run: 7z x CACCHT-Explorer-windows.zip -oprogram > /dev/null
- name: Smoke test with Python out of reach
run: |
# take every folder with a Python off the path (the py launcher lives
# in C:\Windows), until none is left
export PATH=$(echo "$PATH" | tr ':' '\n' | grep -viE "python|windowsapps" | paste -sd: -)
for name in python python3 py; do
tries=0
while found=$(command -v "$name") && [ $((tries += 1)) -le 10 ]; do
echo "taking $(dirname "$found") off the path ($found)"
export PATH=$(echo "$PATH" | tr ':' '\n' | grep -vixF "$(dirname "$found")" | paste -sd: -)
done
done
if command -v python python3 py; then
echo "::error title=Clean Windows::a Python is still reachable"; exit 1
fi
bash libs/explorer/packaging/smoke-test.sh \
program/cfabric-browser/cfabric-browser.exe \
libs/explorer/tests/fixtures/display_corpus

release:
name: Publish a pre-release
if: startsWith(github.ref, 'refs/tags/desktop-v')
needs: [build, clean-windows]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: |
libs/explorer/packaging/RELEASE_NOTES.md
libs/explorer/packaging/mcpb
sparse-checkout-cone-mode: false
- uses: actions/download-artifact@v4
with:
path: out
merge-multiple: true
# the Claude Desktop extension, which reaches the running program
- run: python3 libs/explorer/packaging/mcpb/pack.py out/CACCHT-Explorer.mcpb
- run: ls -l out
# desktop-v0.1.0-test.2 is released as "CACCHT Explorer 0.1.0-test.2"
- id: version
run: echo "version=${GITHUB_REF_NAME#desktop-v}" >> "$GITHUB_OUTPUT"
- uses: softprops/action-gh-release@v2
with:
name: CACCHT Explorer ${{ steps.version.outputs.version }}
body_path: libs/explorer/packaging/RELEASE_NOTES.md
prerelease: true
files: out/*
43 changes: 43 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,46 @@ jobs:
run: pip install -e ".[dev]"
- name: Run tests
run: pytest tests/ -v

test-browser:
# with the Python core of this repository, and with the Rust core (0.6)
# from PyPI: the browser uses only the public API of either
name: Test cfabric-browser (${{ matrix.core }} core)
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
core: [python, rust]
defaults:
run:
working-directory: libs/explorer
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.13'
- uses: actions/setup-node@v4
with:
node-version: '22'
cache: npm
cache-dependency-path: libs/explorer/frontend/package-lock.json
- name: Type-check, test and build the interface
working-directory: libs/explorer/frontend
run: |
npm ci
npm test
npm run build
- name: Install the core, and the MCP package (the browser shares its tools)
run: |
if [ "${{ matrix.core }}" = rust ]; then
pip install "context-fabric==0.6.0rc1"
else
pip install -e ../core
fi
pip install -e ../mcp
- name: Install browser package with dev dependencies
run: pip install -e ".[dev]"
- name: Run tests
run: |
python -c "import cfabric, importlib.metadata as m; print('context-fabric', m.version('context-fabric'))"
pytest tests/ -v
38 changes: 38 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ on:
- 'core-v*'
- 'mcp-v*'
- 'benchmarks-v*'
- 'browser-v*'

jobs:
publish-core:
Expand Down Expand Up @@ -87,3 +88,40 @@ jobs:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: twine upload --skip-existing dist/*

publish-browser:
name: Publish cfabric-browser
if: startsWith(github.ref, 'refs/tags/browser-v')
runs-on: ubuntu-latest
defaults:
run:
working-directory: libs/explorer
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.13'
- uses: actions/setup-node@v4
with:
node-version: '22'
- name: Build the interface into the package
working-directory: libs/explorer/frontend
run: |
npm ci
npm run build
- name: Install dependencies
run: |
pip install build twine
pip install -e ../core
pip install -e ".[dev]"
- name: Run tests
run: pytest tests/
- name: Build package
run: python -m build
- name: Check that the interface is in the wheel
run: python -c "import zipfile, glob; names = zipfile.ZipFile(glob.glob('dist/*.whl')[0]).namelist(); assert 'cfabric_browser/static/index.html' in names, 'interface missing from wheel'"
- name: Publish to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: twine upload --skip-existing dist/*
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ dist/
# TF-specific
.tf/
.cfm/
# the Rust core's compiled cache (context-fabric 0.6)
.cfr/
.ipynb_checkpoints/

# IDE / Editor
Expand Down Expand Up @@ -76,3 +78,6 @@ htmlcov/
# Others
.private
.corpora

# Built interface (npm run build in libs/explorer/frontend)
libs/explorer/cfabric_browser/static/
6 changes: 6 additions & 0 deletions libs/core/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Fixed
- `T.sectionFeatureTypes` was `str` for every level on the first load of a corpus (from `.tf` files, before the `.cfm` cache exists), so numeric chapters and verses could not be looked up from references like `Genesis 1:1` in that session
- `S.search` / `S.fetch` docstrings had the generator-vs-tuple behaviour of `limit` the wrong way round

## [0.5.8] - 2026-10-14

### Added
Expand Down
8 changes: 7 additions & 1 deletion libs/core/cfabric/navigation/text.py
Original file line number Diff line number Diff line change
Expand Up @@ -471,7 +471,13 @@ def __init__(self, api: Api) -> None:
# Get dataType from api.F feature or CF.features
fFeature = getattr(api.F, fName, None)
if fFeature is not None and hasattr(fFeature, 'meta'):
dataType = fFeature.meta.get('value_type', 'str')
# .cfm metadata says `value_type`; metadata read from .tf
# files (the first load, before compiling) says `valueType`
dataType = (
fFeature.meta.get('value_type')
or fFeature.meta.get('valueType')
or 'str'
)
else:
fObj = api.CF.features.get(fName)
dataType = fObj.dataType if fObj else 'str'
Expand Down
4 changes: 2 additions & 2 deletions libs/core/cfabric/search/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ def search(
Each result is a tuple of nodes, where each node corresponds to an
*atom*-line in your search template (see `tf.about.searchusage`).

If `limit` is not `None`, a *generator* is returned,
If `limit` is `None`, a *generator* is returned,
which yields the results one by one.

Otherwise, the results will be fetched up till `limit`
Expand Down Expand Up @@ -415,7 +415,7 @@ def fetch(
Each result is a tuple of nodes, where each node corresponds to an
*atom*-line in your search template (see `tf.about.searchusage`).

If `limit` is not `None`, a *generator* is returned,
If `limit` is `None`, a *generator* is returned,
which yields the results one by one.

Otherwise, the results will be fetched up till `limit`
Expand Down
Loading
Loading