From 4c4310003baa46477f62ab4d85b2016efb87cb96 Mon Sep 17 00:00:00 2001 From: Gorniaky Date: Mon, 12 Oct 2026 12:52:35 -0300 Subject: [PATCH] refactor: update class definitions to use 'const' and improve syntax consistency --- lib/cli/disposable.dart | 2 +- lib/cli/printer/iprinter.dart | 5 +- lib/cli/spin/ispin.dart | 7 +- lib/commands/init.dart | 6 +- lib/services/discloud/user_agent.dart | 8 +- lib/utils/bytes.dart | 36 +++--- lib/utils/signal_wrapper.dart | 56 ++++------ lib/utils/zip.dart | 24 ++-- modules/glob_zipper/lib/src/exception.dart | 4 +- modules/glob_zipper/lib/src/glob_zipper.dart | 32 ++---- modules/glob_zipper/lib/src/zip_progress.dart | 22 ++-- modules/interact/lib/src/input.dart | 8 +- modules/interact/lib/src/theme/theme.dart | 104 ++++++------------ modules/local_store/lib/src/local_store.dart | 2 +- pubspec.yaml | 8 +- scripts/docs/markdown_to_html_converter.dart | 8 +- 16 files changed, 118 insertions(+), 214 deletions(-) diff --git a/lib/cli/disposable.dart b/lib/cli/disposable.dart index 754d850..9f7f0da 100644 --- a/lib/cli/disposable.dart +++ b/lib/cli/disposable.dart @@ -1,5 +1,5 @@ import "dart:async"; -abstract mixin class Disposable { +abstract mixin class const Disposable() { FutureOr dispose(); } diff --git a/lib/cli/printer/iprinter.dart b/lib/cli/printer/iprinter.dart index 6285fe8..5085f59 100644 --- a/lib/cli/printer/iprinter.dart +++ b/lib/cli/printer/iprinter.dart @@ -1,7 +1,10 @@ import "package:discloud/cli/disposable.dart"; +import "package:discloud/cli/printer/console_printer.dart"; import "package:discloud/cli/spin/ispin.dart"; -abstract interface class IPrinter implements Disposable { +abstract interface class const IPrinter() implements Disposable { + factory console({bool isDebug = true}) => ConsolePrinter(isDebug: isDebug); + ISpin spin({String? text, bool start = true}); /// [info] alias diff --git a/lib/cli/spin/ispin.dart b/lib/cli/spin/ispin.dart index 7b242a6..3eb3db3 100644 --- a/lib/cli/spin/ispin.dart +++ b/lib/cli/spin/ispin.dart @@ -1,4 +1,9 @@ -abstract interface class ISpin { +import "package:discloud/cli/spin/cli_spin.dart"; + +abstract interface class const ISpin() { + factory cli({String? text, bool showDuration = false}) => + CLISpin(text: text, showDuration: showDuration); + abstract String text; void fail([String? text]); diff --git a/lib/commands/init.dart b/lib/commands/init.dart index 3a3b3fa..b00852b 100644 --- a/lib/commands/init.dart +++ b/lib/commands/init.dart @@ -74,11 +74,7 @@ final class InitCommand extends Command { } } -class _InitArgs { - const new(this._argResults); - - final ArgResults? _argResults; - +class const _InitArgs(final ArgResults? _argResults) { bool _flag(String name) => _argResults?.flag(name) ?? false; List _multiOption(String n) => _argResults?.multiOption(n) ?? const []; diff --git a/lib/services/discloud/user_agent.dart b/lib/services/discloud/user_agent.dart index a21b51f..6275c3a 100644 --- a/lib/services/discloud/user_agent.dart +++ b/lib/services/discloud/user_agent.dart @@ -2,17 +2,13 @@ import "dart:io"; import "package:discloud/version.dart"; -class UserAgent { +final class const UserAgent() { static const _product = "DiscloudCLI"; - const new(); - String get _version => packageVersion; String get _osName => Platform.operatingSystem; @override - String toString() { - return "$_product/$_version ($_osName)"; - } + String toString() => "$_product/$_version ($_osName)"; } diff --git a/lib/utils/bytes.dart b/lib/utils/bytes.dart index 2099e71..1a95a11 100644 --- a/lib/utils/bytes.dart +++ b/lib/utils/bytes.dart @@ -6,31 +6,25 @@ import "package:intl/intl.dart"; /// binary: KB = 1024 B /// decimal: KB = 1000 B -enum Dimension { +enum Dimension(final int value) { /// KB = 1024 B binary(1024), /// KB = 1000 B - decimal(1000); - - new(this.value); - - final int value; + decimal(1000), } -class Bytes { +class const Bytes( + final N n, { + final Dimension dimension = .binary, + final NumberFormat? numberFormatter, +}) { const factory bits( N n, { Dimension dimension, NumberFormat? numberFormatter, }) = _Bits; - const new(this.n, {this.dimension = .binary, this.numberFormatter}); - - final N n; - final Dimension dimension; - final NumberFormat? numberFormatter; - UnitType get type => .byte; int get index { @@ -158,9 +152,11 @@ class Bytes { int get hashCode => super.hashCode; } -class _Bits extends Bytes { - const new(super.n, {super.dimension = .binary, super.numberFormatter}); - +class const _Bits( + super.n, { + super.dimension = .binary, + super.numberFormatter, +}) extends Bytes { @override UnitType get type => .bit; @@ -294,11 +290,7 @@ enum _ByteUnit { B, KB, MB, GB, TB, PB, EB, ZB, YB } // ignore: constant_identifier_names enum _BitUnit { b, Kb, Mb, Gb, Tb, Pb, Eb, Zb, Yb } -enum UnitType { +enum UnitType(final List units) { bit(_BitUnit.values), - byte(_ByteUnit.values); - - new(this.units); - - final List units; + byte(_ByteUnit.values), } diff --git a/lib/utils/signal_wrapper.dart b/lib/utils/signal_wrapper.dart index eee3055..64a4f08 100644 --- a/lib/utils/signal_wrapper.dart +++ b/lib/utils/signal_wrapper.dart @@ -6,7 +6,7 @@ import "package:discloud/extensions/list.dart"; typedef OnDisposeCallback = FutureOr Function(); typedef OnSignalCallback = FutureOr Function(ProcessSignal signal); -final class _Cancelled implements Exception; +final class const _Cancelled() implements Exception; abstract class SignalWrapper { factory multi( @@ -39,23 +39,12 @@ abstract class SignalWrapper { Future call(Future Function() fn); } -class _MultiSignalWrapper implements SignalWrapper { - const new( - this._signals, { - required this._completer, - this.onSignal, - this.onDispose, - }); - - final Iterable _signals; - final Completer _completer; - - @override - final OnDisposeCallback? onDispose; - - @override - final OnSignalCallback? onSignal; - +class const _MultiSignalWrapper( + final Iterable _signals, { + required final Completer _completer, + @override final OnDisposeCallback? onDispose, + @override final OnSignalCallback? onSignal, +}) implements SignalWrapper { @override bool get signed => _completer.isCompleted; @@ -65,7 +54,9 @@ class _MultiSignalWrapper implements SignalWrapper { final subscriptions = [ for (final signal in _signals) signal.watch().listen((signal) { - if (!_completer.isCompleted) _completer.completeError(_Cancelled()); + if (!_completer.isCompleted) { + _completer.completeError(const _Cancelled()); + } if (onSignal?.call(signal) case final Future f) futures.add(f); }), ]; @@ -84,23 +75,12 @@ class _MultiSignalWrapper implements SignalWrapper { } } -class _SingleSignalWrapper implements SignalWrapper { - const new( - this._signal, { - required this._completer, - this.onDispose, - this.onSignal, - }); - - final ProcessSignal _signal; - final Completer _completer; - - @override - final OnDisposeCallback? onDispose; - - @override - final OnSignalCallback? onSignal; - +class const _SingleSignalWrapper( + final ProcessSignal _signal, { + required final Completer _completer, + @override final OnDisposeCallback? onDispose, + @override final OnSignalCallback? onSignal, +}) implements SignalWrapper { @override bool get signed => _completer.isCompleted; @@ -108,7 +88,9 @@ class _SingleSignalWrapper implements SignalWrapper { Future call(Future Function() fn) async { final futures = []; final subscription = _signal.watch().listen((signal) { - if (!_completer.isCompleted) _completer.completeError(_Cancelled()); + if (!_completer.isCompleted) { + _completer.completeError(const _Cancelled()); + } if (onSignal?.call(signal) case final Future future) futures.add(future); }); diff --git a/lib/utils/zip.dart b/lib/utils/zip.dart index 4eaeb2b..81f6d2d 100644 --- a/lib/utils/zip.dart +++ b/lib/utils/zip.dart @@ -15,19 +15,17 @@ Future zip({ String? password, ZipCallback? onData, OnErrorCallback? onError, -}) { - return GlobZipper.isolated( - directory: directory, - zipfile: zipfile, - globPatterns: glob, - ignorePatterns: ignore, - ignoreFilename: _ignoreFilename, - level: level, - password: password, - onData: onData, - onError: onError, - ); -} +}) => GlobZipper.isolated( + directory: directory, + zipfile: zipfile, + globPatterns: glob, + ignorePatterns: ignore, + ignoreFilename: _ignoreFilename, + level: level, + password: password, + onData: onData, + onError: onError, +); String formatZipProgress(ZipProgress progress, Directory root) { final buffer = StringBuffer("Zipping") diff --git a/modules/glob_zipper/lib/src/exception.dart b/modules/glob_zipper/lib/src/exception.dart index 5207e95..efe3f9d 100644 --- a/modules/glob_zipper/lib/src/exception.dart +++ b/modules/glob_zipper/lib/src/exception.dart @@ -1,5 +1,3 @@ part of "glob_zipper.dart"; -class ZipException implements Exception { - const new(); -} +final class const ZipException() implements Exception; diff --git a/modules/glob_zipper/lib/src/glob_zipper.dart b/modules/glob_zipper/lib/src/glob_zipper.dart index 7cd8f67..e2f7e67 100644 --- a/modules/glob_zipper/lib/src/glob_zipper.dart +++ b/modules/glob_zipper/lib/src/glob_zipper.dart @@ -21,7 +21,17 @@ void _noop(_, _) {} typedef ZipCallback = void Function(ZipProgress progress); typedef OnErrorCallback = void Function(Object error, StackTrace trace); -class GlobZipper { +class const GlobZipper({ + required final Directory directory, + required final File zipfile, + final Iterable globPatterns = const ["**"], + final Iterable ignorePatterns = const .empty(), + final String? ignoreFilename, + + /// Compression level + final int? level, + final String? password, +}) { static Future isolated({ required Directory directory, required File zipfile, @@ -44,26 +54,6 @@ class GlobZipper { onError: onError, ); - const new({ - required this.directory, - required this.zipfile, - this.globPatterns = const ["**"], - this.ignorePatterns = const .empty(), - this.ignoreFilename, - this.level, - this.password, - }); - - final Directory directory; - final File zipfile; - final Iterable globPatterns; - final Iterable ignorePatterns; - final String? ignoreFilename; - - /// Compression level - final int? level; - final String? password; - Future zip({ZipCallback? onData, OnErrorCallback? onError}) async { final fs = FS( directory: directory, diff --git a/modules/glob_zipper/lib/src/zip_progress.dart b/modules/glob_zipper/lib/src/zip_progress.dart index 4015fd3..f8d1fcc 100644 --- a/modules/glob_zipper/lib/src/zip_progress.dart +++ b/modules/glob_zipper/lib/src/zip_progress.dart @@ -1,17 +1,9 @@ part of "glob_zipper.dart"; -class ZipProgress { - const new({ - required this.file, - required this.stat, - required this.current, - required this.processed, - required this.compressed, - }); - - final File file; - final FileStat stat; - final int current; - final int processed; - final int compressed; -} +class const ZipProgress({ + required final File file, + required final FileStat stat, + required final int current, + required final int processed, + required final int compressed, +}); diff --git a/modules/interact/lib/src/input.dart b/modules/interact/lib/src/input.dart index b6c118c..5c81416 100644 --- a/modules/interact/lib/src/input.dart +++ b/modules/interact/lib/src/input.dart @@ -4,13 +4,7 @@ import "package:interact/src/utils/prompt.dart"; /// The error message to be thrown from the [Input] component's /// validator when there is an error. -class ValidationError { - /// Constructs a [ValidationError] with given message. - new(this.message); - - /// The error message. - final String message; -} +class const ValidationError(final String message); /// An input component. class Input extends Component { diff --git a/modules/interact/lib/src/theme/theme.dart b/modules/interact/lib/src/theme/theme.dart index d06c127..8cfbf46 100644 --- a/modules/interact/lib/src/theme/theme.dart +++ b/modules/interact/lib/src/theme/theme.dart @@ -11,78 +11,38 @@ import "package:tint/tint.dart"; typedef StyleFunction = String Function(String); /// The theme to be used by components. -class Theme { - /// Constructs a new [Theme] with all of it's properties. - const new({ - required this.inputPrefix, - required this.inputSuffix, - required this.successPrefix, - required this.successSuffix, - required this.errorPrefix, - required this.hiddenPrefix, - required this.messageStyle, - required this.errorStyle, - required this.hintStyle, - required this.valueStyle, - required this.defaultStyle, - required this.activeItemPrefix, - required this.inactiveItemPrefix, - required this.activeItemStyle, - required this.inactiveItemStyle, - required this.checkedItemPrefix, - required this.uncheckedItemPrefix, - required this.pickedItemPrefix, - required this.unpickedItemPrefix, - required this.showActiveCursor, - required this.progressPrefix, - required this.progressSuffix, - required this.emptyProgress, - required this.filledProgress, - required this.leadingProgress, - required this.emptyProgressStyle, - required this.filledProgressStyle, - required this.leadingProgressStyle, - required this.spinners, - required this.spinningInterval, - }); - - final String inputPrefix; - final String inputSuffix; - final String successPrefix; - final String successSuffix; - final String errorPrefix; - final String hiddenPrefix; - final StyleFunction messageStyle; - final StyleFunction errorStyle; - final StyleFunction hintStyle; - final StyleFunction valueStyle; - final StyleFunction defaultStyle; - - final String activeItemPrefix; - final String inactiveItemPrefix; - final StyleFunction activeItemStyle; - final StyleFunction inactiveItemStyle; - - final String checkedItemPrefix; - final String uncheckedItemPrefix; - - final String pickedItemPrefix; - final String unpickedItemPrefix; - - final bool showActiveCursor; - - final String progressPrefix; - final String progressSuffix; - final String emptyProgress; - final String filledProgress; - final String leadingProgress; - final StyleFunction emptyProgressStyle; - final StyleFunction filledProgressStyle; - final StyleFunction leadingProgressStyle; - - final List spinners; - final int spinningInterval; - +class const Theme({ + required final String inputPrefix, + required final String inputSuffix, + required final String successPrefix, + required final String successSuffix, + required final String errorPrefix, + required final String hiddenPrefix, + required final StyleFunction messageStyle, + required final StyleFunction errorStyle, + required final StyleFunction hintStyle, + required final StyleFunction valueStyle, + required final StyleFunction defaultStyle, + required final String activeItemPrefix, + required final String inactiveItemPrefix, + required final StyleFunction activeItemStyle, + required final StyleFunction inactiveItemStyle, + required final String checkedItemPrefix, + required final String uncheckedItemPrefix, + required final String pickedItemPrefix, + required final String unpickedItemPrefix, + required final bool showActiveCursor, + required final String progressPrefix, + required final String progressSuffix, + required final String emptyProgress, + required final String filledProgress, + required final String leadingProgress, + required final StyleFunction emptyProgressStyle, + required final StyleFunction filledProgressStyle, + required final StyleFunction leadingProgressStyle, + required final List spinners, + required final int spinningInterval, +}) { /// Copy current theme with new properties and create a /// new [Theme] from it. Theme copyWith({ diff --git a/modules/local_store/lib/src/local_store.dart b/modules/local_store/lib/src/local_store.dart index 4d6dede..b8b1049 100644 --- a/modules/local_store/lib/src/local_store.dart +++ b/modules/local_store/lib/src/local_store.dart @@ -6,7 +6,7 @@ import "package:nested_map/nested_map.dart"; part "json_local_store.dart"; -abstract class LocalStore { +abstract interface class const LocalStore() { factory json(String path) = _JSONLocalStore; Future get(String key); diff --git a/pubspec.yaml b/pubspec.yaml index 6cf26ec..8a8cc52 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -6,7 +6,7 @@ publish_to: none repository: https://github.com/discloud/cli-dart environment: - sdk: ^3.13.2 + sdk: ^3.13.5 dependencies: glob_zipper: @@ -31,14 +31,14 @@ dependencies: tint: ^2.0.1 dev_dependencies: - build_runner: ^2.16.1 + build_runner: ^2.16.2 build_version: ^2.1.3 - freezed: ^4.0.1 + freezed: ^4.0.2 inno_bundle: ^0.12.0 interpolation: ^2.1.2 json_serializable: ^6.14.1 lints: ^6.1.0 markdown: ^7.3.1 pub_semver: ^2.2.1 - test: ^1.32.0 + test: ^1.33.0 yaml: ^3.1.4 diff --git a/scripts/docs/markdown_to_html_converter.dart b/scripts/docs/markdown_to_html_converter.dart index e399d73..3cd13cf 100644 --- a/scripts/docs/markdown_to_html_converter.dart +++ b/scripts/docs/markdown_to_html_converter.dart @@ -5,11 +5,9 @@ import "package:path/path.dart"; const _mdExt = ".md"; -final class MarkdownToHtmlConverter { - const new({required this.directory}); - - final Directory directory; - +final class const MarkdownToHtmlConverter({ + required final Directory directory, +}) { Stream<(File, String)> convert({bool recursive = false}) async* { final entities = await directory .list(recursive: recursive, followLinks: false)