| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// Handles version numbers, following the [Semantic Versioning][semver] spec. | 5 /// Handles version numbers, following the [Semantic Versioning][semver] spec. |
| 6 /// | 6 /// |
| 7 /// [semver]: http://semver.org/ | 7 /// [semver]: http://semver.org/ |
| 8 library version; | 8 library version; |
| 9 | 9 |
| 10 import 'dart:math'; | 10 import 'dart:math'; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 } | 50 } |
| 51 | 51 |
| 52 /// Creates a new [Version] by parsing [text]. | 52 /// Creates a new [Version] by parsing [text]. |
| 53 factory Version.parse(String text) { | 53 factory Version.parse(String text) { |
| 54 final match = _PARSE_REGEX.firstMatch(text); | 54 final match = _PARSE_REGEX.firstMatch(text); |
| 55 if (match == null) { | 55 if (match == null) { |
| 56 throw new FormatException('Could not parse "$text".'); | 56 throw new FormatException('Could not parse "$text".'); |
| 57 } | 57 } |
| 58 | 58 |
| 59 try { | 59 try { |
| 60 int major = parseInt(match[1]); | 60 int major = int.parse(match[1]); |
| 61 int minor = parseInt(match[2]); | 61 int minor = int.parse(match[2]); |
| 62 int patch = parseInt(match[3]); | 62 int patch = int.parse(match[3]); |
| 63 | 63 |
| 64 String preRelease = match[5]; | 64 String preRelease = match[5]; |
| 65 String build = match[8]; | 65 String build = match[8]; |
| 66 | 66 |
| 67 return new Version(major, minor, patch, pre: preRelease, build: build); | 67 return new Version(major, minor, patch, pre: preRelease, build: build); |
| 68 } on FormatException catch (ex) { | 68 } on FormatException catch (ex) { |
| 69 throw new FormatException('Could not parse "$text".'); | 69 throw new FormatException('Could not parse "$text".'); |
| 70 } | 70 } |
| 71 } | 71 } |
| 72 | 72 |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 return aPart.compareTo(bPart); | 183 return aPart.compareTo(bPart); |
| 184 } | 184 } |
| 185 } | 185 } |
| 186 } | 186 } |
| 187 } | 187 } |
| 188 } | 188 } |
| 189 | 189 |
| 190 /// Splits a string of dot-delimited identifiers into their component parts. | 190 /// Splits a string of dot-delimited identifiers into their component parts. |
| 191 /// Identifiers that are numeric are converted to numbers. | 191 /// Identifiers that are numeric are converted to numbers. |
| 192 List _splitParts(String text) { | 192 List _splitParts(String text) { |
| 193 return text.split('.').map((part) { | 193 return text.split('.').mappedBy((part) { |
| 194 try { | 194 try { |
| 195 return parseInt(part); | 195 return int.parse(part); |
| 196 } on FormatException catch (ex) { | 196 } on FormatException catch (ex) { |
| 197 // Not a number. | 197 // Not a number. |
| 198 return part; | 198 return part; |
| 199 } | 199 } |
| 200 }); | 200 }).toList(); |
| 201 } | 201 } |
| 202 } | 202 } |
| 203 | 203 |
| 204 /// A [VersionConstraint] is a predicate that can determine whether a given | 204 /// A [VersionConstraint] is a predicate that can determine whether a given |
| 205 /// version is valid or not. For example, a ">= 2.0.0" constraint allows any | 205 /// version is valid or not. For example, a ">= 2.0.0" constraint allows any |
| 206 /// version that is "2.0.0" or greater. Version objects themselves implement | 206 /// version that is "2.0.0" or greater. Version objects themselves implement |
| 207 /// this to match a specific version. | 207 /// this to match a specific version. |
| 208 abstract class VersionConstraint { | 208 abstract class VersionConstraint { |
| 209 /// A [VersionConstraint] that allows no versions: i.e. the empty set. | 209 /// A [VersionConstraint] that allows no versions: i.e. the empty set. |
| 210 factory VersionConstraint.empty() => const _EmptyVersion(); | 210 factory VersionConstraint.empty() => const _EmptyVersion(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 234 } | 234 } |
| 235 | 235 |
| 236 return new VersionConstraint.intersection(constraints); | 236 return new VersionConstraint.intersection(constraints); |
| 237 } | 237 } |
| 238 | 238 |
| 239 /// Creates a new version constraint that is the intersection of | 239 /// Creates a new version constraint that is the intersection of |
| 240 /// [constraints]. It will only allow versions that all of those constraints | 240 /// [constraints]. It will only allow versions that all of those constraints |
| 241 /// allow. If constraints is empty, then it returns a VersionConstraint that | 241 /// allow. If constraints is empty, then it returns a VersionConstraint that |
| 242 /// allows all versions. | 242 /// allows all versions. |
| 243 factory VersionConstraint.intersection( | 243 factory VersionConstraint.intersection( |
| 244 Collection<VersionConstraint> constraints) { | 244 Iterable<VersionConstraint> constraints) { |
| 245 var constraint = new VersionRange(); | 245 var constraint = new VersionRange(); |
| 246 for (var other in constraints) { | 246 for (var other in constraints) { |
| 247 constraint = constraint.intersect(other); | 247 constraint = constraint.intersect(other); |
| 248 } | 248 } |
| 249 return constraint; | 249 return constraint; |
| 250 } | 250 } |
| 251 | 251 |
| 252 /// Returns `true` if this constraint allows no versions. | 252 /// Returns `true` if this constraint allows no versions. |
| 253 bool get isEmpty; | 253 bool get isEmpty; |
| 254 | 254 |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 | 412 |
| 413 class _EmptyVersion implements VersionConstraint { | 413 class _EmptyVersion implements VersionConstraint { |
| 414 const _EmptyVersion(); | 414 const _EmptyVersion(); |
| 415 | 415 |
| 416 bool get isEmpty => true; | 416 bool get isEmpty => true; |
| 417 bool get isAny => false; | 417 bool get isAny => false; |
| 418 bool allows(Version other) => false; | 418 bool allows(Version other) => false; |
| 419 VersionConstraint intersect(VersionConstraint other) => this; | 419 VersionConstraint intersect(VersionConstraint other) => this; |
| 420 String toString() => '<empty>'; | 420 String toString() => '<empty>'; |
| 421 } | 421 } |
| OLD | NEW |