Skip to content

Commit

Permalink
patrol develop: automatically open Patrol page in devtools when ready
Browse files Browse the repository at this point in the history
  • Loading branch information
bartekpacia committed Nov 3, 2023
1 parent 9195fd6 commit b178858
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 2 deletions.
9 changes: 9 additions & 0 deletions packages/patrol_cli/lib/src/commands/develop.dart
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ class DevelopCommand extends PatrolCommand {

usesAndroidOptions();
usesIOSOptions();

argParser.addFlag(
'open-devtools',
help: 'Automatically open Patrol extension in DevTools when ready.',
defaultsTo: true,
);
}

final DeviceFinder _deviceFinder;
Expand Down Expand Up @@ -179,6 +185,7 @@ class DevelopCommand extends PatrolCommand {
iosOpts,
uninstall: uninstall,
device: device,
openDevtools: boolArg('open-devtools'),
);

return 0; // for now, all exit codes are 0
Expand Down Expand Up @@ -254,6 +261,7 @@ class DevelopCommand extends PatrolCommand {
IOSAppOptions iosOpts, {
required bool uninstall,
required Device device,
required bool openDevtools,
}) async {
Future<void> Function() action;
Future<void> Function()? finalizer;
Expand Down Expand Up @@ -291,6 +299,7 @@ class DevelopCommand extends PatrolCommand {
target: flutterOpts.target,
appId: appId,
dartDefines: flutterOpts.dartDefines,
openDevtools: openDevtools,
);

await future;
Expand Down
43 changes: 42 additions & 1 deletion packages/patrol_cli/lib/src/crossplatform/flutter_tool.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,27 @@ import 'package:meta/meta.dart';
import 'package:path/path.dart' show basename;
import 'package:patrol_cli/src/base/logger.dart';
import 'package:patrol_cli/src/base/process.dart';
import 'package:platform/platform.dart';
import 'package:process/process.dart';

class FlutterTool {
FlutterTool({
required Stream<List<int>> stdin,
required ProcessManager processManager,
required Platform platform,
required DisposeScope parentDisposeScope,
required Logger logger,
}) : _stdin = stdin,
_processManager = processManager,
_platform = platform,
_disposeScope = DisposeScope(),
_logger = logger {
_disposeScope.disposedBy(parentDisposeScope);
}

final Stream<List<int>> _stdin;
final ProcessManager _processManager;
final Platform _platform;
final DisposeScope _disposeScope;
final Logger _logger;

Expand All @@ -35,6 +39,7 @@ class FlutterTool {
required String target,
required String? appId,
required Map<String, String> dartDefines,
required bool openDevtools,
}) async {
if (io.stdin.hasTerminal) {
_enableInteractiveMode();
Expand All @@ -47,18 +52,24 @@ class FlutterTool {
target: target,
appId: appId,
dartDefines: dartDefines,
openBrowser: openDevtools,
),
]);
}

/// Attaches to the running app. Returns a [Future] that completes when the
/// connection is ready.
///
/// If [openBrowser] is true, Dart DevTools (with Patrol extension page
/// selected) will be automatically opened in the browser once DevTools URL is
/// printed by Flutter CLI.
@visibleForTesting
Future<void> attach({
required String deviceId,
required String target,
required String? appId,
required Map<String, String> dartDefines,
required bool openBrowser,
}) async {
await _disposeScope.run((scope) async {
final process = await _processManager.start(
Expand Down Expand Up @@ -111,7 +122,13 @@ class FlutterTool {
}
completer.complete();
}
print(line);

if (openBrowser &&
line.startsWith('The Flutter DevTools debugger and profiler')) {
final url = _getDevtoolsUrl(line);
unawaited(_openDevtoolsPage(url));
}

_logger.detail('\t: $line');
}).disposedBy(scope);

Expand Down Expand Up @@ -188,4 +205,28 @@ class FlutterTool {

_logger.detail('Interactive shell mode enabled.');
}

Future<void> _openDevtoolsPage(String url) async {
_logger.success('Patrol DevTools extension is available at $url');

io.Process? process;
switch (_platform.operatingSystem) {
case Platform.macOS:
process = await _processManager.start(['open', url]);
break;
case Platform.windows:
process = await _processManager.start(['start', url]);
break;
case Platform.linux:
process = await _processManager.start(['xdg-open', url]);
}

await process?.exitCode;
}

String _getDevtoolsUrl(String line) {
final startIndex = line.indexOf('http');
final url = line.substring(startIndex);
return url.replaceAllMapped('?uri=', (_) => '/patrol_ext?uri=');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ class PatrolCommandRunner extends CompletionCommandRunner<int> {
flutterTool: FlutterTool(
stdin: stdin,
processManager: _processManager,
platform: _platform,
parentDisposeScope: _disposeScope,
logger: _logger,
),
Expand Down
2 changes: 1 addition & 1 deletion packages/patrol_cli/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ dependencies:
uuid: ^3.0.7
yaml: ^3.1.1
dev_dependencies:
build_runner: ^2.3.3
build_runner: ^2.4.6
fake_async: ^1.3.1
leancode_lint: ^3.0.0
mocktail: ^0.3.0
Expand Down
5 changes: 5 additions & 0 deletions packages/patrol_cli/test/crossplatform/flutter_tool_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,27 @@ import 'dart:async';
import 'package:dispose_scope/dispose_scope.dart';
import 'package:mocktail/mocktail.dart';
import 'package:patrol_cli/src/crossplatform/flutter_tool.dart';
import 'package:platform/platform.dart';
import 'package:test/test.dart';

import '../src/mocks.dart';

void main() {
late FlutterTool flutterTool;
late MockProcessManager processManager;
late Platform platform;

setUp(() {
final disposeScope = DisposeScope();
final stdin = StreamController<List<int>>();
processManager = MockProcessManager();
platform = FakePlatform();

flutterTool = FlutterTool(
logger: MockLogger(),
parentDisposeScope: disposeScope,
processManager: processManager,
platform: platform,
stdin: stdin.stream,
);
});
Expand All @@ -43,6 +47,7 @@ void main() {
target: 'target',
appId: 'appId',
dartDefines: {},
openBrowser: false,
);

verify(
Expand Down

0 comments on commit b178858

Please sign in to comment.