relatica/lib/models/friendica_version.dart

193 wiersze
5.1 KiB
Dart

//Unknown
final FriendicaVersion unknown = FriendicaVersion(DateTime(1970, 01));
class FriendicaVersion implements Comparable<FriendicaVersion> {
final DateTime releaseDate;
final String extra;
FriendicaVersion(this.releaseDate, {this.extra = ''});
factory FriendicaVersion.fromMastodonVersionString(String? text) {
if (text == null) {
return unknown;
}
final elements = text.split(RegExp('\\s+'));
final versionString = elements.last.substring(0, elements.last.length - 1);
return FriendicaVersion.fromVersionString(versionString);
}
factory FriendicaVersion.fromVersionString(String? text) {
if (text == null) {
return unknown;
}
final elements = text.trim().split('.');
if (elements.length < 2) {
return unknown;
}
final year = int.tryParse(elements[0]);
if (year == null) {
return unknown;
}
if (year < 2018) {
return unknown;
}
int? month = int.tryParse(elements[1]);
String extra = '';
if (month == null) {
final secondaryFields = elements[1].split(RegExp('\\D+'));
month = int.tryParse(secondaryFields.first) ?? 1;
extra = secondaryFields.sublist(1).join('-');
}
return FriendicaVersion(DateTime(year, month), extra: extra);
}
bool operator >(FriendicaVersion other) {
return compareTo(other) > 0;
}
bool operator >=(FriendicaVersion other) {
return compareTo(other) >= 0;
}
bool operator <(FriendicaVersion other) {
return compareTo(other) < 0;
}
bool operator <=(FriendicaVersion other) {
return compareTo(other) <= 0;
}
@override
int compareTo(FriendicaVersion other) {
if (releaseDate == other.releaseDate) {
final subVersion = int.tryParse(extra);
final otherSubVersion = int.tryParse(other.extra);
if (subVersion == null && otherSubVersion == null) {
return extra.compareTo(other.extra);
}
if (subVersion == null && otherSubVersion != null) {
return -1;
}
if (subVersion != null && otherSubVersion == null) {
return 1;
}
return subVersion!.compareTo(otherSubVersion!);
}
return releaseDate.compareTo(other.releaseDate);
}
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is FriendicaVersion &&
runtimeType == other.runtimeType &&
releaseDate == other.releaseDate &&
extra == other.extra;
@override
int get hashCode => releaseDate.hashCode ^ extra.hashCode;
@override
String toString() {
return 'FriendicaVersion{releaseDate: $releaseDate, extra: $extra}';
}
String toVersionString() {
final monthString = releaseDate.month.toString().padLeft(2, '0');
final extraString = extra.isEmpty ? '' : '-$extra';
return '${releaseDate.year}.$monthString$extraString';
}
}
// Known Versions
// 2018 Versions
final FriendicaVersion v2018_05 = FriendicaVersion(DateTime(2018, 05));
final FriendicaVersion v2018_09 = FriendicaVersion(DateTime(2018, 09));
// 2019 Versions
final FriendicaVersion v2019_01 = FriendicaVersion(DateTime(2019, 01));
final FriendicaVersion v2019_03 = FriendicaVersion(DateTime(2019, 03));
final FriendicaVersion v2019_04 = FriendicaVersion(DateTime(2019, 04));
final FriendicaVersion v2019_06 = FriendicaVersion(DateTime(2019, 06));
final FriendicaVersion v2019_09 = FriendicaVersion(DateTime(2019, 09));
final FriendicaVersion v2019_12 = FriendicaVersion(DateTime(2019, 12));
// 2020 Versions
final FriendicaVersion v2020_03 = FriendicaVersion(DateTime(2020, 03));
final FriendicaVersion v2020_07 = FriendicaVersion(DateTime(2020, 07));
final FriendicaVersion v2020_07_01 = FriendicaVersion(
DateTime(2020, 07),
extra: '1',
);
final FriendicaVersion v2020_09 = FriendicaVersion(DateTime(2020, 09));
final FriendicaVersion v2020_09_01 = FriendicaVersion(
DateTime(2020, 09),
extra: '1',
);
// 2021 Versions
final FriendicaVersion v2021_01 = FriendicaVersion(DateTime(2021, 01));
final FriendicaVersion v2021_04 = FriendicaVersion(DateTime(2021, 04));
final FriendicaVersion v2021_07 = FriendicaVersion(DateTime(2021, 07));
final FriendicaVersion v2021_09 = FriendicaVersion(DateTime(2021, 09));
// 2022 Versions
final FriendicaVersion v2022_02 = FriendicaVersion(DateTime(2022, 02));
final FriendicaVersion v2022_03 = FriendicaVersion(DateTime(2022, 03));
final FriendicaVersion v2022_06 = FriendicaVersion(DateTime(2022, 06));
final FriendicaVersion v2022_10 = FriendicaVersion(DateTime(2022, 10));
final FriendicaVersion v2022_12 = FriendicaVersion(DateTime(2022, 12));
// 2023 Versions
final FriendicaVersion v2023_01 = FriendicaVersion(DateTime(2023, 01));
final FriendicaVersion v2023_04 = FriendicaVersion(DateTime(2023, 04));
final knownFriendicaVersions = [
// 2018 Versions
v2018_05,
v2018_05,
v2018_09,
// 2019 Versions
v2019_01,
v2019_03,
v2019_04,
v2019_06,
v2019_09,
v2019_12,
// 2020 Versions
v2020_03,
v2020_07_01,
v2020_09,
v2020_09_01,
// 2021 Versions
v2021_01,
v2021_04,
v2021_07,
v2021_09,
// 2022 Versions
v2022_02,
v2022_03,
v2022_06,
v2022_10,
v2022_12,
// 2023 Versions
v2023_01,
v2023_04,
];
FriendicaVersion latestVersion() => knownFriendicaVersions.last;