Add `Version.canonicalizedVersion` to help scrub leading zeros. (dart-lang/pub_semver#50)
diff --git a/pkgs/pub_semver/CHANGELOG.md b/pkgs/pub_semver/CHANGELOG.md index d53b950..a2d5753 100644 --- a/pkgs/pub_semver/CHANGELOG.md +++ b/pkgs/pub_semver/CHANGELOG.md
@@ -1,4 +1,6 @@ -# 2.0.1-dev +# 2.1.0 +- Added `Version.canonicalizedVersion` to help scrub leading zeros and highlight + that `Version.toString()` preserves leading zeros. - Annotated `Version` with `@sealed` to discourage users from implementing the interface.
diff --git a/pkgs/pub_semver/lib/src/version.dart b/pkgs/pub_semver/lib/src/version.dart index 73402af..ba6ce8f 100644 --- a/pkgs/pub_semver/lib/src/version.dart +++ b/pkgs/pub_semver/lib/src/version.dart
@@ -321,9 +321,35 @@ } } + /// Get non-canonical string representation of this [Version]. + /// + /// If created with [Version.parse], the string from which the version was + /// parsed is returned. Unlike the [canonicalizedVersion] this preserves + /// artifacts such as leading zeros. @override String toString() => _text; + /// Get a canonicalized string representation of this [Version]. + /// + /// Unlike [Version.toString()] this always returns a canonical string + /// representation of this [Version]. + /// + /// **Example** + /// ```dart + /// final v = Version.parse('01.02.03-01.dev+pre.02'); + /// + /// assert(v.toString() == '01.02.03-01.dev+pre.02'); + /// assert(v.canonicalizedVersion == '1.2.3-1.dev+pre.2'); + /// assert(Version.parse(v.canonicalizedVersion) == v); + /// ``` + String get canonicalizedVersion => Version( + major, + minor, + patch, + pre: preRelease.isNotEmpty ? preRelease.join('.') : null, + build: build.isNotEmpty ? build.join('.') : null, + ).toString(); + /// Compares a dot-separated component of two versions. /// /// This is used for the pre-release and build version parts. This follows
diff --git a/pkgs/pub_semver/pubspec.yaml b/pkgs/pub_semver/pubspec.yaml index fce9bb0..214f0cd 100644 --- a/pkgs/pub_semver/pubspec.yaml +++ b/pkgs/pub_semver/pubspec.yaml
@@ -1,5 +1,5 @@ name: pub_semver -version: 2.0.1-dev +version: 2.1.0 description: >- Versions and version constraints implementing pub's versioning policy. This is very similar to vanilla semver, with a few corner cases.
diff --git a/pkgs/pub_semver/test/version_test.dart b/pkgs/pub_semver/test/version_test.dart index 6ff4b3e..467d0b7 100644 --- a/pkgs/pub_semver/test/version_test.dart +++ b/pkgs/pub_semver/test/version_test.dart
@@ -330,6 +330,36 @@ }); }); + group('canonicalizedVersion', () { + test('returns version string', () { + expect(Version(0, 0, 0).canonicalizedVersion, equals('0.0.0')); + expect(Version(12, 34, 56).canonicalizedVersion, equals('12.34.56')); + + expect(Version(1, 2, 3, pre: 'alpha.1').canonicalizedVersion, + equals('1.2.3-alpha.1')); + expect(Version(1, 2, 3, pre: 'x.7.z-92').canonicalizedVersion, + equals('1.2.3-x.7.z-92')); + + expect(Version(1, 2, 3, build: 'build.1').canonicalizedVersion, + equals('1.2.3+build.1')); + expect(Version(1, 2, 3, pre: 'pre', build: 'bui').canonicalizedVersion, + equals('1.2.3-pre+bui')); + }); + + test('discards leading zeroes', () { + expect(Version.parse('001.02.0003-01.dev+pre.002').canonicalizedVersion, + equals('1.2.3-1.dev+pre.2')); + }); + + test('example from documentation', () { + final v = Version.parse('01.02.03-01.dev+pre.02'); + + assert(v.toString() == '01.02.03-01.dev+pre.02'); + assert(v.canonicalizedVersion == '1.2.3-1.dev+pre.2'); + assert(Version.parse(v.canonicalizedVersion) == v); + }); + }); + group('primary', () { test('single', () { expect(