bdsc 0.2.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
bdsc-0.2.4/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Gustavo Madeira Santana
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
bdsc-0.2.4/PKG-INFO ADDED
@@ -0,0 +1,352 @@
1
+ Metadata-Version: 2.4
2
+ Name: bdsc
3
+ Version: 0.2.4
4
+ Summary: Sync and query BDSC datasets locally
5
+ Author: Gustavo Madeira Santana
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/gumadeiras/bdsc-cli
8
+ Project-URL: Repository, https://github.com/gumadeiras/bdsc-cli
9
+ Project-URL: Issues, https://github.com/gumadeiras/bdsc-cli/issues
10
+ Keywords: bdsc,drosophila,cli,bioinformatics,genetics
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3 :: Only
13
+ Classifier: Operating System :: OS Independent
14
+ Requires-Python: >=3.11
15
+ Description-Content-Type: text/markdown
16
+ License-File: LICENSE
17
+ Provides-Extra: release
18
+ Requires-Dist: build>=1.2.2; extra == "release"
19
+ Requires-Dist: twine>=6.1.0; extra == "release"
20
+ Dynamic: license-file
21
+
22
+ # bdsc
23
+
24
+ Small CLI for syncing public Bloomington Drosophila Stock Center datasets and
25
+ querying them locally.
26
+
27
+ Repo:
28
+
29
+ - https://github.com/gumadeiras/bdsc-cli
30
+
31
+ Primary source:
32
+
33
+ - https://bdsc.indiana.edu/stocks/stockdata.html
34
+
35
+ What it does:
36
+
37
+ - syncs BDSC CSV datasets into a local cache
38
+ - builds a local SQLite index
39
+ - supports local text search and stock lookups
40
+ - exposes optional live search against BDSC's current web endpoint
41
+
42
+ No third-party Python dependencies.
43
+
44
+ ## Install
45
+
46
+ Another computer:
47
+
48
+ ```bash
49
+ brew tap gumadeiras/tap
50
+ brew install bdsc
51
+ ```
52
+
53
+ PyPI with `pipx`:
54
+
55
+ ```bash
56
+ pipx install bdsc
57
+ ```
58
+
59
+ PyPI with plain `pip`:
60
+
61
+ ```bash
62
+ python3 -m pip install bdsc
63
+ ```
64
+
65
+ Source install:
66
+
67
+ ```bash
68
+ git clone https://github.com/gumadeiras/bdsc-cli.git
69
+ cd bdsc-cli
70
+ python3 -m pip install .
71
+ ```
72
+
73
+ Repo-local dev install:
74
+
75
+ ```bash
76
+ cd ~/git/bdsc-cli
77
+ python3 -m venv .venv
78
+ . .venv/bin/activate
79
+ python -m pip install -e .
80
+ ```
81
+
82
+ Check the CLI:
83
+
84
+ ```bash
85
+ bdsc --help
86
+ ```
87
+
88
+ Build release artifacts locally:
89
+
90
+ ```bash
91
+ python -m pip install -e .[release]
92
+ python -m build
93
+ python -m twine check dist/*
94
+ ```
95
+
96
+ ## Quickstart
97
+
98
+ Create a local cache and index:
99
+
100
+ ```bash
101
+ bdsc sync
102
+ ```
103
+
104
+ Then query it:
105
+
106
+ ```bash
107
+ bdsc find Chronos
108
+ bdsc find 'Or56a Lexa'
109
+ bdsc report optogenetics
110
+ bdsc find --gene Or56a --property lexA
111
+ bdsc find --gene Or42b --driver-family lexA
112
+ bdsc find RRID:BDSC_77118
113
+ bdsc find FBti0195688
114
+ bdsc stock 77118
115
+ ```
116
+
117
+ ## Usage
118
+
119
+ Default state directory:
120
+
121
+ ```text
122
+ ~/.local/share/bdsc-cli
123
+ ```
124
+
125
+ Sync datasets and build the local index:
126
+
127
+ ```bash
128
+ bdsc sync
129
+ ```
130
+
131
+ Use `find` for nearly all interactive querying:
132
+
133
+ ```bash
134
+ bdsc find Chronos
135
+ bdsc find Chronis
136
+ bdsc find 'Or56a Lexa'
137
+ bdsc find FBgn0003996 --json
138
+ bdsc find RRID:BDSC_77118
139
+ bdsc find FBti0195688
140
+ bdsc find --kind property VALIUM20
141
+ bdsc find --kind property-exact lexA
142
+ bdsc find --kind driver-family QF
143
+ bdsc find --kind relationship RNAi
144
+ bdsc find --gene Or56a --property lexA
145
+ bdsc find --gene Or42b --driver-family lexA
146
+ bdsc find --gene Or42b --driver-family qf
147
+ bdsc find --dataset genes --property olfactory --relationship coding --jsonl
148
+ ```
149
+
150
+ Use canned reports for common retrieval buckets:
151
+
152
+ ```bash
153
+ bdsc report olfactory
154
+ bdsc report drivers --jsonl
155
+ bdsc report optogenetics --limit 50
156
+ ```
157
+
158
+ Inspect cache/index status:
159
+
160
+ ```bash
161
+ bdsc status
162
+ ```
163
+
164
+ Use a custom cache/index location:
165
+
166
+ ```bash
167
+ bdsc sync --state-dir ./data
168
+ bdsc find Chronos --state-dir ./data
169
+ ```
170
+
171
+ Structured output for scripts or agents:
172
+
173
+ ```bash
174
+ bdsc status --json
175
+ bdsc find Chronos --json
176
+ bdsc find FBgn0003996 --dataset genes --json
177
+ bdsc find --gene Or56a --property lexA --json
178
+ bdsc export components --limit 5 --format jsonl
179
+ bdsc stock 77118 --json
180
+ ```
181
+
182
+ Query commands return all matches by default. Use `--limit N` when you want a
183
+ bounded result set.
184
+
185
+ ## Commands
186
+
187
+ - `bdsc sync`: download the BDSC CSV datasets; builds the index by default
188
+ - `bdsc build-index`: rebuild the SQLite index from previously downloaded CSVs
189
+ - `bdsc status`: show local dataset freshness and index metadata
190
+ - `bdsc find [query]`: primary query command; free-text lookup or compound filters
191
+ - `bdsc report <name>`: canned reports for `olfactory`, `drivers`, `optogenetics`
192
+ - `bdsc export <dataset>`: stream normalized rows as `jsonl`, `csv`, or `tsv`
193
+ - `bdsc terms <scope>`: inspect available property/relationship vocab
194
+ - `bdsc stock <stknum>`: local stock details
195
+ - legacy compatibility shims still exist for `search`, `gene`, `component`, `fbid`, `rrid`, `property`, `property-exact`, `driver-family`, `relationship`, `lookup`, `filter`, `live-search`
196
+
197
+ ## Find
198
+
199
+ Use `find` when the caller does not want to choose a dedicated query command up
200
+ front.
201
+
202
+ Auto-detect rules:
203
+
204
+ - digits -> `stock`
205
+ - `RRID:BDSC_*` or `BDSC_*` -> `rrid`
206
+ - `FBgn...` -> `gene`
207
+ - `FBti...` / `FBal...` / similar `FB..` ids in the component table -> `fbid`
208
+ - transgene/component-like text (`P{...}`, brackets, `attP`, `CyO`) -> `component`
209
+ - multi-term or dotted construct fragments -> local full-text `search`
210
+ - `--kind property` when you want property-driven lookup explicitly
211
+ - single bare terms -> `gene`, then local full-text `search` fallback if no gene hits
212
+
213
+ Examples:
214
+
215
+ ```bash
216
+ bdsc find Chronos
217
+ bdsc find RRID:BDSC_77118
218
+ bdsc find --kind component 'P{10XUAS-Chronos'
219
+ bdsc find --kind property VALIUM20
220
+ bdsc find --kind property-exact lexA
221
+ bdsc find --kind driver-family qf
222
+ ```
223
+
224
+ ## Export
225
+
226
+ Use `export` when another tool wants direct normalized rows instead of
227
+ search-oriented output.
228
+
229
+ Datasets:
230
+
231
+ - `stocks`
232
+ - `components`
233
+ - `genes`
234
+ - `properties`
235
+
236
+ Examples:
237
+
238
+ ```bash
239
+ bdsc export stocks --limit 3
240
+ bdsc export genes --query Chronos --kind gene
241
+ bdsc export components --query FBti0195688 --kind fbid --format jsonl
242
+ bdsc export properties --query VALIUM20 --kind property --format tsv
243
+ bdsc export components --gene Or56a --property lexA --format jsonl
244
+ bdsc export components --gene Or42b --driver-family qf --format jsonl
245
+ bdsc export genes --property olfactory --relationship coding --format csv
246
+ bdsc export components --format tsv --output components.tsv
247
+ bdsc export genes --format csv --output genes.csv
248
+ bdsc export properties --limit 20 --format jsonl
249
+ ```
250
+
251
+ `export --query` uses the same lookup kinds as `find --kind`:
252
+
253
+ - `stock`
254
+ - `rrid`
255
+ - `gene`
256
+ - `fbid`
257
+ - `component`
258
+ - `property`
259
+ - `property-exact`
260
+ - `driver-family`
261
+ - `relationship`
262
+ - `search`
263
+ - `auto`
264
+
265
+ You can also stack explicit filter flags on `export`; multiple flags combine as
266
+ AND:
267
+
268
+ - `--stock`
269
+ - `--rrid`
270
+ - `--gene`
271
+ - `--component`
272
+ - `--fbid`
273
+ - `--property`
274
+ - `--property-exact`
275
+ - `--driver-family`
276
+ - `--relationship`
277
+ - `--search`
278
+
279
+ ## Compound Find
280
+
281
+ `find` also subsumes compound filters. Default dataset: `components`.
282
+
283
+ Examples:
284
+
285
+ ```bash
286
+ bdsc find --gene Or56a --property lexA
287
+ bdsc find --gene Or67d --property qf
288
+ bdsc find --gene Or42b --driver-family lexA
289
+ bdsc find --gene Or56a --property-exact lexA
290
+ bdsc find --dataset stocks --property optogenetic
291
+ bdsc find --dataset genes --property olfactory --relationship coding --jsonl
292
+ ```
293
+
294
+ ## Reports
295
+
296
+ Use `report` for curated high-level buckets that would otherwise need multiple
297
+ queries or OR filters.
298
+
299
+ Reports:
300
+
301
+ - `olfactory`: receptor-family genes (`Or*`, `Orco`, `Ir*`, `Obp*`)
302
+ - `drivers`: GAL4 / lexA / QF / split-driver / FLP-like driver surfaces
303
+ - `optogenetics`: common optogenetic effectors plus optogenetic-tagged properties
304
+
305
+ Examples:
306
+
307
+ ```bash
308
+ bdsc report olfactory
309
+ bdsc report olfactory --dataset genes --jsonl
310
+ bdsc report drivers --limit 50 --json
311
+ bdsc report optogenetics --dataset components --jsonl
312
+ ```
313
+
314
+ ## Terms
315
+
316
+ Use `terms` when you need to discover the vocabulary before filtering.
317
+
318
+ Scopes:
319
+
320
+ - `properties`
321
+ - `property-descriptions`
322
+ - `relationships`
323
+
324
+ Examples:
325
+
326
+ ```bash
327
+ bdsc terms properties --limit 20
328
+ bdsc terms properties --query VALIUM --json
329
+ bdsc terms relationships --limit 20
330
+ bdsc terms property-descriptions --query optogenetic --jsonl
331
+ ```
332
+
333
+ ## Notes
334
+
335
+ - `sync` uses conditional HTTP headers when possible (`ETag`,
336
+ `If-Modified-Since`) to avoid re-downloading unchanged files.
337
+ - Local lookup is built from the public CSV dumps, not the private site search
338
+ endpoints.
339
+ - `search` now uses a two-stage index: exact/prefix FTS first, trigram fuzzy
340
+ fallback second. Typos and loose spacing/punctuation usually still find the
341
+ intended stock without having the exact BDSC string.
342
+ - `find` is the intended interactive entrypoint; dedicated legacy query
343
+ commands still work but are no longer the main documented path.
344
+ - direct lookup paths also rerank fuzzy candidates when exact/prefix matching
345
+ misses.
346
+ - use `property-exact` or `driver-family` when `property` is too broad for a
347
+ reliable LexA/QF/GAL4-style answer.
348
+ - tag pushes like `vX.Y.Z` run the release workflow: build artifacts, create a
349
+ GitHub release, publish to PyPI, and update `gumadeiras/homebrew-tap`.
350
+ - The live endpoint is undocumented and may change without notice.
351
+ - BDSC data is large enough that the first full sync/index can take a few
352
+ minutes depending on network and disk speed.
bdsc-0.2.4/README.md ADDED
@@ -0,0 +1,331 @@
1
+ # bdsc
2
+
3
+ Small CLI for syncing public Bloomington Drosophila Stock Center datasets and
4
+ querying them locally.
5
+
6
+ Repo:
7
+
8
+ - https://github.com/gumadeiras/bdsc-cli
9
+
10
+ Primary source:
11
+
12
+ - https://bdsc.indiana.edu/stocks/stockdata.html
13
+
14
+ What it does:
15
+
16
+ - syncs BDSC CSV datasets into a local cache
17
+ - builds a local SQLite index
18
+ - supports local text search and stock lookups
19
+ - exposes optional live search against BDSC's current web endpoint
20
+
21
+ No third-party Python dependencies.
22
+
23
+ ## Install
24
+
25
+ Another computer:
26
+
27
+ ```bash
28
+ brew tap gumadeiras/tap
29
+ brew install bdsc
30
+ ```
31
+
32
+ PyPI with `pipx`:
33
+
34
+ ```bash
35
+ pipx install bdsc
36
+ ```
37
+
38
+ PyPI with plain `pip`:
39
+
40
+ ```bash
41
+ python3 -m pip install bdsc
42
+ ```
43
+
44
+ Source install:
45
+
46
+ ```bash
47
+ git clone https://github.com/gumadeiras/bdsc-cli.git
48
+ cd bdsc-cli
49
+ python3 -m pip install .
50
+ ```
51
+
52
+ Repo-local dev install:
53
+
54
+ ```bash
55
+ cd ~/git/bdsc-cli
56
+ python3 -m venv .venv
57
+ . .venv/bin/activate
58
+ python -m pip install -e .
59
+ ```
60
+
61
+ Check the CLI:
62
+
63
+ ```bash
64
+ bdsc --help
65
+ ```
66
+
67
+ Build release artifacts locally:
68
+
69
+ ```bash
70
+ python -m pip install -e .[release]
71
+ python -m build
72
+ python -m twine check dist/*
73
+ ```
74
+
75
+ ## Quickstart
76
+
77
+ Create a local cache and index:
78
+
79
+ ```bash
80
+ bdsc sync
81
+ ```
82
+
83
+ Then query it:
84
+
85
+ ```bash
86
+ bdsc find Chronos
87
+ bdsc find 'Or56a Lexa'
88
+ bdsc report optogenetics
89
+ bdsc find --gene Or56a --property lexA
90
+ bdsc find --gene Or42b --driver-family lexA
91
+ bdsc find RRID:BDSC_77118
92
+ bdsc find FBti0195688
93
+ bdsc stock 77118
94
+ ```
95
+
96
+ ## Usage
97
+
98
+ Default state directory:
99
+
100
+ ```text
101
+ ~/.local/share/bdsc-cli
102
+ ```
103
+
104
+ Sync datasets and build the local index:
105
+
106
+ ```bash
107
+ bdsc sync
108
+ ```
109
+
110
+ Use `find` for nearly all interactive querying:
111
+
112
+ ```bash
113
+ bdsc find Chronos
114
+ bdsc find Chronis
115
+ bdsc find 'Or56a Lexa'
116
+ bdsc find FBgn0003996 --json
117
+ bdsc find RRID:BDSC_77118
118
+ bdsc find FBti0195688
119
+ bdsc find --kind property VALIUM20
120
+ bdsc find --kind property-exact lexA
121
+ bdsc find --kind driver-family QF
122
+ bdsc find --kind relationship RNAi
123
+ bdsc find --gene Or56a --property lexA
124
+ bdsc find --gene Or42b --driver-family lexA
125
+ bdsc find --gene Or42b --driver-family qf
126
+ bdsc find --dataset genes --property olfactory --relationship coding --jsonl
127
+ ```
128
+
129
+ Use canned reports for common retrieval buckets:
130
+
131
+ ```bash
132
+ bdsc report olfactory
133
+ bdsc report drivers --jsonl
134
+ bdsc report optogenetics --limit 50
135
+ ```
136
+
137
+ Inspect cache/index status:
138
+
139
+ ```bash
140
+ bdsc status
141
+ ```
142
+
143
+ Use a custom cache/index location:
144
+
145
+ ```bash
146
+ bdsc sync --state-dir ./data
147
+ bdsc find Chronos --state-dir ./data
148
+ ```
149
+
150
+ Structured output for scripts or agents:
151
+
152
+ ```bash
153
+ bdsc status --json
154
+ bdsc find Chronos --json
155
+ bdsc find FBgn0003996 --dataset genes --json
156
+ bdsc find --gene Or56a --property lexA --json
157
+ bdsc export components --limit 5 --format jsonl
158
+ bdsc stock 77118 --json
159
+ ```
160
+
161
+ Query commands return all matches by default. Use `--limit N` when you want a
162
+ bounded result set.
163
+
164
+ ## Commands
165
+
166
+ - `bdsc sync`: download the BDSC CSV datasets; builds the index by default
167
+ - `bdsc build-index`: rebuild the SQLite index from previously downloaded CSVs
168
+ - `bdsc status`: show local dataset freshness and index metadata
169
+ - `bdsc find [query]`: primary query command; free-text lookup or compound filters
170
+ - `bdsc report <name>`: canned reports for `olfactory`, `drivers`, `optogenetics`
171
+ - `bdsc export <dataset>`: stream normalized rows as `jsonl`, `csv`, or `tsv`
172
+ - `bdsc terms <scope>`: inspect available property/relationship vocab
173
+ - `bdsc stock <stknum>`: local stock details
174
+ - legacy compatibility shims still exist for `search`, `gene`, `component`, `fbid`, `rrid`, `property`, `property-exact`, `driver-family`, `relationship`, `lookup`, `filter`, `live-search`
175
+
176
+ ## Find
177
+
178
+ Use `find` when the caller does not want to choose a dedicated query command up
179
+ front.
180
+
181
+ Auto-detect rules:
182
+
183
+ - digits -> `stock`
184
+ - `RRID:BDSC_*` or `BDSC_*` -> `rrid`
185
+ - `FBgn...` -> `gene`
186
+ - `FBti...` / `FBal...` / similar `FB..` ids in the component table -> `fbid`
187
+ - transgene/component-like text (`P{...}`, brackets, `attP`, `CyO`) -> `component`
188
+ - multi-term or dotted construct fragments -> local full-text `search`
189
+ - `--kind property` when you want property-driven lookup explicitly
190
+ - single bare terms -> `gene`, then local full-text `search` fallback if no gene hits
191
+
192
+ Examples:
193
+
194
+ ```bash
195
+ bdsc find Chronos
196
+ bdsc find RRID:BDSC_77118
197
+ bdsc find --kind component 'P{10XUAS-Chronos'
198
+ bdsc find --kind property VALIUM20
199
+ bdsc find --kind property-exact lexA
200
+ bdsc find --kind driver-family qf
201
+ ```
202
+
203
+ ## Export
204
+
205
+ Use `export` when another tool wants direct normalized rows instead of
206
+ search-oriented output.
207
+
208
+ Datasets:
209
+
210
+ - `stocks`
211
+ - `components`
212
+ - `genes`
213
+ - `properties`
214
+
215
+ Examples:
216
+
217
+ ```bash
218
+ bdsc export stocks --limit 3
219
+ bdsc export genes --query Chronos --kind gene
220
+ bdsc export components --query FBti0195688 --kind fbid --format jsonl
221
+ bdsc export properties --query VALIUM20 --kind property --format tsv
222
+ bdsc export components --gene Or56a --property lexA --format jsonl
223
+ bdsc export components --gene Or42b --driver-family qf --format jsonl
224
+ bdsc export genes --property olfactory --relationship coding --format csv
225
+ bdsc export components --format tsv --output components.tsv
226
+ bdsc export genes --format csv --output genes.csv
227
+ bdsc export properties --limit 20 --format jsonl
228
+ ```
229
+
230
+ `export --query` uses the same lookup kinds as `find --kind`:
231
+
232
+ - `stock`
233
+ - `rrid`
234
+ - `gene`
235
+ - `fbid`
236
+ - `component`
237
+ - `property`
238
+ - `property-exact`
239
+ - `driver-family`
240
+ - `relationship`
241
+ - `search`
242
+ - `auto`
243
+
244
+ You can also stack explicit filter flags on `export`; multiple flags combine as
245
+ AND:
246
+
247
+ - `--stock`
248
+ - `--rrid`
249
+ - `--gene`
250
+ - `--component`
251
+ - `--fbid`
252
+ - `--property`
253
+ - `--property-exact`
254
+ - `--driver-family`
255
+ - `--relationship`
256
+ - `--search`
257
+
258
+ ## Compound Find
259
+
260
+ `find` also subsumes compound filters. Default dataset: `components`.
261
+
262
+ Examples:
263
+
264
+ ```bash
265
+ bdsc find --gene Or56a --property lexA
266
+ bdsc find --gene Or67d --property qf
267
+ bdsc find --gene Or42b --driver-family lexA
268
+ bdsc find --gene Or56a --property-exact lexA
269
+ bdsc find --dataset stocks --property optogenetic
270
+ bdsc find --dataset genes --property olfactory --relationship coding --jsonl
271
+ ```
272
+
273
+ ## Reports
274
+
275
+ Use `report` for curated high-level buckets that would otherwise need multiple
276
+ queries or OR filters.
277
+
278
+ Reports:
279
+
280
+ - `olfactory`: receptor-family genes (`Or*`, `Orco`, `Ir*`, `Obp*`)
281
+ - `drivers`: GAL4 / lexA / QF / split-driver / FLP-like driver surfaces
282
+ - `optogenetics`: common optogenetic effectors plus optogenetic-tagged properties
283
+
284
+ Examples:
285
+
286
+ ```bash
287
+ bdsc report olfactory
288
+ bdsc report olfactory --dataset genes --jsonl
289
+ bdsc report drivers --limit 50 --json
290
+ bdsc report optogenetics --dataset components --jsonl
291
+ ```
292
+
293
+ ## Terms
294
+
295
+ Use `terms` when you need to discover the vocabulary before filtering.
296
+
297
+ Scopes:
298
+
299
+ - `properties`
300
+ - `property-descriptions`
301
+ - `relationships`
302
+
303
+ Examples:
304
+
305
+ ```bash
306
+ bdsc terms properties --limit 20
307
+ bdsc terms properties --query VALIUM --json
308
+ bdsc terms relationships --limit 20
309
+ bdsc terms property-descriptions --query optogenetic --jsonl
310
+ ```
311
+
312
+ ## Notes
313
+
314
+ - `sync` uses conditional HTTP headers when possible (`ETag`,
315
+ `If-Modified-Since`) to avoid re-downloading unchanged files.
316
+ - Local lookup is built from the public CSV dumps, not the private site search
317
+ endpoints.
318
+ - `search` now uses a two-stage index: exact/prefix FTS first, trigram fuzzy
319
+ fallback second. Typos and loose spacing/punctuation usually still find the
320
+ intended stock without having the exact BDSC string.
321
+ - `find` is the intended interactive entrypoint; dedicated legacy query
322
+ commands still work but are no longer the main documented path.
323
+ - direct lookup paths also rerank fuzzy candidates when exact/prefix matching
324
+ misses.
325
+ - use `property-exact` or `driver-family` when `property` is too broad for a
326
+ reliable LexA/QF/GAL4-style answer.
327
+ - tag pushes like `vX.Y.Z` run the release workflow: build artifacts, create a
328
+ GitHub release, publish to PyPI, and update `gumadeiras/homebrew-tap`.
329
+ - The live endpoint is undocumented and may change without notice.
330
+ - BDSC data is large enough that the first full sync/index can take a few
331
+ minutes depending on network and disk speed.