Skip to content

Commit 7526e85

Browse files
committed
Release v0.99.75
1 parent 0fdead5 commit 7526e85

File tree

1 file changed

+214
-0
lines changed

1 file changed

+214
-0
lines changed

CHANGELOG.md

Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,219 @@ The format is based on [Keep a Changelog][], and this project adheres to [Semant
1010
[Keep a Changelog]: https://keepachangelog.com/en/1.1.0/
1111
[Semantic Versioning]: https://semver.org/spec/v2.0.0.html
1212

13+
## [v0.99.75] - 2025-02-22
14+
15+
Achieved with the changes detailed below:
16+
17+
- Completion of `Core` API review
18+
- Cleaner access to constants via classes that implement their interfaces
19+
- Progress towards decoupling the `Core` component from `Container`
20+
- Progress towards rewritten "sli generate" commands
21+
22+
### Added
23+
24+
#### `Core`
25+
26+
- Add `Serializable` interface
27+
- Add, implement and adopt `InvalidDataException`
28+
- Add, implement and adopt `EventDispatcherInterface` and `EventListenerProviderInterface`
29+
- Add `Builder::getStaticConstructor()` to allow use of a static method for instantiation instead of the constructor
30+
- Add `MetricCollector::getMaxTimers()` to provide maximum number of timers running simultaneously per group
31+
32+
#### `Utility`
33+
34+
- Add `File::eof()` and `File::select()`
35+
- Add `File::getIndentation()`
36+
- Add `Inflect::list()`, with optional Oxford comma support
37+
- Add `Reflect::getDeclaring()`, `Reflect::getFileName()` and `getNamespaceName()`
38+
39+
### Changed
40+
41+
- Rename exception interfaces to reduce verbosity
42+
- Move `Indentation` to `Salient\Utility\Support`
43+
- Move `MimeType` to `Salient\Contract\Http`
44+
- Move `SqlQuery` to `Salient\Db`
45+
46+
#### `Cache`
47+
48+
- Treat `DateInterval` TTLs like integers, i.e. delete the item if TTL is <= 0 seconds
49+
50+
#### `Console`
51+
52+
- Rename:
53+
- `ConsoleWriterInterface` -> `ConsoleInterface`
54+
- `ConsoleWriter` -> `Console`
55+
- `ConsoleMessageType` -> `HasMessageType`
56+
- `ConsoleMessageTypeGroup` -> `HasMessageTypes`
57+
- Implement `HasMessageLevel`, `HasMessageLevels`, `HasMessageType` and `HasMessageTypes` from the `Console` facade
58+
59+
#### `Core`
60+
61+
- Rename:
62+
- `AbstractBuilder` -> `Builder`
63+
- `AbstractFacade` -> `Facade` and move to `Salient\Core\Facade`
64+
- `AbstractStore` -> `Store`
65+
- `AbstractStreamWrapper` -> `StreamWrapper`
66+
- `AbstractException` -> `Exception` and move to `Salient\Core\Exception`
67+
- `AbstractMultipleErrorException` -> `MultipleErrorException` and move to `Salient\Core\Exception`
68+
- `HasBuilder` -> `BuildableTrait`
69+
- `HasChainableMethods` -> `ChainableTrait`
70+
- `HasFacade` -> `FacadeAwareInstanceTrait`
71+
- `HasMutator` -> `ImmutableTrait`
72+
- `HasNormaliser` -> `NormalisableTrait`
73+
- `HasReadableProperties` -> `ReadableTrait`
74+
- `HasWritableProperties` -> `WritableTrait`
75+
- `JsonSchemaInterface` -> `HasJsonSchema`
76+
- `Process` methods:
77+
- `getText()` -> `getOutputAsText()`
78+
- `getNewText()` -> `getNewOutputAsText()`
79+
- `ProvidableEntityInterface` -> `ProviderEntityInterface` and move to `Salient\Core\Entity`
80+
- `ReadsProtectedProperties` -> `ReadableProtectedPropertiesTrait`
81+
- `SerializeRulesInterface` methods:
82+
- `getIncludeMeta()` -> `getDynamicProperties()`
83+
- `withIncludeMeta()` -> `withDynamicProperties()`
84+
- `UnloadsFacades` -> `FacadeAwareTrait`
85+
- Rename, move to `Salient\Contract` and update constants:
86+
- `EscapeSequence` -> `HasEscapeSequence`
87+
- `FileDescriptor` -> `HasFileDescriptor`
88+
- `ListConformity` -> `HasConformity`
89+
- `MessageLevel` -> `HasMessageLevel`
90+
- `MessageLevelGroup` -> `HasMessageLevels`
91+
- `TextComparisonAlgorithm` -> `HasTextComparisonFlag`
92+
- `TextComparisonFlag` -> `HasTextComparisonFlag`
93+
- Move:
94+
- `StoppableEventInterface` -> `Salient\Contract\Core\Event`
95+
- `EventDispatcher` -> `Salient\Core\Event`
96+
- `StoppableEventTrait` -> `Salient\Core\Event`
97+
- `FacadeInterface` -> `Salient\Contract\Core\Facade`
98+
- `FacadeAwareInterface` -> `Salient\Contract\Core\Facade`
99+
- `ArrayMapperInterface` -> `Salient\Contract\Core\Pipeline`
100+
- `DateFormatter` -> `Salient\Core\Date`
101+
- `DateFormatParser` -> `Salient\Core\Date`
102+
- `DateParser` -> `Salient\Core\Date`
103+
- `DotNetDateParser` -> `Salient\Core\Date`
104+
- `Providable` -> `Salient\Core\Entity`
105+
- `SerializeRulesInterface` -> `Salient\Core\Entity`
106+
- `ExceptionTrait` -> `Salient\Core\Exception`
107+
- `MultipleErrorExceptionTrait` -> `Salient\Core\Exception`
108+
- `AbstractEntity` -> `Salient\Core\Provider`
109+
- `AbstractProvider` -> `Salient\Core\Provider`
110+
- `ProviderContext` -> `Salient\Core\Provider`
111+
- Don't accept a container when creating a builder (builders are tightly coupled with constructors, so no container is needed)
112+
- In `Facade`, only use `Container` if it is defined
113+
- Detect date properties and parameters via native type hints even if `Temporal` is not implemented
114+
- Refactor `Facade::getService()` for simplicity
115+
- Narrow `Hierarchical` return types to `$this` as needed
116+
- Refactor `Normalisable::normaliseProperty()` for clarity
117+
- Make `$context` a required parameter of `Providable` methods `provide()` and `provideMultiple()` and remove `$provider` accordingly
118+
- Refactor `Providable::provideMultiple()` for consistency with `Constructible`
119+
- Improve uninitialised property handling in `TreeableTrait`
120+
- Replace `ConfigurationManager::getMany()` with `getMultiple()`
121+
- Extend `DateParserInterface` from `DateFormatterInterface`
122+
- In `DateParserInterface::parse()`, specify that `$timezone` is ignored if `$value` has a timezone and update implementations accordingly
123+
- Deregister `ErrorHandler` when the facade it's running behind is unloaded
124+
- In `MultipleErrorException`:
125+
- Rename `getMessageWithoutErrors()` to `getMessageOnly()`
126+
- Add `$console` parameter to `reportErrors()`
127+
- In `Process`:
128+
- Improve robustness of stream handling
129+
- Always throw `ProcessTerminatedBySignalException` when a process is killed, not just when `wait()` is called
130+
- Add and throw `ProcessDidNotTerminateException`
131+
- Do not throw `ProcessException` for stream-related errors
132+
- Add `ClassReflection` and adopt instead of `Introspector` and `IntrospectionClass` where possible
133+
- Fix issue where reserved properties are ignored when getting "magic" properties
134+
- Fix issue where properties with asymmetric handling are not serialized, e.g. when a protected property is read via `__get()` and written via `_setMyProperty()`
135+
- Do not allow multiple properties or "magic" property methods to resolve to the same name after normalisation
136+
- Do not allow dynamic property properties to be serviced by "magic" property methods
137+
- Do not allow `Treeable` classes to return invalid parent/children properties
138+
139+
#### `PHPDoc`
140+
141+
- Collect and propagate context data to allow expansion of relative class types like `static`, `$this` and `self`
142+
143+
#### `PHPStan`
144+
145+
- Preserve key types when `$preserveKeys = true` is passed to `Arr::flatten()`
146+
- Handle optional keys in arrays passed to `Arr::flatten()`
147+
148+
#### `Sli`
149+
150+
- Refactor "generate facade" command
151+
- Add new options:
152+
- `--implement <interface>`
153+
- `--skip-deprecated` (previous behaviour was to skip deprecated methods unconditionally)
154+
- Exclude `@internal` methods from facades
155+
- Build out PHPDoc tag handling and other abstractions in `AbstractGenerateCommand`
156+
157+
#### `Sync`
158+
159+
- Extend `ClassReflection` from `Reflection` classes
160+
- Rename `Reflection` classes for consistency
161+
- Refactor `SyncSerializeRulesInterface` for consistency with `SerializeRulesInterface`
162+
- Rename `SyncSerializeRulesInterface` methods:
163+
- `getIncludeCanonicalId()` -> `getCanonicalId()`
164+
- `withIncludeCanonicalId()` -> `withCanonicalId()`
165+
- Rename `SyncSerializeRulesBuilder` methods:
166+
- `includeMeta()` -> `dynamicProperties()`
167+
- `includeCanonicalId()` -> `canonicalId()`
168+
- Do not extend `AbstractEntity` from `AbstractSyncEntity`
169+
- Remove `Temporal` from `SyncEntityInterface` and implement it in `AbstractSyncEntity`
170+
- Refactor `SyncEntityProviderInterface::getResolver()` and downstream implementations
171+
- Accept closures for `$nameProperty` and `$weightProperty`
172+
- Require `$nameProperty` closures to return `string`
173+
- Handle uninitialised properties and invalid values gracefully
174+
175+
#### `Utility`
176+
177+
- Optionally preserve keys in `Arr::pluck()`, `Arr::flatten()` and `Reflect::getNames()`
178+
- In `Test::isBuiltinType()`, optionally exclude relative class types and/or the `resource` type, and remove soft-reserved types `enum` and `numeric` entirely
179+
180+
### Removed
181+
182+
#### `Core`
183+
184+
- Remove `getB()`, `issetB()`, `unsetB()` from `BuilderInterface` (implementation details are not needed in the contract)
185+
- Remove unused `Exception::withExitStatus()` method
186+
- Remove `MultipleErrorExceptionTrait::getMetadata()` to prevent errors being reported twice
187+
- Remove `GraphInterface` from API
188+
- Remove `NormaliserFlag`
189+
- Remove unused `PipeInterface` and related code
190+
- Remove unused `Process::isTerminatedBySignal()`
191+
- Remove unused `WritesProtectedProperties` trait
192+
- Remove date formatter caching from `AbstractProvider`
193+
- Remove `final` from `AbstractProvider::getDateFormatter()` and replace with a default implementation
194+
- Deprecate `AbstractProvider::createDateFormatter()` and make it `final` to force downstream implementation updates
195+
196+
#### `PHPDoc`
197+
198+
- Remove `$trackInheritance` parameter from `PHPDoc::forClass()`
199+
200+
#### `Sli`
201+
202+
- Remove support for setting properties via generated builders
203+
204+
#### `Utility`
205+
206+
- Remove `Indentation::from()` (replaced with `File::getIndentation()`)
207+
208+
### Fixed
209+
210+
#### `Core`
211+
212+
- Fix issue where a deregistered `ErrorHandler` cannot be re-registered and may still report errors on shutdown
213+
- Fix issue where multiple calls to `ErrorHandler::deregister()` may remove other error/exception handlers
214+
- Fix issue where timeout behaviour may be incorrect after calling `Process::setTimeout()`
215+
216+
#### `PHPDoc`
217+
218+
- Do not inherit DocBlocks from private members of inherited classes
219+
- Fix issue where empty template maps are needlessly inherited
220+
221+
#### `Utility`
222+
223+
- Fix `Date::maybeSetTimezone()` issue where `+00:00`, the timezone applied when timestamps are parsed, is not handled correctly
224+
- Add missing `int<1,max>` type to tab size in `Indentation`
225+
13226
## [v0.99.74] - 2025-01-29
14227

15228
### Fixed
@@ -4436,6 +4649,7 @@ This is the final release of `lkrms/util`. It is moving to [Salient](https://git
44364649

44374650
- Allow `CliOption` value names to contain arbitrary characters
44384651

4652+
[v0.99.75]: https://github.com/salient-labs/toolkit/compare/v0.99.74...v0.99.75
44394653
[v0.99.74]: https://github.com/salient-labs/toolkit/compare/v0.99.73...v0.99.74
44404654
[v0.99.73]: https://github.com/salient-labs/toolkit/compare/v0.99.72...v0.99.73
44414655
[v0.99.72]: https://github.com/salient-labs/toolkit/compare/v0.99.71...v0.99.72

0 commit comments

Comments
 (0)