Skip to content

Commit

Permalink
Merge pull request #72 from smeghead/add-hide-private-option
Browse files Browse the repository at this point in the history
feat: add `--hide-private` option. #67
  • Loading branch information
smeghead authored Jul 6, 2024
2 parents eace33a + 149a696 commit 48290e4
Show file tree
Hide file tree
Showing 8 changed files with 263 additions and 2 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# CHANGELOG

### Features

* add `--hide-private`, `--hide-private-properties`, `--hide-private-methods` option. #67

### Bug fix

* Improve Main class #68 by @Chemaclass
Expand Down
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ OPTIONS
--disable-class-methods not describe methods in class diagram.
--enable-class-name-summary describe classname with Class summary of document comment. (default)
--disable-class-name-summary describe classname without Class summary of document comment.
--hide-private hide private properties and methods.
--hide-private-properties hide private properties.
--hide-private-methods hide private methods.
--svg-topurl specifies the top URL when displaying the class as a link when outputting in SVG format.
--php5 parse php source file as php5.
--php7 parse php source file as php7.
Expand Down
6 changes: 6 additions & 0 deletions bin/php-class-diagram
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ $options = getopt('hv', [
'disable-class-methods',
'enable-class-name-summary',
'disable-class-name-summary',
'hide-private',
'hide-private-properties',
'hide-private-methods',
'svg-topurl::',
'php7',
'php8',
Expand Down Expand Up @@ -57,6 +60,9 @@ OPTIONS
--disable-class-methods not describe methods in class diagram.
--enable-class-name-summary describe classname with Class summary of document comment. (default)
--disable-class-name-summary describe classname without Class summary of document comment.
--hide-private hide private properties and methods.
--hide-private-properties hide private properties.
--hide-private-methods hide private methods.
--svg-topurl Specifies the top URL when displaying the class as a link when outputting in SVG format.
--php5 parse php source file as php5.
--php7 parse php source file as php7.
Expand Down
22 changes: 22 additions & 0 deletions src/Config/Options.php
Original file line number Diff line number Diff line change
Expand Up @@ -163,4 +163,26 @@ public function svgTopurl(): string
}
return $this->opt['svg-topurl'];
}

public function hidePrivateProperties(): bool
{
if (isset($this->opt['hide-private-properties'])) {
return true;
}
if (isset($this->opt['hide-private'])) {
return true;
}
return false;
}

public function hidePrivateMethods(): bool
{
if (isset($this->opt['hide-private-methods'])) {
return true;
}
if (isset($this->opt['hide-private'])) {
return true;
}
return false;
}
}
9 changes: 8 additions & 1 deletion src/DiagramElement/Entry.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,11 +63,17 @@ public function dump(int $level = 0): array
$lines[] = sprintf('%s%s {', $indent, $classIdentifier);
if ($this->options->classProperties()) {
foreach ($this->class->getProperties() as $p) {
if ($this->options->hidePrivateProperties() && $p->getAccessModifier()->isPublic() === false) {
continue;
}
$lines[] = sprintf(' %s%s%s : %s', $indent, $this->modifier($p->getAccessModifier()), $p->getName(), $p->getType()->getName());
}
}
if ($this->options->classMethods()) {
foreach ($this->class->getMethods() as $m) {
if ($this->options->hidePrivateMethods() && $m->getAccessModifier()->isPublic() === false) {
continue;
}
$params = array_map(function (PhpMethodParameter $x) {
return $x->getName();
}, $m->getParams());
Expand Down Expand Up @@ -189,6 +195,7 @@ private function getLinkExpression(string $meta): string
' [[%s %s %s]]',
$path,
$this->class->getClassType()->getName(),
ucfirst($meta));
ucfirst($meta)
);
}
}
145 changes: 145 additions & 0 deletions test/HidePrivateTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
<?php

declare(strict_types=1);

use PHPUnit\Framework\TestCase;

use Smeghead\PhpClassDiagram\Config\Options;
use Smeghead\PhpClassDiagram\DiagramElement\{
Relation,
Entry,
};
use Smeghead\PhpClassDiagram\Php\PhpReader;

final class HidePrivateTest extends TestCase
{
private string $fixtureDir;

public function setUp(): void
{
$this->fixtureDir = sprintf('%s/fixtures', __DIR__);
}

public function testDefault(): void
{
$directory = sprintf('%s/hide-private', $this->fixtureDir);
$options = new Options([
]);
$files = [
'product/Product.php',
];
$entries = [];
foreach ($files as $f) {
$filename = sprintf('%s/hide-private/%s', $this->fixtureDir, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation(array_merge(...$entries), $options);

$expected = <<<EOS
@startuml class-diagram
package product as product {
class "Product" as product_Product {
+name : string
-memo : string
+publicFunction(param1)
-privateFunction(param1)
}
}
@enduml
EOS;
$this->assertSame($expected, implode(PHP_EOL, $rel->dump()), 'output PlantUML script.');
}

public function testHidePrivate(): void
{
$directory = sprintf('%s/hide-private', $this->fixtureDir);
$options = new Options([
'hide-private' => true,
]);
$files = [
'product/Product.php',
];
$entries = [];
foreach ($files as $f) {
$filename = sprintf('%s/hide-private/%s', $this->fixtureDir, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation(array_merge(...$entries), $options);

$expected = <<<EOS
@startuml class-diagram
package product as product {
class "Product" as product_Product {
+name : string
+publicFunction(param1)
}
}
@enduml
EOS;
$this->assertSame($expected, implode(PHP_EOL, $rel->dump()), 'output PlantUML script.');
}

public function testHidePrivateProperties(): void
{
$directory = sprintf('%s/hide-private', $this->fixtureDir);
$options = new Options([
'hide-private-properties' => true,
]);
$files = [
'product/Product.php',
];
$entries = [];
foreach ($files as $f) {
$filename = sprintf('%s/hide-private/%s', $this->fixtureDir, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation(array_merge(...$entries), $options);

$expected = <<<EOS
@startuml class-diagram
package product as product {
class "Product" as product_Product {
+name : string
+publicFunction(param1)
-privateFunction(param1)
}
}
@enduml
EOS;
$this->assertSame($expected, implode(PHP_EOL, $rel->dump()), 'output PlantUML script.');
}

public function testHidePrivateMethods(): void
{
$directory = sprintf('%s/hide-private', $this->fixtureDir);
$options = new Options([
'hide-private-methods' => true,
]);
$files = [
'product/Product.php',
];
$entries = [];
foreach ($files as $f) {
$filename = sprintf('%s/hide-private/%s', $this->fixtureDir, $f);
$classes = PhpReader::parseFile($directory, $filename, $options);
$entries[] = array_map(fn($c) => new Entry(dirname($f), $c->getInfo(), $options), $classes);
}
$rel = new Relation(array_merge(...$entries), $options);

$expected = <<<EOS
@startuml class-diagram
package product as product {
class "Product" as product_Product {
+name : string
-memo : string
+publicFunction(param1)
}
}
@enduml
EOS;
$this->assertSame($expected, implode(PHP_EOL, $rel->dump()), 'output PlantUML script.');
}
}
Loading

0 comments on commit 48290e4

Please sign in to comment.