Skip to content

Commit

Permalink
Update for non-nullable types (#32)
Browse files Browse the repository at this point in the history
* Update for non-nullable types

* Bump version in travis config

* Add docker, binary, and version

* Run pub get on check

* Fix typo
  • Loading branch information
glesica authored Mar 16, 2021
1 parent 518ae10 commit 7aa9c6d
Show file tree
Hide file tree
Showing 45 changed files with 634 additions and 586 deletions.
24 changes: 24 additions & 0 deletions .github/workflows/dcdg-ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: DCDG CI

on: [push, pull_request]

jobs:
check:
runs-on: ubuntu-20.04
container:
image: glesica/dcdg_build
volumes:
- ${{ github.workspace }}:/code
steps:
- uses: actions/checkout@v1
- run: ./tool/check.sh

check-format:
runs-on: ubuntu-20.04
container:
image: glesica/dcdg_build
volumes:
- ${{ github.workspace }}:/code
steps:
- uses: actions/checkout@v1
- run: ./tool/format.sh
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
language: dart
dart:
- 2.2.0
- 2.12.0
- stable
- dev
script:
Expand Down
7 changes: 7 additions & 0 deletions Dockerfile_build
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
FROM google/dart:2.12 AS build
RUN apt-get -q update && \
apt-get -y install make && \
rm -rf /var/lib/apt/lists/* && \
mkdir -p /code
VOLUME /code
WORKDIR /code
13 changes: 2 additions & 11 deletions USAGE.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,41 +2,32 @@ Usage: dcdg [options]

-b, --builder=<NAME> Builder to use to construct a class diagram
(defaults to "plantuml")

-e, --exclude=<TYPE> Class / type names to exclude, can be a regular
expression

--exclude-private=<KIND> Exclude private entities (field, method, class,
or all)

--exclude-has-a Exclude has-a / aggregation relationships from
the diagram output

--exclude-is-a Exclude is-a / extension relationships from the
diagram output

--exported-only Include only classes exported from the Dart
package

--has-a=<CLASS> Include only classes with a has-a relationship
to any of the named classes

--is-a=<CLASS> Include only classes with an is-a relationship
to any of the named classes

-h, --help Show usage information
-i, --include=<TYPE> Class / type names to include, can be a regular
expression

-o, --output=<FILE> File to which output should be written (stdout
if omitted)
(defaults to "")

-p, --package=<DIR> Path to the root of the Dart package to scan
(defaults to ".")

-s, --search-path=<DIR> Directory relative to the package root to search
for classes
(defaults to "lib")
-v, --version Show the version number and exit

Available builders:
* plantuml - PlantUML builder that attempts to be feature-complete
Expand Down
17 changes: 12 additions & 5 deletions bin/dcdg.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:io';

import 'package:dcdg/dcdg.dart';
import 'package:dcdg/src/command_line.dart';
import 'package:path/path.dart' as path;

Future<Null> main(Iterable<String> arguments) async {
Expand All @@ -12,16 +13,22 @@ Future<Null> main(Iterable<String> arguments) async {
exit(0);
}

if (config.shouldShowVersion) {
print(makeVersion());
exit(0);
}

// TODO: Move validation to the Configuration itself for easier testing

if (config.builder == null) {
outputError('Builder "${config.builderName}" was not found');
exit(1);
}
final builder = config.builder!;

final pubspec = File(path.join(config.packagePath, 'pubspec.yaml'));
if (!pubspec.existsSync()) {
outputError('No Dart package found at ${config.packagePath}');
outputError('No Dart package found at "${config.packagePath}"');
exit(1);
}

Expand All @@ -32,7 +39,7 @@ Future<Null> main(Iterable<String> arguments) async {
);

buildDiagram(
builder: config.builder,
builder: builder,
classElements: classes,
excludeHasA: config.excludeHasA,
excludeIsA: config.excludeIsA,
Expand All @@ -46,11 +53,11 @@ Future<Null> main(Iterable<String> arguments) async {
);

if (config.outputPath == '') {
config.builder.printContent(print);
builder.printContent(print);
} else {
final outFile = File(config.outputPath);
try {
config.builder.writeContent(outFile);
builder.writeContent(outFile);
} on FileSystemException catch (exception) {
outputError(
'Failed writing to file ${exception.path} (${exception.osError})',
Expand All @@ -61,7 +68,7 @@ Future<Null> main(Iterable<String> arguments) async {
}
}

void outputError(String message, [Exception exception]) {
void outputError(String message, [Exception? exception]) {
stderr.writeln('Error: $message');
if (exception != null) {
stderr.writeln(exception.toString());
Expand Down
Binary file modified example/dcdg.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
64 changes: 32 additions & 32 deletions example/dcdg.puml
Original file line number Diff line number Diff line change
@@ -1,23 +1,7 @@
@startuml
set namespaceSeparator ::

class "dcdg::src::diagram_visitor.dart::DiagramVisitor" {
+bool hasA()
+bool isA()
+bool shouldInclude()
+bool shouldIncludeClass()
+bool shouldIncludeField()
+bool shouldIncludeHasA()
+bool shouldIncludeIsA()
+bool shouldIncludeMethod()
+void visitClassElement()
+void visitFieldElement()
+void visitMethodElement()
}

"analyzer::dart::element::visitor.dart::RecursiveElementVisitor<R>" <|-- "dcdg::src::diagram_visitor.dart::DiagramVisitor"

class "dcdg::src::builders::dot_builder.dart::DotBuilder" {
class "dcdg::src::builders::plant_uml_builder.dart::PlantUmlBuilder" {
+void addAggregation()
+void addField()
+void addInterface()
Expand All @@ -27,13 +11,14 @@ class "dcdg::src::builders::dot_builder.dart::DotBuilder" {
+void beginClass()
+void endClass()
+String namespacedTypeName()
+String getVisibility()
+void printContent()
+void writeContent()
}

"dcdg::src::builders::diagram_builder.dart::DiagramBuilder" <|-- "dcdg::src::builders::dot_builder.dart::DotBuilder"
"dcdg::src::builders::diagram_builder.dart::DiagramBuilder" <|-- "dcdg::src::builders::plant_uml_builder.dart::PlantUmlBuilder"

class "dcdg::src::builders::plant_uml_builder.dart::PlantUmlBuilder" {
class "dcdg::src::builders::dot_builder.dart::DotBuilder" {
+void addAggregation()
+void addField()
+void addInterface()
Expand All @@ -43,12 +28,11 @@ class "dcdg::src::builders::plant_uml_builder.dart::PlantUmlBuilder" {
+void beginClass()
+void endClass()
+String namespacedTypeName()
+String getVisibility()
+void printContent()
+void writeContent()
}

"dcdg::src::builders::diagram_builder.dart::DiagramBuilder" <|-- "dcdg::src::builders::plant_uml_builder.dart::PlantUmlBuilder"
"dcdg::src::builders::diagram_builder.dart::DiagramBuilder" <|-- "dcdg::src::builders::dot_builder.dart::DotBuilder"

abstract class "dcdg::src::builders::diagram_builder.dart::DiagramBuilder" {
+void addAggregation()
Expand Down Expand Up @@ -82,8 +66,17 @@ class "dcdg::src::builders::nomnoml_builder.dart::NomnomlBuilder" {

"dcdg::src::builders::diagram_builder.dart::DiagramBuilder" <|-- "dcdg::src::builders::nomnoml_builder.dart::NomnomlBuilder"

class "dcdg::src::builder_factories.dart::BuilderFactory" {
+DiagramBuilder Function() callback
+String description
+String name
+String toString()
}

"dcdg::src::builder_factories.dart::BuilderFactory" o-- "dcdg::src::builder_factories.dart::DiagramBuilder Function()"

abstract class "dcdg::src::configuration.dart::Configuration" {
+DiagramBuilder builder
+DiagramBuilder? builder
+String builderName
+Iterable<RegExp> excludeExpressions
+bool excludeHasA
Expand All @@ -101,10 +94,10 @@ abstract class "dcdg::src::configuration.dart::Configuration" {
+bool shouldShowHelp
}

"dcdg::src::configuration.dart::Configuration" o-- "dcdg::src::builders::diagram_builder.dart::DiagramBuilder"
"dcdg::src::configuration.dart::Configuration" o-- "dcdg::src::builders::diagram_builder.dart::DiagramBuilder?"

class "dcdg::src::configuration.dart::ConfigurationImpl" {
+DiagramBuilder builder
+DiagramBuilder? builder
+String builderName
+Iterable<RegExp> excludeExpressions
+bool excludeHasA
Expand All @@ -122,25 +115,32 @@ class "dcdg::src::configuration.dart::ConfigurationImpl" {
+bool shouldShowHelp
}

"dcdg::src::configuration.dart::ConfigurationImpl" o-- "dcdg::src::builders::diagram_builder.dart::DiagramBuilder"
"dcdg::src::configuration.dart::ConfigurationImpl" o-- "dcdg::src::builders::diagram_builder.dart::DiagramBuilder?"
"dcdg::src::configuration.dart::Configuration" <|-- "dcdg::src::configuration.dart::ConfigurationImpl"

class "dcdg::src::builder_factories.dart::BuilderFactory" {
+() → DiagramBuilder callback
+String description
+String name
+String toString()
class "dcdg::src::diagram_visitor.dart::DiagramVisitor" {
+bool hasA()
+bool isA()
+bool shouldInclude()
+bool shouldIncludeClass()
+bool shouldIncludeField()
+bool shouldIncludeHasA()
+bool shouldIncludeIsA()
+bool shouldIncludeMethod()
+void visitClassElement()
+void visitFieldElement()
+void visitMethodElement()
}

"dcdg::src::builder_factories.dart::BuilderFactory" o-- "dcdg::src::builder_factories.dart::() → DiagramBuilder"
"analyzer::dart::element::visitor.dart::RecursiveElementVisitor" <|-- "dcdg::src::diagram_visitor.dart::DiagramVisitor"

class "dcdg::src::class_element_collector.dart::ClassElementCollector" {
+Iterable<ClassElement> classElements
+void visitClassElement()
+void visitExportElement()
}

"analyzer::dart::element::visitor.dart::RecursiveElementVisitor<R>" <|-- "dcdg::src::class_element_collector.dart::ClassElementCollector"
"analyzer::dart::element::visitor.dart::RecursiveElementVisitor" <|-- "dcdg::src::class_element_collector.dart::ClassElementCollector"


@enduml
23 changes: 11 additions & 12 deletions lib/src/build_diagram.dart
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:dcdg/src/builders/diagram_builder.dart';
import 'package:dcdg/src/diagram_visitor.dart';
import 'package:meta/meta.dart';

/// Build a diagram using the given builder from the given class
/// elements.
void buildDiagram({
@required DiagramBuilder builder,
@required Iterable<ClassElement> classElements,
bool excludeHasA,
bool excludeIsA,
bool excludePrivateClasses,
bool excludePrivateFields,
bool excludePrivateMethods,
Iterable<RegExp> excludes,
Iterable<RegExp> hasA,
Iterable<RegExp> includes,
Iterable<RegExp> isA,
required DiagramBuilder builder,
required Iterable<ClassElement> classElements,
required bool excludeHasA,
required bool excludeIsA,
required bool excludePrivateClasses,
required bool excludePrivateFields,
required bool excludePrivateMethods,
required Iterable<RegExp> excludes,
required Iterable<RegExp> hasA,
required Iterable<RegExp> includes,
required Iterable<RegExp> isA,
}) {
final visitor = DiagramVisitor(
onAggregateField: builder.addAggregation,
Expand Down
12 changes: 7 additions & 5 deletions lib/src/builder_factories.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import 'package:dcdg/src/builders/dot_builder.dart';
import 'package:dcdg/src/builders/nomnoml_builder.dart';
import 'package:dcdg/src/builders/plant_uml_builder.dart';
import 'package:dcdg/src/builders/diagram_builder.dart';
import 'package:meta/meta.dart';

/// A collection of available builders parameterized in different ways
/// for different use-cases.
Expand Down Expand Up @@ -37,9 +36,9 @@ class BuilderFactory {
final String name;

BuilderFactory({
@required this.callback,
@required this.description,
@required this.name,
required this.callback,
required this.description,
required this.name,
});

@override
Expand All @@ -48,4 +47,7 @@ class BuilderFactory {

Iterable<BuilderFactory> availableBuilders() => _factories.values;

DiagramBuilder getBuilder(String name) => _factories[name]?.callback();
DiagramBuilder? getBuilder(String name) {
final factory = _factories[name];
return factory?.callback();
}
2 changes: 1 addition & 1 deletion lib/src/builders/diagram_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ abstract class DiagramBuilder {

void endClass(ClassElement element);

void printContent(void printer(String content));
void printContent(void Function(String content) printer);

void writeContent(File file);
}
10 changes: 3 additions & 7 deletions lib/src/builders/dot_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:analyzer/dart/element/type.dart';
import 'package:dcdg/src/builders/diagram_builder.dart';

class DotBuilder implements DiagramBuilder {
String _currentClass;
String? _currentClass;

final List<String> _lines = [
'strict digraph {',
Expand Down Expand Up @@ -59,7 +59,7 @@ class DotBuilder implements DiagramBuilder {
}

String namespacedTypeName(Element element) {
final namespace = element.library.identifier
final namespace = element.library?.identifier
.replaceFirst('package:', '')
.replaceFirst('dart:', '');
final className = element.name;
Expand All @@ -68,11 +68,7 @@ class DotBuilder implements DiagramBuilder {

@override
void printContent(void Function(String content) printer) {
final content = ([]
..addAll(_lines)
..add('')
..add('}'))
.join('\n');
final content = ([..._lines, '', '}']).join('\n');
printer(content);
}

Expand Down
Loading

0 comments on commit 7aa9c6d

Please sign in to comment.