litscan 2.0.1
A small CLI tool that scans a codebase for string and numeric literals, helping you quickly spot hard-coded values in source files.
Prerequisites
- Python 3.14+
Installation
pip install litscan
Usage
After installation, litscan is available as a console script:
litscan <path> [options]
What is detected
The scanner uses tree-sitter to parse each file and extracts literal nodes per language:
| Language | Extensions | Literal types detected |
|---|---|---|
| Python | .py .pyi |
strings, integers, floats |
| JavaScript | .js .mjs .cjs |
strings, numbers, template strings |
| TypeScript | .ts .tsx |
strings, numbers, template strings |
| Java | .java |
string literals, text blocks, integer literals, floating-point literals |
| Go | .go |
interpreted strings, raw strings, integer literals, float literals |
| Gosu | .gs .gsx |
string literals, integer literals, floating-point literals |
| C | .c .h |
string literals, number literals, char literals |
| C++ | .cpp .cc .cxx .hpp .hxx |
string literals, number literals, char literals |
| C# | .cs |
string literals, integer literals, real literals |
| Rust | .rs |
string literals, integer literals, float literals |
| Kotlin | .kt .kts |
string literals, number literals, float literals |
| Swift | .swift |
string literals, integer literals, real literals |
| Scala | .scala |
strings, integer literals, floating-point literals |
| Groovy | .groovy .gradle |
string literals, integer literals, floating-point literals |
Files with extensions not in the table above are skipped with a warning.
Results are grouped by unique literal value and sorted by occurrence count (highest first).
Arguments
| Argument | Description |
|---|---|
path |
Target directory or file to scan. Multiple paths can be specified, separated by a semicolon (e.g. src;lib;tests). |
Options
| Option | Default | Description |
|---|---|---|
--ext <exts> |
(all files) | Comma-separated extensions to include (e.g. py,js,ts) |
--output <name> |
litscan-output |
Base name (without extension) for output file(s) |
--output-dir <dir> |
reports |
Directory where output file(s) will be written |
--format <fmt> |
json |
Output format: json, html, or all |
--workers <n> |
min(32, cpu_count + 4) |
Number of parallel worker threads used during scanning |
--db <path> |
<system-temp>/litscan.db |
Path to the SQLite scratch database that stores occurrences during a scan run. Session records are removed after the report is written. |
--functions-only |
(off) | Scan only literals that appear inside function or method implementations. Supported languages: Python, JavaScript, TypeScript, Java, Go, Gosu, C, C++, C#, Rust, Kotlin, Swift, Scala, Groovy. |
--version |
Print the version and exit. |
Examples
Scan all files in the current directory and produce a JSON report:
litscan .
Scan only Python and JavaScript files in src/:
litscan src --ext py,js
Generate both JSON and HTML reports in a custom directory:
litscan . --format all --output-dir my-reports
Scan a Java source tree with a custom output name:
litscan src/main/java --ext java --format all --output-dir reports
Scan only literals inside functions and methods:
litscan src --functions-only
Configuration
| Environment variable | Description |
|---|---|
LITSCAN_CONFIG_DIR |
Directory where logging.ini and lit_ignore are seeded on first run and read from. When unset, the bundled copies inside the package are used directly. |
Ignore patterns
The lit_ignore file (seeded into LITSCAN_CONFIG_DIR on first run) contains one regex pattern per line. Any literal whose value matches a pattern is excluded from scan results. Edit the file to suppress noise such as common stop-words or numeric constants you do not care about.
Development
Prerequisites
- Poetry 2.2+
Installation
poetry install
Architecture
flowchart TD
CLI["cli.py\n(entry point)"] --> logenrich["setup_logger()\nlogenrich"]
CLI --> discover["discover_files()"]
discover --> concurrent["ThreadPoolExecutor\n(parallel scan)"]
concurrent --> scan["scan_file()\nscanner.py"]
scan --> parser["parser.py\n(tree-sitter)"]
parser --> ts["Language-specific\ngrammar packages"]
scan --> litignore["lit_ignore\n(exclude patterns)"]
scan --> store["SessionStore\nstore.py (SQLite)"]
store --> report["write_outputs()\nreporter.py"]
report --> JSON["JSON report"]
report --> HTML["HTML report"]
| Module | Responsibility |
|---|---|
cli.py |
Argument parsing, file discovery, orchestration |
parser.py |
Tree-sitter language loading (LRU-cached) and source parsing |
scanner.py |
AST-based literal extraction; LiteralOccurrence / LiteralGroup types |
store.py |
SessionStore — thread-safe SQLite scratch store; one UUID per scan run |
reporter.py |
write_outputs() — renders JSON and/or HTML reports |
logenrich |
External library that provides setup_logger() — logging config seeded from logging.ini |
Test with coverage
poetry run pytest --cov=litscan tests --cov-report html
Format and lint
poetry run black litscan; poetry run pylint litscan
Quality gates
- Coverage ≥ 90%
- Pylint score 10/10
Example
Scan the test fixtures and produce both JSON and HTML reports:
poetry run litscan tests\fixtures --format all
Publishing to PyPI
Prerequisites
- A PyPI account with an API token.
Configure the token
poetry config pypi-token.pypi <your-token>
Build and publish
poetry publish --build
This builds the source distribution and wheel, then uploads them to PyPI in one step.
Note: PyPI releases are immutable. Once a version is published, it cannot be overwritten.
To fix a mistake, yank the release via the PyPI web UI and publish a new version.
Changelog
License
Author
Ron Webb <ron@ronella.xyz>
Release files for litscan 2.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| litscan-2.0.1.tar.gz | 21.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| litscan-2.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 40.7 kB
Release files / litscan-2.0.1.tar.gz
| Download URL | litscan-2.0.1.tar.gz |
|---|---|
| Size | 21.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ee2f48f18499ef53ebf13db466ac397dd49058f4ab8be9b716e1d764d56f3c6b
|
|
BLAKE2b-256 checksum How to use checksums |
0b904623f651272c8f0319108d203a15d67ff8a7000db1097f6150ca58ecae60
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.2.0 CPython/3.14.7 Linux/6.17.0-1022-azure
|
Release files / litscan-2.0.1-py3-none-any.whl
| Download URL | litscan-2.0.1-py3-none-any.whl |
|---|---|
| Size | 19.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0182cc7849634684dd343ae062a803dce8a3876200a9a1fcdcd7b1de7caabb13
|
|
BLAKE2b-256 checksum How to use checksums |
5cbf0d6f9a62d48b24a205a69255cbccd2f2260d21a3bd4227093d04ffd33780
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.2.0 CPython/3.14.7 Linux/6.17.0-1022-azure
|