A simple command-line tool to count lines in files by extension.
Project description
📦 extliner
extliner is a lightweight Python package that recursively counts lines in files — distinguishing between total lines and non-empty lines — grouped by file extension. It's perfect for analyzing codebases, writing statistics, or cleaning up documentation-heavy directories.
🚀 Features
- 📂 Recursive directory scanning
- 🧮 Counts:
- Total lines (with whitespace)
- Non-empty lines (ignores blank lines)
- 🔠 Groups results by file extension (
.py,.js,NO_EXT, etc.) - 🚫 Support for ignoring specific extensions or folders
- 📊 Output formats:
- Pretty CLI table
- JSON / CSV / Markdown exports
- 🧩 Clean, extensible class-based design
- 🧪 Fully tested with
unittest - 🔧 CLI and Python API support
📥 Installation
Install via pip:
pip install extliner
Or install locally for development:
git clone https://github.com/extliner/extliner.git
cd extliner
pip install -e .
⚙️ CLI Usage
✅ Basic
extliner -d <directory_path>
🔍 Ignoring Extensions
extliner -d ./myproject --ignore .md .log
Ignoring Folders
extliner -d ./myproject --folders .venv __pycache__
🧾 Output Example
+-------------+---------------+------------------+---------+--------------+
| Extension | With Spaces | Without Spaces | Files | % of Total |
+=============+===============+==================+=========+==============+
| .py | 443 | 362 | 7 | 32.15% |
+-------------+---------------+------------------+---------+--------------+
| no_ext | 361 | 287 | 8 | 26.20% |
+-------------+---------------+------------------+---------+--------------+
| .pyc | 151 | 125 | 3 | 10.96% |
+-------------+---------------+------------------+---------+--------------+
🧱 Python API
✅ Count Lines Programmatically
from extliner.main import LineCounter
from pathlib import Path
counter = LineCounter(ignore_extensions=[".log", ".json"])
result = counter.count_lines(Path("./your_directory"))
# Output as JSON
print(counter.to_json(result))
# Output as Markdown
print(counter.to_markdown(result))
# Output as CSV
print(counter.to_csv(result))
🛠️ Configuration Options
| Flag | Description | Example | Optioal/Required |
|---|---|---|---|
-d |
Directory to scan | -d ./src |
Required |
--ignore |
File extensions to ignore | --ignore .log .md .json |
Optional |
--folders |
Folder names to ignore | --folders .venv __pycache__ |
Optional |
📂 Supported Formats
| Output Method | Description |
|---|---|
to_json(data) |
Returns JSON string |
to_csv(data) |
Returns CSV string |
to_markdown(data) |
Returns Markdown table |
✅ Testing
To run tests:
python -m unittest discover tests
Or using pytest (if installed):
pytest
📄 License
This project is licensed under the MIT License.
👨💻 Author
Made with ❤️ by Deepak Raj
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file extliner-0.0.8.tar.gz.
File metadata
- Download URL: extliner-0.0.8.tar.gz
- Upload date:
- Size: 13.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.32.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cf1371d0d197b3b4152b5e6b231ba01876271af3aa4ff28f771127d9a48ac00
|
|
| MD5 |
fe8edd7abe9a0dc900cc3cabf70e24c3
|
|
| BLAKE2b-256 |
44b133637b8ee0d07bfbe2f84ef7d0e0919e952d0d61598f97707ba605504514
|
File details
Details for the file extliner-0.0.8-py3-none-any.whl.
File metadata
- Download URL: extliner-0.0.8-py3-none-any.whl
- Upload date:
- Size: 6.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-requests/2.32.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac8cd9c206b33e566de344638fac6cdd49710dad7f0db33454a1fb1e45236746
|
|
| MD5 |
c779d72bd34c8dbb98c5fd0ed5ced73c
|
|
| BLAKE2b-256 |
d877008fe99315622871e5df56a3e5a3ce3aa838a0d5b22704847a5a25d4c946
|