diff --git a/moor_generator/lib/src/cli/commands/migrate.dart b/moor_generator/lib/src/cli/commands/migrate.dart index 0b87deca..a5a7e795 100644 --- a/moor_generator/lib/src/cli/commands/migrate.dart +++ b/moor_generator/lib/src/cli/commands/migrate.dart @@ -9,6 +9,7 @@ import 'package:analyzer/dart/ast/visitor.dart'; import 'package:moor_generator/src/utils/string_escaper.dart'; import 'package:path/path.dart' as p; import 'package:sqlparser/sqlparser.dart' hide AnalysisContext, StringLiteral; +import 'package:yaml/yaml.dart'; import 'package:yaml_edit/yaml_edit.dart'; import '../cli.dart'; @@ -100,7 +101,44 @@ class MigrateCommand extends MoorCommand { Future _transformBuildYaml(File file) async {} - Future _transformPubspec(File file) async {} + Future _transformPubspec(File file) async { + dynamic originalPubspec; + YamlEditor editor; + + try { + final content = await file.readAsString(); + originalPubspec = loadYaml(content, sourceUrl: file.uri); + editor = YamlEditor(content); + } on Exception { + cli.logger.warning('Could not parse ${file.path}, ignoring...'); + } + + const newPackages = {'moor': 'drift', 'moor_generator': 'drift_dev'}; + + void replaceIn(String key) { + if (originalPubspec is! Map) return; + + final dependencyBlock = originalPubspec[key]; + if (dependencyBlock is! Map) return; + + final block = dependencyBlock as Map; + for (final package in newPackages.keys) { + if (block.containsKey(package)) { + final newPackage = newPackages[package]; + + editor + ..remove([key, package]) + ..update([key, newPackage], block[package]); + } + } + } + + replaceIn('dependencies'); + replaceIn('dev_dependencies'); + replaceIn('dependency_overrides'); + + await file.writeAsString(editor.toString()); + } } class _Moor2DriftDartRewriter extends GeneralizingAstVisitor { diff --git a/moor_generator/pubspec.yaml b/moor_generator/pubspec.yaml index a6dfb61c..b0e22060 100644 --- a/moor_generator/pubspec.yaml +++ b/moor_generator/pubspec.yaml @@ -22,6 +22,7 @@ dependencies: logging: '>=0.11.0 <2.0.0' cli_util: '>=0.2.0 <0.4.0' yaml_edit: ^2.0.1 + yaml: ^3.1.0 # Moor-specific analysis and apis moor: ^4.4.0 diff --git a/moor_generator/test/cli/migrate_test.dart b/moor_generator/test/cli/migrate_test.dart index 7a1ddaca..12c7323e 100644 --- a/moor_generator/test/cli/migrate_test.dart +++ b/moor_generator/test/cli/migrate_test.dart @@ -101,6 +101,44 @@ import 'package:drift/src/some/internal/file.dart'; export 'package:drift/web.dart'; export 'package:drift/native.dart'; +'''), + ]).validate(); + }); + + _test('updates pubspec.yaml', () async { + await _setup(const [], pubspec: ''' +name: app + +environment: + sdk: ^2.12.0 + +dependencies: + moor: ^1.2.3 + something_else: + +# comment +dev_dependencies: + moor_generator: ^4.5.6 + build_runner: ^2.0.0 +'''); + + await _apply(); + + await d.dir('app', [ + d.file('pubspec.yaml', ''' +name: app + +environment: + sdk: ^2.12.0 + +dependencies: + drift: ^1.2.3 + something_else: + +# comment +dev_dependencies: + build_runner: ^2.0.0 + drift_dev: ^4.5.6 '''), ]).validate(); });