Skip to content

Commit

Permalink
add context and tooling
Browse files Browse the repository at this point in the history
  • Loading branch information
klavs committed Oct 9, 2020
1 parent 6ddcf30 commit c2d99d8
Show file tree
Hide file tree
Showing 5 changed files with 184 additions and 29 deletions.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@ uni pub global activate uni
- [ ] `uni run`: Run the program.
- [ ] `uni test`: Run tests in this package.

#### Modes
Based on context `uni` chooses the appropriate tooling. This behavior can be overriden, by setting `--mode` flag.
For example, `uni --mode <mode> pub`.
#### Tooling
Based on context `uni` chooses the appropriate tooling. This behavior can be overriden, by setting `--tooling` flag.
For example, `uni --tooling <TOOLING> pub`.
- `dart`: uses commands from `dart` command. `uni pub` -> `dart pub`
- `flutter`: uses commands from `flutter` command.`uni pub` -> `flutter pub`
- `legacy`: uses legacy tooling bundled with dart. `uni pub` -> `pub`
Expand Down
27 changes: 14 additions & 13 deletions bin/uni.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import "package:args/command_runner.dart";
import "package:uni/commands.dart";
import "package:uni/src/tooling.dart";

void main(List<String> arguments) async {
final runner = CommandRunner<void>(
Expand All @@ -8,22 +9,22 @@ void main(List<String> arguments) async {
);

runner.argParser.addOption(
"mode",
abbr: "m",
help: "Select tooling mode.",
valueHelp: "MODE",
defaultsTo: "adaptive",
"tooling",
abbr: "t",
help: "Select tooling.",
valueHelp: "TOOLING",
defaultsTo: const AdaptiveTooling().name,
allowed: [
"adaptive",
"dart",
"flutter",
"legacy",
const AdaptiveTooling().name,
const DartTooling().name,
const FlutterTooling().name,
const LegacyTooling().name,
],
allowedHelp: <String, String>{
"adaptive": "Selects tooling based on package.",
"dart": "Only use `dart` tool.",
"flutter": "Only use `flutter` tool.",
"legacy": "Only use legacy tooling.",
const AdaptiveTooling().name: const AdaptiveTooling().description,
const DartTooling().name: const DartTooling().description,
const FlutterTooling().name: const FlutterTooling().description,
const LegacyTooling().name: const LegacyTooling().description,
},
);

Expand Down
56 changes: 46 additions & 10 deletions lib/src/commands/doctor.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,36 @@
import "dart:async";

import "package:args/command_runner.dart";
import "package:uni/src/tool.dart";
import "package:uni/src/context.dart";
import "package:uni/src/tooling.dart";
import "package:uni/src/tools/dart_tool.dart";
import "package:uni/src/tools/dartanalyzer_tool.dart";
import "package:uni/src/tools/dartdoc_tool.dart";
import "package:uni/src/tools/dartfmt_tool.dart";
import "package:uni/src/tools/flutter_tool.dart";
import "package:uni/src/tools/pub_tool.dart";

const tools = [
FlutterTool(),
DartTool(),
PubTool(),
DartAnalyzerTool(),
DartFmtTool(),
DartDocTool(),
];

const contexts = [
FlutterContext(),
DartContext(),
];

const toolingSet = [
AdaptiveTooling(),
DartTooling(),
FlutterTooling(),
LegacyTooling(),
];

class DoctorCommand extends Command<void> {
@override
final String name = "doctor";
Expand All @@ -20,21 +42,35 @@ class DoctorCommand extends Command<void> {

@override
FutureOr<void> run() async {
final tools = <Tool>[
FlutterTool(),
DartTool(),
PubTool(),
DartAnalyzerTool(),
DartFmtTool(),
DartDocTool(),
];

print("Available tools:");
for (final tool in tools) {
if (!tool.isAvailable()) {
print("[X] ${tool.name}");
continue;
}
print("[√] ${tool.name}, version: ${await tool.getVersion()}");
}

print("");

print("Supported contexts: ");
for (final context in contexts) {
if (!await context.isSupported()) {
print("[X] ${context.name}");
continue;
}
print("[√] ${context.name}");
}

print("");

print("Supported tooling: ");
for (final tooling in toolingSet) {
if (!await tooling.isSupported()) {
print("[X] ${tooling.name}");
continue;
}
print("[√] ${tooling.name}");
}
}
}
24 changes: 21 additions & 3 deletions lib/src/context.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
class PackageContext {
final bool isFlutter;
import "package:uni/src/tooling.dart";

const PackageContext({this.isFlutter});
abstract class Context {
final String name;

const Context({this.name});

Future<bool> isSupported();
}

class FlutterContext extends Context {
const FlutterContext() : super(name: "flutter");

@override
Future<bool> isSupported() => const FlutterTooling().isSupported();
}

class DartContext extends Context {
const DartContext() : super(name: "dart");

@override
Future<bool> isSupported() => const AdaptiveTooling().isSupported();
}
100 changes: 100 additions & 0 deletions lib/src/tooling.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import "package:pub_semver/pub_semver.dart";
import "package:uni/src/tools/dart_tool.dart";
import "package:uni/src/tools/dartanalyzer_tool.dart";
import "package:uni/src/tools/dartdoc_tool.dart";
import "package:uni/src/tools/dartfmt_tool.dart";
import "package:uni/src/tools/flutter_tool.dart";
import "package:uni/src/tools/pub_tool.dart";

abstract class Tooling {
final String name;
final String description;

const Tooling({
this.name,
this.description,
});

factory Tooling.fromName(String name) {
if (const AdaptiveTooling().name == name) {
return const AdaptiveTooling();
}

if (const DartTooling().name == name) {
return const DartTooling();
}

if (const FlutterTooling().name == name) {
return const FlutterTooling();
}

if (const LegacyTooling().name == name) {
return const LegacyTooling();
}

return null;
}

Future<bool> isSupported();
}

class AdaptiveTooling extends Tooling {
const AdaptiveTooling()
: super(
name: "adaptive",
description: "Selects tooling based on package.",
);

@override
Future<bool> isSupported() async => Stream.fromFutures([
const DartTooling().isSupported(),
const FlutterTooling().isSupported(),
const LegacyTooling().isSupported(),
]).any(
(supported) => supported,
);
}

class DartTooling extends Tooling {
const DartTooling()
: super(
name: "dart",
description: "Only use `dart` tool.",
);

@override
Future<bool> isSupported() async =>
const DartTool().isAvailable() &&
VersionConstraint.parse("^2.10.0").allows(
await const DartTool().getVersion(),
);
}

class FlutterTooling extends Tooling {
const FlutterTooling()
: super(
name: "flutter",
description: "Only use `flutter` tool.",
);

@override
Future<bool> isSupported() async => const FlutterTool().isAvailable();
}

class LegacyTooling extends Tooling {
const LegacyTooling()
: super(
name: "legacy",
description: "Only use legacy tooling.",
);

@override
Future<bool> isSupported() async => const [
PubTool(),
DartAnalyzerTool(),
DartFmtTool(),
DartDocTool(),
].every(
(tool) => tool.isAvailable(),
);
}

0 comments on commit c2d99d8

Please sign in to comment.