diff --git a/dev/format_dart_code.sh b/dev/format_dart_code.sh index 04b84d4..80a0515 100755 --- a/dev/format_dart_code.sh +++ b/dev/format_dart_code.sh @@ -1,3 +1,3 @@ #!/bin/bash -ex -dartfmt --overwrite --fix "$@" . +dart format --fix "$@" . diff --git a/lib/src/pubspec_yaml.dart b/lib/src/pubspec_yaml.dart index ca197f4..511c1a9 100644 --- a/lib/src/pubspec_yaml.dart +++ b/lib/src/pubspec_yaml.dart @@ -32,6 +32,7 @@ import 'package:meta/meta.dart'; import 'package:plain_optional/plain_optional.dart'; import 'package:yaml/yaml.dart'; +import '../pubspec_yaml.dart'; import 'package_dependency_spec/package_dependency_spec.dart'; import 'package_dependency_spec/serializers.dart'; @@ -157,33 +158,30 @@ extension PubspecYamlFromYamlString on String { // Implementation details // ============================================================================= -String _formatToYaml(PubspecYaml pubspecYaml) => '${[ - _packageMetadataToYaml(pubspecYaml), - if (pubspecYaml.dependencies.isNotEmpty) - _dependenciesToYaml(pubspecYaml.dependencies, _Tokens.dependencies), - if (pubspecYaml.devDependencies.isNotEmpty) - _dependenciesToYaml( - pubspecYaml.devDependencies, - _Tokens.devDependencies, - ), - if (pubspecYaml.dependencyOverrides.isNotEmpty) - _dependenciesToYaml( - pubspecYaml.dependencyOverrides, - _Tokens.dependencyOverrides, - ), - if (pubspecYaml.environment.isNotEmpty) - _environmentToYaml(pubspecYaml.environment), - if (pubspecYaml.executables.isNotEmpty) - _executablesToYaml(pubspecYaml.executables), - for (final customField in pubspecYaml.customFields.entries) - json2yaml( - Map.fromEntries({customField}), - yamlStyle: YamlStyle.pubspecYaml, - ), - ].join("\n\n")}\n'; - -String _packageMetadataToYaml(PubspecYaml pubspecYaml) => - json2yaml({ +String _formatToYaml(PubspecYaml pubspecYaml) => json2yaml( + _pubspecYamlToJson(pubspecYaml), + yamlStyle: YamlStyle.pubspecYaml, + ); + +Map _pubspecYamlToJson(PubspecYaml pubspecYaml) => + { + ..._packageMetadataToJson(pubspecYaml), + ..._executablesToJson(pubspecYaml.executables), + ..._environmentToJson(pubspecYaml.environment), + ..._dependenciesToJson(pubspecYaml.dependencies, _Tokens.dependencies), + ..._dependenciesToJson( + pubspecYaml.devDependencies, + _Tokens.devDependencies, + ), + ..._dependenciesToJson( + pubspecYaml.dependencyOverrides, + _Tokens.dependencyOverrides, + ), + ...pubspecYaml.customFields, + }; + +Map _packageMetadataToJson(PubspecYaml pubspecYaml) => + { _Tokens.name: pubspecYaml.name, if (pubspecYaml.version.hasValue) _Tokens.version: pubspecYaml.version.valueOr(() => ''), @@ -202,43 +200,37 @@ String _packageMetadataToYaml(PubspecYaml pubspecYaml) => _Tokens.documentation: pubspecYaml.documentation.valueOr(() => ''), if (pubspecYaml.publishTo.hasValue) _Tokens.publishTo: pubspecYaml.publishTo.valueOr(() => ''), - }, yamlStyle: YamlStyle.pubspecYaml); - -String _dependenciesToYaml( - Iterable dependencies, - String key, -) => - json2yaml(_dependenciesToJson(dependencies, key), - yamlStyle: YamlStyle.pubspecYaml); + }; Map _dependenciesToJson( Iterable dependencies, String key, ) => { - key: { - for (final dep - in dependencies.toList() - ..sort((a, b) => a.package().compareTo(b.package()))) - ...dep.toJson() - } + if (dependencies.isNotEmpty) + key: { + for (final dep + in dependencies.toList() + ..sort((a, b) => a.package().compareTo(b.package()))) + ...dep.toJson() + } }; -String _environmentToYaml(Map environment) => json2yaml( - {_Tokens.environment: environment}, - yamlStyle: YamlStyle.pubspecYaml, - ); +Map _environmentToJson(Map environment) => + { + if (environment.isNotEmpty) _Tokens.environment: environment + }; -String _executablesToYaml(Map> executables) => - json2yaml( - { +Map _executablesToJson( + Map> executables, +) => + { + if (executables.isNotEmpty) _Tokens.executables: { for (final entry in executables.entries) entry.key: _nullIfEmpty(entry.value.valueOr(() => '')), } - }, - yamlStyle: YamlStyle.pubspecYaml, - ); + }; PubspecYaml _loadFromYaml(String content) { final jsonMap = diff --git a/pubspec.yaml b/pubspec.yaml index 7f7eeb6..cc899d5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,15 +9,15 @@ environment: dependencies: collection: ^1.15.0 functional_data: ^1.0.0 - json2yaml: ^2.0.0 - meta: ^1.1.0 + json2yaml: ^3.0.0 + meta: ^1.7.0 plain_optional: ^1.0.0 sum_types: ^0.3.0 yaml: ^3.1.0 dev_dependencies: - build_runner: ^2.1.0 + build_runner: ^2.1.4 dependency_validator: ^3.1.0 functional_data_generator: ^1.1.0 sum_types_generator: ^0.3.0 - test: ^1.17.0 + test: ^1.18.0 diff --git a/test/custom_fields_test.dart b/test/custom_fields_test.dart index 5770277..100d13c 100644 --- a/test/custom_fields_test.dart +++ b/test/custom_fields_test.dart @@ -32,8 +32,19 @@ void main() { group('$PubspecYaml.toYamlString', () { test('preserves custom fields data', () { expect( - PubspecYaml.loadFromYamlString(pubspec.toYamlString()).customFields, - pubspec.customFields); + PubspecYaml.loadFromYamlString(pubspec.toYamlString()).customFields, + pubspec.customFields, + ); + }); + }); + }); + + // https: //github.com/alexei-sintotski/pubspec_yaml/issues/31 + group('given pubspec.yaml with nested array', () { + final pubspec = PubspecYaml.loadFromYamlString(pubspecWithNestedArray); + group('$PubspecYaml.toYamlString', () { + test('preserves custom fields formatting', () { + expect(pubspec.toYamlString(), pubspecWithNestedArray); }); }); }); @@ -58,3 +69,16 @@ $customFieldName: - assets/background.png another_custom_field: value '''; + +const pubspecWithNestedArray = ''' +name: pubspecWithNestedArray + +fonts: + - family: larsseit + fonts: + - asset: assets/fonts/larsseit/Larsseit-Bold.ttf + - asset: assets/fonts/larsseit/Larsseit-Medium.ttf + - family: roger_icons + fonts: + - asset: assets/fonts/roger_icons/RogerIcons.ttf +'''; diff --git a/test/dependency_specs/dev_dependencies_test.dart b/test/dependency_specs/dev_dependencies_test.dart index e6d509e..4d432df 100644 --- a/test/dependency_specs/dev_dependencies_test.dart +++ b/test/dependency_specs/dev_dependencies_test.dart @@ -57,5 +57,5 @@ const pubspecWithDevDependency = ''' name: pubspec_yaml dev_dependencies: - $dependency: ">=0.5.0 <0.12.0" + $dependency: '>=0.5.0 <0.12.0' '''; diff --git a/test/dependency_specs/git_package_dependency_spec_test.dart b/test/dependency_specs/git_package_dependency_spec_test.dart index 064267a..a945197 100644 --- a/test/dependency_specs/git_package_dependency_spec_test.dart +++ b/test/dependency_specs/git_package_dependency_spec_test.dart @@ -156,7 +156,7 @@ name: pubspec_yaml dependencies: $dependency: - git: "$url" + git: $url '''; const ref = 'some-branch'; @@ -166,8 +166,8 @@ name: pubspec_yaml dependencies: $dependency: git: - url: "$url" - ref: "$ref" + url: $url + ref: $ref '''; const path = 'path/to/kittens'; @@ -177,6 +177,6 @@ name: pubspec_yaml dependencies: $dependency: git: - url: "$url" + url: $url path: $path '''; diff --git a/test/dependency_specs/hosted_package_dependency_spec_test.dart b/test/dependency_specs/hosted_package_dependency_spec_test.dart index d7fc5dd..0656246 100644 --- a/test/dependency_specs/hosted_package_dependency_spec_test.dart +++ b/test/dependency_specs/hosted_package_dependency_spec_test.dart @@ -211,7 +211,7 @@ dependencies: $dependency: hosted: name: $name - url: "$url" + url: $url '''; const pubspecWithPackageHostedElsewhereWithVersionSpec = ''' @@ -221,6 +221,6 @@ dependencies: $dependency: hosted: name: $name - url: "$url" + url: $url version: $version '''; diff --git a/test/environment_test.dart b/test/environment_test.dart index d931837..4382c2e 100644 --- a/test/environment_test.dart +++ b/test/environment_test.dart @@ -62,6 +62,6 @@ const pubspecWithSdkConstraints = ''' name: pubspec_yaml environment: - $dartSdk: "$dartSdkConstraint" + $dartSdk: '$dartSdkConstraint' $flutterSdk: $flutterSdkConstraint '''; diff --git a/test/executables_test.dart b/test/executables_test.dart index 2781129..bd84257 100644 --- a/test/executables_test.dart +++ b/test/executables_test.dart @@ -75,7 +75,6 @@ const customScriptName = 'new_element'; const executableWithoutCustomScriptName = 'useful-script'; const pubspecYamlWithExecutables = ''' name: pubspec_yaml - executables: $executableWithCustomScriptName: $customScriptName $executableWithoutCustomScriptName: diff --git a/test/metadata_fields/package_authors_test.dart b/test/metadata_fields/package_authors_test.dart index 52fd8b2..5e5477b 100644 --- a/test/metadata_fields/package_authors_test.dart +++ b/test/metadata_fields/package_authors_test.dart @@ -117,7 +117,7 @@ void main() { const author = 'Natalie Weizenbaum '; const pubspecWithSingleAuthor = ''' name: pubspec_yaml -author: "$author" +author: '$author' '''; const pubspecWithoutAuthorSpecification = ''' @@ -128,7 +128,7 @@ const anotherAuthor = 'Abigail Larsen'; const pubspecWithTwoAuthors = ''' name: pubspec_yaml authors: - - "$author" + - '$author' - $anotherAuthor '''; diff --git a/test/metadata_fields/package_documentation_test.dart b/test/metadata_fields/package_documentation_test.dart index 1a21d30..e850278 100644 --- a/test/metadata_fields/package_documentation_test.dart +++ b/test/metadata_fields/package_documentation_test.dart @@ -70,7 +70,7 @@ void main() { const documentation = 'https://example-pet-store.com/newtify/docs'; const pubspecWithDocumentationDefined = ''' name: pubspec_yaml -documentation: "$documentation" +documentation: $documentation '''; const pubspecWithoutDocumentation = ''' diff --git a/test/metadata_fields/package_homepage_test.dart b/test/metadata_fields/package_homepage_test.dart index 68d841f..c9bfa05 100644 --- a/test/metadata_fields/package_homepage_test.dart +++ b/test/metadata_fields/package_homepage_test.dart @@ -68,7 +68,7 @@ void main() { const homepage = 'https://example-pet-store.com/newtify'; const pubspecWithHomepageDefined = ''' name: pubspec_yaml -homepage: "$homepage" +homepage: $homepage '''; const pubspecWithoutHomepage = ''' diff --git a/test/metadata_fields/package_issue_tracker_test.dart b/test/metadata_fields/package_issue_tracker_test.dart index e9aa257..a4818c4 100644 --- a/test/metadata_fields/package_issue_tracker_test.dart +++ b/test/metadata_fields/package_issue_tracker_test.dart @@ -70,7 +70,7 @@ void main() { const issueTracker = 'https://example-pet-store.com/newtify/issues'; const pubspecWithIssueTrackerDefined = ''' name: pubspec_yaml -issue_tracker: "$issueTracker" +issue_tracker: $issueTracker '''; const pubspecWithoutIssueTracker = ''' diff --git a/test/metadata_fields/package_repository_test.dart b/test/metadata_fields/package_repository_test.dart index 496b9d3..9aadee2 100644 --- a/test/metadata_fields/package_repository_test.dart +++ b/test/metadata_fields/package_repository_test.dart @@ -70,7 +70,7 @@ void main() { const repository = 'https://example-pet-store.com/newtify'; const pubspecWithRepositoryDefined = ''' name: pubspec_yaml -repository: "$repository" +repository: $repository '''; const pubspecWithoutRepository = '''