From 9b5c59a6165ac1cac967e571ad0372f27b8769d1 Mon Sep 17 00:00:00 2001 From: Sam Rawlins Date: Mon, 14 Sep 2020 20:19:37 -0700 Subject: [PATCH] Move some e2e tests which use flags or options to package_test.dart --- lib/src/package_meta.dart | 20 +- test/end2end/dartdoc_test.dart | 85 +---- test/package_test.dart | 312 ++++++++++++++---- test/src/utils.dart | 28 +- testing/test_package_minimum/lib/main.dart | 1 - testing/test_package_minimum/pubspec.yaml | 1 - .../lib/main.dart | 3 - .../pubspec.yaml | 8 - 8 files changed, 292 insertions(+), 166 deletions(-) delete mode 100644 testing/test_package_minimum/lib/main.dart delete mode 100644 testing/test_package_minimum/pubspec.yaml delete mode 100644 testing/test_package_options_importer/lib/main.dart delete mode 100644 testing/test_package_options_importer/pubspec.yaml diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart index 406555c89a..8c87ca59d5 100644 --- a/lib/src/package_meta.dart +++ b/lib/src/package_meta.dart @@ -308,7 +308,7 @@ class _FilePackageMeta extends PubPackageMeta { if (!_setHostedAt) { _setHostedAt = true; // Search for 'hosted/host.domain' as the immediate parent directories, - // and verify that a directory _temp exists alongside hosted. Those + // and verify that a directory "_temp" exists alongside "hosted". Those // seem to be the only guaranteed things to exist if we're from a pub // cache. // @@ -317,14 +317,16 @@ class _FilePackageMeta extends PubPackageMeta { // a pub library to do this. // People could have a pub cache at root with Windows drive mappings. if (pathContext.split(pathContext.canonicalize(dir.path)).length >= 3) { - var pubCacheRoot = dir.parent.parent.parent.path; - var hosted = pathContext.canonicalize(dir.parent.parent.path); - var hostname = pathContext.canonicalize(dir.parent.path); - if (pathContext.basename(hosted) == 'hosted' && - resourceProvider - .getFolder(pathContext.join(pubCacheRoot, '_temp')) - .exists) { - _hostedAt = pathContext.basename(hostname); + var pubCacheRoot = dir.parent.parent.parent?.path; + if (pubCacheRoot != null) { + var hosted = pathContext.canonicalize(dir.parent.parent.path); + var hostname = pathContext.canonicalize(dir.parent.path); + if (pathContext.basename(hosted) == 'hosted' && + resourceProvider + .getFolder(pathContext.join(pubCacheRoot, '_temp')) + .exists) { + _hostedAt = pathContext.basename(hostname); + } } } } diff --git a/test/end2end/dartdoc_test.dart b/test/end2end/dartdoc_test.dart index fbd858ade9..c6f1a572f3 100644 --- a/test/end2end/dartdoc_test.dart +++ b/test/end2end/dartdoc_test.dart @@ -28,16 +28,12 @@ Folder _getFolder(String p) => _resourceProvider final _testPackageDir = _getFolder('testing/test_package'); final Folder _testPackageBadDir = _getFolder('testing/test_package_bad'); -final Folder _testPackageMinimumDir = - _getFolder('testing/test_package_minimum'); final Folder _testSkyEnginePackage = _getFolder('testing/sky_engine'); final Folder _testPackageIncludeExclude = _getFolder('testing/test_package_include_exclude'); final Folder _testPackageImportExportError = _getFolder('testing/test_package_import_export_error'); final Folder _testPackageOptions = _getFolder('testing/test_package_options'); -final Folder _testPackageOptionsImporter = - _getFolder('testing/test_package_options_importer'); final _testPackageCustomTemplates = _getFolder('testing/test_package_custom_templates'); @@ -162,43 +158,6 @@ void main() { contains('Tool "drill" returned non-zero exit code')); }); - group('Option handling with cross-linking', () { - DartdocResults results; - Package testPackageOptions; - Folder tempDir; - - setUpAll(() async { - tempDir = resourceProvider.createSystemTemp('dartdoc.test.'); - results = await (await buildDartdoc( - ['--link-to-remote'], _testPackageOptionsImporter, tempDir)) - .generateDocsBase(); - testPackageOptions = results.packageGraph.packages - .firstWhere((Package p) => p.name == 'test_package_options'); - }); - - test('linkToUrl', () async { - var main = testPackageOptions.allLibraries - .firstWhere((Library l) => l.name == 'main'); - var UseAnExampleHere = main.allClasses - .firstWhere((Class c) => c.name == 'UseAnExampleHere'); - expect(testPackageOptions.documentedWhere, - equals(DocumentLocation.remote)); - expect( - UseAnExampleHere.href, - equals( - 'https://nonexistingsuperpackage.topdomain/test_package_options/0.0.1/main/UseAnExampleHere-class.html')); - }); - - test('includeExternal works via remote', () async { - var unusualLibrary = testPackageOptions.allLibraries - .firstWhere((Library l) => l.name == 'unusualLibrary'); - expect( - unusualLibrary.allClasses - .firstWhere((Class c) => c.name == 'Something'), - isNotNull); - }); - }); - test('with broken reexport chain', () async { var dartdoc = await buildDartdoc([], _testPackageImportExportError, tempDir); @@ -246,13 +205,6 @@ void main() { }); }); - test('package without version produces valid semver in docs', () async { - var dartdoc = await buildDartdoc([], _testPackageMinimumDir, tempDir); - var results = await dartdoc.generateDocs(); - var p = results.packageGraph; - expect(p.defaultPackage.version, equals('0.0.0-unknown')); - }); - test('basic interlinking test', () async { var dartdoc = await buildDartdoc([], _testPackageDir, tempDir); var results = await dartdoc.generateDocs(); @@ -327,41 +279,9 @@ void main() { expect(e is DartdocFailure, isTrue); } }, - skip: 'Blocked on getting analysis errors with correct interpretation' + skip: 'Blocked on getting analysis errors with correct interpretation ' 'from analysis_options'); - test('generate docs including a single library', () async { - var dartdoc = - await buildDartdoc(['--include', 'fake'], _testPackageDir, tempDir); - - var results = await dartdoc.generateDocs(); - expect(results.packageGraph, isNotNull); - - var p = results.packageGraph; - expect(p.defaultPackage.name, 'test_package'); - expect(p.defaultPackage.hasDocumentationFile, isTrue); - expect(p.localPublicLibraries, hasLength(1)); - expect(p.localPublicLibraries.map((lib) => lib.name), contains('fake')); - }); - - test('generate docs excluding a single library', () async { - var dartdoc = - await buildDartdoc(['--exclude', 'fake'], _testPackageDir, tempDir); - - var results = await dartdoc.generateDocs(); - expect(results.packageGraph, isNotNull); - - var p = results.packageGraph; - expect(p.defaultPackage.name, 'test_package'); - expect(p.defaultPackage.hasDocumentationFile, isTrue); - // Plus 1 here because we're excluding only two libraries (the specified - // one and the 'excluded' library) instead of three. - expect( - p.localPublicLibraries, hasLength(kTestPackagePublicLibraries + 1)); - expect(p.localPublicLibraries.map((lib) => lib.name).contains('fake'), - isFalse); - }); - test('generate docs for package with embedder yaml', () async { var dartdoc = await buildDartdoc([], _testSkyEnginePackage, tempDir); @@ -443,8 +363,7 @@ void main() { }); test('rel canonical prefix does not include base href', () async { - // ignore: omit_local_variable_types - final String prefix = 'foo.bar/baz'; + final prefix = 'foo.bar/baz'; var dartdoc = await buildDartdoc( ['--rel-canonical-prefix', prefix], _testPackageDir, tempDir); await dartdoc.generateDocsBase(); diff --git a/test/package_test.dart b/test/package_test.dart index 728e2c13ca..04220b27e7 100644 --- a/test/package_test.dart +++ b/test/package_test.dart @@ -6,6 +6,7 @@ import 'package:analyzer/file_system/file_system.dart'; import 'package:analyzer/file_system/memory_file_system.dart'; import 'package:analyzer/src/test_utilities/mock_sdk.dart'; import 'package:dartdoc/src/dartdoc_options.dart'; +import 'package:dartdoc/src/model/documentable.dart'; import 'package:dartdoc/src/package_config_provider.dart'; import 'package:dartdoc/src/package_meta.dart'; import 'package:dartdoc/src/special_elements.dart'; @@ -15,14 +16,24 @@ import 'src/utils.dart' as utils; void main() { MemoryResourceProvider resourceProvider; + PackageMetaProvider packageMetaProvider; + FakePackageConfigProvider packageConfigProvider; + DartdocOptionSet optionSet; MockSdk mockSdk; Folder sdkFolder; Folder projectRoot; String projectPath; var packageName = 'my_package'; - PackageMetaProvider packageMetaProvider; - FakePackageConfigProvider packageConfigProvider; + + void writeToJoinedPath(List pathSegments, String content) { + var file = pathSegments.removeAt(pathSegments.length - 1); + var directory = projectRoot; + for (var d in pathSegments) { + directory = directory.getChildAssumingFolder(d); + } + directory.getChildAssumingFile(file).writeAsStringSync(content); + } setUp(() async { resourceProvider = MemoryResourceProvider(); @@ -37,9 +48,8 @@ void main() { sdkFolder, defaultSdk: mockSdk, ); - var optionSet = await DartdocOptionSet.fromOptionGenerators( + optionSet = await DartdocOptionSet.fromOptionGenerators( 'dartdoc', [createDartdocOptions], packageMetaProvider); - optionSet.parseArguments([]); packageConfigProvider = FakePackageConfigProvider(); // To build the package graph, we always ask package_config for a // [PackageConfig] for the SDK directory. Put a dummy entry in. @@ -55,6 +65,7 @@ void main() { group('typical package', () { setUp(() { + optionSet.parseArguments([]); projectRoot = utils.writePackage( packageName, resourceProvider, packageConfigProvider); projectPath = projectRoot.path; @@ -133,10 +144,7 @@ int x; }); test('has anonymous libraries', () async { - projectRoot - .getChildAssumingFolder('lib') - .getChildAssumingFile('b.dart') - .writeAsStringSync(''' + writeToJoinedPath(['lib', 'b.dart'], ''' /// Documentation comment. int x; '''); @@ -147,9 +155,7 @@ int x; }); test('has documentation via Markdown README', () async { - projectRoot - .getChildAssumingFile('README.md') - .writeAsStringSync('Readme text.'); + writeToJoinedPath(['README.md'], 'Readme text.'); var packageGraph = await utils.bootBasicPackage( projectPath, packageMetaProvider, packageConfigProvider); expect(packageGraph.defaultPackage.hasDocumentationFile, true); @@ -157,9 +163,7 @@ int x; }); test('has documentation via text README', () async { - projectRoot - .getChildAssumingFile('README') - .writeAsStringSync('Readme text.'); + writeToJoinedPath(['README'], 'Readme text.'); var packageGraph = await utils.bootBasicPackage( projectPath, packageMetaProvider, packageConfigProvider); expect(packageGraph.defaultPackage.hasDocumentationFile, true); @@ -167,18 +171,14 @@ int x; }); test('has documentation content', () async { - projectRoot - .getChildAssumingFile('README.md') - .writeAsStringSync('Readme text.'); + writeToJoinedPath(['README.md'], 'Readme text.'); var packageGraph = await utils.bootBasicPackage( projectPath, packageMetaProvider, packageConfigProvider); expect(packageGraph.defaultPackage.documentation, equals('Readme text.')); }); test('has documentation content rendered as HTML', () async { - projectRoot - .getChildAssumingFile('README.md') - .writeAsStringSync('Readme text.'); + writeToJoinedPath(['README.md'], 'Readme text.'); var packageGraph = await utils.bootBasicPackage( projectPath, packageMetaProvider, packageConfigProvider); expect(packageGraph.defaultPackage.documentationAsHtml, @@ -186,7 +186,189 @@ int x; }); }); + test('documents single explicitly included library', () async { + optionSet.parseArguments([]); + projectRoot = utils.writePackage( + packageName, resourceProvider, packageConfigProvider); + projectPath = projectRoot.path; + writeToJoinedPath(['lib', 'foo.dart'], ''' +/// Documentation comment. +library foo; +'''); + writeToJoinedPath(['lib', 'bar.dart'], ''' +/// Documentation comment. +library bar; +'''); + var packageGraph = await utils.bootBasicPackage( + projectPath, packageMetaProvider, packageConfigProvider, + additionalArguments: ['--include', 'foo']); + + expect(packageGraph.localPublicLibraries, hasLength(1)); + expect(packageGraph.localPublicLibraries.single.name, equals('foo')); + }); + + test('documents multiple explicitly included libraries', () async { + optionSet.parseArguments(['--include', 'foo', '--include', 'bar']); + projectRoot = utils.writePackage( + packageName, resourceProvider, packageConfigProvider); + projectPath = projectRoot.path; + writeToJoinedPath(['lib', 'foo.dart'], ''' +/// Documentation comment. +library foo; +'''); + writeToJoinedPath(['lib', 'bar.dart'], ''' +/// Documentation comment. +library bar; +'''); + writeToJoinedPath(['lib', 'baz.dart'], ''' +/// Documentation comment. +library baz; +'''); + var packageGraph = await utils.bootBasicPackage( + projectPath, packageMetaProvider, packageConfigProvider, + additionalArguments: ['--include', 'foo', '--include', 'bar']); + + var documentedLibraries = packageGraph.localPublicLibraries; + expect(documentedLibraries, hasLength(2)); + expect(documentedLibraries.map((e) => e.name), containsAll(['foo', 'bar'])); + expect(documentedLibraries.map((e) => e.name), contains('bar')); + }); + + test('excludes single explicitly excluded library', () async { + optionSet.parseArguments([]); + projectRoot = utils.writePackage( + packageName, resourceProvider, packageConfigProvider); + projectPath = projectRoot.path; + writeToJoinedPath(['lib', 'foo.dart'], ''' +/// Documentation comment. +library foo; +'''); + writeToJoinedPath(['lib', 'bar.dart'], ''' +/// Documentation comment. +library bar; +'''); + var packageGraph = await utils.bootBasicPackage( + projectPath, packageMetaProvider, packageConfigProvider, + additionalArguments: ['--exclude', 'foo']); + + expect(packageGraph.localPublicLibraries, hasLength(1)); + expect(packageGraph.localPublicLibraries.single.name, equals('bar')); + }); + + group('using --link-to-remote', () { + Folder packageOneRoot; + Folder packageTwoRoot; + + setUp(() { + optionSet.parseArguments(['--link-to-remote']); + packageOneRoot = + utils.writePackage('one', resourceProvider, packageConfigProvider); + packageOneRoot + .getChildAssumingFolder('lib') + .getChildAssumingFile('one.dart') + .writeAsStringSync(''' +/// Documentation comment. +library one; + +class One {} +'''); + packageOneRoot.getChildAssumingFolder('bin').create(); + packageOneRoot + .getChildAssumingFolder('bin') + .getChildAssumingFile('script.dart') + .writeAsStringSync(''' +/// Documentation comment. +library script; + +class Script {} +'''); + + packageTwoRoot = + utils.writePackage('two', resourceProvider, packageConfigProvider); + packageConfigProvider.addPackageToConfigFor( + packageTwoRoot.path, 'one', Uri.file('${packageOneRoot.path}/')); + packageTwoRoot + .getChildAssumingFolder('lib') + .getChildAssumingFile('two.dart') + .writeAsStringSync(''' +/// Documentation comment. +library two; +import 'package:one/one.dart'; + +class Two extends One {} +'''); + }); + + test('includes remote elements when linkTo -> url is specified', () async { + packageOneRoot + .getChildAssumingFile('dartdoc_options.yaml') + .writeAsStringSync(''' +dartdoc: + linkTo: + url: 'https://mypub.topdomain/%n%/%v%' +'''); + var packageGraph = await utils.bootBasicPackage( + packageTwoRoot.path, packageMetaProvider, packageConfigProvider, + additionalArguments: ['--link-to-remote']); + + expect(packageGraph.packages, hasLength(3)); + var packageOne = + packageGraph.packages.singleWhere((p) => p.name == 'one'); + // TODO(srawlins): Why is there more than one? + var libraryOne = + packageOne.allLibraries.lastWhere((l) => l.name == 'one'); + var classOne = libraryOne.allClasses.firstWhere((c) => c.name == 'One'); + expect(packageOne.documentedWhere, equals(DocumentLocation.remote)); + expect(classOne.href, + equals('https://mypub.topdomain/one/0.0.1/one/One-class.html')); + }); + + test('does not include remote elements when linkTo -> url is not specified', + () async { + var packageGraph = await utils.bootBasicPackage( + packageTwoRoot.path, packageMetaProvider, packageConfigProvider, + additionalArguments: ['--link-to-remote']); + + expect(packageGraph.packages, hasLength(3)); + var packageOne = + packageGraph.packages.singleWhere((p) => p.name == 'one'); + expect(packageOne.documentedWhere, equals(DocumentLocation.missing)); + }); + + test('includes external remote elements when includeExternal is specified', + () async { + packageOneRoot + .getChildAssumingFile('dartdoc_options.yaml') + .writeAsStringSync(''' +dartdoc: + includeExternal: + - bin/script.dart + linkTo: + url: 'https://mypub.topdomain/%n%/%v%' +'''); + var packageGraph = await utils.bootBasicPackage( + packageTwoRoot.path, packageMetaProvider, packageConfigProvider, + additionalArguments: ['--link-to-remote']); + + expect(packageGraph.packages, hasLength(3)); + var packageOne = + packageGraph.packages.singleWhere((p) => p.name == 'one'); + expect(packageOne.documentedWhere, equals(DocumentLocation.remote)); + // TODO(srawlins): Why is there more than one? + var libraryScript = + packageOne.allLibraries.singleWhere((l) => l.name == 'script'); + var classScript = + libraryScript.allClasses.singleWhere((c) => c.name == 'Script'); + expect(classScript.href, + equals('https://mypub.topdomain/one/0.0.1/script/Script-class.html')); + }); + }); + group('SDK package', () { + setUp(() { + optionSet.parseArguments([]); + }); + test('has proper name and kind', () async { var packageGraph = await utils.bootBasicPackage( sdkFolder.path, packageMetaProvider, packageConfigProvider, @@ -250,62 +432,72 @@ int x; }); }); - test('package with no doc comments has no docs', () async { - projectRoot = utils.writePackage( - packageName, resourceProvider, packageConfigProvider); - projectPath = projectRoot.path; - projectRoot - .getChildAssumingFolder('lib') - .getChildAssumingFile('a.dart') - .writeAsStringSync(''' + group('using default options', () { + setUp(() { + optionSet.parseArguments([]); + }); + + test('package with no version has a default version', () async { + projectRoot = utils.writePackage( + packageName, resourceProvider, packageConfigProvider, + pubspecContent: ''' +name: $packageName +'''); + projectPath = projectRoot.path; + var packageGraph = await utils.bootBasicPackage( + projectPath, packageMetaProvider, packageConfigProvider); + + expect(packageGraph.defaultPackage.version, equals('0.0.0-unknown')); + }); + + test('package with no doc comments has no docs', () async { + projectRoot = utils.writePackage( + packageName, resourceProvider, packageConfigProvider); + projectPath = projectRoot.path; + writeToJoinedPath(['lib', 'a.dart'], ''' // No documentation comment. int x; '''); - var packageGraph = await utils.bootBasicPackage( - projectPath, packageMetaProvider, packageConfigProvider); + var packageGraph = await utils.bootBasicPackage( + projectPath, packageMetaProvider, packageConfigProvider); - expect(packageGraph.defaultPackage.hasDocumentation, isFalse); - expect(packageGraph.defaultPackage.hasDocumentationFile, isFalse); - expect(packageGraph.defaultPackage.documentationFile, isNull); - expect(packageGraph.defaultPackage.documentation, isNull); - }); + expect(packageGraph.defaultPackage.hasDocumentation, isFalse); + expect(packageGraph.defaultPackage.hasDocumentationFile, isFalse); + expect(packageGraph.defaultPackage.documentationFile, isNull); + expect(packageGraph.defaultPackage.documentation, isNull); + }); - test('package with no homepage in the pubspec has no homepage', () async { - projectRoot = utils.writePackage( - packageName, resourceProvider, packageConfigProvider, - pubspecContent: ''' + test('package with no homepage in the pubspec has no homepage', () async { + projectRoot = utils.writePackage( + packageName, resourceProvider, packageConfigProvider, + pubspecContent: ''' name: $packageName version: 0.0.1 '''); - projectPath = projectRoot.path; - projectRoot - .getChildAssumingFolder('lib') - .getChildAssumingFile('a.dart') - .writeAsStringSync(''' + projectPath = projectRoot.path; + writeToJoinedPath(['lib', 'a.dart'], ''' /// Documentation comment. int x; '''); - var packageGraph = await utils.bootBasicPackage( - projectPath, packageMetaProvider, packageConfigProvider); + var packageGraph = await utils.bootBasicPackage( + projectPath, packageMetaProvider, packageConfigProvider); - expect(packageGraph.defaultPackage.hasHomepage, isFalse); - }); + expect(packageGraph.defaultPackage.hasHomepage, isFalse); + }); - test('package with no doc comments has no categories', () async { - projectRoot = utils.writePackage( - packageName, resourceProvider, packageConfigProvider); - projectPath = projectRoot.path; - projectRoot - .getChildAssumingFolder('lib') - .getChildAssumingFile('a.dart') - .writeAsStringSync(''' + test('package with no doc comments has no categories', () async { + projectRoot = utils.writePackage( + packageName, resourceProvider, packageConfigProvider); + projectPath = projectRoot.path; + writeToJoinedPath(['lib', 'a.dart'], ''' // No documentation comment. int x; '''); - var packageGraph = await utils.bootBasicPackage( - projectPath, packageMetaProvider, packageConfigProvider); + var packageGraph = await utils.bootBasicPackage( + projectPath, packageMetaProvider, packageConfigProvider); - expect(packageGraph.localPackages.first.hasCategories, isFalse); - expect(packageGraph.localPackages.first.categories, isEmpty); + expect(packageGraph.localPackages.first.hasCategories, isFalse); + expect(packageGraph.localPackages.first.categories, isEmpty); + }); }); } diff --git a/test/src/utils.dart b/test/src/utils.dart index f09319d2e2..e9f4e54610 100644 --- a/test/src/utils.dart +++ b/test/src/utils.dart @@ -125,10 +125,36 @@ homepage: https://github.com/dart-lang projectFolder .getChildAssumingFile('pubspec.yaml') .writeAsStringSync(pubspecContent); + projectFolder.getChildAssumingFile('.packages').writeAsStringSync(''' +# Generated by pub on 2020-07-07 08:25:30.557406. +one:../one/lib/ +two:lib/ +'''); projectFolder .getChildAssumingFolder('.dart_tool') .getChildAssumingFile('package_config.json') - .writeAsStringSync(''); + .writeAsStringSync(''' +{ + "configVersion": 2, + "packages": [ + { + "name": "one", + "rootUri": "../../one", + "packageUri": "lib/", + "languageVersion": "2.0" + }, + { + "name": "two", + "rootUri": "../", + "packageUri": "lib/", + "languageVersion": "2.0" + } + ], + "generated": "2020-07-07T15:25:30.566271Z", + "generator": "pub", + "generatorVersion": "2.8.4" +} +'''); projectFolder.getChildAssumingFolder('lib').create(); packageConfigProvider.addPackageToConfigFor( projectRoot, packageName, Uri.file('$projectRoot/')); diff --git a/testing/test_package_minimum/lib/main.dart b/testing/test_package_minimum/lib/main.dart deleted file mode 100644 index e14d75224e..0000000000 --- a/testing/test_package_minimum/lib/main.dart +++ /dev/null @@ -1 +0,0 @@ -library small; diff --git a/testing/test_package_minimum/pubspec.yaml b/testing/test_package_minimum/pubspec.yaml deleted file mode 100644 index 062b6ccd19..0000000000 --- a/testing/test_package_minimum/pubspec.yaml +++ /dev/null @@ -1 +0,0 @@ -name: test_package_minimal diff --git a/testing/test_package_options_importer/lib/main.dart b/testing/test_package_options_importer/lib/main.dart deleted file mode 100644 index 63ee0775dd..0000000000 --- a/testing/test_package_options_importer/lib/main.dart +++ /dev/null @@ -1,3 +0,0 @@ -import 'package:test_package_options/main.dart'; - -class X extends UseAnExampleHere {} diff --git a/testing/test_package_options_importer/pubspec.yaml b/testing/test_package_options_importer/pubspec.yaml deleted file mode 100644 index b9e8fbc569..0000000000 --- a/testing/test_package_options_importer/pubspec.yaml +++ /dev/null @@ -1,8 +0,0 @@ -name: test_package_options_importer -version: 0.0.1 -description: A simple console application. -environment: - sdk: '>=2.0.0 <3.0.0' -dependencies: - test_package_options: - path: '../test_package_options'