Skip to main content

pycomfort

PyPI version Tests Python Versions License

A Python utility library that provides convenient methods for file operations and text manipulation using a functional programming approach. Built with developer comfort in mind, pycomfort offers:

  • 🗂️ Functional File Operations - Chain operations on files and directories using pyfunctional
  • 🔄 Smart Text Replacement - Easily replace text patterns in single or multiple files
  • 📝 Enhanced Logging - Beautiful hierarchical logging based on Eliot library with timing and argument tracking
  • 🛠️ CLI Tools - Command-line utilities for common file and text operations

Installation

Install using pip:

pip install pycomfort

Or preferably using Poetry:

poetry add pycomfort

Features

File Operations

The library provides functional-style methods for file system operations using the pyfunctional library:

Key Functions

File System Operations

  • children(p: Path) -> seq - Lists files and subfolders as pyfunctional sequence
  • dirs(p: Path) -> seq - Lists subfolders as pyfunctional sequence
  • files(p: Path) -> seq - Lists files as pyfunctional sequence
  • with_ext(p: Path, ext: str) -> seq - Filters files by extension

File Manipulation

  • rename_files_with_dictionary(files_or_path, dictionary, test=False) - Batch rename files using a dictionary
  • replace_in_file(file, what, to, output=None) - Replace text in files
  • replace_from_dict_in_file(file, replacement, output=None) - Replace multiple patterns using a dictionary

Extended Logging Features (based on Eliot logging library)

  • to_nice_stdout(output_file: Optional[Path]) - Configure Eliot logging with improved rendering to stdout
  • to_nice_file(output_file: Path, rendered_file: Path) - Configure Eliot logging with improved rendering to separate files
  • log_function decorator - Enhanced function logging with timing and argument tracking

Examples

Some examples of how to use the library.

Get all Python files and print their names

print(files("test"))
python_files = with_ext("test", ".py") #get all python files in current directory
python_files.map(lambda p: p.name).for_each(print) #print all python files names

Replace multiple patterns in all markdown files:

replacements = {
"# TODO": "# DONE",
"- [ ]": "- [x]"
}
with_ext("docs", ".md").for_each(lambda f: replace_from_dict_in_file(f, replacements))

Pretty print directory structure:

tprint("project", max_depth=2, debug=True)

Chain operations to process specific files:

(dirs("src")
.flat_map(lambda d: with_ext(d, ".py"))
.filter(lambda p: p.stat().st_size > 1000)
.for_each(lambda f: replace_in_file(f, "old", "new")))

Function Logging with Decorator

from pycomfort.logging import log_function, LogLevel
@log_function(
include_args=True,
include_result=True,
log_level=LogLevel.INFO,
include_timing=True
)
def process_data(data):
    # Some processing logic
    return data

process_data(123)

The decorator will log:

  • Function entry with arguments
  • Execution time
  • Return value
  • Any errors that occur

You can output logs in hirarcial way bu registering the logger file destinations using the to_nice_stdout or to_nice_file functions.

to_nice_file(
output_file=Path("logs/output.json"),
rendered_file=Path("logs/readable.log")
)

Basic Logging Setup

CLI Tools

The package provides command-line tools for text replacement:

Simple Text Replacement

Replace text in a file using the replace command:

replace --file=config.txt --what="DEBUG" --to="INFO"

Options:

  • --file: Input file path (required)
  • --what: Text to search for and replace (required)
  • --to: Text to replace matches with (required)
  • --output: Optional output file path. If not provided, modifies the input file in-place

Dictionary-based Replacement

Replace multiple patterns at once using a JSON dictionary with the replace_dict command:

replace_dict --file=config.txt --dictionary=replacements.json --verbose

Options:

  • --file: Input file path (required)
  • --dictionary: Path to a JSON file containing replacement patterns (required)
  • --verbose: Enable verbose logging

Replace Text in Multiple Files Using a Dictionary

Replace multiple patterns in all markdown files:

replace_dict --file=docs --dictionary=replacements.json --output=docs_new --verbose

where replacements.json is:

{
"DEBUG": "INFO",
"WARNING": "WARN",
"ERROR": "ERR"
}

Options:
- `--file`: Input file path (required)
- `--dictionary`: Path to JSON file containing old->new text mappings (required)
- `--output`: Optional output file path. If not provided, modifies the input file in-place
- `--verbose`: Print detailed replacement information

## Development Setup

1. Clone the repository:

2. Install poetry if you haven't:

3. Install dependencies:

4. Run tests:

## Publishing

To publish a new version to PyPI:

1. Update version in pyproject.toml
2. Run the publish script:

## License

Apache License 2.0 - See LICENSE file for details.

Example `replacements.json`:
```json
{
    "DEBUG": "INFO",
    "WARNING": "WARN",
    "ERROR": "ERR"
}

Metadata

Release files for pycomfort 0.0.18

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

Source distribution (sdist)

Source distribution for pycomfort 0.0.18
File Size Uploaded Provenance
pycomfort-0.0.18.tar.gz 12.2 kB Without provenance Details

Built distribution (wheel)

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

Total release size: 26.5 kB

Release files / pycomfort-0.0.18.tar.gz

Download URL pycomfort-0.0.18.tar.gz
Size 12.2 kB
Tags Source
SHA-256 checksum
How to use checksums
617e075326cb3d89f13967d2d7e64042af93c722ca8b9e7afa59cd90796e9ee5
BLAKE2b-256 checksum
How to use checksums
9bfa2f86d36fea508a8ca445fd16157c5b239934744bf6fa35f054935c9ab2e7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.1.1 CPython/3.12.3 Linux/6.8.0-54-lowlatency

Release files / pycomfort-0.0.18-py3-none-any.whl

Download URL pycomfort-0.0.18-py3-none-any.whl
Size 14.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ca5c6f9d2f72ac4024d44e0ed62a8278e357caedbc7d943657b358a2da6ddfc9
BLAKE2b-256 checksum
How to use checksums
77906a6e6009e68edb9f6073c801105928822dcebf36c9d2a926086e1cf3597b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.1.1 CPython/3.12.3 Linux/6.8.0-54-lowlatency

Security for pycomfort 0.0.18

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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