Skip to content

Commit d79fd8e

Browse files
committed
add division diagram option.
1 parent 97cb233 commit d79fd8e

File tree

10 files changed

+94
-0
lines changed

10 files changed

+94
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# CHANGELOG
22

3+
### Features
4+
5+
* add division diagram option.
6+
37
### Bug fix
48

59
* Fixed so that unnamed external packages are not displayed in the package association diagram.

bin/php-class-diagram

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ $options = getopt('hv',[
1414
'version',
1515
'class-diagram',
1616
'package-diagram',
17+
'division-diagram',
1718
'jig-diagram',
1819
'enable-class-properties',
1920
'disable-class-properties',
@@ -37,6 +38,7 @@ OPTIONS
3738
-v, --version show version.
3839
--class-diagram output class diagram script. (default)
3940
--package-diagram output package diagram script.
41+
--division-diagram output division diagram script.
4042
--jig-diagram output class diagram and package diagram script.
4143
--enable-class-properties describe properties in class diagram. (default)
4244
--disable-class-properties not describe properties in class diagram.

src/Config/Options.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Options
1515
const DIAGRAM_CLASS = 'class';
1616
const DIAGRAM_PACKAGE = 'package';
1717
const DIAGRAM_JIG = 'jig';
18+
const DIAGRAM_DIVSION = 'division';
1819

1920
public function __construct(array $opt)
2021
{
@@ -43,6 +44,9 @@ public function diagram(): string
4344
if (isset($this->opt['jig-diagram'])) {
4445
return self::DIAGRAM_JIG;
4546
}
47+
if (isset($this->opt['division-diagram'])) {
48+
return self::DIAGRAM_DIVSION;
49+
}
4650
// default
4751
return self::DIAGRAM_CLASS;
4852
}

src/DiagramElement/Entry.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,24 @@ public function dump($level = 0): array
6767
return $lines;
6868
}
6969

70+
public function dumpDivisions($level = 0): array
71+
{
72+
$indent = str_repeat(' ', $level);
73+
$lines = [];
74+
$meta = $this->class->getClassType()->getMetaName();
75+
if ($meta === 'enum') {
76+
$lines[] = sprintf('%scard %s [', $indent, $this->class->getClassType()->getName());
77+
$lines[] = sprintf('%s %s', $indent, $this->class->getClassType()->getName());
78+
$lines[] = sprintf('%s ====', $indent);
79+
$cases = $this->class->getEnumCases();
80+
$lines[] = implode(sprintf("\r\n%s ----\r\n", $indent), array_map(function (string $x) use($indent) {
81+
return sprintf('%s %s', $indent, $x);
82+
}, $cases));
83+
$lines[] = sprintf('%s]', $indent);
84+
}
85+
return $lines;
86+
}
87+
7088
private function modifier(PhpAccessModifier $modifier): string
7189
{
7290
$expressions = [];

src/DiagramElement/Package.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,4 +204,28 @@ private function recFindPackage(string $package): ?Package
204204
}
205205
return null;
206206
}
207+
208+
public function dumpDivisions($level = 0): array
209+
{
210+
$indent = str_repeat(' ', $level);
211+
$lines = [];
212+
if ($this->name !== 'ROOT') {
213+
$lines[] = sprintf(
214+
'%spackage %s as %s {',
215+
$indent,
216+
$this->name,
217+
$this->getLogicalName()
218+
);
219+
}
220+
foreach ($this->entries as $e) {
221+
$lines = array_merge($lines, $e->dumpDivisions($level + 1));
222+
}
223+
foreach ($this->children as $n) {
224+
$lines = array_merge($lines, $n->dumpDivisions($level + 1));
225+
}
226+
if ($this->name !== 'ROOT') {
227+
$lines[] = sprintf('%s}', $indent);
228+
}
229+
return $lines;
230+
}
207231
}

src/DiagramElement/Relation.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,17 @@ public function getUses(): array
7474
{
7575
return $this->package->getUses([]);
7676
}
77+
78+
public function dumpDivisions(): array
79+
{
80+
$lines = ['@startuml division-diagram'];
81+
$lines = array_merge($lines, array_map(function ($x) {
82+
return ' ' . $x;
83+
}, $this->options->headers()));
84+
$lines = array_merge($lines, $this->package->dumpDivisions());
85+
$lines[] = '@enduml';
86+
87+
return $lines;
88+
}
89+
7790
}

src/Main.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ public function __construct(string $directory, Options $options)
4848
echo implode("\r\n", $relation->dump()) . "\r\n";
4949
echo implode("\r\n", $relation->dumpPackages()) . "\r\n";
5050
break;
51+
case OPTIONS::DIAGRAM_DIVSION:
52+
echo implode("\r\n", $relation->dumpDivisions()) . "\r\n";
53+
break;
5154
default:
5255
throw new \Exception('invalid diagram.');
5356
}

src/Php/PhpClass.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
Namespace_,
1717
ClassLike,
1818
ClassMethod,
19+
Enum_,
20+
EnumCase,
1921
Property,
2022
GroupUse,
2123
Use_,
@@ -225,4 +227,18 @@ public function getExtends(): array
225227
}
226228
return $extends;
227229
}
230+
231+
public function getEnumCases(): array
232+
{
233+
if ( ! $this->syntax instanceof Enum_) {
234+
return [];
235+
}
236+
$cases = [];
237+
foreach ($this->syntax->stmts as $stmt) {
238+
if ($stmt instanceof EnumCase) {
239+
$cases[] = $stmt->name->name;
240+
}
241+
}
242+
return $cases;
243+
}
228244
}

test/OptionsTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,15 @@ public function testDiagram2(): void {
124124

125125
$this->assertSame(Options::DIAGRAM_PACKAGE, $options->diagram(), 'diagram is package.');
126126
}
127+
public function testDiagram_division(): void {
128+
$opt = [
129+
'division-diagram' => true,
130+
];
131+
132+
$options = new Options($opt);
133+
134+
$this->assertSame(Options::DIAGRAM_DIVSION, $options->diagram(), 'diagram is division.');
135+
}
127136
public function testDiagram3(): void {
128137
$opt = [
129138
];

test/PhpReflectionTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,5 +311,6 @@ public function testEnum(): void {
311311
$data = $parsed[0]->getInfo();
312312
$this->assertSame('Suit', $data->getClassType()->getName(), '1st class type name.');
313313
$this->assertSame(['Hoge', 'TestEnum'], $data->getClassType()->getNamespace(), '1st namespace name.');
314+
$this->assertSame(['Hearts', 'Diamonds', 'Clubs', 'Spades'], $data->getEnumCases(), 'enum cases.');
314315
}
315316
}

0 commit comments

Comments
 (0)