Skip to content

Latest commit

 

History

History
1601 lines (1205 loc) · 83.9 KB

File metadata and controls

1601 lines (1205 loc) · 83.9 KB

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

Added

(none yet)

Changed

(none)

Fixed

(none)

Documentation

(none)


[1.0.17] - 2026-03-25

Fixed

  • JsonFaker: Preserva precisión de floats al codificar valores generados por esquema usando JSON_PRESERVE_ZERO_FRACTION, para que json_decode() devuelva float de forma consistente en PHP 8.5+.
  • GenerateMongoAnonymizedFieldCommand: Durante el escaneo de documentos, ahora salta ficheros PHP no legibles (is_readable()), evitando warnings de “Permission denied” y haciendo el comportamiento determinista entre entornos.
  • AnonymizationHistoryServiceTest: Hace la prueba de rebuildIndex robusta frente a flakiness por el cambio de segundos (cutoff temporal).

Documentation

(none)


[1.0.16] - 2026-03-24

Changed

  • Docker Compose (bundle root and demos): MySQL and PostgreSQL are no longer published on the host (ports removed). PHP, phpMyAdmin, pgAdmin, and other services on the same Compose network still reach them as mysql:3306 and postgres:5432. This avoids common WSL2 / Docker Desktop failures when binding host ports (e.g. forwards/expose 500) and reduces exposed surface on the workstation. MongoDB in demos may still publish an optional host port for local tools (unchanged).

Fixed

  • PHPUnit (integration): Assertions on Symfony Console output were updated to tolerate wrapped lines (e.g. MongoDB warning, “no entities” notes, .gitignore note) so make test-coverage stays green across terminal widths and CI environments.
  • DbalHelperTest: No longer configures Connection::quoteSingleIdentifier on mocks when that method is final or static (Doctrine DBAL 4 / PHP 8.1 CI); the test still exercises the fallback path via getDatabasePlatform() throwing.

Demo

  • composer.lock (symfony6, symfony7, symfony8): Synchronized with composer.json so nowo-tech/twig-inspector-bundle (require-dev) is present in the lock file; composer install during make up no longer fails with “package is not present in the lock file”.

Documentation

  • README, FAKERS.md, CONFIGURATION.md, ROADMAP.md: Faker count aligned with FakerType40 types (including map, utm, etc.), not 39.
  • README (Roadmap): Current release 1.0.16; test/coverage stats remain phrased so numbers do not go stale (1100+ methods; use composer test / make test-coverage for current figures).
  • TESTING_COMMANDS.md: Aligned with scripts/test-commands.sh26 combinations; per-section counts and notes (export has no --dry-run; real export runs in demos).
  • README: Demo script description updated to 26 combinations.
  • demo/README.md and demo/symfony6|7|8/README.md: Document database access via the internal Compose network and admin UIs (phpMyAdmin / pgAdmin); home Twig templates updated with correct admin ports per demo.

[1.0.15] - 2026-03-16

Added

  • Command runner abstraction: New Nowo\AnonymizeBundle\Service\CommandRunnerInterface and default implementation SystemCommandRunner. DatabaseExportService now uses this abstraction so database export logic (MySQL/PostgreSQL/SQLite/MongoDB) is testable without depending on real binaries or host environment.
  • Statistics display service: New Nowo\AnonymizeBundle\Service\AnonymizeStatisticsDisplay extracted from AnonymizeCommand to handle statistics rendering and export (tables, JSON/CSV, success rates) with dedicated unit tests.
  • Documentation: New and expanded docs for configuration, command usage, testing, and demos:
    • docs/CONFIGURATION.md, docs/COMMANDS.md, docs/TESTING_COMMANDS.md, docs/INSTALLATION.md, docs/RECIPE.md, docs/FAKERS.md, and example guides for pattern-based filters and polymorphism (EXAMPLES_PATTERN_BASED.md, EXAMPLES_POLYMORPHISM_ANONYMIZE_SERVICE.md).
    • docs/DEMO-FRANKENPHP.md describes running the demos with FrankenPHP and Caddy (dev images, Caddyfile, PHP ini).
    • docs/PROPUESTA-TESTS-COBERTURA.md, docs/ENGRAM.md, and docs/ROADMAP.md expanded with testing and architecture notes.

Changed

  • DatabaseExportService: Refactored to delegate all shell command execution (mysqldump/pg_dump/mongodump/tar/gzip/bzip2/zip) to CommandRunnerInterface. Behaviour is unchanged for consumers (CLI commands still export databases the same way), but the implementation is now covered by deterministic tests using fake runners.
  • History command: AnonymizationHistoryCommand now delegates statistics rendering of anonymization runs to AnonymizeStatisticsDisplay, improving separation of concerns and allowing higher coverage of reporting logic.
  • CI / tooling:
    • CI workflows now use a consistent composer update strategy and ignore composer.lock in validation steps where appropriate, while keeping composer.lock under version control for reproducible installs.
    • composer.json platform PHP version set to 8.1.34 for consistent dependency resolution in CI and local development.
    • Makefile and demo Makefiles updated to align testing, coverage, and demo verification targets; README updated to reflect the current tooling.

Fixed

  • Resilience of export and history reporting tests: The new abstractions and test coverage flush out edge cases around command availability (tar, gzip, bzip2, zip) and statistics display. No user-facing API changes, but future regressions are less likely.

Documentation

  • README.md: Updated feature list, installation instructions, and links to the expanded documentation set (commands, configuration, usage, testing, demos).
  • UPGRADING.md: New section “Upgrading to 1.0.15” describing that this is a non-breaking release focused on internal refactors, test coverage and documentation, with no required configuration changes.

[1.0.14] - 2026-02-22

Added

  • Main Makefile: New release-check target runs pre-release checks: code style (cs-fix, cs-check), tests with coverage (test-coverage), and demo healthchecks (build and verify each demo). Use before creating a tag.
  • Demo Makefiles (symfony6, symfony7, symfony8): New targets release-verify (healthcheck for the demo), restart (down + up), and build (build containers). Help text updated for all targets.

Changed

  • Code style: PHP CS Fixer fixes applied (no functional change). [CI]

Fixed

(none)

Documentation

  • docs/RELEASE.md: Release process (CHANGELOG, UPGRADING, tag, push). docs/SECURITY.md: Security policy and reporting.

[1.0.13] - 2026-02-21

Fixed

  • Custom anonymizer service (anonymizeService): When you reference the service by class name (e.g. #[Anonymize(anonymizeService: MyAnonymizer::class)]), the bundle resolves it via $container->get(). In Symfony, services are private by default and get inlined at compile time, so the bundle can no longer retrieve them by id. You must declare your custom anonymizer service as public: true in config/services.yaml (or equivalent) so the bundle can resolve it. See the demos: App\Service\SmsNotificationAnonymizerService is explicitly set to public: true in demo/symfony6, demo/symfony7, and demo/symfony8.

Demo

  • Demo (symfony6, symfony7, symfony8): make install and make up no longer fail with "service php is not running" when the PHP container exits because vendor/ is missing. Composer is now run with docker-compose run --rm php composer install so dependencies install in a one-off container; then docker-compose up -d php is run to start the PHP service with the app ready.
  • Demo (symfony6, symfony7, symfony8): SmsNotificationAnonymizerService is declared with public: true in config/services.yaml so nowo:anonymize:run can resolve the custom anonymizer and process SmsNotification without "service has been removed or inlined".
  • Demo (PostgreSQL init): The users table in demo/docker/init/postgres/init.sql now uses columns first_name, last_name, and credit_card (instead of firstname, lastname, creditcard) to match Doctrine's underscore naming strategy. Pre-flight checks for the postgres entity manager no longer fail with "Column first_name (from mapping) does not exist". If you already have a Postgres data volume from a previous run, remove it (e.g. rm -rf demo/symfony8/.data/postgres) and run make setup again so the init script runs with the new schema.

Documentation

  • UPGRADING.md: New section "Upgrading to 1.0.13" with the requirement to make custom anonymizer services public when using FQCN, and demo-specific notes (recreate Postgres volume if needed).

[1.0.12] - 2026-02-16

Added

  • Chunked processing and bounded memory: AnonymizeService::anonymizeEntity() now loads records in chunks of batch_size (LIMIT/OFFSET with ORDER BY primary key) instead of loading all rows at once. Memory usage is bounded by the configured batch size. A single COUNT(*) query is run once for progress reporting.
  • Transaction per chunk: All updates for a chunk are committed in one transaction (one commit per chunk instead of per row), improving throughput when using a custom anonymizer or property-based anonymization.
  • EntityAnonymizerServiceInterface: Two new methods for custom anonymizer services:
    • supportsBatch(): bool — Return true to have the bundle call anonymizeBatch() once per chunk; false to call anonymize() for each record.
    • anonymizeBatch(EntityManagerInterface $em, ClassMetadata $metadata, array $records, bool $dryRun): array — Receives the full chunk of records and returns a map record index => (column => new value). Only called when supportsBatch() returns true.

Changed

  • EntityAnonymizerServiceInterface (breaking): The interface now requires three methods: supportsBatch(), anonymize(), and anonymizeBatch(). Existing implementations must add supportsBatch() and anonymizeBatch(). For record-by-record behavior, return false from supportsBatch() and implement anonymizeBatch() e.g. by delegating to anonymize() per record (see demos and USAGE.md).

Fixed

(none)

Documentation

  • CONFIGURATION.md: batch_size description updated to state that it limits rows loaded per query (memory) and that one transaction is committed per chunk (performance).
  • USAGE.md: Section "Anonymizing via a custom service" updated with the three interface methods and the record-by-record vs batch behaviour.

[1.0.11] - 2026-02-17

Fixed

  • UtmFaker: For types campaign, term, and content, min_length and max_length are now enforced again after applying the output format (snake_case, kebab-case, lowercase, etc.). Formatting can shorten the string (e.g. lowercase removes underscores), so the final value now respects the requested length. Fixes flaky test testGenerateContentWithMinMaxLength when the formatted value was shorter than min_length.
  • Tests / CI: testConfigureDefinesOptions no longer uses Application::add() (not available in all Symfony Console versions used in CI). The test only instantiates the command and reads its definition; options are registered in configure() called from the parent constructor.

[1.0.10] - 2026-02-17

Changed

  • anonymizeService without #[AnonymizeProperty]: When an entity has only #[Anonymize(anonymizeService: '...')] and no property with #[AnonymizeProperty], the command now processes it and calls the custom service for each record instead of skipping with "No properties found". You can use a custom anonymizer service without defining any property-level attributes. USAGE.md updated to state that no #[AnonymizeProperty] is required when using only anonymizeService.

Fixed

  • Tests: testConfigureDefinesOptions no longer asserts the -e shortcut for --entity (removed in 1.0.9 to avoid conflict with Symfony's --env).

[1.0.9] - 2026-02-16

Fixed

  • DI / FakerFactory: AnonymizeService and PreFlightCheckService now receive FakerFactory via explicit injection (@nowo_anonymize.faker_factory) in the bundle's services.yaml, so the container builds correctly when the app (or the bundle's autowiring pattern) excludes FakerFactory from autowiring. Fixes "Cannot autowire service ... argument $fakerFactory needs an instance of FakerFactory but this type has been excluded".
  • Synthetic kernel: Commands and services no longer use the kernel service (synthetic until boot). They use the kernel.project_dir parameter or getParameter('kernel.project_dir') where available, with fallback to getcwd(). Fixes "The 'kernel' service is synthetic, it needs to be set at boot time" in runtimes such as FrankenPHP. Affected: AnonymizeCommand, ExportDatabaseCommand, AnonymizationHistoryCommand, GenerateMongoAnonymizedFieldCommand, DatabaseExportService, KernelParameterBagAdapter.
  • Console option conflict: The --entity option no longer uses the -e shortcut, to avoid conflict with Symfony's global --env (-e). Use --entity only.

Documentation

  • Demo Makefiles: All three demos (symfony6, symfony7, symfony8) aligned: same targets and help text, cache-clear target added, update-bundle runs full cache:clear (with warmup). Symfony 6 keeps update-symfony in help and as a target.

[1.0.8] - 2026-02-17

Added

  • nowo:anonymize:run: New --entity option to process only the given entity class name(s). Can be used multiple times. Useful to test a single entity, its anonymizeService or event listeners. See COMMANDS.md.
  • FakerFactory: Public alias nowo_anonymize.faker_factory for injection in app services. CONFIGURATION.md now includes a section "Using FakerFactory in your own services" explaining that services depending on FakerFactory must be registered only in dev/test (where the bundle is loaded) to avoid "no such service exists" when the container is built.

Fixed

  • Tests: DateFaker future-date assertion now compares by date string (avoids timezone/midnight flakiness). AnonymizeCommand entity-filter test updated for DBAL Result return type and ORM metadata mocks.

[1.0.7] - 2026-02-16

Fixed

  • Doctrine DBAL 4 / PHP 8.1 CI: Identifier quoting now uses the database platform when available, so the bundle works with DBAL 4 where Connection::quoteSingleIdentifier may be final or static and not mockable. DbalHelper::quoteIdentifier() prefers $connection->getDatabasePlatform()->quoteSingleIdentifier() first, then falls back to connection-level quoting or driver-aware manual quoting. No change for end users; tests were updated to mock the platform instead of the connection so CI passes on PHP 8.1 with DBAL 4.

[1.0.6] - 2026-02-17

Fixed

  • PostgreSQL / AnonymizeService: The anonymized column (boolean) is now written with SQL literals TRUE/FALSE on PostgreSQL instead of 1/0, fixing SQLSTATE[42804]: Datatype mismatch: column "anonymized" is of type boolean but expression is of type integer. MySQL and other platforms continue to use 1/0. Detection uses DbalHelper::getDriverName() (pgsql) for compatibility across DBAL versions.

Documentation

  • UPGRADING.md: Standardized section headings to "Migration Steps" (was mixed with "Upgrade Steps"). Renamed duplicate "Upgrading to 1.0.0 (Initial Release)" to "Installing the bundle (first-time install)" for clarity.
  • ROADMAP.md: Vision, adoption strategy (Phases A–C), and four pillars for community adoption; Implementation Priority aligned with adoption milestones.

[1.0.5] - 2026-02-16

Added

  • Anonymization via custom service (anonymizeService): Entity-level option to delegate anonymization to a service instead of AnonymizeProperty attributes.

    • New parameter on #[Anonymize]: anonymizeService (string, service id). When set, the bundle calls this service for each record instead of applying property-based anonymization.
    • New interface: Nowo\AnonymizeBundle\Service\EntityAnonymizerServiceInterface with method anonymize(EntityManagerInterface $em, ClassMetadata $metadata, array $record, bool $dryRun): array (returns column => value for updates).
    • Useful for polymorphic entities (different logic per subtype), API-based anonymization, or complex rules. Documented in USAGE.md and CONFIGURATION.md.
    • Demos: SmsNotification uses SmsNotificationAnonymizerService in all demo projects (symfony6, symfony7, symfony8).
  • Truncate by discriminator (polymorphic entities): When an entity uses Doctrine inheritance (STI/CTI) and truncate: true, the bundle now deletes only rows for that entity's discriminator value instead of truncating the whole table.

    • Detection is automatic via inheritanceType, discriminatorColumn, and discriminatorValue in metadata.
    • No extra configuration: normal entities still get full table truncate; polymorphic entities get DELETE FROM table WHERE discriminator_column = value.
    • When loading records for anonymization, the query is also restricted by discriminator so only rows of that subtype are processed.

Changed

  • AnonymizeService: Constructor accepts optional ContainerInterface $container to resolve anonymizeService by id. Required when any entity uses anonymizeService (bundle wiring provides it when available).

Documentation

  • USAGE.md: New section "Anonymizing via a custom service (anonymizeService)" with interface and example; truncation section extended with "Polymorphic entities (STI/CTI)".
  • CONFIGURATION.md: #[Anonymize] syntax updated with anonymizeService and polymorphic truncate behavior.
  • Demo folders: References updated from demo-symfony6/7/8 to symfony6/7/8 in docs and scripts where applicable.

Demo

  • Notification CRUD (symfony6, 7, 8): Fixed breadcrumb route notification_index_indexnotification_index in _breadcrumbs.html.twig (use _route, listRoute/indexRoute/routePrefix, and entityName fallback for Notifications). Notification index/show templates now pass listRoute: 'notification_index' and routePrefix: 'notification' with only to avoid context leakage. All three demos aligned (same breadcrumb logic and notification includes).

Fixed

  • Doctrine ORM 3 compatibility: AnonymizeService::getDiscriminatorForTruncate() now accepts both array (ORM 2.x) and DiscriminatorColumnMapping object (ORM 3.x) for discriminatorColumn metadata. Tests use DiscriminatorColumnMapping when available.
  • UtmFaker: generateCampaign() now enforces min_length and max_length in all code paths (predefined patterns and random words); previously a single short word could yield a campaign shorter than min_length.
  • AnonymizeTest: testAnonymizePropertiesArePublic now uses property_exists() instead of isset() so nullable properties (e.g. truncate_order) are correctly reported as present.

[1.0.4] - 2026-02-04

Added

  • Map Faker: New faker type for value substitution ("if value is X, put Y")

    • Options: map (required, associative array original_value => replacement_value), default (optional; if omitted, unmapped values are left as-is).
    • Use case: anonymize status/role fields by mapping each original value to a fixed replacement (e.g. activestatus_a, inactivestatus_b).
    • Registered as map in FakerType and FakerFactory. Documented in FAKERS.md.
    • Tests: MapFakerTest. Demo: FakerTypeExample entity with status field in all demos (Symfony 6, 7, 8).
  • Demos: AnonymizePropertySubscriber: Example listener for AnonymizePropertyEvent

    • Dispatched before each property is anonymized; allows pre-processing (e.g. migrate files from Amazon S3 to another storage before replacing the field).
    • Declared with #[AsEventListener(event: AnonymizePropertyEvent::class)] (Symfony 6.3+).
    • Located in demo/*/src/EventSubscriber/AnonymizePropertySubscriber.php with commented S3 migration example.
  • Tests: AnonymizePropertyListenerTest: Tests for the listener pattern on AnonymizePropertyEvent

    • Covers: listener no-op, setAnonymizedValue(), setSkipAnonymization(), reading getRecord().

Changed

  • FakerFactory: Match keys now use FakerType::CONSTANT->value instead of string literals for consistency with the enum and easier maintenance.

Fixed

  • UtmFaker: generateTerm() now enforces min_length and max_length; previously a single short word could yield a result shorter than min_length (e.g. 2 chars when min was 5).

Documentation

  • Map faker already documented in FAKERS.md. Event listener example with AsEventListener in USAGE.md.

[1.0.3] - 2026-02-04

Added

  • excludePatterns / includePatterns: array value (OR for one field)
    Pattern values can be an array of strings; the record matches if the field value matches any option.

    • Example: 'email' => ['%@nowo.tech', 'operador@example.com'] — exclude when email matches any option.
    • Same syntax for includePatterns. Backward compatible: string values (and | within string) still work.
  • excludePatterns / includePatterns: multiple configs (OR between configs)
    You can pass a list of pattern sets; the record is excluded (or included) when any config matches.

    • Example: [ ['role' => 'admin', 'email' => '%@nowo.tech'], ['status' => 'deleted'], ['id' => '<=100'] ] — exclude when (config1) OR (config2) OR (config3).
    • Within each config all fields are AND; between configs the logic is OR.
    • Same for includePatterns. Documented in CONFIGURATION.md and USAGE.md.
  • Demos: bundle from repo
    Demos now use the bundle code from the repository via path repository (/bundles) when run with Docker, so you can test local changes (e.g. new excludePatterns) without publishing. See demo/README.md.

Changed

  • ProtectedUser demo
    Uses the new multiple-configs syntax for excludePatterns (list of configs) for clearer examples.

  • UserAccount demo
    Uses array value for excludePatterns on email: 'email' => ['%@visitor.com', '%@internal.com'].

  • PatternMatcher
    Supports pattern value as string or array (OR), and patterns as single config or list of configs (OR between configs).

  • AnonymizeService
    Uses getPatternFieldNames() so entity/property patterns work correctly when using list of configs (all field names collected for query building).

  • PreFlightCheckService
    Validates both array values and list-of-configs for includePatterns and excludePatterns.

Documentation

  • CONFIGURATION.md: "Array of options" and "Multiple configs (OR between sets)" with examples.
  • USAGE.md: Examples 4 (array value) and 5 (multiple configs).
  • EXAMPLES_PATTERN_BASED.md: excludePatterns with array of options.
  • demo/README.md: "Bundle code from the repo" explains path repo usage.

[1.0.2] - 2026-01-27

Added

  • Table Truncation Support: Added truncate and truncate_order options to #[Anonymize] attribute
    • Tables can now be emptied (truncated) before anonymization
    • truncate_order allows controlling the order of truncation for tables with dependencies
    • Tables without explicit order are truncated alphabetically after those with orders
    • Automatic handling of foreign key constraints (MySQL, PostgreSQL, SQLite)
    • Support for dry-run mode to preview truncation
    • New demo entities: TempData, CacheData, LogEntry demonstrating truncation scenarios
    • New demo fixtures: TempDataFixtures (8 records), CacheDataFixtures (6 records), LogEntryFixtures (10 records) for testing truncation functionality

[1.0.1] - 2026-01-27

Added

  • New Faker: UTM Faker: Generate anonymized UTM (Urchin Tracking Module) parameters for marketing campaign tracking

    • Supports all UTM parameter types: source, medium, campaign, term, and content
    • Multiple format options: snake_case, kebab-case, camelCase, lowercase, PascalCase
    • Custom lists support: custom_sources, custom_mediums, custom_campaigns
    • Prefix and suffix options for generated values
    • Configurable min/max length for campaign, term, and content types
    • Predefined common sources (google, facebook, twitter, linkedin, etc.)
    • Predefined common mediums (cpc, email, social, organic, etc.)
    • Predefined campaign patterns (spring_sale, product_launch, etc.)
    • Registered as utm faker type in FakerType enum
    • Comprehensive test coverage: 25 tests with multiple assertions
    • Perfect for anonymizing marketing campaign tracking data while maintaining realistic parameter formats
  • Example Custom Faker: Reference implementation for creating custom faker services

    • Located at src/Faker/Example/ExampleCustomFaker.php
    • Comprehensive example demonstrating best practices for custom fakers
    • Shows how to preserve original values (useful for testing events)
    • Demonstrates accessing other fields from the current record
    • Shows how to access related entities using EntityManager
    • Includes extensive documentation with code examples
    • Perfect reference for users creating their own custom fakers
    • Can be copied and adapted for project-specific needs
    • Comprehensive test coverage: 13 tests with 26+ assertions
  • Demo: CustomFakerExample Entity: New example entity demonstrating ExampleCustomFaker usage

    • Shows how to use custom faker services with preserve_original option
    • Demonstrates accessing record fields and custom options
    • Includes comprehensive fixtures with 5 records covering various scenarios
    • Available in all demo projects (Symfony 6, 7, 8)
    • Perfect reference for understanding custom faker implementation
  • Demo: MarketingCampaign Entity: New example entity demonstrating UtmFaker usage

    • Shows how to use UTM faker for all parameter types (source, medium, campaign, term, content)
    • Demonstrates different formats (snake_case, kebab-case)
    • Shows custom sources and length constraints
    • Includes comprehensive fixtures with 8 records covering various UTM scenarios
    • Available in all demo projects (Symfony 6, 7, 8)
    • Perfect reference for anonymizing marketing campaign data
  • Documentation: Enhanced documentation for custom fakers and UTM faker

    • Added comprehensive section in USAGE.md about custom service fakers
    • Detailed examples showing how to use ExampleCustomFaker as reference
    • Complete documentation for UTM faker with all options and examples
    • Updated FAKERS.md with UTM faker description and custom faker reference
    • All examples include multiple use cases and edge cases

Changed

  • Total Faker Types: Increased from 38 to 39 fakers

    • Added utm for generating anonymized UTM parameters
    • Added ExampleCustomFaker as reference implementation (not counted in total, but available)
  • Test Coverage: Improved test coverage

    • Added comprehensive tests for UtmFaker (25 tests)
    • Added comprehensive tests for ExampleCustomFaker (13 tests, 26+ assertions)
    • All tests passing successfully

Technical Details

  • FakerFactory: Updated to support UTM faker

    • Added service registration for utm faker
    • Added direct instantiation fallback for utm faker
    • Integrated with existing faker infrastructure
  • FakerType Enum: Updated to include UTM faker

    • Added UTM = 'utm' case to enum
    • Maintains type safety and IDE autocompletion

[1.0.0] - 2026-01-24

Added

  • Demo: ProtectedUser Entity: New comprehensive example entity demonstrating excludePatterns at entity level

    • Shows how to exclude entire records from anonymization when fields match specific patterns
    • Demonstrates multiple exclusion patterns working together:
      • Email pattern matching: 'email' => '%@visitor.com'
      • Role-based exclusion: 'role' => 'admin'
      • ID range exclusion: 'id' => '<=100'
      • Status-based exclusion with OR operator: 'status' => 'archived|deleted'
    • Includes comprehensive fixtures with 25+ records covering all exclusion scenarios
    • Demonstrates edge cases (records matching multiple exclusion patterns)
    • Available in all demo projects (Symfony 6, 7, 8)
    • Perfect reference for understanding entity-level pattern filtering
  • Documentation: Enhanced documentation for entity-level excludePatterns

    • Clarified how excludePatterns work at entity level to exclude entire records
    • Added comprehensive examples in ProtectedUser entity
    • Updated usage examples to show multiple exclusion patterns

Changed

  • Demo Coverage: Improved demo coverage for pattern-based filtering
    • Existing demos (Order, Employee, Customer) already demonstrate excludePatterns
    • New ProtectedUser demo provides comprehensive multi-pattern examples
    • All demos include detailed comments in fixtures explaining exclusion logic

Documentation

  • Enhanced examples showing how to exclude records based on multiple criteria
  • Clarified the difference between entity-level and property-level pattern filtering
  • Added comprehensive use cases for excludePatterns at entity level

[0.0.29] - 2026-01-24

Added

  • New Faker: Pattern-Based Faker: Constructs values from other fields with pattern extraction

    • Perfect for fields derived from other fields that need to preserve patterns (e.g., username from email with number suffix)
    • Extracts a pattern from the original value and appends it to the anonymized source field value
    • Options: source_field (required), pattern (regex), pattern_replacement, separator, fallback_faker, fallback_options
    • Example: ['source_field' => 'email', 'pattern' => '/(\\(\\d+\\))$/'] preserves number in parentheses
    • Automatically receives the full record with already anonymized values
    • Registered as pattern_based faker type
    • Comprehensive test coverage: 13 tests with 26 assertions
  • New Faker: Copy Faker: Copies values from other fields

    • Perfect for fields that should be identical after anonymization (e.g., email and emailCanonical)
    • Simply copies the anonymized value from the source field
    • Options: source_field (required), fallback_faker, fallback_options
    • Example: ['source_field' => 'email'] copies anonymized email value
    • Automatically receives the full record with already anonymized values
    • Registered as copy faker type
    • Comprehensive test coverage: 9 tests with 19 assertions
  • Demo: UserAccount Entity: New example entity demonstrating copy and pattern_based fakers together

    • Shows how to use copy to make emailCanonical same as email
    • Shows how to use pattern_based to construct username from email while preserving pattern
    • Includes comprehensive fixtures with 10 records
    • Demonstrates complete workflow: email → username (with pattern) → usernameCanonical (same) → emailCanonical (copy)
    • Available in all demo projects (Symfony 6, 7, 8)
  • Documentation: Enhanced documentation with comprehensive examples

    • Added EXAMPLES_PATTERN_BASED.md with detailed examples of pattern_based and copy fakers
    • Updated USAGE.md with complete examples showing pattern_based and copy working together
    • Updated FAKERS.md with descriptions of new fakers
    • All examples include multiple use cases and edge cases

Changed

  • Total Faker Types: Increased from 35 to 37 fakers

    • Added pattern_based for constructing values from other fields with pattern extraction
    • Added copy for copying values from other fields
  • Test Coverage: Improved test coverage

    • Total tests: 788 tests with 2166 assertions (increased from 766 tests)
    • Code coverage metrics:
      • Classes: 67.69% (44/65)
      • Methods: 75.61% (186/246)
      • Lines: 61.79% (1942/3143)
    • Added comprehensive tests for pattern_based faker (13 tests, 26 assertions)
    • Added comprehensive tests for copy faker (9 tests, 19 assertions)
    • All tests passing successfully

Technical Details

  • AnonymizeService: Enhanced to support pattern_based and copy fakers

    • Modified to pass merged record (original + anonymized values) to these fakers
    • Ensures source_field contains the anonymized value if it was processed earlier
    • Maintains correct processing order based on weight attribute
  • FakerFactory: Updated to support new faker types

    • Added service registration for pattern_based and copy fakers
    • Added direct instantiation fallback for both fakers
    • Integrated with existing faker infrastructure

[0.0.28] - 2026-01-23

Added

  • Nullable Option for All Fakers: Added support for generating null values with configurable probability

    • New options: nullable (bool) and null_probability (0-100)
    • Works with all faker types
    • Useful for simulating optional fields and creating more realistic anonymized datasets
    • Example: ['nullable' => true, 'null_probability' => 30] generates null 30% of the time
    • When a value is determined to be null, it bypasses faker generation and sets the field to null directly
    • Preserves null values during type conversion to prevent null from being converted to empty strings
  • Preserve Null Option for All Fakers: Added support for preserving null values (skip anonymization when original is null)

    • New option: preserve_null (bool)
    • Works with all faker types
    • If preserve_null is true and the original value is null, the field is skipped (not anonymized)
    • If preserve_null is true and the original value has a value, it is anonymized normally
    • Useful for anonymizing only fields that have values, leaving nulls unchanged
    • Example: ['preserve_null' => true] - only anonymizes if the field has a value
    • Takes precedence over nullable option when original value is null
  • New Faker: DNI/CIF/NIF Faker: Spanish identification number anonymization

    • Supports DNI (8 digits + 1 letter), CIF (1 letter + 7 digits + 1 letter/digit), and NIF formats
    • Auto-detects type from original value if available
    • Optional formatting with separators (e.g., 12345678-A or A-1234567-4)
    • Generates valid identification numbers with proper checksum validation
    • Options: type (dni/cif/nif/auto), formatted (bool)
    • Example: #[AnonymizeProperty(type: 'dni_cif', options: ['type' => 'auto', 'formatted' => false])]
  • New Faker: Name Fallback Faker: Handles nullable related name fields

    • Perfect for entities with multiple name fields (e.g., name and firstname) where one can be nullable
    • Ensures data consistency: if one field has value and the other is null, generates a random value for the null field
    • Automatically uses the full database record to check related field values
    • Options: fallback_field (required), gender (male/female/random), locale_specific (bool)
    • Example: #[AnonymizeProperty(type: 'name_fallback', options: ['fallback_field' => 'firstname'])]
    • Behavior:
      • If current field is null but related field has value → generates random name
      • If current field has value → anonymizes normally
      • If both are null → generates random name
      • If both have values → anonymizes both normally
  • New Faker: HTML Faker: Generates anonymized HTML content with lorem ipsum

    • Perfect for anonymizing email signatures, HTML templates, and HTML content
    • Supports multiple types: signature (email signature-like), paragraph, list, mixed
    • Generates valid HTML with lorem ipsum text while maintaining realistic structure
    • Options: type, include_links, include_styles, min_paragraphs, max_paragraphs, min_list_items, max_list_items
    • Signature type includes name, title, company, contact info with optional links and styles
    • Example: #[AnonymizeProperty(type: 'html', options: ['type' => 'signature', 'include_links' => true])]
  • Demo: Person Entity: New example entity demonstrating name_fallback faker

    • Shows how to handle nullable related name fields
    • Includes comprehensive fixtures covering all use cases:
      • Both fields have values
      • Only name has value (firstname is null)
      • Only firstname has value (name is null)
      • Both fields are null
    • Available in all demo projects (Symfony 6, 7, 8)
  • Demo: EmailSignature Entity: New example entity demonstrating html faker

    • Shows how to anonymize email signatures and HTML email bodies
    • Includes comprehensive fixtures with realistic email signatures
    • Demonstrates different HTML faker types (signature, paragraph)
    • Available in all demo projects (Symfony 6, 7, 8)
  • Demo: Contact Entity: New example entity demonstrating nullable and preserve_null options

    • Shows how to use nullable with null_probability to generate null values with configurable probability
    • Shows how to use preserve_null to skip anonymization when original value is null
    • Includes comprehensive fixtures with 8 records covering all use cases
    • Demonstrates both options working together with different faker types
    • Available in all demo projects (Symfony 6, 7, 8)

Changed

  • Total Faker Types: Increased from 32 to 35 fakers

    • Added dni_cif for Spanish identification numbers
    • Added name_fallback for nullable related name fields
    • Added html for HTML content with lorem ipsum (perfect for email signatures)
  • Test Coverage: Improved test coverage

    • Total tests: 766 tests with 2121 assertions (increased from 726 tests)
    • Code coverage metrics:
      • Classes: 68.25% (43/63)
      • Methods: 75.42% (181/240)
      • Lines: 61.29% (1884/3074)
    • Added comprehensive tests for nullable and preserve_null options
    • All tests passing successfully

[0.0.27] - 2026-01-21

Improved

  • Test Coverage: Significantly improved code coverage across the entire bundle

    • Added comprehensive test suites for multiple components
    • Total tests: 726 tests with 2011 assertions (increased from 660 tests)
    • Code coverage metrics:
      • Classes: 73.33% (44/60) - 44 classes with 100% coverage
      • Methods: 75.89% (170/224)
      • Lines: 59.57% (1731/2906)
    • All tests passing successfully
  • Command Tests: Added comprehensive test coverage for commands

    • GenerateAnonymizedColumnCommand: 9 new tests covering instantiation, configuration, execution scenarios
    • ExportDatabaseCommand: 9 new tests covering command structure, formatBytes, getParameterBag
    • GenerateMongoAnonymizedFieldCommand: 12 new tests covering script generation, file output, project root detection
    • AnonymizationHistoryCommand: Enhanced test coverage
  • Attribute Tests: Complete test coverage for attribute classes

    • Anonymize: 6 tests covering all constructor parameters and property access
    • AnonymizeProperty: 9 tests covering all faker types, options, and property access
    • Both attribute classes now have 100% code coverage
  • Faker Tests: Enhanced test coverage for faker classes

    • HashPreserveFaker: 4 additional tests for preserve_format edge cases (long hashes, float/integer values)
    • EnumFaker: 4 additional tests for weighted value selection, zero weights, small weights, locale support
    • JsonFaker: 4 additional tests for object type with zero depth, number type, random structure edge cases
    • DbalHelper: 6 additional tests for quoteIdentifier and getDriverName edge cases
  • Service Tests: Enhanced test coverage for core services

    • AnonymizeService: Additional tests for buildQueryWithRelationships with duplicate patterns
    • AnonymizeStatistics: Enhanced tests for formatDuration edge cases
    • PatternMatcher: Additional edge case tests
    • PreFlightCheckService: Comprehensive test coverage improvements
    • EnvironmentProtectionService: Complete test coverage
    • DatabaseExportService: Enhanced test coverage
  • Event Tests: Complete test coverage for all event classes

    • AnonymizePropertyEvent: All getters, setters, and skip functionality tested
    • BeforeAnonymizeEvent: Complete test coverage
    • AfterAnonymizeEvent: Complete test coverage
    • BeforeEntityAnonymizeEvent: Complete test coverage
    • AfterEntityAnonymizeEvent: Complete test coverage
    • All event classes now have 100% code coverage
  • Trait Tests: Complete test coverage for AnonymizableTrait

    • 7 tests covering all methods and edge cases
    • 100% code coverage achieved
  • Enum Tests: Complete test coverage for enum classes

    • FakerType: All enum cases tested
    • SymfonyService: All constants tested
    • Both enum classes now have 100% code coverage
  • Dependency Injection Tests: Complete test coverage

    • AnonymizeExtension: All methods tested
    • Configuration: Complete test coverage
    • Both classes now have 100% code coverage
  • Bundle Tests: Complete test coverage for AnonymizeBundle

    • getContainerExtension method fully tested
    • 100% code coverage achieved

Fixed

  • PasswordFaker: Fixed intermittent test failures

    • Ensured guaranteed inclusion of special characters and numbers when options are enabled
    • Improved password generation algorithm for deterministic character type inclusion
  • PatternMatcher: Fixed TypeError with non-string values

    • Added type check before calling str_starts_with() to prevent errors with boolean values
  • AnonymizeStatistics: Fixed CSV export with empty properties

    • Only includes property header when there are actual properties to report
  • Test Robustness: Improved test reliability

    • Fixed multiple test failures related to mocking final classes
    • Improved test assertions for edge cases
    • Enhanced test data generation for better coverage

[0.0.26] - 2026-01-21

Fixed

  • AnonymizeService: Fixed boolean and null value handling in SQL UPDATE queries
    • Boolean false values were incorrectly converted to empty string '' instead of '0'
    • Boolean true values now correctly converted to '1'
    • null values now correctly converted to SQL NULL (unquoted)
    • Resolves SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'is_active' error
    • Affects MySQL tinyint columns and other boolean-type columns

Changed

  • Demo Projects: Enhanced Symfony 6 demo Makefile
    • Added update-symfony command to help migrate from Symfony 6.0 to 6.1+
    • Updated help text to reflect Symfony 6.1+ requirement
    • Improved documentation for bundle installation process

[0.0.25] - 2026-01-21

Fixed

  • Services Configuration: Fixed FakerFactory autowiring error
    • FakerFactory was excluded from autowiring pattern but needed by AnonymizeService and PreFlightCheckService
    • Now explicitly registered in services.yaml with locale parameter
    • Resolves "Cannot autowire service AnonymizeService: argument FakerFactory has been excluded" error

[0.0.24] - 2026-01-21

Changed

  • Services Configuration: Simplified services.yaml using autowiring pattern

    • Replaced explicit faker definitions with autowiring pattern and exclude
    • Reduced configuration from ~165 lines to ~95 lines (42% reduction)
    • All fakers now use #[Autowire('%nowo_anonymize.locale%')] attribute
    • Requires Symfony 6.1+ (already documented requirement)
    • More maintainable and cleaner configuration
  • Documentation: Complete documentation update for Symfony 6.1+ requirement

    • Updated all documentation files to consistently state Symfony 6.1+ requirement
    • Added requirement notes to all major documentation files
    • Updated demo projects documentation
    • Fixed inconsistencies in demo composer.json files

Fixed

  • Demo Projects: Fixed Symfony version inconsistencies
    • Updated demo-symfony6/composer.json to use ^6.1 for all Symfony dependencies
    • Updated debug-bundle and web-profiler-bundle to ^6.1
    • Updated Symfony Flex require to 6.1.*
    • Updated demo README files to reflect Symfony 6.1+ requirement

[0.0.23] - 2026-01-21

Added

  • Standardized Faker API: All fakers now receive original_value parameter

    • FakerInterface updated to document original_value as standard parameter
    • All fakers receive the original database value automatically
    • Enables more intelligent fakers that can use original values when needed
    • Improves versatility and extensibility for custom fakers
  • Improved PreFlightCheckService: Enhanced column existence checking

    • Now queries actual database columns instead of relying solely on Doctrine mapping
    • Case-insensitive matching for better compatibility
    • More informative error messages showing available columns
    • Helps identify mapping issues (e.g., firstname vs firstName)

Changed

  • Symfony Version Requirement: Minimum Symfony version increased to 6.1+

    • Required for #[Autowire] attribute support in constructor parameters
    • All fakers now use #[Autowire('%nowo_anonymize.locale%')] attribute
    • Symfony 6.0 is no longer supported
    • Updated composer.json, documentation, and demo projects
  • AnonymizeService: Always passes original_value to all fakers

    • Standardized API: all fakers receive original_value automatically
    • Backward compatibility: hash_preserve and masking still support value key
    • Fakers can use or ignore the original value as needed
  • HashPreserveFaker and MaskingFaker: Support both original_value and value

    • Accept original_value (standard) or value (backward compatibility)
    • Prioritize original_value if available

Fixed

  • PreFlightCheckService: Fixed column name detection
    • Now queries actual database schema instead of relying on mapping
    • Better error messages with column suggestions
    • Case-insensitive matching for database compatibility

[0.0.22] - 2026-01-21

Fixed

  • Symfony 6.1+ Compatibility: Fixed services.yaml configuration error
    • Removed autowiring pattern with exclude (incompatible with Symfony 6.0, now requires 6.1+)
    • Explicitly defined all 28 fakers that require locale parameter
    • Resolved error: "Argument #1 ($resource) must be of type string, array given"
    • Services configuration now works correctly in Symfony 6.1+, 7.0, and 8.0

[0.0.21] - 2026-01-21

Added

  • DbalHelper Enhancement: New getDriverName() method for DBAL compatibility

    • Provides cross-version compatibility for getting database driver names
    • Supports DBAL 2.x and 3.x with multiple fallback strategies
    • Extracts driver name from platform class, connection params, or defaults to 'pdo_mysql'
    • Used by ExportDatabaseCommand and DatabaseExportService for better compatibility
  • Demo UI Improvements: Enhanced navigation and visual consistency

    • Added breadcrumbs navigation to all CRUD pages (index, show, new, edit)
    • Standardized anonymized badge display with icons and consistent colors
    • Created reusable _breadcrumbs.html.twig and _anonymized_badge.html.twig components
    • All 156 templates across 3 demos now have consistent navigation and badges
  • MongoDB Fixtures: Improved fixture loading and data generation

    • Enhanced load-fixtures.js script with better error handling
    • Created scripts/reload-mongodb-fixtures.sh script for manual fixture reloading
    • Improved entrypoint.sh for better MongoDB container detection
    • All 5 MongoDB collections now have sample data (125 documents per demo)

Fixed

  • HashPreserveFaker: Fixed "requires a 'value' option" error

    • AnonymizeService now automatically passes the original value to HashPreserveFaker
    • No need to manually specify value option in #[AnonymizeProperty] attributes
    • Resolved error when anonymizing entities with hash_preserve faker type
    • Affects SystemLog entity and any entity using hash_preserve faker
  • ExportDatabaseCommand: Fixed DBAL compatibility error

    • Replaced $connection->getDriver()->getName() with DbalHelper::getDriverName()
    • Resolved "Call to undefined method Driver::getName()" error in Symfony 6.1+/7.0
    • Improved compatibility across different Doctrine DBAL versions
    • DatabaseExportService also updated to use the new helper method

Changed

  • AnonymizeService: Enhanced faker option handling

    • Automatically injects original value for hash_preserve faker type
    • Maintains backward compatibility with existing configurations
    • Improves developer experience by reducing required configuration
  • Demo Templates: Standardized UI components

    • All anonymized badges now use consistent styling (green check for anonymized, gray X for not anonymized)
    • Bootstrap Icons used for visual clarity
    • Breadcrumbs follow consistent pattern: Home > Entity (connection) > Current Page

[0.0.20] - 2026-01-20

Added

  • DbalHelper: New static helper class for DBAL operations

    • Created DbalHelper::quoteIdentifier() static method for database identifier quoting
    • Compatible with both DBAL 2.x and 3.x versions
    • Can be used from anywhere without instantiation
    • Centralized location for DBAL compatibility methods
  • AbstractCommand: New base class for all bundle commands

    • Provides common functionality for all commands
    • Includes wrapper method for quoteIdentifier() for command convenience
    • All 6 commands now extend from AbstractCommand
  • Testing Infrastructure: Added testing script and documentation

    • Created scripts/test-commands.sh script for automated command testing
    • Added docs/TESTING_COMMANDS.md guide for testing all commands
    • Script supports testing in all three demo applications (Symfony 6, 7, 8)

Changed

  • Code Refactoring: Improved code organization and reusability
    • Moved quoteIdentifier() logic to static DbalHelper class
    • All commands now extend AbstractCommand instead of Command directly
    • AnonymizeService now uses DbalHelper::quoteIdentifier() directly
    • Eliminated code duplication across commands and services
    • Replaced Command::SUCCESS/FAILURE with self::SUCCESS/FAILURE for consistency

Fixed

  • PreFlightCheckService: Fixed getEntityManager() method call error

    • ClassMetadata does not have getEntityManager() method
    • Updated checkColumnExistence() to receive EntityManagerInterface as parameter
    • Resolved error: "Call to undefined method Doctrine\ORM\Mapping\ClassMetadata::getEntityManager()"
  • DBAL Compatibility: Fixed quoteSingleIdentifier() compatibility issues

    • Added fallback for DBAL versions that don't have quoteSingleIdentifier() method
    • Supports DBAL 2.x (quoteIdentifier) and DBAL 3.x (quoteSingleIdentifier)
    • Manual fallback with backticks for maximum compatibility

[0.0.19] - 2026-01-20

Added

  • Demo Improvements: Enhanced demo applications with better navigation and user experience
    • Added "Back to List" links in all form pages (new.html.twig and edit.html.twig) for better navigation
    • Added missing links in home page for EmailSubscription, SystemLog, and all MongoDB collections
    • Added SQLite connection links in sidebar navigation for all ORM entities
    • Improved consistency across all three demo applications (Symfony 6, 7, and 8)

Fixed

  • Demo Navigation: Fixed missing connection parameter in home page links
    • EmailSubscription and SystemLog links now correctly include the connection parameter
    • All home page links now follow the same pattern as other entities (MySQL, PostgreSQL, SQLite)
    • Resolved routing error: "Some mandatory parameters are missing ("connection") to generate a URL"

[0.0.18] - 2026-01-20

Fixed

  • Symfony 6.1+ Compatibility: Fixed compatibility issue

    • Moved command help text from #[AsCommand] attribute parameter to setHelp() method in configure()
    • The help parameter in #[AsCommand] is only available from Symfony 6.1+
    • All commands now use setHelp() for maximum compatibility (Symfony 6.1+, 7.0, 8.0)
    • Affected commands: AnonymizeCommand, AnonymizationHistoryCommand, ExportDatabaseCommand, AnonymizeInfoCommand, GenerateAnonymizedColumnCommand, GenerateMongoAnonymizedFieldCommand
  • DatabaseExportService Configuration: Fixed autowiring issue for DatabaseExportService

    • Service now explicitly configured in services.yaml with all required parameters
    • Excluded from automatic autowiring to prevent parameter resolution issues
    • All parameters (outputDir, filenamePattern, compression, autoGitignore) now correctly resolved from bundle configuration
  • UsernameFaker Overflow Warning: Fixed PHP warning for float-to-int conversion

    • Limited remainingLength to maximum 9 to prevent overflow when calculating pow(10, n)
    • Prevents warning: "The float ... is not representable as an int, cast occurred"
    • pow(10, 9) = 1,000,000,000 is safe for int representation in PHP
  • TextFakerTest Flaky Test: Improved test robustness for Faker randomness

    • Test now runs 10 iterations to account for Faker's random word generation
    • More lenient assertions that handle Faker's occasional generation of fewer words than requested
    • Test verifies minimum word count across iterations rather than single assertion

[0.0.17] - 2026-01-20

Added

  • Interactive Mode: Step-by-step confirmation prompts for anonymization

    • New --interactive or -i option for the nowo:anonymize:run command
    • Summary display before starting anonymization
    • Confirmation prompts for each entity manager
    • Confirmation prompts for each entity before processing
    • Shows entity details (table name, property count) in interactive mode
    • Verbose mode shows property details (faker types) in interactive prompts
    • Allows selective processing of entity managers and entities
    • Improves safety and user control during anonymization
  • Enhanced Reporting: Improved statistics and export capabilities

    • New --stats-csv option to export statistics to CSV format
    • Success rate calculation and display (global and per-entity)
    • Enhanced statistics tables with success rate column
    • CSV export includes: global statistics, entity statistics, and property statistics
    • Improved statistics display with more detailed metrics
    • CSV format suitable for spreadsheet analysis and reporting
    • Configurable output directory for statistics via stats_output_dir configuration
    • Relative file paths automatically use configured output directory
    • Absolute paths are used as-is for maximum flexibility
  • Database Export Command: Export databases to files with optional compression

    • New nowo:anonymize:export-db command for exporting databases
    • Supports MySQL (mysqldump), PostgreSQL (pg_dump), SQLite (file copy), and MongoDB (mongodump)
    • Configurable output directory and filename patterns with placeholders
    • Compression support: gzip, bzip2, zip (auto-detects available tools)
    • Automatic .gitignore management to exclude export directory
    • Selective export: export specific connections or all connections
    • Configurable via bundle configuration (nowo_anonymize.export.*)
    • Filename pattern placeholders: {connection}, {database}, {date}, {time}, {format}
    • Command-line options for overriding configuration
    • Detailed export summary with file sizes and success/failure counts
  • Configuration Enhancements:

    • New stats_output_dir configuration option for statistics export directory
    • New export configuration section for database export settings
    • All command help text moved to #[AsCommand] attributes for better organization
    • Symfony Flex recipe updated with all new configuration options
  • Anonymization History: Track and manage anonymization runs

    • New nowo:anonymize:history command to view and manage anonymization history
    • Automatic saving of anonymization run metadata after each execution
    • List all anonymization runs with filtering options (limit, connection)
    • View detailed information about specific runs
    • Compare two anonymization runs side-by-side
    • Cleanup old runs to manage storage
    • History stored in JSON format with index file for quick access
    • Configurable history directory via history_dir configuration option
    • Includes metadata: environment, PHP version, Symfony version, command options
    • Comparison shows differences in entities processed, updated, and duration

[0.0.16] - 2026-01-20

Added

  • Relationship Patterns Support: Patterns can now reference related entities using dot notation

    • Support for relationship patterns in includePatterns and excludePatterns (e.g., 'type.name' => '%HR')
    • Automatic SQL JOIN construction for relationship patterns
    • Works with all pattern operators: comparison (>, <, =, etc.), SQL LIKE (%), and OR (|)
    • Supports ManyToOne and OneToOne relationships
    • Example: #[Anonymize(includePatterns: ['type.name' => '%HR', 'status' => 'completed'])]
    • The bundle automatically detects relationship patterns and builds appropriate SQL queries with LEFT JOINs
    • PatternMatcher updated to access nested relationship values
    • Documented in docs/USAGE.md and docs/CONFIGURATION.md
  • Demo: Type Entity and Relationship Example: New example demonstrating relationship patterns

    • Created Type entity (id, name, description) in all demo projects
    • Added ManyToOne relationship from Order to Type
    • Updated Order entity with relationship pattern example: ['type.name' => '%HR']
    • Created TypeFixtures with 7 types (HR, HR Management, Sales, IT, Marketing, Finance, Operations)
    • Updated OrderFixtures to include type relationships
    • Applied to all demo projects (Symfony 6, 7, 8)

Improved

  • Demo: MongoDB CRUD Navigation: Enhanced menu navigation in all demo projects
    • Added MongoDB section to sidebar menu in base.html.twig
    • "User Activities (MongoDB)" link now visible in navigation menu
    • Better integration of MongoDB CRUD with other entity CRUDs
    • Applied to all demo projects (Symfony 6, 7, 8)

[0.0.15] - 2026-01-20

Added

  • MongoDB Field Migration Command: New command to generate MongoDB scripts for adding anonymized field
    • nowo:anonymize:generate-mongo-field: Generate JavaScript scripts (compatible with mongosh) to add anonymized field
    • Supports --scan-documents to automatically detect MongoDB document classes with #[Anonymize] attribute
    • Supports --collection option to manually specify collection names
    • Supports --database option to specify target database
    • Generates scripts that use updateMany() to add anonymized: false to existing documents
    • Output can be saved to file with --output option
    • Complements the existing SQL migration command (nowo:anonymize:generate-column-migration)
    • Documented in docs/COMMANDS.md and README.md

Improved

  • Demo: Enhanced CRUD Navigation: Updated home page in all demo projects to show all available CRUDs

    • Added links for Product, Order, Invoice, Employee entities across all SQL connections (MySQL, PostgreSQL, SQLite)
    • All CRUD interfaces now accessible from home page
    • Better organization of CRUD links by entity type
    • Applied to all demo projects (Symfony 6, 7, 8)
  • Demo: MongoDB Scripts: Improved MongoDB fixture scripts

    • Updated scripts to use current database connection (already connected via mongosh)
    • Better comments explaining script usage
    • Applied to all demo projects (Symfony 6, 7, 8)

[0.0.14] - 2026-01-20

Added

  • Pattern Matching Enhancement: PatternMatcher now supports multiple values with | (OR) operator

    • Allows matching multiple values in a single pattern (e.g., 'status' => 'inactive|unsubscribed')
    • Supports SQL LIKE patterns with % wildcard combined with OR operator
    • Useful for complex pattern matching scenarios
    • Example: includePatterns: ['email' => '%@test-domain.com|%@example.com|%@demo.local']
  • Demo: EmailSubscription Entity: New entity demonstrating comprehensive pattern-based anonymization

    • Shows how to anonymize emails based on domain patterns
    • Demonstrates conditional anonymization based on status
    • Includes ~50 fixture records covering all pattern combinations
    • Examples of all pattern types: domain matching, status-based conditions, date conditions
    • Applied to all demo projects (Symfony 6, 7, 8)
  • Demo: MongoDB Infrastructure: Added MongoDB support to all demo projects

    • MongoDB 7.0 service added to docker-compose.yml in all demos
    • Mongo Express added for MongoDB management (ports: 8088/8087/8086)
    • MongoDB connection variables (MONGODB_URL) configured
    • Entrypoint scripts updated to wait for MongoDB readiness
    • Sample document (UserActivity) prepared for when bundle supports MongoDB ODM
    • Dockerfiles updated with mongodb-tools
    • Healthchecks configured for MongoDB
    • MongoDB fixtures script (load-fixtures.js) loads 30 user activities automatically
    • MongoDB CRUD interface (/mongodb/user-activity) for viewing and managing documents
    • anonymized field added to MongoDB documents (similar to AnonymizableTrait in ORM entities)
    • Applied to all demo projects (Symfony 6, 7, 8)
  • Demo: SQLite Support: Added SQLite database support to all demo projects

    • SQLite connection configured in doctrine.yaml
    • File-based database at var/data/anonymize_demo.sqlite
    • pdo_sqlite extension added to Dockerfiles
    • Automatic setup in entrypoint scripts
    • Same entities and fixtures as MySQL/PostgreSQL
    • Applied to all demo projects (Symfony 6, 7, 8)

Fixed

  • Entity-Level Pattern Filtering: Fixed issue where entity-level includePatterns/excludePatterns were not applied

    • Patterns from #[Anonymize] attribute are now correctly applied before processing records
    • Ensures entities like Order and Customer filter records correctly based on entity-level patterns
    • Example: Order now correctly only processes records with status='completed' and id>5
  • Service Registration: Fixed CustomReferenceFaker service registration in demos

    • Now uses #[Autoconfigure(public: true)] attribute instead of explicit YAML configuration
    • More declarative and consistent with bundle patterns
    • Applied to all demo projects (Symfony 6, 7, 8)
  • EventDispatcher Injection: Fixed optional EventDispatcher injection compatibility

    • Changed from @?event_dispatcher to full interface name for better compatibility
    • Prevents configuration loading errors
  • SystemLog Fixtures: Added missing fixtures for SystemLog entity in all demo projects

    • Ensures SystemLog table exists and has data for anonymization testing
    • Applied to all demo projects (Symfony 6, 7, 8)

Improved

  • Demo Coverage: Enhanced demo fixtures with comprehensive test cases
    • EmailSubscription fixtures expanded to ~50 records
    • Covers all pattern combinations: domain matching, status conditions, with/without backup emails, with/without notes
    • All source types represented: website, newsletter, promotion, partner
    • Different date ranges for comprehensive testing

[0.0.13] - 2026-01-19

Added

  • Enhanced Existing Fakers: Improved IbanFaker, AgeFaker, NameFaker, and SurnameFaker

    • IbanFaker: Added valid and formatted options
    • AgeFaker: Added distribution (uniform/normal), mean, and std_dev options
    • NameFaker: Added gender (male/female/random) and locale_specific options
    • SurnameFaker: Added gender and locale_specific options for API consistency
    • All improvements backward compatible
  • New Fakers: Added 3 new faker types (Phase 2 - Data Preservation Strategies)

    • HashPreserveFaker: Deterministic anonymization using hash functions
      • Maintains referential integrity (same input → same output)
      • Options: algorithm (md5/sha1/sha256/sha512), salt, preserve_format, length
      • Use cases: When you need to maintain referential integrity
    • ShuffleFaker: Shuffle values within a column while maintaining distribution
      • Preserves statistical properties
      • Options: values (required), seed (for reproducibility), exclude
      • Use cases: When statistical properties must be preserved
    • ConstantFaker: Replace with constant value
      • Options: value (required, can be any type including null)
      • Use cases: Null out sensitive data or replace with fixed values
    • All new fakers registered in FakerType enum and FakerFactory
    • Total fakers available: 32 (29 from v0.0.12 + 3 new)
    • Comprehensive test coverage for all new fakers
  • Pre-flight Checks: Comprehensive validation before anonymization execution

    • Database connectivity validation
    • Entity existence validation
    • Column existence validation
    • Faker type and options validation
    • Pattern validation (include/exclude)
    • Clear error messages for all validation failures
    • Integrated in AnonymizeCommand before processing
    • New PreFlightCheckService for centralized validation
  • Progress Bars: Visual progress indicators for anonymization process

    • Real-time progress bars using Symfony Console ProgressBar
    • Shows percentage, elapsed time, and estimated time
    • Displays current status message
    • Updates every 1% of progress
    • Option --no-progress to disable progress bars
    • Compatible with --stats-only mode
    • Progress callback system in AnonymizeService
  • Enhanced Environment Protection: Improved safety checks

    • New EnvironmentProtectionService for comprehensive environment validation
    • Validates environment (dev/test only)
    • Validates debug mode
    • Validates configuration files (detects production config)
    • Validates bundle registration in bundles.php
    • Clear error messages with actionable guidance
    • Integrated in both AnonymizeCommand and GenerateAnonymizedColumnCommand
  • Debug and Verbose Modes: Enhanced output options

    • --verbose, -v: Increase verbosity of messages
    • --debug: Enable debug mode with detailed information
    • Shows detailed entity information in verbose mode
    • Shows property details, patterns, and options in debug mode
    • Shows pre-flight check information
    • Shows total records per table
    • Shows property statistics after processing
    • Compatible with Symfony Console verbosity system
  • Info Command: New command to display anonymizer information

    • nowo:anonymize:info: Display information about anonymizers
    • Shows location of each anonymizer (entity and property)
    • Shows configuration (faker type, options, patterns)
    • Shows execution order (based on weight)
    • Shows statistics about how many records will be anonymized
    • Options: --connection, --locale
  • Event System: Symfony events for extensibility

    • BeforeAnonymizeEvent: Dispatched before anonymization starts
    • AfterAnonymizeEvent: Dispatched after anonymization completes
    • BeforeEntityAnonymizeEvent: Dispatched before processing each entity
    • AfterEntityAnonymizeEvent: Dispatched after processing each entity
    • AnonymizePropertyEvent: Dispatched before anonymizing each property
    • Allows listeners to modify anonymized values or skip anonymization
    • Supports event listeners and subscribers
    • EventDispatcher is optional (works without it)
  • Demo Coverage: Complete faker examples in all demos

    • New SystemLog entity demonstrating all remaining fakers
    • Demonstrates: password, ip_address, mac_address, uuid, hash, coordinate, color, boolean, numeric, file, json, text, enum, country, language, hash_preserve, shuffle, constant
    • All 32 fakers now have examples in demos (100% coverage)
    • Updated in all demo projects (Symfony 6, 7, 8)

Improved

  • Services Configuration: Optimized services.yaml for better maintainability

    • Removed 32 redundant explicit alias definitions
    • Aliases now created automatically from #[AsAlias] attributes
    • Fakers without locale parameter use #[Autoconfigure(public: true)] attribute
    • Reduced YAML from 89 to 52 lines (35% reduction)
    • More declarative configuration in PHP classes
  • Demo Templates: Enhanced conditional display of anonymized column

    • Column anonymized now displayed conditionally in all list views
    • Only shown when column exists in database (checked via SchemaService)
    • Visual indicators: ✓ Yes (green) for anonymized, ✗ No (gray) for not anonymized
    • Updated in all 18 templates across Symfony 6, 7, and 8 demos
    • Prevents errors when column doesn't exist
  • Code Quality: Improved service registration

    • Fakers use #[Autoconfigure(public: true)] instead of YAML configuration
    • Configuration moved from YAML to PHP attributes (more maintainable)
    • Consistent pattern across all fakers
  • Command Options: Enhanced command-line interface

    • Better error messages and warnings
    • More informative output in verbose/debug modes
    • Improved user experience with progress indicators
  • Safety: Enhanced protection against accidental production execution

    • Multiple layers of environment validation
    • Configuration file validation
    • Clear warnings and error messages
  • Developer Experience: Better debugging and monitoring

    • Detailed information in debug mode
    • Progress tracking for long-running operations
    • Comprehensive validation feedback
  • Tests: Enhanced test coverage for improved fakers

    • 216 tests, 512 assertions - All passing
    • Comprehensive tests for all enhanced faker options

[0.0.12] - 2026-01-19

Added

  • New Fakers: Added 15 new faker types (Phase 1 completion - 100%)
    • Phase 1 continued (9 fakers): PasswordFaker, IpAddressFaker, MacAddressFaker, UuidFaker, HashFaker, CoordinateFaker, ColorFaker, BooleanFaker, NumericFaker
    • Phase 1 final (6 fakers): FileFaker, JsonFaker, TextFaker, EnumFaker, CountryFaker, LanguageFaker
    • All new fakers registered in FakerType enum and FakerFactory
    • Total fakers available: 29 (8 original + 21 new)
    • Phase 1 of roadmap: 100% complete (21/21 fakers implemented)
    • Comprehensive test coverage for all new fakers

Improved

  • EmailFaker: Enhanced with new options

    • domain: Custom domain option
    • format: 'name.surname' or 'random' format option
    • local_part_length: Control local part length
    • Backward compatible with existing usage
  • PhoneFaker: Enhanced with new options

    • country_code: Specific country code option (e.g., '+34')
    • format: 'international' or 'national' format option
    • include_extension: Include phone extension option
    • Backward compatible with existing usage
  • CreditCardFaker: Enhanced with new options

    • type: 'visa', 'mastercard', 'amex', or 'random' option
    • valid: Generate valid Luhn numbers option
    • formatted: Include spaces/dashes in card number option
    • Backward compatible with existing usage
  • Tests: Added comprehensive test suites for all new and enhanced fakers

    • 187 tests executed
    • 435 assertions
    • All tests pass
  • Documentation: Updated README, CONFIGURATION, ROADMAP, and UPGRADING guides

    • Phase 1 marked as 100% complete
    • All new fakers documented
    • Enhanced faker options documented
  • Service Registration: Fixed MaskingFaker service registration issue

[0.0.11] - 2026-01-19

Added

  • New Fakers: Added 6 new faker types (Phase 1 implementation)

    • AddressFaker: Generate anonymized street addresses with country, format, and postal code options
    • DateFaker: Generate anonymized dates with min/max date, format, and type (past/future/between) options
    • UsernameFaker: Generate anonymized usernames with length, prefix, suffix, and number options
    • UrlFaker: Generate anonymized URLs with scheme, domain, and path options
    • CompanyFaker: Generate anonymized company names with type (corporation/llc/inc) and suffix options
    • MaskingFaker: Partial masking of sensitive data with preserve_start, preserve_end, mask_char options
    • All new fakers registered in FakerType enum and FakerFactory
    • Total fakers available: 14 (8 original + 6 new)
  • Demo Enhancements: Added 4 new entities and fixtures

    • Product entity: Demonstrates name, url, date fakers (10 products)
    • Order entity: Demonstrates service, address, date, email fakers with patterns (13 orders)
    • Invoice entity: Demonstrates masking, company, iban, service fakers (8 invoices)
    • Employee entity: Demonstrates username, date, company fakers with exclusion patterns (12 employees)
    • All entities include AnonymizableTrait for anonymization tracking
    • Comprehensive fixtures with realistic test data
  • Custom Service Faker: Added example service in demos

    • CustomReferenceFaker: Example service implementing FakerInterface
    • Demonstrates how to create custom anonymizers
    • Used in Customer and Order entities
    • Available in all demo projects (Symfony 6, 7, 8)

Improved

  • Demo Projects: Synchronized all demo projects (Symfony 6, 7, 8)
    • Expanded fixtures: 20 users and 25 customers in all demos
    • Added 4 new entities (Product, Order, Invoice, Employee) with fixtures
    • Updated controllers to use SchemaService for anonymized column detection
    • Updated templates with anonymized column alerts and conditional display
    • Added underscore naming strategy to Doctrine configuration
    • Updated bundle version to v0.0.11 in all demos
    • Added complete CRUD interfaces for all entities (Product, Order, Invoice, Employee)
    • Updated navigation menu with all entities organized by categories
    • Added anonymization field alerts in all entity list views
    • Consistent functionality across all Symfony versions
    • Total entities in demos: 6 (User, Customer, Product, Order, Invoice, Employee)
    • Total fixtures in demos: 6 (UserFixtures, CustomerFixtures, ProductFixtures, OrderFixtures, InvoiceFixtures, EmployeeFixtures)

[0.0.10] - 2026-01-19

Fixed

  • Doctrine DBAL Compatibility: Replaced deprecated quoteIdentifier() with quoteSingleIdentifier()
    • Updated AnonymizeService to use quoteSingleIdentifier() (4 occurrences)
    • Updated GenerateAnonymizedColumnCommand to use quoteSingleIdentifier() (2 occurrences)
    • Updated demo controllers to use quoteSingleIdentifier() (4 occurrences)
    • Fixes deprecation warnings in Doctrine DBAL 3.x
    • Maintains backward compatibility with Doctrine DBAL 2.x

[0.0.9] - 2026-01-19

Fixed

  • AnonymizeService: Fixed quote() method to handle integer values

    • Convert values to string before quoting in UPDATE queries
    • Fixes error when anonymizing entities with integer IDs
    • Handles both ID columns and update values correctly
  • Demo PostgreSQL Compatibility: Fixed column name issues

    • Added explicit column names for PostgreSQL compatibility
    • Added underscore naming strategy to Doctrine configuration
    • Ensures consistent column naming across MySQL and PostgreSQL

Improved

  • Demo Fixtures: Expanded demo data for better testing
    • UserFixtures: Increased from 5 to 20 users
    • CustomerFixtures: Increased from 8 to 25 customers
    • Added edge cases: null optional fields, age limits (18, 100)
    • Better demonstration of inclusion/exclusion patterns
    • More diverse data scenarios for comprehensive testing

[0.0.8] - 2026-01-19

Fixed

  • GitHub Release Workflow: Fixed release creation to mark as latest
    • Added make_latest: !isPrerelease parameter to createRelease call
    • New releases are now automatically marked as latest
    • Ensures consistency between release creation and update workflows

Improved

  • Documentation: Enhanced upgrade guide
    • Added complete upgrade instructions for v0.0.7
    • Updated compatibility table with all versions
    • Improved documentation consistency

[0.0.7] - 2026-01-19

Added

  • SchemaService: New service for checking database schema information
    • hasAnonymizedColumn() method to check if anonymized column exists
    • hasColumn() generic method to check any column existence
    • Service is autowired and available for dependency injection
    • Comprehensive test coverage with 8 test cases

Changed

  • Demo Controllers: Refactored to use SchemaService
    • Removed duplicate hasAnonymizedColumn() method from controllers
    • Controllers now inject SchemaService via dependency injection
    • Improved code organization and reusability

Fixed

  • Demo Templates: All texts translated to English
    • Alert messages now in English
    • Consistent language across all demo templates

Improved

  • Documentation: Enhanced demo README with anonymized column tracking
    • Added information about AnonymizableTrait
    • Added instructions for generating migrations
    • Complete documentation of anonymized column feature

[0.0.6] - 2026-01-19

Fixed

  • Symfony 8 Compatibility: Fixed doctrine-bundle version constraint
    • Updated doctrine/doctrine-bundle constraint from ^2.8 to ^2.8 || ^3.0
    • Symfony 8 requires doctrine-bundle 3.x
    • Maintains backward compatibility with Symfony 6/7 (doctrine-bundle 2.x)
    • Demo projects updated to handle missing anonymized column gracefully
    • Controllers now check column existence before using it to prevent SQL errors

[0.0.5] - 2026-01-19

Changed

  • Doctrine Bundle Compatibility: Improved compatibility with Symfony 8

    • Updated doctrine/doctrine-bundle constraint from ^2.15 to ^2.8
    • Allows broader compatibility across Symfony 6, 7, and 8
    • Symfony Flex can now resolve compatible versions automatically
  • Demo Projects: Updated demo configurations

    • Symfony 8 demo now uses dev-main for bundle development
    • Improved dependency resolution for Symfony 8 compatibility
    • Removed explicit constraints that conflicted with Symfony 8

[0.0.4] - 2026-01-19

Added

  • Anonymized Column Tracking: Added functionality to track anonymization status in database
    • AnonymizableTrait: Trait that adds an anonymized boolean field to entities
    • nowo:anonymize:generate-column-migration command: Generates SQL migrations to add the anonymized column
    • AnonymizeService: Automatically sets anonymized = true when a record is anonymized
    • Automatic column detection: Checks if the anonymized column exists before updating
    • Demo examples: All demo entities (User, Customer) now use AnonymizableTrait

Changed

  • AnonymizeService: Enhanced to detect and update anonymized column
    • Checks if entity uses AnonymizableTrait before setting the flag
    • Verifies column existence in database schema before updating
    • Sets anonymized = true automatically during anonymization process

[0.0.3] - 2026-01-19

Added

  • Comprehensive Test Suite: Added unit tests for all Faker classes and services

    • Tests for EmailFaker, NameFaker, SurnameFaker, PhoneFaker, IbanFaker, CreditCardFaker
    • Tests for FakerFactory with all faker types
    • Tests for ServiceFaker with different service implementations
    • Comprehensive tests for PatternMatcher with all operators
    • Total: 51 tests with 119 assertions
  • Faker Services: Registered all fakers as Symfony services

    • All fakers are now singleton services with locale injection
    • Fakers can be injected directly where needed
    • Better integration with Symfony dependency injection
  • Service Aliases: Added #[AsAlias] attributes to all faker classes

    • Modern Symfony 6.3+ approach for service aliases
    • Aliases defined directly in classes
    • Cleaner services.yaml configuration
  • Demo Projects: Added WebProfilerBundle to all demo projects

    • Symfony WebProfilerBundle for development debugging
    • Available in dev and test environments

Changed

  • ContainerInterface Usage: Unified to PSR-11 standard

    • All services now use Psr\Container\ContainerInterface
    • Removed Symfony-specific ContainerInterface usage
    • More portable and standard-compliant
  • FakerFactory: Updated to use services from container

    • Tries to get fakers from service container first
    • Falls back to direct instantiation if container is not available
    • Uses alias IDs defined via #[AsAlias] attributes

Fixed

  • ServiceFaker Autowiring: Fixed autowiring error for ServiceFaker
    • Added #[Exclude] attribute to prevent automatic service registration
    • ServiceFaker is created dynamically by FakerFactory
    • Excluded from services.yaml resource registration

[0.0.2] - 2026-01-19

Fixed

  • Autowiring Configuration: Fixed ContainerInterface autowiring issue
    • Added alias for Symfony\Component\DependencyInjection\ContainerInterface to @service_container
    • Added alias for Psr\Container\ContainerInterface to @service_container
    • Optimized services configuration to use autowiring whenever possible
    • Removed manual service configuration in favor of autowiring

Changed

  • Services Configuration: Optimized services.yaml to maximize autowiring
    • Simplified service definitions
    • Removed unnecessary manual configurations
    • All services now use autowiring by default

[0.0.1] - 2026-01-19

Added

  • Initial Release: Complete database anonymization functionality for Symfony

    • Attribute-based entity and property configuration (#[Anonymize] and #[AnonymizeProperty])
    • Automatic entity discovery across multiple Doctrine connections
    • Support for multiple database types (MySQL, PostgreSQL)
    • Comprehensive Faker integration with custom types
    • Weight-based processing order
    • Pattern matching for selective anonymization
    • Statistics collection and reporting
    • Dry-run mode for safe testing
    • Development-only bundle with built-in environment protection
  • Bundle Structure:

    • Nowo\AnonymizeBundle namespace
    • Dependency injection configuration
    • Service definitions with autowiring
    • Console command for anonymization
    • Symfony Flex recipe for automatic setup
  • Attributes:

    • #[Anonymize] - Mark entities for anonymization
    • #[AnonymizeProperty] - Configure property anonymization with type, weight, and patterns
  • Faker Types:

    • EmailFaker - Generate anonymized email addresses
    • NameFaker - Generate anonymized first names
    • SurnameFaker - Generate anonymized last names
    • AgeFaker - Generate anonymized ages with configurable ranges
    • PhoneFaker - Generate anonymized phone numbers
    • IbanFaker - Generate anonymized IBAN codes
    • CreditCardFaker - Generate anonymized credit card numbers
    • ServiceFaker - Use custom services for anonymization
  • Services:

    • AnonymizeService - Core anonymization logic
    • PatternMatcher - Pattern matching for inclusion/exclusion
    • FakerFactory - Factory for creating faker instances
    • AnonymizeStatistics - Statistics collection and reporting
  • Commands:

    • nowo:anonymize:run - Main anonymization command with options:
      • --connection - Process specific connections
      • --dry-run - Test mode without making changes
      • --batch-size - Configure batch processing size
      • --locale - Set Faker locale
      • --stats-json - Export statistics to JSON
      • --stats-only - Show only statistics summary
  • Security Features:

    • Built-in environment validation (dev/test only)
    • Automatic command failure in production environments
    • Configuration file created in config/packages/dev/ by default
  • Demo Projects: Created three independent demo projects for different Symfony versions

    • symfony6 - Demo with Symfony 6.1+, MySQL and PostgreSQL connections
    • symfony7 - Demo with Symfony 7.0, MySQL and PostgreSQL connections
    • symfony8 - Demo with Symfony 8.0, MySQL and PostgreSQL connections
    • Each demo includes:
      • Docker Compose with both database types (MySQL and PostgreSQL)
      • Complete Symfony setup with Nginx and PHP-FPM
      • Example entities (User, Customer) with anonymization attributes
      • CRUD interfaces for managing entities
      • DoctrineFixturesBundle for loading sample data
      • phpMyAdmin and pgAdmin for database visualization
      • Makefile for easy management
      • Comprehensive documentation
  • Development Tools:

    • Docker setup for development
    • Makefile with common development commands
    • PHP-CS-Fixer configuration (PSR-12)
    • PHPUnit configuration with coverage
    • GitHub Actions CI/CD workflows (ci.yml, release.yml, sync-releases.yml)
  • Documentation:

    • Comprehensive README.md with usage examples
    • INSTALLATION.md guide
    • CONFIGURATION.md guide
    • CHANGELOG.md (this file)
    • UPGRADING.md guide
    • PHP Doc comments in English for all classes, methods, and properties
    • Demo project documentation

Changed

  • N/A - Initial release

Fixed

  • N/A - Initial release

Deprecated

  • N/A - Initial release

Removed

  • N/A - Initial release

Security

  • Development-Only Bundle: Bundle is restricted to dev/test environments only
    • Command automatically fails if executed in production
    • Bundle registration restricted to dev/test in Symfony Flex recipe
    • Configuration file created in config/packages/dev/ by default
    • All documentation includes security warnings