Skip to content

Commit adf088c

Browse files
authored
Merge pull request #9 from cspray/task/remove-initializer
Remove Initializer, rename get/set methods
2 parents 015c6e4 + 45e3ae4 commit adf088c

20 files changed

+65
-82
lines changed

.github/workflows/testing.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ name: 'Unit Tests & Static Analysis'
22

33
on:
44
push:
5-
branches: [ main ]
5+
branches: [ release-1.x, release-2.x ]
66
pull_request:
7-
branches: [ main ]
7+
branches: [ release-1.x, release-2.x ]
88

99
jobs:
1010
continuous-integration:

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.phpunit.cache
22
.phpunit.result.cache
3+
architectural-decisions.xml.bak
34
vendor/

README.md

+5-4
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,19 @@ namespace Acme\ArchitecturalDecisions;
3939
use Cspray\ArchitecturalDecision\DecisionStatus;
4040
use Cspray\ArchitecturalDecision\DocBlockArchitecturalDecision;
4141
use Attribute;
42+
use DateTimeImmutable;
4243

4344
/**
4445
* Explain the decision and its potential business impact.
4546
*/
4647
#[Attribute]
4748
final class MyFirstDecision extends DocBlockArchitecturalDecision {
4849

49-
public function getDate() : string {
50-
return '2022-07-19';
50+
public function date() : DateTimeImmutable {
51+
return new DateTimeImmutable('2022-07-19');
5152
}
5253

53-
public function getStatus() : string|DecisionStatus {
54+
public function status() : string|DecisionStatus {
5455
return DecisionStatus::Draft;
5556
}
5657

@@ -67,7 +68,7 @@ If successful a file named `architectural-decisions.xml` will be generated and s
6768

6869
### Setting Custom Meta Data
6970

70-
There might be additional information you'd like to include with an ArchitecturalDecisionRecord that doesn't fit into the contents of the decision. Perhaps it is additional data that can be used with static analysis. Perhaps you like to include information about who authored the decision or some other meta-data. You can implement the `ArchitecturalDecisionRecord::setMetaData(DOMElement $meta)` method to add whatever data you'd like to the generated XML document. Please review the [DOMDocument]() documentation for how to appropriately add elements and attribute to the `<meta>` element.
71+
There might be additional information you'd like to include with an ArchitecturalDecisionRecord that doesn't fit into the contents of the decision. Perhaps it is additional data that can be used with static analysis. Perhaps you like to include information about who authored the decision or some other meta-data. You can implement the `ArchitecturalDecisionRecord::setMetaData(DOMElement $meta)` method to add whatever data you'd like to the generated XML document. Please review the [DOMDocument](https://www.php.net/domdocument) documentation for how to appropriately add elements and attribute to the `<meta>` element.
7172

7273
## Example XML Document
7374

bin/architectural-decisions

+4-17
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
use Cspray\AnnotatedTarget\PhpParserAnnotatedTargetParser;
55
use Cspray\ArchitecturalDecision\ArchitecturalDecisionAttributeGatherer;
6-
use Cspray\ArchitecturalDecision\Initializer;
76
use Cspray\ArchitecturalDecision\SourceArchitecturalDecisionAttributeRegistry;
87
use Cspray\ArchitecturalDecision\XmlDocumentGenerator;
98

@@ -35,25 +34,13 @@ foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($composerDirs)
3534
$paths[] = $rootDir . '/' . $composerDir;
3635
}
3736

38-
$initializers = $composer['extra']['$architecturalDecision']['initializers'] ?? [];
37+
$additionalScanPaths = $composer['extra']['$architecturalDecision']['additionalScanPaths'] ?? [];
3938

40-
foreach ($initializers as $initializerClass) {
41-
$initializerClass = (string) $initializerClass;
42-
if (!class_exists($initializerClass)) {
43-
echo 'Your configured initializer ' . $initializerClass . ' is not an autoloadable class.';
44-
exit(255);
45-
}
46-
47-
if (!is_subclass_of($initializerClass, Initializer::class)) {
48-
echo 'Your configured initializer ' . $initializerClass . ' MUST extend ' . Initializer::class;
49-
exit(255);
50-
}
51-
52-
$initializer = new $initializerClass();
53-
$paths = [...$paths, ...$initializer->getAdditionalScanPaths()];
39+
foreach ($additionalScanPaths as $additionalScanPath) {
40+
$paths[] = $rootDir . '/' . $additionalScanPath;
5441
}
5542

56-
$attributes = (new SourceArchitecturalDecisionAttributeRegistry($paths))->getArchitecturalDecisionAttributes();
43+
$attributes = (new SourceArchitecturalDecisionAttributeRegistry($paths))->architecturalDecisionAttributes();
5744
if (count($attributes) === 0) {
5845
echo 'You must implement an ArchitecturalDecisionRecord in your codebase before running this command!';
5946
exit(255);

src/ArchitecturalDecisionAttributeGatherer.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function __construct(private readonly AnnotatedTargetParser $annotatedTar
2121
/**
2222
* @return list<ObjectType>
2323
*/
24-
public function getRegisteredAttributes() : array {
24+
public function registeredAttributes() : array {
2525
return $this->attributeTypes;
2626
}
2727

src/ArchitecturalDecisionAttributeRegistry.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ interface ArchitecturalDecisionAttributeRegistry {
99
/**
1010
* @return list<ObjectType>
1111
*/
12-
public function getArchitecturalDecisionAttributes() : array;
12+
public function architecturalDecisionAttributes() : array;
1313

1414
}

src/ArchitecturalDecisionRecord.php

+6-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Cspray\ArchitecturalDecision\ArchitecturalDecisionRecords\ExplicitArchitecturalDecisionStatus;
66
use Cspray\ArchitecturalDecision\ArchitecturalDecisionRecords\PreferCustomArchitecturalDecisionOverGeneric;
77
use Cspray\ArchitecturalDecision\ArchitecturalDecisionRecords\UsingAttributesForArchitecturalDecisions;
8+
use DateTimeImmutable;
89
use DOMElement;
910

1011
#[ExplicitArchitecturalDecisionStatus]
@@ -14,14 +15,14 @@ interface ArchitecturalDecisionRecord {
1415

1516
const SCHEMA = 'https://architectural-decision.cspray.io/schema/architectural-decision.xsd';
1617

17-
public function getId() : string;
18+
public function id() : string;
1819

19-
public function getDate() : string;
20+
public function date() : DateTimeImmutable;
2021

21-
public function getStatus() : string|DecisionStatus;
22+
public function status() : string|DecisionStatus;
2223

23-
public function getContents() : string;
24+
public function contents() : string;
2425

25-
public function setMetaData(DOMElement $meta) : void;
26+
public function addMetaData(DOMElement $meta) : void;
2627

2728
}

src/ArchitecturalDecisionRecords/ExplicitArchitecturalDecisionStatus.php

+5-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use Attribute;
66
use Cspray\ArchitecturalDecision\DecisionStatus;
77
use Cspray\ArchitecturalDecision\DocBlockArchitecturalDecision;
8+
use DateTimeImmutable;
9+
use DateTimeZone;
810

911
/**
1012
* # Explicit Architectural Decision Status
@@ -37,11 +39,11 @@
3739
#[Attribute(Attribute::TARGET_CLASS)]
3840
final class ExplicitArchitecturalDecisionStatus extends DocBlockArchitecturalDecision {
3941

40-
public function getDate() : string {
41-
return '2022-07-19';
42+
public function date() : DateTimeImmutable {
43+
return new DateTimeImmutable('2022-07-19', new DateTimeZone('America/New_York'));
4244
}
4345

44-
public function getStatus() : DecisionStatus {
46+
public function status() : DecisionStatus {
4547
return DecisionStatus::Accepted;
4648
}
4749
}

src/ArchitecturalDecisionRecords/PreferCustomArchitecturalDecisionOverGeneric.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Attribute;
66
use Cspray\ArchitecturalDecision\DecisionStatus;
77
use Cspray\ArchitecturalDecision\DocBlockArchitecturalDecision;
8+
use DateTimeImmutable;
89

910
/**
1011
* # Prefer Custom ArchitecturalDecisionRecord Over Generic
@@ -85,11 +86,11 @@
8586
#[Attribute(Attribute::TARGET_CLASS)]
8687
final class PreferCustomArchitecturalDecisionOverGeneric extends DocBlockArchitecturalDecision {
8788

88-
public function getDate() : string {
89-
return '2022-07-19';
89+
public function date() : DateTimeImmutable {
90+
return new DateTimeImmutable('2022-07-19', new \DateTimeZone('America/New_York'));
9091
}
9192

92-
public function getStatus() : DecisionStatus {
93+
public function status() : DecisionStatus {
9394
return DecisionStatus::Accepted;
9495
}
9596
}

src/ArchitecturalDecisionRecords/UsingAttributesForArchitecturalDecisions.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Attribute;
66
use Cspray\ArchitecturalDecision\DecisionStatus;
77
use Cspray\ArchitecturalDecision\DocBlockArchitecturalDecision;
8+
use DateTimeImmutable;
89

910
/**
1011
* # Use Attributes for Architectural Decisions
@@ -15,11 +16,11 @@
1516
*/
1617
#[Attribute(Attribute::TARGET_ALL)]
1718
final class UsingAttributesForArchitecturalDecisions extends DocBlockArchitecturalDecision {
18-
public function getDate() : string {
19-
return '2022-07-19';
19+
public function date() : DateTimeImmutable {
20+
return new DateTimeImmutable('2022-07-19', new \DateTimeZone('America/New_York'));
2021
}
2122

22-
public function getStatus() : DecisionStatus {
23+
public function status() : DecisionStatus {
2324
return DecisionStatus::Accepted;
2425
}
2526
}

src/DocBlockArchitecturalDecision.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ abstract class DocBlockArchitecturalDecision implements ArchitecturalDecisionRec
99

1010
private ?string $contents = null;
1111

12-
public function getId() : string {
12+
public function id() : string {
1313
$parts = explode('\\', static::class);
1414
return array_pop($parts);
1515
}
1616

17-
final public function getContents() : string {
17+
final public function contents() : string {
1818
if (!isset($this->contents)) {
1919
$reflection = new \ReflectionClass(static::class);
2020
$content = $reflection->getDocComment();
@@ -37,7 +37,7 @@ final public function getContents() : string {
3737
return $this->contents;
3838
}
3939

40-
public function setMetaData(DOMElement $meta) : void {
40+
public function addMetaData(DOMElement $meta) : void {
4141
// noop, override to set your custom meta data
4242
}
4343
}

src/Initializer.php

-14
This file was deleted.

src/SourceArchitecturalDecisionAttributeRegistry.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public function __construct(
2626
$this->parser = (new ParserFactory())->createForNewestSupportedVersion();
2727
}
2828

29-
public function getArchitecturalDecisionAttributes() : array {
29+
public function architecturalDecisionAttributes() : array {
3030
$gatherer = new class extends NodeVisitorAbstract {
3131

3232
/**

src/XmlDocumentGenerator.php

+6-6
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public function generateDocument(string $file, array $scanDirs) : void {
2525
/** @var array<class-string, array{attribute: ArchitecturalDecisionRecord, targets: list<AnnotatedTarget>}> $decisionAnnotations */
2626
$decisionAnnotations = [];
2727

28-
foreach ($this->gatherer->getRegisteredAttributes() as $attributeType) {
28+
foreach ($this->gatherer->registeredAttributes() as $attributeType) {
2929
/** @psalm-var class-string $type */
3030
$type = $attributeType->getName();
3131
$decisionAnnotations[$type] = [
@@ -55,14 +55,14 @@ public function generateDocument(string $file, array $scanDirs) : void {
5555
$decisionElement = $dom->createElementNS(ArchitecturalDecisionRecord::SCHEMA, 'architecturalDecision')
5656
);
5757

58-
$decisionElement->setAttribute('id', $attribute->getId());
58+
$decisionElement->setAttribute('id', $attribute->id());
5959
$decisionElement->setAttribute('attribute', $attribute::class);
6060

6161
$decisionElement->appendChild(
62-
$dom->createElementNS(ArchitecturalDecisionRecord::SCHEMA, 'date', $attribute->getDate())
62+
$dom->createElementNS(ArchitecturalDecisionRecord::SCHEMA, 'date', $attribute->date()->format('Y-m-d'))
6363
);
6464

65-
$status = $attribute->getStatus();
65+
$status = $attribute->status();
6666
if ($status instanceof DecisionStatus) {
6767
$status = $status->value;
6868
}
@@ -75,7 +75,7 @@ public function generateDocument(string $file, array $scanDirs) : void {
7575
);
7676

7777
$contentsNode->appendChild(
78-
$contentsNode->ownerDocument->createCDATASection($attribute->getContents())
78+
$contentsNode->ownerDocument->createCDATASection($attribute->contents())
7979
);
8080

8181
if ($decisionAnnotation['targets'] !== []) {
@@ -158,7 +158,7 @@ public function generateDocument(string $file, array $scanDirs) : void {
158158
$meta = $dom->createElementNS(ArchitecturalDecisionRecord::SCHEMA, 'meta')
159159
);
160160

161-
$attribute->setMetaData($meta);
161+
$attribute->addMetaData($meta);
162162
}
163163

164164
$dom->schemaValidate(dirname(__DIR__) . '/architectural-decision.xsd');

tests/DocBlockArchitecturalDecisionTest.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ public function testGetContentsReturnsDocBlock() : void {
2424
displayed in the CLI tool explaining the reason for the Architectural Decision.
2525
DOC;
2626

27-
self::assertSame($expected, $subject->getContents());
27+
self::assertSame($expected, $subject->contents());
2828
}
2929

3030
public function testGetTitleReturnsConstructorArgument() : void {
3131
$subject = new StubDocBlockArchitecturalDecision();
3232

33-
self::assertSame('stub-attr-id', $subject->getId());
33+
self::assertSame('stub-attr-id', $subject->id());
3434
}
3535

3636
public function testGetContentsMissingDocBlockThrowsException() : void {
@@ -39,7 +39,7 @@ public function testGetContentsMissingDocBlockThrowsException() : void {
3939
self::expectException(MissingDocBlock::class);
4040
self::expectExceptionMessage('Expected to find a DocBlock associated with ' . MissingDocBlockArchitecturalDecision::class);
4141

42-
$subject->getContents();
42+
$subject->contents();
4343
}
4444

4545
}

tests/SourceArchitecturalDecisionAttributeRegistryTest.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ final class SourceArchitecturalDecisionAttributeRegistryTest extends TestCase {
1818
public function testSourceDirectoryContainsAttributes() : void {
1919
$subject = new SourceArchitecturalDecisionAttributeRegistry([__DIR__]);
2020

21-
$attributes = $subject->getArchitecturalDecisionAttributes();
21+
$attributes = $subject->architecturalDecisionAttributes();
2222

2323
self::assertCount(4, $attributes);
2424

tests/Stub/Adr/AnotherDocBlockArchitecturalDecision.php

+5-4
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,23 @@
44

55
use Attribute;
66
use Cspray\ArchitecturalDecision\DocBlockArchitecturalDecision;
7+
use DateTimeImmutable;
78

89
/**
910
* Another doc block.
1011
*/
1112
#[Attribute(Attribute::TARGET_ALL)]
1213
final class AnotherDocBlockArchitecturalDecision extends DocBlockArchitecturalDecision {
1314

14-
public function getId() : string {
15+
public function id() : string {
1516
return 'Another DocBlock';
1617
}
1718

18-
public function getDate() : string {
19-
return '1984-01-01';
19+
public function date() : DateTimeImmutable {
20+
return new DateTimeImmutable('1984-01-01', new \DateTimeZone('America/New_York'));
2021
}
2122

22-
public function getStatus() : string {
23+
public function status() : string {
2324
return 'Draft';
2425
}
2526
}

tests/Stub/Adr/StubDocBlockArchitecturalDecision.php

+4-4
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@
1515
#[Attribute(Attribute::TARGET_ALL)]
1616
final class StubDocBlockArchitecturalDecision extends DocBlockArchitecturalDecision {
1717

18-
public function getId() : string {
18+
public function id() : string {
1919
return 'stub-attr-id';
2020
}
2121

22-
public function getDate() : string {
23-
return '2022-01-01';
22+
public function date() : \DateTimeImmutable {
23+
return new \DateTimeImmutable('2022-01-01', new \DateTimeZone('America/New_York'));
2424
}
2525

26-
public function getStatus() : DecisionStatus {
26+
public function status() : DecisionStatus {
2727
return DecisionStatus::Accepted;
2828
}
2929
}

0 commit comments

Comments
 (0)