From 667837a49d717ca094fa9b245544372f8aafdc4c Mon Sep 17 00:00:00 2001 From: Tobias Sorn Date: Thu, 18 Jul 2019 11:04:42 +0200 Subject: [PATCH 1/4] [RFC] 0001 Configurable console output Provide option to configure the console output --- .../images/ui5-migration-reporter-concept.png | Bin 0 -> 39215 bytes rfcs/0001-configurable-console-output.md | 72 ++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 docs/images/ui5-migration-reporter-concept.png create mode 100644 rfcs/0001-configurable-console-output.md diff --git a/docs/images/ui5-migration-reporter-concept.png b/docs/images/ui5-migration-reporter-concept.png new file mode 100644 index 0000000000000000000000000000000000000000..8e5456c98f4e3f2d6b68608bc8a489f8a27e7b47 GIT binary patch literal 39215 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 literal 0 HcmV?d00001 diff --git a/rfcs/0001-configurable-console-output.md b/rfcs/0001-configurable-console-output.md new file mode 100644 index 00000000..3e5eaea0 --- /dev/null +++ b/rfcs/0001-configurable-console-output.md @@ -0,0 +1,72 @@ +- Start Date: 2019-07-18 +- RFC PR: - +- Issue: [#39](https://github.com/SAP/ui5-migration/issues/39) + + +# RFC 0001 Configurable console output + +## Summary +The log output should be configurable to support use cases like machine-readability, summaries, eslint-like output. + +## Motivation +The idea is to support integration scenarios where the output needs to be concise to minimize the time to identify/fix the problem. + +## Detailed design + +### Refactoring +In order to achieve and easy configuration and extension of the output requires a refactoring of the existing Reporter mechanism and its surrounding classes. + +#### Favor composition over inheritance +The concept of Reporter being an interface, `BaseReporter` the abstract implementation and `JSONReporter`, `ConsoleReporter` and `MetaConsoleReporter` their implementation is a pretty rigid construction. +The approach should be flexible and use composition instead of inheritance. + +#### Single Responsibility Principle (SRP) +The current concept makes the Reporters (`JSONReporter`, `ConsoleReporter` and `MetaConsoleReporter`) do many things: +* collect Findings +* format output +* manage other reporters +* instantiate other reporters + +#### Solution + +![concept](./../docs/images/ui5-migration-reporter-concept.png) + +##### `Dumper` +* `Dumper` is an interface +A `Dumper` dumps given content. +It dumps findings in the given format + +##### `Console`Dumper`` +* Implementation of `Dumper` +Dumps content to the console + +##### `JSON`Dumper`` +* Implementation of `Dumper` +Dumps content in the JSON format + +##### `SimpleStructure`Dumper`` +* Implementation of `Dumper` +Dumps content grouped by files (like eslint) to console + + +##### `ReporterManager` +* Singleton +The ReportManager is able to instantiate new Reporters. +It manages them and uses them to get all findings. +It uses then a `Dumper` to dump them. + +##### `Reporter` +A Reporter collects findings and logs + +### Configuration +There should be a configuration option such that the user can configure the way the output is reported with option `--dump`. + +## How we teach this +- Documentation +- Blog article + +## Drawbacks + +## Alternatives + +## Unresolved Questions and Bikeshedding From c5aef0e8d913cb2dcedad1e66e80acaf543a743e Mon Sep 17 00:00:00 2001 From: Tobias Sorn Date: Thu, 18 Jul 2019 11:17:27 +0200 Subject: [PATCH 2/4] Update 0001-configurable-console-output.md Add RFC PR --- rfcs/0001-configurable-console-output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rfcs/0001-configurable-console-output.md b/rfcs/0001-configurable-console-output.md index 3e5eaea0..362b13ca 100644 --- a/rfcs/0001-configurable-console-output.md +++ b/rfcs/0001-configurable-console-output.md @@ -1,5 +1,5 @@ - Start Date: 2019-07-18 -- RFC PR: - +- RFC PR: [#42](https://github.com/SAP/ui5-migration/pull/42) - Issue: [#39](https://github.com/SAP/ui5-migration/issues/39) From 2b3ddd32add84c7161cdc8178a0b9e0e9e0c13c3 Mon Sep 17 00:00:00 2001 From: Tobias Sorn Date: Thu, 18 Jul 2019 11:20:48 +0200 Subject: [PATCH 3/4] Update 0001-configurable-console-output.md --- rfcs/0001-configurable-console-output.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rfcs/0001-configurable-console-output.md b/rfcs/0001-configurable-console-output.md index 362b13ca..0e1292fa 100644 --- a/rfcs/0001-configurable-console-output.md +++ b/rfcs/0001-configurable-console-output.md @@ -14,14 +14,14 @@ The idea is to support integration scenarios where the output needs to be concis ## Detailed design ### Refactoring -In order to achieve and easy configuration and extension of the output requires a refactoring of the existing Reporter mechanism and its surrounding classes. +In order to achieve and easy configuration and extension of the output requires a refactoring of the existing `Reporter` centric mechanism and its surrounding classes. #### Favor composition over inheritance The concept of Reporter being an interface, `BaseReporter` the abstract implementation and `JSONReporter`, `ConsoleReporter` and `MetaConsoleReporter` their implementation is a pretty rigid construction. The approach should be flexible and use composition instead of inheritance. #### Single Responsibility Principle (SRP) -The current concept makes the Reporters (`JSONReporter`, `ConsoleReporter` and `MetaConsoleReporter`) do many things: +The current concept makes the Reporters (`JSONReporter`, `ConsoleReporter` and `MetaConsoleReporter`) do too many things: * collect Findings * format output * manage other reporters @@ -36,27 +36,27 @@ The current concept makes the Reporters (`JSONReporter`, `ConsoleReporter` and ` A `Dumper` dumps given content. It dumps findings in the given format -##### `Console`Dumper`` +##### `ConsoleDumper` * Implementation of `Dumper` Dumps content to the console -##### `JSON`Dumper`` +##### `JSONDumper` * Implementation of `Dumper` Dumps content in the JSON format -##### `SimpleStructure`Dumper`` +##### `SimpleStructureDumper` * Implementation of `Dumper` Dumps content grouped by files (like eslint) to console ##### `ReporterManager` * Singleton -The ReportManager is able to instantiate new Reporters. +The `ReportManager` is able to instantiate new Reporters. It manages them and uses them to get all findings. It uses then a `Dumper` to dump them. ##### `Reporter` -A Reporter collects findings and logs +A `Reporter` collects findings and logs ### Configuration There should be a configuration option such that the user can configure the way the output is reported with option `--dump`. From 52c356fb77d2c16017acb617de8f1562de12599a Mon Sep 17 00:00:00 2001 From: Thorsten Hochreuter Date: Fri, 19 Jul 2019 11:25:00 +0200 Subject: [PATCH 4/4] More explanation on the intended refactorings --- .../images/ui5-migration-reporter-concept.png | Bin 39215 -> 25865 bytes rfcs/0001-configurable-console-output.md | 94 ++++++++++-------- 2 files changed, 51 insertions(+), 43 deletions(-) diff --git a/docs/images/ui5-migration-reporter-concept.png b/docs/images/ui5-migration-reporter-concept.png index 8e5456c98f4e3f2d6b68608bc8a489f8a27e7b47..226767e960fb20e2f8bdc1bb237286e5d682b647 100644 GIT binary patch literal 25865 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 GU;hSgV)uRk literal 39215 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 diff --git a/rfcs/0001-configurable-console-output.md b/rfcs/0001-configurable-console-output.md index 0e1292fa..af185744 100644 --- a/rfcs/0001-configurable-console-output.md +++ b/rfcs/0001-configurable-console-output.md @@ -1,72 +1,80 @@ +# RFC 0001 Configurable console output + - Start Date: 2019-07-18 - RFC PR: [#42](https://github.com/SAP/ui5-migration/pull/42) - Issue: [#39](https://github.com/SAP/ui5-migration/issues/39) - -# RFC 0001 Configurable console output - ## Summary -The log output should be configurable to support use cases like machine-readability, summaries, eslint-like output. + +The output of the findings of a migration-run should be configurable. We want to support use-cases like machine-readability, summaries, eslint-like output. The final output should facilitate integration into CI environments. ## Motivation -The idea is to support integration scenarios where the output needs to be concise to minimize the time to identify/fix the problem. + +See [Summary](#Summary). + +The internal refactoring efforts should aim to support integration scenarios, where the output needs to be concise to minimize the time to identify/fix the problem. ## Detailed design ### Refactoring -In order to achieve and easy configuration and extension of the output requires a refactoring of the existing `Reporter` centric mechanism and its surrounding classes. -#### Favor composition over inheritance -The concept of Reporter being an interface, `BaseReporter` the abstract implementation and `JSONReporter`, `ConsoleReporter` and `MetaConsoleReporter` their implementation is a pretty rigid construction. -The approach should be flexible and use composition instead of inheritance. +In order to achieve an easy configuration and extension of the output, a deeper refactoring of the existing `Reporter` mechanism is required. + +### Favor composition over inheritance -#### Single Responsibility Principle (SRP) -The current concept makes the Reporters (`JSONReporter`, `ConsoleReporter` and `MetaConsoleReporter`) do too many things: -* collect Findings -* format output -* manage other reporters -* instantiate other reporters +The current implementation is heavily using inheritance, which makes it rather rigid and inconvenient to extend/maintain. -#### Solution +The new approach should be flexible and use composition instead of inheritance. We aim for better extensibility and maintainability. + +### Single Responsibility Principle + +The current concept makes the Reporters (`JSONReporter`, `ConsoleReporter` and `MetaConsoleReporter`) does too many things intermingled: + +- collect Findings +- format output +- manage other reporters +- instantiate other reporters + +We aim to break this feature *lump* down into classes with only one single responsibility. +In the following [section](#Solution) we will explain our simplified class design. + +### Solution + +The following image shows our intended simplified class structure. ![concept](./../docs/images/ui5-migration-reporter-concept.png) -##### `Dumper` -* `Dumper` is an interface -A `Dumper` dumps given content. -It dumps findings in the given format +#### `Exporter` + +`Exporter` is an interface. +An `Exporter` is responsible for exporting the given findings. The findings will be exported in the format defined by the implementing class. + +We currently want to provide two predefined `Exporter` implementations: -##### `ConsoleDumper` -* Implementation of `Dumper` -Dumps content to the console +1. `ConsoleExporter` (*implements `Exporter` interface*) +Dumps content to the console in human readable format. -##### `JSONDumper` -* Implementation of `Dumper` -Dumps content in the JSON format +1. `JSONExporter` (*implements `Exporter` interface*) +For automation and visualization purposes we also provide a JSON export. -##### `SimpleStructureDumper` -* Implementation of `Dumper` -Dumps content grouped by files (like eslint) to console +#### `ReporterManager` +- The `ReporterManager` is a Singleton +- It serves as a `Reporter` factory and holds references on all instantiated Reporters. +- In the future the `ReporterManager` also might implement grouping and filtering mechanisms on all retained `Reporter` instances to allow for eslint-like "per-file" output. +- It uses then an `Exporter` instance for exporting the different findings. -##### `ReporterManager` -* Singleton -The `ReportManager` is able to instantiate new Reporters. -It manages them and uses them to get all findings. -It uses then a `Dumper` to dump them. +#### `Reporter` -##### `Reporter` -A `Reporter` collects findings and logs +A `Reporter` collects findings and logs issued by the migration processors. ### Configuration -There should be a configuration option such that the user can configure the way the output is reported with option `--dump`. -## How we teach this -- Documentation -- Blog article +There should be a configuration option such that the user can configure the way the output is reported with option `--export`. -## Drawbacks +Currently the available export formats will be *console-logs* and *JSON*. -## Alternatives +## Open Points -## Unresolved Questions and Bikeshedding +- Extend design to include the Migration `Task` class. + Show how the `Task` classes can create a new `Reporter` via the `ReporterManager` factory.