Skip to content

Commit 103c35c

Browse files
committed
Refactor metadata links again? templol
1 parent 1129a3f commit 103c35c

File tree

11 files changed

+142
-136
lines changed

11 files changed

+142
-136
lines changed

src/Doctrine/Entity/AbstractMetadataLink.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace CodedMonkey\Dirigent\Doctrine\Entity;
44

5+
use CodedMonkey\Dirigent\Entity\MetadataLinkType;
56
use Doctrine\DBAL\Types\Types;
67
use Doctrine\ORM\Mapping as ORM;
78

@@ -38,8 +39,6 @@ public function __construct(
3839
$this->addToCollection();
3940
}
4041

41-
abstract protected function addToCollection(): void;
42-
4342
public function getId(): ?int
4443
{
4544
return $this->id;
@@ -64,4 +63,10 @@ public function getIndex(): int
6463
{
6564
return $this->index;
6665
}
66+
67+
private function addToCollection(): void
68+
{
69+
$linkType = MetadataLinkType::fromClass(static::class);
70+
$linkType->getMetadataLinks($this->metadata)->add($this);
71+
}
6772
}

src/Doctrine/Entity/Metadata.php

Lines changed: 28 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace CodedMonkey\Dirigent\Doctrine\Entity;
44

55
use CodedMonkey\Dirigent\Doctrine\Repository\MetadataRepository;
6+
use CodedMonkey\Dirigent\Entity\MetadataLinkType;
67
use Composer\Package\Version\VersionParser;
78
use Composer\Pcre\Preg;
89
use Doctrine\Common\Collections\ArrayCollection;
@@ -101,42 +102,42 @@ class Metadata extends TrackedEntity implements \Stringable
101102
*/
102103
#[ORM\OneToMany(targetEntity: MetadataRequireLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
103104
#[ORM\OrderBy(['index' => 'ASC'])]
104-
private Collection $require;
105+
private Collection $requireLinks;
105106

106107
/**
107108
* @var Collection<int, MetadataDevRequireLink>
108109
*/
109110
#[ORM\OneToMany(targetEntity: MetadataDevRequireLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
110111
#[ORM\OrderBy(['index' => 'ASC'])]
111-
private Collection $devRequire;
112+
private Collection $devRequireLinks;
112113

113114
/**
114115
* @var Collection<int, MetadataConflictLink>
115116
*/
116117
#[ORM\OneToMany(targetEntity: MetadataConflictLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
117118
#[ORM\OrderBy(['index' => 'ASC'])]
118-
private Collection $conflict;
119+
private Collection $conflictLinks;
119120

120121
/**
121122
* @var Collection<int, MetadataProvideLink>
122123
*/
123124
#[ORM\OneToMany(targetEntity: MetadataProvideLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
124125
#[ORM\OrderBy(['index' => 'ASC'])]
125-
private Collection $provide;
126+
private Collection $provideLinks;
126127

127128
/**
128129
* @var Collection<int, MetadataReplaceLink>
129130
*/
130131
#[ORM\OneToMany(targetEntity: MetadataReplaceLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
131132
#[ORM\OrderBy(['index' => 'ASC'])]
132-
private Collection $replace;
133+
private Collection $replaceLinks;
133134

134135
/**
135136
* @var Collection<int, MetadataSuggestLink>
136137
*/
137138
#[ORM\OneToMany(targetEntity: MetadataSuggestLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach', 'remove'])]
138139
#[ORM\OrderBy(['index' => 'ASC'])]
139-
private Collection $suggest;
140+
private Collection $suggestLinks;
140141

141142
/**
142143
* @var Collection<int, Keyword>
@@ -149,12 +150,12 @@ public function __construct(Version $version)
149150
$this->version = $version;
150151
$this->package = $version->getPackage();
151152

152-
$this->require = new ArrayCollection();
153-
$this->devRequire = new ArrayCollection();
154-
$this->conflict = new ArrayCollection();
155-
$this->provide = new ArrayCollection();
156-
$this->replace = new ArrayCollection();
157-
$this->suggest = new ArrayCollection();
153+
$this->requireLinks = new ArrayCollection();
154+
$this->devRequireLinks = new ArrayCollection();
155+
$this->conflictLinks = new ArrayCollection();
156+
$this->provideLinks = new ArrayCollection();
157+
$this->replaceLinks = new ArrayCollection();
158+
$this->suggestLinks = new ArrayCollection();
158159
$this->keywords = new ArrayCollection();
159160
}
160161

@@ -415,49 +416,49 @@ public function getPackage(): Package
415416
/**
416417
* @return Collection<int, MetadataRequireLink>
417418
*/
418-
public function getRequire(): Collection
419+
public function getRequireLinks(): Collection
419420
{
420-
return $this->require;
421+
return $this->requireLinks;
421422
}
422423

423424
/**
424425
* @return Collection<int, MetadataDevRequireLink>
425426
*/
426-
public function getDevRequire(): Collection
427+
public function getDevRequireLinks(): Collection
427428
{
428-
return $this->devRequire;
429+
return $this->devRequireLinks;
429430
}
430431

431432
/**
432433
* @return Collection<int, MetadataConflictLink>
433434
*/
434-
public function getConflict(): Collection
435+
public function getConflictLinks(): Collection
435436
{
436-
return $this->conflict;
437+
return $this->conflictLinks;
437438
}
438439

439440
/**
440441
* @return Collection<int, MetadataProvideLink>
441442
*/
442-
public function getProvide(): Collection
443+
public function getProvideLinks(): Collection
443444
{
444-
return $this->provide;
445+
return $this->provideLinks;
445446
}
446447

447448
/**
448449
* @return Collection<int, MetadataReplaceLink>
449450
*/
450-
public function getReplace(): Collection
451+
public function getReplaceLinks(): Collection
451452
{
452-
return $this->replace;
453+
return $this->replaceLinks;
453454
}
454455

455456
/**
456457
* @return Collection<int, MetadataSuggestLink>
457458
*/
458-
public function getSuggest(): Collection
459+
public function getSuggestLinks(): Collection
459460
{
460-
return $this->suggest;
461+
return $this->suggestLinks;
461462
}
462463

463464
/**
@@ -621,19 +622,10 @@ public function toComposerArray(): array
621622
];
622623

623624
// Set links
624-
$supportedLinkTypes = [
625-
'require' => $this->require,
626-
'require-dev' => $this->devRequire,
627-
'suggest' => $this->suggest,
628-
'conflict' => $this->conflict,
629-
'provide' => $this->provide,
630-
'replace' => $this->replace,
631-
];
632-
633-
foreach ($supportedLinkTypes as $linkType => $linkCollection) {
625+
foreach (MetadataLinkType::cases() as $linkType) {
634626
/** @var AbstractMetadataLink $link */
635-
foreach ($linkCollection as $link) {
636-
$data[$linkType][$link->getLinkedPackageName()] = $link->getLinkedVersionConstraint();
627+
foreach ($linkType->getMetadataLinks($this) as $link) {
628+
$data[$linkType->value][$link->getLinkedPackageName()] = $link->getLinkedVersionConstraint();
637629
}
638630
}
639631

src/Doctrine/Entity/MetadataConflictLink.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,4 @@ class MetadataConflictLink extends AbstractMetadataLink
1010
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'conflict')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
13-
14-
#[\Override]
15-
protected function addToCollection(): void
16-
{
17-
$this->metadata->getConflict()->add($this);
18-
}
1913
}

src/Doctrine/Entity/MetadataDevRequireLink.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,4 @@ class MetadataDevRequireLink extends AbstractMetadataLink
1010
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'devRequire')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
13-
14-
#[\Override]
15-
protected function addToCollection(): void
16-
{
17-
$this->metadata->getDevRequire()->add($this);
18-
}
1913
}

src/Doctrine/Entity/MetadataProvideLink.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,6 @@ class MetadataProvideLink extends AbstractMetadataLink
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
1313

14-
#[\Override]
15-
protected function addToCollection(): void
16-
{
17-
$this->metadata->getProvide()->add($this);
18-
}
19-
2014
public function isImplementation(): bool
2115
{
2216
return str_ends_with($this->getLinkedPackageName(), '-implementation');

src/Doctrine/Entity/MetadataReplaceLink.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,4 @@ class MetadataReplaceLink extends AbstractMetadataLink
1010
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'replace')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
13-
14-
#[\Override]
15-
protected function addToCollection(): void
16-
{
17-
$this->metadata->getReplace()->add($this);
18-
}
1913
}

src/Doctrine/Entity/MetadataRequireLink.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,4 @@ class MetadataRequireLink extends AbstractMetadataLink
1010
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'require')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
13-
14-
#[\Override]
15-
protected function addToCollection(): void
16-
{
17-
$this->metadata->getRequire()->add($this);
18-
}
1913
}

src/Doctrine/Entity/MetadataSuggestLink.php

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,4 @@ class MetadataSuggestLink extends AbstractMetadataLink
1010
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'suggest')]
1111
#[ORM\JoinColumn(nullable: false)]
1212
protected Metadata $metadata;
13-
14-
#[\Override]
15-
protected function addToCollection(): void
16-
{
17-
$this->metadata->getSuggest()->add($this);
18-
}
1913
}

src/Entity/MetadataLinkType.php

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Entity;
4+
5+
use CodedMonkey\Dirigent\Doctrine\Entity\Metadata;
6+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataConflictLink;
7+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataDevRequireLink;
8+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataProvideLink;
9+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataReplaceLink;
10+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataRequireLink;
11+
use CodedMonkey\Dirigent\Doctrine\Entity\MetadataSuggestLink;
12+
use Composer\Package\PackageInterface;
13+
use Doctrine\Common\Collections\Collection;
14+
15+
enum MetadataLinkType: string
16+
{
17+
case Require = 'require';
18+
case DevRequire = 'require-dev';
19+
case Conflict = 'conflict';
20+
case Provide = 'provide';
21+
case Replace = 'replace';
22+
case Suggest = 'suggest';
23+
24+
public static function fromClass(string $class): self
25+
{
26+
return match ($class) {
27+
MetadataRequireLink::class => self::Require,
28+
MetadataDevRequireLink::class => self::DevRequire,
29+
MetadataConflictLink::class => self::Conflict,
30+
MetadataProvideLink::class => self::Provide,
31+
MetadataReplaceLink::class => self::Replace,
32+
MetadataSuggestLink::class => self::Suggest,
33+
default => throw new \InvalidArgumentException("Unknown link class $class"),
34+
};
35+
}
36+
37+
public function getClass(): string
38+
{
39+
return match ($this) {
40+
self::Require => MetadataRequireLink::class,
41+
self::DevRequire => MetadataDevRequireLink::class,
42+
self::Conflict => MetadataConflictLink::class,
43+
self::Provide => MetadataProvideLink::class,
44+
self::Replace => MetadataReplaceLink::class,
45+
self::Suggest => MetadataSuggestLink::class,
46+
};
47+
}
48+
49+
public function isConstraintLink(): bool
50+
{
51+
return self::Suggest !== $this;
52+
}
53+
54+
public function getComposerPackageLinks(PackageInterface $package): array
55+
{
56+
return match ($this) {
57+
self::Require => $package->getRequires(),
58+
self::DevRequire => $package->getDevRequires(),
59+
self::Conflict => $package->getConflicts(),
60+
self::Provide => $package->getProvides(),
61+
self::Replace => $package->getReplaces(),
62+
self::Suggest => $package->getSuggests(),
63+
};
64+
}
65+
66+
public function getMetadataLinks(Metadata $metadata): Collection
67+
{
68+
return match ($this) {
69+
self::Require => $metadata->getRequireLinks(),
70+
self::DevRequire => $metadata->getDevRequireLinks(),
71+
self::Conflict => $metadata->getConflictLinks(),
72+
self::Provide => $metadata->getProvideLinks(),
73+
self::Replace => $metadata->getReplaceLinks(),
74+
self::Suggest => $metadata->getSuggestLinks(),
75+
};
76+
}
77+
}

0 commit comments

Comments
 (0)