<commit_before>Containers:
===========

Consider a syntax such as:

```php
Check::that($container)->contains([
    'foo' => 'isArray',
    'foo/bar' => 'isString',
    'foo/baz' => 'optional & isUuid',
]);
```

```php
Check::that($container, $value)->contains([
    'foo' => $value->isArray(),
    'foo/bar' => $value->isString(),
    'foo/baz' => $value->isOptional()->isUuid()
]);
```

Templates:
==========
Maybe merge Template and AssertionBag.
Maybe refactor Template:
    Maybe rename
    Maybe inherit from AssertionBag instead of composition

Tests:
======

Add tests for Str class
Add tests for Size class
Add tests for Date class


StatInfo:
=========

File.php should have an stat() function that can be overridden so we
do not have to monkey patch.
<commit_msg>TODO stuff<commit_after>Containers:
===========

Consider a syntax such as:

```php
Check::that($container)->contains([
    'foo' => 'isArray',
    'foo/bar' => 'isString',
    'foo/baz' => 'optional & isUuid',
]);
```

```php
Check::that($container, $value)->contains([
    'foo' => $value->isArray(),
    'foo/bar' => $value->isString(),
    'foo/baz' => $value->isOptional()->isUuid()
]);
```

Templates:
==========
Maybe merge Template and AssertionBag.
Maybe refactor Template:
    Maybe rename
    Maybe inherit from AssertionBag instead of composition

Tests:
======

Add tests for Str class
Add tests for Size class
Add tests for Date class


StatInfo:
=========

File.php should have an stat() function that can be overridden so we
do not have to monkey patch.
We should consider using SplFileInfo to store and transmit file objects.
We could ue a FakeFileInfo object when overriding File Infos.

Possible implementation:

```php

$fake = new FakeFileInfo();
$fake->accessedAt(new DateTime('now'))
     ->modifiedAt(new DateTime('2 days ago'))
     ->createdAt(new DateTime('4 days ago'))
     ->withSize(12312412);

File::override('fooFile', $fake);

expect(File::size('fooFile'))->toBe(12312412);
```

{'fraction_non_alphanumeric': 0.181360201511335, 'fraction_numerical': 0.00906801007556675, 'mean_word_length': 4.456043956043956, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 32, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3758779', 'n_tokens_mistral': 649, 'n_tokens_neox': 606, 'n_words': 196}