fix: null shell config

feat: improve errors
This commit is contained in:
Chen Asraf
2022-08-30 19:23:19 +03:00
parent 79290a2d54
commit 2569dc6970
5 changed files with 103 additions and 49 deletions

17
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,17 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "script_runner",
"request": "launch",
"type": "dart",
"program": "${workspaceRoot}/bin/script_runner.dart",
"args": [
"echo1"
]
}
]
}

View File

@@ -1,3 +1,8 @@
## 0.1.7
- Fix error when not supplying shell in config
- Improve errors for bad configurations
## 0.1.6
- Code improvements

View File

@@ -98,8 +98,13 @@ class ScriptRunnerConfig {
}
final pubspec = await file.readAsString();
final yaml.YamlMap contents = yaml.loadYaml(pubspec);
final yaml.YamlMap? conf = contents['script_runner'];
return conf;
try {
final yaml.YamlMap? conf = contents['script_runner'];
return conf;
} catch (e) {
throw StateError(
'Expected YamlMap in pubspec.yaml under script_runner key, got: ${contents['script_runner'].runtimeType}');
}
}
static Future<yaml.YamlMap?>? _getCustomConfig(FileSystem fileSystem) async {
@@ -110,8 +115,13 @@ class ScriptRunnerConfig {
return null;
}
final pubspec = await file.readAsString();
final yaml.YamlMap? conf = yaml.loadYaml(pubspec);
return conf;
try {
final yaml.YamlMap? conf = yaml.loadYaml(pubspec);
return conf;
} catch (e) {
throw StateError(
'Expected YamlMap in pubspec.yaml under script_runner key, got: ${yaml.loadYaml(pubspec).runtimeType}');
}
}
static List<RunnableScript> _parseScriptsList(
@@ -166,20 +176,28 @@ class ScriptRunnerShellConfig {
this.linux,
});
/// Parses a shell configuration from a YAML map, dart map or string.
/// Parses a shell configuration from a [YamlMap], [Map] or [String].
/// Other types will throw a [StateError].
factory ScriptRunnerShellConfig.parse(dynamic obj) {
if (obj is String) {
return ScriptRunnerShellConfig(defaultShell: obj);
try {
if (obj is String) {
return ScriptRunnerShellConfig(defaultShell: obj);
}
if (obj is yaml.YamlMap || obj is Map) {
return ScriptRunnerShellConfig(
defaultShell: obj['default'],
windows: obj['windows'],
macos: obj['macos'],
linux: obj['linux'],
);
}
if (obj == null) {
return ScriptRunnerShellConfig();
}
throw StateError('Invalid shell config: $obj');
} catch (e) {
throw StateError('Error while parsing config: $obj');
}
if (obj is yaml.YamlMap || obj is Map) {
return ScriptRunnerShellConfig(
defaultShell: obj['default'],
windows: obj['windows'],
macos: obj['macos'],
linux: obj['linux'],
);
}
throw StateError('Invalid shell config: $obj');
}
/// Get the shell to use for the given platform.
@@ -200,6 +218,11 @@ class ScriptRunnerShellConfig {
if (Platform.isWindows) {
return 'cmd.exe';
}
return '/bin/sh';
try {
final res = Platform.environment['SHELL'];
return res ?? '/bin/sh';
} catch (e) {
return '/bin/sh';
}
}
}

View File

@@ -66,8 +66,12 @@ class RunnableScript {
(map['args'] as yaml.YamlList?)?.map((e) => e.toString()).toList();
out['env'] = (map['env'] as yaml.YamlMap?)?.cast<String, String>();
}
return RunnableScript.fromMap(out, fileSystem: fileSystem);
try {
return RunnableScript.fromMap(out, fileSystem: fileSystem);
} catch (e) {
throw StateError(
'Failed to parse script, arguments: $map, $fileSystem. Error: $e');
}
}
/// Generate a runnable script from a normal map as defined in the config.
@@ -81,13 +85,18 @@ class RunnableScript {
final description = map['description'] as String?;
// print('cmdArgs: $cmdArgs');
return RunnableScript(
name,
cmd: cmd,
args: cmdArgs + List<String>.from(rawArgs),
fileSystem: fileSystem,
description: description,
);
try {
return RunnableScript(
name,
cmd: cmd,
args: cmdArgs + List<String>.from(rawArgs),
fileSystem: fileSystem,
description: description,
);
} catch (e) {
throw StateError(
'Failed to parse script, arguments: $map, $fileSystem. Error: $e');
}
}
/// Runs the current script with the given extra arguments.

View File

@@ -1,7 +1,7 @@
name: script_runner
description: Run all your project-related scripts in a portable, simple config.
version: 0.1.6
homepage: https://casraf.blog/
version: 0.1.7
homepage: https://casraf.dev/
repository: https://github.com/chenasraf/dart_script_runner
license: MIT
environment:
@@ -17,27 +17,27 @@ dev_dependencies:
test: ^1.16.0
script_runner:
shell: /bin/zsh
line_length: 100
scripts:
# Real
- auto-fix: dart fix --apply
- publish: dart pub publish
- doc: dart doc
# Examples
- name: echo1
cmd: echo "Hello World"
description: Interdum a scelerisque arcu felis taciti ligula pellentesque curabitur, suspendisse adipiscing quisque sed luctus elementum in imperdiet id, praesent enim sem justo sapien diam nec. Quisque erat risus sagittis penatibus per, vehicula sociosqu cubilia convallis, sollicitudin scelerisque cras aptent. Natoque ornare dictumst netus litora mollis suspendisse cubilia proin morbi primis consequat eu massa, cursus non urna ridiculus dolor duis tempus ut nam velit lacus viverra. A interdum senectus eu mus leo aptent facilisi augue tristique ante purus condimentum pulvinar porta viverra morbi, et tellus gravida porttitor non euismod suscipit neque egestas praesent arcu luctus pharetra fusce. Luctus mauris a venenatis tempus cras ante efficitur massa ultricies mollis lacus, volutpat nisi lacinia himenaeos facilisi in aliquet sodales purus integer vitae quisque, libero torquent enim mattis placerat tortor mi dignissim viverra sem.
- name: echo2
cmd: echo
args:
- 'Hello World'
description: test script foobar
- name: activate-local
cmd: dart pub global activate --source path ./
- name: combined
cmd: echo 'test' && echo1 && echo2
- short: echo 'this is a short script'
# line_length: 100
# scripts:
# Real
- auto-fix: dart fix --apply
- publish: dart pub publish
- doc: dart doc
# Examples
- name: echo1
cmd: echo "Hello World" $SHELL
description: Interdum a scelerisque arcu felis taciti ligula pellentesque curabitur, suspendisse adipiscing quisque sed luctus elementum in imperdiet id, praesent enim sem justo sapien diam nec. Quisque erat risus sagittis penatibus per, vehicula sociosqu cubilia convallis, sollicitudin scelerisque cras aptent. Natoque ornare dictumst netus litora mollis suspendisse cubilia proin morbi primis consequat eu massa, cursus non urna ridiculus dolor duis tempus ut nam velit lacus viverra. A interdum senectus eu mus leo aptent facilisi augue tristique ante purus condimentum pulvinar porta viverra morbi, et tellus gravida porttitor non euismod suscipit neque egestas praesent arcu luctus pharetra fusce. Luctus mauris a venenatis tempus cras ante efficitur massa ultricies mollis lacus, volutpat nisi lacinia himenaeos facilisi in aliquet sodales purus integer vitae quisque, libero torquent enim mattis placerat tortor mi dignissim viverra sem.
- name: echo2
cmd: echo
args:
- 'Hello World'
description: test script foobar
- name: activate-local
cmd: dart pub global activate --source path ./
- name: combined
cmd: echo 'test' && echo1 && echo2
- short: echo 'this is a short script'
executables:
scr: script_runner