Python tools for data type handling and validation
Project description
splurge-tools
A Python package providing comprehensive tools for data type handling, validation, text processing, and streaming data analysis.
Description
splurge-tools is a collection of Python utilities focused on:
- Data type handling and validation with comprehensive type inference and conversion
- Text file processing and manipulation with streaming support for large files
- String tokenization and parsing with delimited value support
- Text case transformations and normalization
- Delimited separated value (DSV) parsing with streaming capabilities
- Tabular data models for both in-memory and streaming datasets
- Typed tabular data models with schema validation
- Data validation and transformation utilities
- Random data generation for testing and development
- Memory-efficient streaming for large datasets that don't fit in RAM
- Python 3.10+ compatibility with full type annotations
Installation
pip install splurge-tools
Features
Core Data Processing
type_helper.py: Comprehensive type validation, conversion, and inference utilities with support for strings, numbers, dates, times, booleans, and collectionsdsv_helper.py: Delimited separated value parsing with streaming support, column profiling, and data analysistabular_data_model.py: In-memory data model for tabular datasets with multi-row header supporttyped_tabular_data_model.py: Type-safe data model with schema validation and type enforcementstreaming_tabular_data_model.py: Memory-efficient streaming data model for large datasets (>100MB)
Text Processing
text_file_helper.py: Text file processing with streaming support, header/footer skipping, and memory-efficient operationsstring_tokenizer.py: String parsing and tokenization utilities with delimited value supportcase_helper.py: Text case transformation utilities (camelCase, snake_case, kebab-case, etc.)text_normalizer.py: Text normalization and cleaning utilities
Data Utilities
data_validator.py: Data validation framework with custom validation rulesdata_transformer.py: Data transformation utilities for converting between formatsrandom_helper.py: Random data generation for testing, including realistic test data and secure Base58-like string generation with guaranteed character diversitydecorators.py: Common decorators for handling empty values in string processing methods
Key Capabilities
- Streaming Support: Process datasets larger than available RAM with configurable chunk sizes
- Type Inference: Automatic detection of data types including dates, times, numbers, and booleans
- Multi-row Headers: Support for complex header structures with automatic merging
- Memory Efficiency: Streaming models use minimal memory regardless of dataset size
- Type Safety: Full type annotations and validation throughout the codebase
- Error Handling: Comprehensive error handling with meaningful error messages
- Performance: Optimized for large datasets with efficient algorithms and data structures
Examples
Streaming Large Datasets
from splurge_tools.dsv_helper import DsvHelper
from splurge_tools.streaming_tabular_data_model import StreamingTabularDataModel
# Process a large CSV file without loading it into memory
stream = DsvHelper.parse_stream("large_dataset.csv", delimiter=",")
model = StreamingTabularDataModel(stream, header_rows=1, chunk_size=1000)
# Iterate through data efficiently
for row in model:
# Process each row
print(row)
# Or get rows as dictionaries
for row_dict in model.iter_rows():
print(row_dict["column_name"])
Type Inference and Validation
from splurge_tools.type_helper import String, DataType
# Infer data types
data_type = String.infer_type("2023-12-25") # DataType.DATE
data_type = String.infer_type("123.45") # DataType.FLOAT
data_type = String.infer_type("true") # DataType.BOOLEAN
# Convert values with validation
date_val = String.to_date("2023-12-25")
float_val = String.to_float("123.45", default=0.0)
bool_val = String.to_bool("true")
DSV Parsing and Profiling
from splurge_tools.dsv_helper import DsvHelper
# Parse and profile columns
data = DsvHelper.parse("data.csv", delimiter=",")
profile = DsvHelper.profile_columns(data)
# Get column information
for col_name, col_info in profile.items():
print(f"{col_name}: {col_info['datatype']} ({col_info['count']} values)")
Secure Random String Generation
from splurge_tools.random_helper import RandomHelper
# Generate Base58-like strings with guaranteed character diversity
api_key = RandomHelper.as_base58_like(32) # Contains alpha, digit, and symbol
print(api_key) # Example: "A3!bC7@dE9#fG2$hJ4%kL6&mN8*pQ5"
# Generate without symbols (alpha + digits only)
token = RandomHelper.as_base58_like(16, symbols="")
print(token) # Example: "A3bC7dE9fG2hJ4kL"
# Generate with custom symbols and secure mode
secure_id = RandomHelper.as_base58_like(20, symbols="!@#$", secure=True)
print(secure_id) # Example: "A3!bC7@dE9#fG2$hJ4"
Empty Value Handling Decorators
The package provides specialized decorators for handling empty values in string processing methods:
from splurge_tools.decorators import (
handle_empty_value_classmethod,
handle_empty_value_instancemethod,
handle_empty_value
)
class StringProcessor:
@classmethod
@handle_empty_value_classmethod
def class_process(cls, value: str) -> str:
return f"class:{value.upper()}"
@handle_empty_value_instancemethod
def instance_process(self, value: str) -> str:
return f"{self.prefix}{value.upper()}"
@handle_empty_value
def standalone_process(value: str) -> str:
return f"function:{value.upper()}"
# All decorators handle None and empty strings gracefully
StringProcessor.class_process(None) # Returns ""
StringProcessor.class_process("") # Returns ""
StringProcessor.class_process("hello") # Returns "class:HELLO"
# Deprecated method example
@deprecated_method("new_process_method", "2.0.0")
def old_process(value: str) -> str:
return value.upper()
Decorator Types:
handle_empty_value_classmethod: For@classmethoddecorated methodshandle_empty_value_instancemethod: For instance methods (self as first parameter)handle_empty_value: For standalone methods and@staticmethoddecorated methodsdeprecated_method: For marking methods as deprecated with customizable warnings
Development
Requirements
- Python 3.10 or higher
- setuptools
- wheel
Setup
- Clone the repository:
git clone https://github.com/jim-schilling/splurge-tools.git
cd splurge-tools
- Create and activate a virtual environment:
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
- Install development dependencies:
pip install -e ".[dev]"
Testing
Run tests using pytest:
python -m pytest tests/
Code Quality
The project uses several tools to maintain code quality:
- Black: Code formatting
- isort: Import sorting
- flake8: Linting
- mypy: Type checking
- pytest: Testing with coverage
Run all quality checks:
black .
isort .
flake8 splurge_tools/ tests/ --max-line-length=120
mypy splurge_tools/
python -m pytest tests/ --cov=splurge_tools
Build
Build distribution:
python -m build --sdist
Changelog
[2025.4.2] - 2025-08-22
Added
- Centralized Decorators Module: Created new
splurge_tools/decorators.pymodule to centralize common decorators:handle_empty_value_classmethod: For@classmethoddecorated methods that process string valueshandle_empty_value_instancemethod: For instance methods (self as first parameter) that process string valueshandle_empty_value: For standalone functions and@staticmethoddecorated methods that process string valuesdeprecated_method: For marking methods as deprecated with customizable warning messages
- Enhanced Decorator Examples: Added comprehensive example demonstrating all decorator types:
examples/08_decorator_examples.py: Complete demonstration of all decorator functionality- Shows proper usage patterns for each decorator type
- Demonstrates empty value handling and deprecation warnings
- Includes performance metrics and feature coverage validation
Changed
- Decorator Refactoring: Moved
handle_empty_valuedecorator fromcase_helper.pyandtext_normalizer.pyto centralizeddecorators.py:- Eliminated code duplication across modules
- Improved maintainability and consistency
- Enhanced type safety with specialized decorators for different use cases
- Module Organization: Moved
deprecated_methoddecorator fromcommon_utils.pytodecorators.py:- Better separation of concerns (decorators vs utility functions)
- Improved discoverability of decorator functionality
- Cleaner module organization
- Test Organization: Updated test structure for better maintainability:
tests/test_decorators.py: Comprehensive testing of all decorator functionality- Removed duplicate
deprecated_methodtests fromtest_common_utils.py - Improved test coverage and organization
Fixed
- Decorator Parameter Handling: Fixed critical bug in
handle_empty_valuedecorator:- Corrected parameter signature for class methods (added missing
clsparameter) - Fixed parameter mismatch that caused decorator to fail with valid strings
- Ensured proper handling of
Noneand empty string inputs
- Corrected parameter signature for class methods (added missing
- Test Coverage: Improved test organization and eliminated duplicate testing:
- Removed
TestDeprecatedMethodclass fromtest_common_utils.py - Centralized all decorator testing in
test_decorators.py - Maintained 100% test coverage for decorators module
- Removed
Performance
- Test Execution: Improved test performance with better organization:
- 527 tests passed with no failures
- 95% overall code coverage
- 100% coverage for
decorators.py - 89% coverage for
common_utils.py
- Example Validation: All examples running successfully:
- 8/8 examples passed with comprehensive feature coverage
- 0.83s total execution time (0.12s average per example)
- Validated all major library features working correctly
[2025.4.1] - 2025-08-16
Added
- Enhanced Base58 Error Handling: Introduced specific exception types for better error clarity:
Base58Error: Base class for all base-58 related errorsBase58TypeError: Raised when input type validation failsBase58ValidationError: Raised when base-58 validation fails
- Improved Base58 Class Structure: Refactored
Base58class with better organization:- Separated alphabet constants (
DIGITS,ALPHA_UPPER,ALPHA_LOWER,ALPHABET) - Enhanced type checking with specific error messages
- Improved input validation and error handling
- Separated alphabet constants (
Changed
- Base58 Method Signatures: Updated method signatures for better type safety:
decode()method now requires non-None string inputis_valid()method now requires string input with proper type checking- Removed redundant
is_valid_base58()alias method
- Enhanced Test Coverage: Comprehensive test suite improvements:
- Converted from unittest to pytest for better test organization
- Added extensive error handling test cases
- Improved test coverage for edge cases and error conditions
- Enhanced validation testing for all Base58 operations
Fixed
- Base58 Decoding Edge Cases: Fixed handling of edge cases in base-58 decoding:
- Improved handling of all-zero byte sequences
- Better handling of leading zero bytes in encoded data
- Enhanced validation for empty and invalid inputs
- Error Message Clarity: Improved error messages for better debugging and user experience
Performance
- Test Execution: Improved test performance and reliability with pytest framework
- Error Handling: More efficient error detection and reporting
[2025.4.0] - 2025-08-13
- Moved to CalVer versioning scheme (Year.Minor.Micro)
Breaking Changes
- Removed factory pattern and heuristics:
- Deleted
DataModelFactory,ComponentFactory, andcreate_data_model(). - Introduced explicit constructors in
splurge_tools/factory.py:create_in_memory_model(data, *, header_rows=1, skip_empty_rows=True)create_streaming_model(stream, *, header_rows=1, skip_empty_rows=True, chunk_size=1000)
- Deleted
- Removed
TypedTabularDataModel. Typed access is now provided via a lightweight view:TabularDataModel.to_typed(type_configs: dict[DataType, Any] | None = None)
- Simplified protocols and resource management guidance:
- Streamlined
StreamingTabularDataProtocoldocumentation to a minimal, unified interface. - Deprecated
ResourceManagerProtocolusage in favor of direct context managers.
- Streamlined
Added
splurge_tools/tabular_utils.py: Shared utilities for tabular processingprocess_headers()— multi-row header merging and normalizationnormalize_rows()— row padding and empty-row filteringshould_skip_row()andauto_column_names()helpers
TabularDataModel.to_typed()typed view:- Iterates typed rows (
__iter__,iter_rows,iter_rows_as_tuples) - Random access (
row,row_as_list,row_as_tuple) - Column APIs (
column_values,cell_value,column_type) - Lazy conversion with caching; no data duplication
- Iterates typed rows (
Changed
- Unified header and row normalization logic in both in-memory and streaming models using
tabular_utils. - Updated examples and tests to use explicit constructors and
to_typed(); removed factory usage. DataTransformerimport cleanup (removed dependency on deletedTypedTabularDataModel).
Removed
splurge_tools/typed_tabular_data_model.pyand all references.- Factory helpers and wrapper-based resource manager creation.
Fixed
- Typed view default behavior for empty vs. none-like values to match previous semantics:
- Supports override semantics via
type_configs(perDataType). - Distinguishes empty defaults from none defaults for accurate conversions.
- Supports override semantics via
Migration Guide
- Replace factory usage:
create_data_model(data)→create_in_memory_model(data)orcreate_streaming_model(stream)ComponentFactory.create_validator()/create_transformer()→ instantiate classes directly
- Replace
TypedTabularDataModel(...)withTabularDataModel(...).to_typed(...). - Replace
ComponentFactory.create_resource_manager(...)withsafe_file_operation(...)orFileResourceManagerdirectly.
[0.3.2] - 2025-08-09
Added
-
Secure Float Range Generation: Enhanced
RandomHelper.as_float_range()method with newsecureparameter for cryptographically secure random float generation:- Uses Python's
secretsmodule whensecure=Truefor cryptographically secure randomness - Maintains full 64-bit precision for secure random floats using byte-to-float conversion
- Consistent API with other secure methods in
RandomHelperclass - Backward compatible - existing code continues to work unchanged
- Comprehensive documentation and examples included
- Uses Python's
-
Comprehensive Examples Suite: Added complete set of working examples demonstrating all major library features:
01_type_inference_and_validation.py: Type inference, conversion, and validation utilities02_dsv_parsing_and_profiling.py: DSV parsing, streaming, and column profiling03_tabular_data_models.py: In-memory, streaming, and typed tabular data models04_text_processing.py: Text normalization, case conversion, and tokenization05_validation_and_transformation.py: Data validation, transformation, and factory patterns06_random_data_generation.py: Random data generation including secure methods07_comprehensive_workflows.py: End-to-end ETL and streaming data processing workflowsexamples/README.md: Comprehensive documentation for all examplesexamples/run_all_examples.py: Test runner with performance metrics and feature coverage
Changed
- Example Quality Improvements: All examples now include:
- Comprehensive error handling and validation
- Performance metrics and timing information
- Windows compatibility (replaced Unicode symbols with ASCII)
- Detailed explanations and best practices
- Real-world use cases and practical applications
Fixed
- Method Signature Corrections: Fixed multiple incorrect method signatures across examples:
DataTransformer.pivot(): Corrected parameter names (index_cols,columns_col,values_col)DataTransformer.group_by(): Fixed aggregation parameter structure (group_cols,agg_dict)DataTransformer.transform_column(): Updated parameter names (column,transform_func)TextNormalizermethods: Corrected method names (remove_special_chars,remove_control_chars)Validatorutility methods: Fixed parameter signatures for validation utilities
- Unicode Compatibility: Resolved Windows terminal encoding issues by replacing Unicode symbols with ASCII equivalents
- Import Dependencies: Fixed missing imports and removed factory pattern references throughout examples
- Type System Integration: Replaced
TypedTabularDataModelwithTabularDataModel.to_typed()for typed access
Performance
- Example Execution: All 7 examples now execute successfully with average runtime of 0.12s per example
- Test Coverage: 100% success rate across all examples with comprehensive error handling
- Memory Efficiency: Examples demonstrate proper streaming techniques for large dataset processing
Testing
- Comprehensive Example Testing: Added automated test runner that validates all examples execute successfully
- Feature Coverage Verification: Test suite verifies all major library features are properly demonstrated
- Cross-Platform Compatibility: Examples tested and working on Windows, macOS, and Linux
[0.3.1] - 2025-08-09
Added
-
Common Utilities Module: Added new
common_utils.pymodule containing reusable utility functions to reduce code duplication across the package:deprecated_method(): Decorator for marking methods as deprecated with customizable warning messagessafe_file_operation(): Safe file path validation and operation handling with comprehensive error handlingensure_minimum_columns(): Utility for ensuring data rows have minimum required columns with paddingsafe_index_access(): Safe list/tuple index access with bounds checking and helpful error messagessafe_dict_access(): Safe dictionary key access with default values and error contextvalidate_data_structure(): Generic data structure validation with type checking and empty data handlingcreate_parameter_validator(): Factory function for creating parameter validation functions from validator dictionariesbatch_validate_rows(): Iterator for validating and filtering tabular data rows with column count constraintscreate_error_context(): Utility for creating detailed error context information for debugging
-
Validation Utilities Module: Added new
validation_utils.pymodule providing centralizedValidatorclass with consistent error handling:Validator.is_non_empty_string(): String validation with whitespace handling optionsValidator.is_positive_integer(): Integer validation with range constraints and bounds checkingValidator.is_valid_range(): Numeric range validation with inclusive/exclusive boundsValidator.is_valid_path(): Path validation with existence checking and permission validationValidator.is_valid_encoding(): Text encoding validation with fallback optionsValidator.is_iterable_of_type(): Generic iterable validation with element type checking- All validator methods follow consistent
is_*naming convention and return validated values or raise specific exceptions
Changed
- Type Annotation Modernization: Updated type annotations across multiple modules to use modern Python union syntax (
|) instead ofOptionalandUnionimports:- Updated
data_transformer.py,data_validator.py,dsv_helper.py,random_helper.py,string_tokenizer.py,tabular_data_model.py - Improved type safety and consistency throughout the codebase
- Simplified import statements by removing unused
OptionalandUnionimports
- Updated
Fixed
- Enhanced Error Handling: Improved error handling consistency across the package with specific exception types
- Code Duplication Reduction: Consolidated common validation and utility patterns into reusable functions
- Type Safety Improvements: Enhanced type checking and validation throughout the codebase
Testing
- Comprehensive Test Coverage: Added extensive test suites for new modules:
tests/test_common_utils.py: Complete test coverage for common utility functions (96% coverage)tests/test_validation_utils.py: Comprehensive validation utility testing (94% coverage)- Enhanced existing test files to use new utility functions where appropriate
- Maintained Package Coverage: All existing functionality preserved with improved test organization
[0.3.0] - 2025-08-08
Added
- Protocol-Based Architecture: Implemented comprehensive protocol-based design across all major components for improved type safety and consistency
- StreamingTabularDataProtocol: Added new
StreamingTabularDataProtocolspecifically designed for streaming data models with methods optimized for memory-efficient processing:column_names,column_count,column_index()for metadata access__iter__(),iter_rows_as_dicts(),iter_rows_as_tuples()for data iterationreset_stream()for stream position management
- DataValidatorProtocol: Added
DataValidatorProtocolwith required methodsvalidate(),get_errors(), andclear_errors() - DataTransformerProtocol: Added
DataTransformerProtocolwith required methodstransform()andcan_transform() - TypeInferenceProtocol: Added
TypeInferenceProtocolwith required methodscan_infer(),infer_type(), andconvert_value() - Enhanced RandomHelper: Added new
as_base58_like()method for generating Base58-like strings with guaranteed character diversity:- Ensures at least one alphabetic character, one digit, and one symbol (if provided)
- Validates symbols against the
SYMBOLSconstant for security - Supports secure and non-secure random generation modes
- Includes comprehensive error handling and validation
- New Constants: Added
BASE58_ALPHA,BASE58_DIGITS, andSYMBOLSconstants toRandomHelper:BASE58_ALPHA: 49 characters (excludes O, I, l from standard alphabet)BASE58_DIGITS: 9 characters (excludes 0, uses 1-9 only)SYMBOLS: 26 special characters for secure string generation
- TypeInference Class: Created new
TypeInferenceclass implementingTypeInferenceProtocolfor type inference operations - ResourceManager Base Class: Created new
ResourceManagerbase class implementingResourceManagerProtocolwith abstract methods_create_resource()and_cleanup_resource() - FileResourceManagerWrapper: Added adapter class to wrap existing context managers to protocol interface
- Runtime Protocol Validation: Added runtime validation in factory methods to ensure created objects implement correct protocols
- Comprehensive Test Suites: Added extensive test coverage for all new implementations:
tests/test_factory_protocols.py- Factory protocol testingtests/test_type_inference.py- TypeInference class and protocol testingtests/test_data_validator_comprehensive.py- Comprehensive DataValidator testing (98% coverage)tests/test_factory_comprehensive.py- Comprehensive Factory testing (87% coverage)tests/test_resource_manager_comprehensive.py- Comprehensive ResourceManager testing (84% coverage)- Enhanced
test_random_helper.pywith comprehensiveas_base58_like()testing (97% coverage)
Changed
- StreamingTabularDataModel Protocol Separation: Updated
StreamingTabularDataModelto implementStreamingTabularDataProtocolinstead ofTabularDataProtocol:- Removed methods not suitable for streaming:
row_count,column_type,column_values,cell_value,row,row_as_list,row_as_tuple - Focused on streaming-optimized iteration methods
- Improved architectural clarity between in-memory and streaming models
- Removed methods not suitable for streaming:
- Factory Return Types: Enhanced factory methods to correctly return
Union[TabularDataProtocol, StreamingTabularDataProtocol]based on model type - DataValidator Protocol Compliance: Updated
DataValidatorclass to explicitly implementDataValidatorProtocol:- Modified
validate()method to returnboolinstead ofDict[str, List[str]] - Added
get_errors()method returning list of error messages - Added
clear_errors()method to reset error state - Added
_errorslist to track validation errors - Kept
validate_detailed()method for backward compatibility
- Modified
- DataTransformer Protocol Compliance: Updated
DataTransformerclass to explicitly implementDataTransformerProtocol:- Added
transform()method providing general transformation capability - Added
can_transform()method to check transformability - Updated constructor to accept
TabularDataProtocolfor broader compatibility - Kept existing specific transformation methods (pivot, melt, group_by, etc.)
- Added
- Factory Pattern Improvements: Enhanced
ComponentFactorymethods to return proper protocol types instead ofAny:- Added runtime validation for protocol compliance
- Updated type hints throughout factory classes
- Added proper error handling for protocol compliance failures
- Test Organization: Updated existing test suites to include protocol compliance testing and improved test structure
Fixed
- Type Annotation Issues: Resolved 109 MyPy type errors across the codebase:
- Fixed decorator type signatures in
case_helper.pyandtext_normalizer.py - Corrected unreachable code issues in
type_helper.pyby restructuring type checks - Fixed
Noneattribute access by adding properisinstance()checks - Updated generic type parameters throughout (
Iterator[Any],list[Any],dict[str, DataType]) - Corrected
PathLiketype annotations toPathLike[str] - Fixed resource manager type annotations for file handles and temporary files
- Fixed decorator type signatures in
- Protocol Implementation Issues: Resolved all protocol compliance issues across the codebase
- Type Safety: Fixed factory methods to return proper protocol types with runtime validation
- Circular Import Issues: Resolved circular import problems in type inference components
- Parameter Type Issues: Fixed parameter types to handle
Nonevalues properly:- Updated
string_tokenizer.py,base58.pyparameter types tostr | NoneorAny - Added proper validation in
random_helper.pyforstartparameter
- Updated
- Test Failures: Fixed 7 test failures related to protocol type assertions in factory tests
- Backward Compatibility: Ensured all existing functionality remains intact while adding protocol compliance
Performance
- Test Coverage Improvements: Significant improvements in test coverage across core components:
- DataValidator: 67% → 100% (+33%)
- Factory: 85% → 89% (+4%)
- ResourceManager: 42% → 84% (+42%)
- TypeHelper: 51% → 71% (+20%)
- RandomHelper: 58% → 97% (+39%)
- Type Safety: Reduced MyPy errors from 109 to 7 (remaining are "unreachable code" warnings for defensive programming)
- Architectural Clarity: Improved separation of concerns between streaming and in-memory data models
[0.2.7] - 2025-08-01
Added
- Added
utility_helper.pymodule with base-58 encoding/decoding utilities - Added
encode_base58()function for converting binary data to base-58 strings - Added
decode_base58()function for converting base-58 strings to binary data - Added
is_valid_base58()function for validating base-58 string format - Added
ValidationErrorexception class for utility validation errors - Added comprehensive test suite for base-58 functionality in
test_utility_helper.py - Added support for bytearray input in base-58 encoding
- Added handling for edge cases including all-zero bytes and leading zeros
- Added integration tests for cryptographic key encoding and Bitcoin-style addresses
- Added performance and memory efficiency tests for large data handling
- Added concurrent operation testing for thread safety
Changed
- Enhanced error handling with specific validation error messages
- Improved input validation for base-58 encoding/decoding operations
Fixed
- Proper handling of leading zero bytes in base-58 encoding/decoding
- Correct validation of base-58 alphabet characters (excluding 0, O, I, l)
[0.2.6] - 2025-07-12
Added
- Incremental Type Checking Optimization: Added performance optimization to
profile_values()function intype_helper.pythat uses weighted incremental checks at 25%, 50%, and 75% of data processing to short-circuit early when a definitive type can be determined. This provides significant performance improvements for large datasets (>10,000 items) while maintaining accuracy. - Early Mixed Type Detection: Enhanced early termination logic to immediately return
MIXEDtype when both numeric/temporal types and string types are detected, avoiding unnecessary processing. - Configurable Optimization: Added
use_incremental_typecheckparameter (default:True) to control whether incremental checking is used, allowing users to disable optimization if needed. - Performance Benchmarking: Added comprehensive performance benchmark script (
examples/profile_values_performance_benchmark.py) demonstrating 2-3x performance improvements for large datasets.
Changed
- Performance Threshold: Incremental type checking is automatically disabled for datasets of 10,000 items or fewer to avoid overhead on small datasets.
- Documentation Updates: Updated docstrings in
type_helper.pyto accurately reflect the simplified implementation. - Test Structure: Updated unittest test classes to properly inherit from
unittest.TestCasefor improved test organization and consistency.
Removed
- Unused Imports: Removed unused
osimport fromtype_helper.pyto improve code cleanliness.
[0.2.5] - 2025-07-10
Changed
- Test Organization: Reorganized test files to improve clarity and maintainability by separating core functionality tests from complex/integration tests. Split the following test files:
test_dsv_helper.py: Kept core parsing tests; moved file I/O and streaming tests totest_dsv_helper_file_stream.pytest_streaming_tabular_data_model.py: Kept core streaming model tests; moved complex scenarios and edge cases totest_streaming_tabular_data_model_complex.pytest_text_file_helper.py: Kept core text file operations; moved streaming tests totest_text_file_helper_streaming.py
- Import Cleanup: Removed unused import statements from all test files to improve code quality and maintainability:
- Removed unused
DataTypeimport fromtest_dsv_helper.py - Removed unused
Iteratorimports from streaming tabular data model test files
- Removed unused
- String Class Refactoring: Migrated method-level constants to class-level constants in
type_helper.pyString class for improved performance and maintainability:- Moved date/time/datetime pattern lists to class-level constants (
_DATE_PATTERNS,_TIME_PATTERNS,_DATETIME_PATTERNS) - Moved regex patterns to class-level constants (
_FLOAT_REGEX,_INTEGER_REGEX,_DATE_YYYY_MM_DD_REGEX, etc.) - This eliminates repeated pattern compilation on each method call and improves code organization
- Moved date/time/datetime pattern lists to class-level constants (
Fixed
- Test Expectations: Fixed test failures related to incorrect expectations for
profile_columnsmethod keys (datatypeinstead oftypeand nocountkey) and adjusted error message regex in streaming tabular data model tests. - String Class Regex Patterns: Fixed regex patterns in
type_helper.pyString class for datetime parsing. Updated_DATETIME_YYYY_MM_DD_REGEXand_DATETIME_MM_DD_YYYY_REGEXpatterns to properly handle microseconds with[.]?\d+instead of the incorrect[.]?\d{5}pattern.
Testing
- Maintained Coverage: All 167 tests continue to pass with 96% code coverage after reorganization and cleanup.
- Improved Maintainability: Test organization now provides clearer separation between core functionality and complex scenarios, enabling selective test execution and better code organization.
[0.2.4] - 2025-07-05
Fixed
- profile_values Edge Case: Fixed edge case in
profile_valuesfunction where collections of all-digit strings that could be interpreted as different types (DATE, TIME, DATETIME, INTEGER) were being classified as MIXED instead of INTEGER. The function now prioritizes INTEGER type when all values are all-digit strings (with optional +/- signs) and there's a mix of DATE, TIME, DATETIME, and INTEGER interpretations. - profile_values Iterator Safety: Fixed issue where
profile_valuesfunction would fail when given a non-reusable iterator (e.g., generator). The function now uses a 2-pass approach that always uses a list for the special case logic is needed, ensuring both correctness with generators.
[0.2.3] - 2025-07-05
Changed
- API Simplification: Removed the
multi_row_headersparameter fromTabularDataModel,StreamingTabularDataModel, andDsvHelper.profile_columns. Multi-row header merging is now controlled solely by theheader_rowsparameter. - StreamingTabularDataModel API Refinement: Streamlined the
StreamingTabularDataModelAPI to focus on streaming functionality by removing random access methods (row(),row_as_list(),row_as_tuple(),cell_value()) and column analysis methods (column_values(),column_type()). This creates a cleaner, more consistent streaming paradigm. - Tests and Examples Updated: All tests and example scripts have been updated to use only the
header_rowsparameter for multi-row header merging. Any usage ofmulti_row_headershas been removed. - StringTokenizer Tests Refactored: Consolidated and removed redundant tests in
test_string_tokenizer.pyfor improved maintainability and clarity. Test coverage and edge case handling remain comprehensive.
Added
- StreamingTabularDataModel: New streaming tabular data model for large datasets that don't fit in memory. Works with streams from
DsvHelper.parse_streamto process data without loading the entire dataset into memory. Features include:- Memory-efficient streaming processing with configurable chunk sizes (minimum 100 rows)
- Support for multi-row headers with automatic merging
- Multiple iteration methods (as lists, dictionaries, tuples)
- Empty row skipping and uneven row handling
- Comprehensive error handling and validation
- Dynamic column expansion during iteration
- Row padding for uneven data
- Comprehensive Test Coverage: Added extensive test suite for
StreamingTabularDataModelwith 26 test methods covering:- Basic functionality with and without headers
- Multi-row header processing
- Buffer operations and memory management
- Iteration methods (direct, dict, tuple)
- Error handling for invalid parameters and columns
- Edge cases (empty files, large datasets, uneven rows, empty headers)
- Header validation and initialization
- Chunk processing and buffer size limits
- Dynamic column expansion and row padding
- Streaming Data Example: Added comprehensive example demonstrating
StreamingTabularDataModelusage, including memory usage comparison with traditional loading methods.
Fixed
- Header Processing: Fixed header processing logic in all data models (
StreamingTabularDataModel,TabularDataModel) to properly handle empty headers by filling them withcolumn_<index>names. Headers like"Name,,City"now correctly become["Name", "column_1", "City"]. - DSV Parsing: Fixed
StringTokenizer.parseto preserve empty fields instead of filtering them out. This ensures that"Name,,City"is parsed as["Name", "", "City"]instead of["Name", "City"], maintaining data integrity. - Row Padding and Dynamic Column Expansion: Fixed row padding logic in
StreamingTabularDataModelto properly handle uneven rows and dynamically expand columns during iteration. - File Handling: Fixed file permission errors in tests by ensuring proper cleanup of temporary files and stream exhaustion.
Performance
- Memory Efficiency:
StreamingTabularDataModelprovides significant memory savings for large datasets by processing data in configurable chunks rather than loading entire files into memory. - Streaming Processing: Enables processing of datasets larger than available RAM through efficient streaming and buffer management.
Testing
- 94% Test Coverage: Achieved 94% test coverage for
StreamingTabularDataModelwith comprehensive edge case testing. - Error Condition Testing: Added thorough testing of error conditions including invalid parameters and missing columns.
- Integration Testing: Tests cover integration with
DsvHelper.parse_streamand various data formats. - StringTokenizer Tests Updated: Updated
StringTokenizertests to reflect the new behavior of preserving empty fields.
[0.2.2] - 2025-07-04
Added
- TextFileHelper.load_as_stream: Added new method for memory-efficient streaming of large text files with configurable chunk sizes. Supports header/footer row skipping and uses optimized deque-based sliding window for footer handling.
- TextFileHelper.preview skip_header_rows parameter: Added
skip_header_rowsparameter to thepreview()method, allowing users to skip header rows when previewing file contents.
Performance
- TextFileHelper Footer Buffer Optimization: Replaced list-based footer buffer with
collections.dequeinload_as_stream()method, improving performance from O(n) to O(1) for footer row operations.
Fixed
- TabularDataModel No-Header Scenarios: Fixed issue where column names were empty when
header_rows=0. Column names are now properly generated as["column_0", "column_1", "column_2"]when no headers are provided. - TabularDataModel Row Access: Fixed
IndexErrorin therow()method when accessing uneven data rows. Added proper padding logic to ensure row data has enough columns before access. - TabularDataModel Data Normalization: Improved consistency between column count and column names by ensuring column names always match the actual column count, regardless of header configuration.
[0.2.1] - 2025-07-03
Added
- DsvHelper.profile_columns: Added
DsvHelper.profile_columns, a new method that generates a simple data profile from parsed DSV data, inferring column names and datatypes. - Test Coverage: Added comprehensive test cases for
DsvHelper.profile_columnsand improved validation of DSV parsing logic, including edge cases for all supported datatypes.
[0.2.0] - 2025-07-02
Breaking Changes
- Method Signature Standardization: All method signatures across the codebase have been updated to require default parameters to be named (e.g.,
def myfunc(value: str, *, trim: bool = True)). This enforces keyword-only arguments for all default values, improving clarity and consistency. This is a breaking change and may require updates to any code that calls these methods positionally for defaulted parameters. - All method signatures now use explicit type annotations and follow PEP8 and project-specific conventions for parameter ordering and naming.
- Some methods may have reordered parameters or stricter type requirements as part of this standardization.
Fixed
- Resolved Regex Pattern Bug: Fixed regex pattern bug - ?? should have been ? in String class in type_helper.py.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Development
Building Source Distributions
This project is configured to build source distributions only (no wheels). To build a source distribution:
# Using the build script (recommended)
python build_sdist.py
# Or using build directly
python -m build --sdist
The source distribution will be created in the dist/ directory as a .tar.gz file.
Testing
Run the test suite:
pytest
Run with coverage:
pytest --cov=splurge_tools --cov-report=html
Author
Jim Schilling
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 splurge_tools-2025.4.2.tar.gz.
File metadata
- Download URL: splurge_tools-2025.4.2.tar.gz
- Upload date:
- Size: 133.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
72fc7161a3981bb5e3ce95d9a1f36456fdccfa8455abb88824b9ad6357db780f
|
|
| MD5 |
9cd6e751c9d9c6abf2e8fe1ecc29a30f
|
|
| BLAKE2b-256 |
488d7183406e521f42f7dba6873e8551c5dd0d8687df66bd2836225847593a47
|
File details
Details for the file splurge_tools-2025.4.2-py3-none-any.whl.
File metadata
- Download URL: splurge_tools-2025.4.2-py3-none-any.whl
- Upload date:
- Size: 65.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a490fc87e26935236a323fb179f3de6b90ee0bdfe78ec69caa15c7520f09c2a
|
|
| MD5 |
972e1ad3481a1c3dc9feb016da32d6aa
|
|
| BLAKE2b-256 |
44c3374a6648324d1536b227db5c922c9ce7bce51e7e360cc1169247f517cca9
|