Skip to main content

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

MIT

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)

Source distribution for litscan 2.0.1
File Size Uploaded
litscan-2.0.1.tar.gz 21.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for litscan 2.0.1
File Interpreter ABI Platform
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

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

This release

2.0.1 This release

2 release files

2.0.0

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