Skip to main content

litscan 2.0.0

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

MIT

Author

Ron Webb <ron@ronella.xyz>

Release files for litscan 2.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for litscan 2.0.0
File Size Uploaded
litscan-2.0.0.tar.gz 20.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for litscan 2.0.0
File Interpreter ABI Platform
litscan-2.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 39.9 kB

Release files / litscan-2.0.0.tar.gz

Download URL litscan-2.0.0.tar.gz
Size 20.4 kB
Tags Source
SHA-256 checksum
How to use checksums
3524814253652ec92a2d55b6ae46ccdc6b1b72ebcde50e475a5227c5ab6ff55b
BLAKE2b-256 checksum
How to use checksums
adf4843c93fdd8199d6ecafe4e891b09710be34a322863e164a28ff0e61bdeff
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.0-py3-none-any.whl

Download URL litscan-2.0.0-py3-none-any.whl
Size 19.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
923d999cdccc1b39696226baa0ed674319b75e05814624cb371a5a35f6a65e4a
BLAKE2b-256 checksum
How to use checksums
d96ca2a696ca58bfb3a2c0de5e4799a20b7ceb3ed687e230d7c635bb40a9b028
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 history Release notifications | RSS feed

2.2.1

2 release files

2.2.0

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.1

2 release files

This release

2.0.0 This release

2 release files

1.4.0

2 release files

1.3.1

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page