Revision history for Params-Filter

0.018  2026-04-25
    - Removed two dead-code branches identified by Devel::Cover:
      * `or $has_wildcard` in fast-return condition (logically unreachable:
        $has_wildcard can only be true when $ok->@* is already true)
      * `elsif ($ok->@*)` in Phase 4 (always true when reached, since the
        fast-return already handles the empty-accepted case)
    - Added Devel::Cover integration: `make cover` target via MY::postamble
    - Added 6 new subtests to close remaining coverage gaps:
      * Scalar-context branches for empty-args, per-field, and Phase 4 returns
      * Unsupported reference input type (scalar ref, coderef, regex)
      * `required || []` defensive guard in apply() (torn-object test)
      * `@all_msgs` true branch on fast-return path (odd-array + required-only)
    - 100% coverage across all Devel::Cover metrics: stmt, branch, cond, sub
    - All 84 tests passing

0.017001  2026-04-08
    - Updated Changes file to document v0.017 test coverage improvements
    - v0.017 added 9 new subtests across t/01-functional.t, t/02-oo-interface.t,
      and t/04-make_filter.t to close branch and condition coverage gaps
      identified in cpancover report; no code or API changes in v0.017
    - Moved benchmark.t to xt/ as author-only tests; benchmarks compare the
      module's own interfaces and are not relevant to end-user installs
    - All 78 tests passing

0.017  2026-04-08
    - Improved test coverage: 9 new subtests targeting branch/condition gaps
      found in cpancover report for v0.016
    - Covered: wrong-key detection, scalar/array truncation paths, excluded-wins
      logic, scalar-context undef return, non-hashref and empty-hashref
      new_filter() branches, defensive apply() guard, accepted-absent closure path
    - No code or API changes; tests only
    - All 82 tests passing

0.016  2026-02-15
    - Fixed distribution issue with MANIFEST.SKIP

0.015  2026-02-14
    - Improved documentation.

v0.014  2026-01-27 (STABLE RELEASE)
    - DISTRIBUTION: Fixed PAX headers issue permanently
    - Configured Makefile.PL to use GNU tar (gtar) with --format=ustar
    - This prevents CPAN rejection due to PAX headers created by macOS BSD tar
    - Requires: brew install gnu-tar
    - No code changes, distribution build fix only

v0.013  2026-01-27 (STABLE RELEASE)
    - DOCUMENTATION: Major reorganization and cleanup
    - README.md simplified from 856 to 198 lines (77% reduction)
    - Removed duplicate API documentation from README (now in POD only)
    - Added focused quick start examples in README
    - POD reorganized to emphasize closure interface performance
    - CLOSURE INTERFACE now presented first with "Maximum Performance" emphasis
    - Added real-world security examples (safe logging, data segregation)
    - Clear scope markers for which features apply to which interfaces
    - EXAMPLES: Consolidated and organized
      * Created dev-tools/ directory for development benchmarks (6 files)
      * Removed redundant benchmarks from examples/
      * Renamed benchmarks for clarity
      * examples/ now has 11 teaching examples + 4 user benchmarks
    - DISTRIBUTION: Clean perl 5.036 requirement verified
    - Removed profiling artifacts from distribution
    - All 73 tests pass

v0.011  2026-01-26 (STABLE RELEASE)
    - NEW: Added closure interface with make_filter() function for maximum performance
    - make_filter() creates optimized, reusable closures that can be 20-25% faster than
      hand-written Perl filtering code due to pre-computed exclusion lookups and
      specialized closure variants
    - Three specialized closure variants:
      * Required-only (empty accepted list) - 3.1M ops/sec
      * Wildcard (accepted contains '*') - 1.3M ops/sec, 24% faster than raw Perl
      * Accepted-specific (normal case) - 1.8M ops/sec, 20% faster than raw Perl
    - OPTIMIZED: filter() function now uses same optimizations as closure interface:
      * Pre-computed exclusion hash (O(1) lookups instead of O(n) array search)
      * Hash slice for required field copying (faster bulk operations)
      * Non-destructive operations with hash lookups instead of delete
      * Single wildcard check instead of per-iteration checks
    - All interfaces (functional, OO, closure) now use identical optimization techniques
    - Closure interface is 142-239% faster than functional interface due to:
      * No input parsing overhead (hashref-only input)
      * No error message construction overhead
      * Pre-compiled closures optimized for specific configuration
    - Added comprehensive test suite for make_filter() (t/04-make_filter.t with 10 subtests)
    - Added complete POD documentation for closure interface
    - Added usage examples (examples/closure_interface.pl with 6 working examples)
    - Added benchmark scripts:
      * benchmark-three-variants.pl - Performance comparison of three closure types
      * benchmark-optimized-filter.pl - Optimized filter() vs make_filter() comparison
      * benchmark-make_filter.pl - Closure vs raw Perl performance
    - Updated README.md with closure interface documentation and performance notes
    - Updated performance considerations to clarify that closure interface provides
      maximum speed while functional/OO have feature overhead
    - Changed "database queries" to "database statements" for accuracy (includes inserts/updates)
    - All 73 tests passing across 6 test files
    - POD syntax validated
    - Full backward compatibility maintained

v0.010  2026-01-25 (STABLE RELEASE)
    - Updated documentation to emphasize security, compliance, and correctness
      over raw performance
    - Added "Consistency" as primary benefit: converts varying data formats to
      consistent key-value pairs
    - Rewrote performance section with more nuanced messaging based on
      comprehensive benchmarking
    - Added comprehensive SECURITY documentation section with examples
    - Changed module description from "Fast field filtering" to
      "Secure field filtering"
    - All tests passing

v0.009  2026-01-24 (STABLE RELEASE)
    - Fixed PAUSE indexing issue: added META.yml and META.json to distribution
    - These files are required for CPAN indexing
    - All 59 tests passing

v0.008  2026-01-24 (STABLE RELEASE)
    - Fixed CPAN distribution issues:
      - Rebuilt tarball using COPY_EXTENDED_ATTRIBUTES_DISABLE=1 to avoid
        PAX headers for CPAN testers compatibility
      - Added =encoding utf-8 to POD documentation to resolve non-ASCII
        character warnings (→ arrows in examples)
      - Removed META.json and META.yml from MANIFEST (auto-generated)
    - All 59 tests passing
    - POD syntax validated

v0.007  2026-01-21 (STABLE RELEASE)
    - Version bump to resolve CPAN testers indexing issue
    - Repository renamed: Local-Params-Filter → Params-Filter
    - All package metadata updated for new repository location
    - Ready for full CPAN distribution

v0.006  2026-01-20 (STABLE RELEASE)
    - First stable CPAN release
    - Major documentation improvements:
      - Updated POD to match README structure and clarity
      - Improved DESCRIPTION section with clearer "When to Use" guidance
      - Enhanced INPUT PARSING section with numbered formats and better examples
      - Enhanced RETURN VALUES section with clearer structure
      - Improved MODIFIER METHODS documentation with important behavior notes
      - Improved WILDCARD SUPPORT section
      - Enhanced EXAMPLES section with complex data flows
    - Fixed bug in example code (extra empty arrayref argument to filter())
      - Fixed in examples/arrayref_input.pl (3 instances)
      - Fixed in examples/edge_cases.pl (3 instances)
      - Fixed in README.md (2 instances)
      - Fixed in lib/Params/Filter.pm POD (2 instances)
    - Fixed syntax error in examples/advanced_filtering.pl (hashref construction)
    - Replaced problematic examples/strict_construction_test.pl with proper
      examples/strict_construction.pl (educational example, no external dependencies)
    - All 11 example scripts tested and working correctly
    - All 59 tests passing
    - Ready for production use

v0.6_002 2026-01-14 (DEVELOPER RELEASE)
    - Improved message consistency: separated parsing messages from debug warnings
    - Parsing messages (always shown): plain text args, odd array elements
    - Debug warnings (debug mode only): unrecognized fields, excluded fields
    - Updated DEBUG MODE documentation to clarify message types
    - Updated Common Status Messages section with parsing vs debug distinction
    - All 59 tests still passing

v0.6_01 2026-01-14 (DEVELOPER RELEASE)
    - Beta release for CPAN testing and feedback
    - Renamed for CPAN publication: Local::Params::Filter → Params::Filter
    - Changed failure return value from 0 to undef for clearer boolean semantics
    - Lowered minimum Perl version from 5.36 to 5.36 (signatures stable since 5.36)
    - Updated all test files with new namespace
    - Updated all example files with new namespace
    - Updated README.md with new namespace
    - Updated Makefile.PL for CPAN distribution
    - Comprehensive POD documentation in module file
    - All 59 tests passing
    - Seeking feedback from CPAN testers and early adopters

v0.5.0 2026-01-13
    - Renamed module from Local::Params::Strictly to Local::Params::Filter
    - Renamed function: strictly() → filter()
    - Renamed constructor: new_bouncer() → new_filter()
    - Renamed method: admit() → apply()
    - Modifier methods unchanged: set_required(), set_accepted(), set_excluded(), accept_all(), accept_none()
    - Updated all test files (t/*.t) with new naming
    - Updated all example files (examples/*.pl) with new naming
    - Updated README.md with new terminology and examples
    - Updated Changes file header
    - All functionality remains identical (breaking API change only)

v0.4.0 2026-01-13
    - Added modifier methods for dynamic bouncer configuration
    - New methods: set_required(), set_accepted(), set_excluded()
    - Added convenience methods: accept_all(), accept_none()
    - new_bouncer() can now be called without arguments (defaults to reject all)
    - Methods support both arrayref and list arguments
    - Empty calls to set_* methods set fields to [] (empty array)
    - All modifier methods return $self for method chaining
    - Enables meta-programming and conditional configuration patterns
    - Added comprehensive test suite: t/03-modifier-methods.t (23 tests)
    - Added example script: examples/modifier_methods.pl
    - Updated README.md with modifier methods documentation
    - All 59 tests passing across 4 test files

v0.3.1 2025-01-12
    - Enhanced wildcard feature: '*' can now appear anywhere in accepted list
    - More flexible debugging: can add '*' to existing accepted fields
    - ['name', 'email', '*'] now accepts all fields
    - Documented wildcard behavior in README.md
    - Clarified that '*' is only special in accepted parameter

v0.3.0 2025-01-12
    - Added wildcard ['*'] feature to accept all fields in accepted parameter
    - When ['*'] is used as accepted parameter, all fields (except exclusions) are accepted
    - Empty [] still means 'accept none' (backward compatible)

v0.2.0 2025-01-12
    - Renamed module from Local::Strictly to Local::Params::Strictly
    - Renamed repository from Local-Strictly to Local-Params-Strictly
    - Updated all documentation and examples

v0.1.0 2025-01-08
    - Initial repository setup from installed version
    - Fresh repository structure with ExtUtils::MakeMaker
    - Parameter validation for strict construction
    - Both functional and OO interfaces
    - Flexible input handling (hashref, arrayref, scalar)
