Skip to content

chore: flutter version packages and handle immutability ,nullability #716

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,9 @@ app.*.map.json
# Others
/vendor/bundle/ruby/
/coverage/

# Generated files
*.g.dart
*.freezed.dart
*.gr.dart
*.gen.dart
2 changes: 1 addition & 1 deletion analysis_options.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -169,4 +169,4 @@ dart_code_metrics:
formatter:
indent: 0
line-length: 100
cascading-widget-extensions: false
cascading-widget-extensions: false
52 changes: 35 additions & 17 deletions flatpak/scripts/flatpak_packager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ void main(List<String> arguments) async {
'You must run this script with a metadata file argument, using the --meta flag.');
}
if (arguments.length == metaIndex + 1) {
throw Exception('The --meta flag must be followed by the path to the metadata file.');
throw Exception(
'The --meta flag must be followed by the path to the metadata file.');
}

final metaFile = File(arguments[metaIndex + 1]);
Expand All @@ -39,26 +40,34 @@ void main(List<String> arguments) async {
final fetchFromGithub = arguments.contains('--github');

final addTodaysVersionIndex = arguments.indexOf('--addTodaysVersion');
if (addTodaysVersionIndex != -1 && arguments.length == addTodaysVersionIndex + 1) {
throw Exception('The --addTodaysVersion flag must be followed by the version name.');
if (addTodaysVersionIndex != -1 &&
arguments.length == addTodaysVersionIndex + 1) {
throw Exception(
'The --addTodaysVersion flag must be followed by the version name.');
}

final addedTodaysVersion =
addTodaysVersionIndex != -1 ? arguments[addTodaysVersionIndex + 1] : null;

// GENERATE PACKAGE

final meta = FlatpakMeta.fromJson(metaFile, skipLocalReleases: fetchFromGithub);
final meta =
FlatpakMeta.fromJson(metaFile, skipLocalReleases: fetchFromGithub);

final outputDir = Directory('${Directory.current.path}/flatpak_generator_exports');
final outputDir =
Directory('${Directory.current.path}/flatpak_generator_exports');
await outputDir.create();

final packageGenerator = PackageGenerator(
inputDir: metaFile.parent, meta: meta, addedTodaysVersion: addedTodaysVersion);
inputDir: metaFile.parent,
meta: meta,
addedTodaysVersion: addedTodaysVersion);

await packageGenerator.generatePackage(
outputDir,
await PackageGenerator.runningOnARM() ? CPUArchitecture.aarch64 : CPUArchitecture.x86_64,
await PackageGenerator.runningOnARM()
? CPUArchitecture.aarch64
: CPUArchitecture.x86_64,
fetchFromGithub);
}

Expand All @@ -67,10 +76,13 @@ class PackageGenerator {
final FlatpakMeta meta;
final String? addedTodaysVersion;

PackageGenerator({required this.inputDir, required this.meta, required this.addedTodaysVersion});
PackageGenerator(
{required this.inputDir,
required this.meta,
required this.addedTodaysVersion});

Future<void> generatePackage(
Directory outputDir, CPUArchitecture arch, bool fetchReleasesFromGithub) async {
Future<void> generatePackage(Directory outputDir, CPUArchitecture arch,
bool fetchReleasesFromGithub) async {
final tempDir = await outputDir.createTemp('flutter_generator_temp');
final appId = meta.appId;

Expand Down Expand Up @@ -122,12 +134,15 @@ class PackageGenerator {
final destDir = Directory('${tempDir.path}/bin');
await destDir.create();

final baseFilename = '${meta.lowercaseAppName}-linux-${arch.flatpakArchCode}';
final baseFilename =
'${meta.lowercaseAppName}-linux-${arch.flatpakArchCode}';
final packagePath = '${outputDir.absolute.path}/$baseFilename.tar.gz';
final shaPath = '${outputDir.absolute.path}/$baseFilename.sha256';

await Process.run('cp', ['-r', '${buildDir.absolute.path}/.', destDir.absolute.path]);
await Process.run('tar', ['-czvf', packagePath, '.'], workingDirectory: tempDir.absolute.path);
await Process.run(
'cp', ['-r', '${buildDir.absolute.path}/.', destDir.absolute.path]);
await Process.run('tar', ['-czvf', packagePath, '.'],
workingDirectory: tempDir.absolute.path);

print('Generated $packagePath');

Expand All @@ -150,10 +165,13 @@ class PackageGenerator {

// updates releases in ${appName}.metainfo.xml
class AppStreamModifier {
static String replaceVersions(String origAppStreamContent, List<Release> versions) {
final joinedReleases =
versions.map((v) => '\t\t<release version="${v.version}" date="${v.date}" />').join('\n');
final releasesSection = '<releases>\n$joinedReleases\n\t</releases>'; //TODO check this
static String replaceVersions(
String origAppStreamContent, List<Release> versions) {
final joinedReleases = versions
.map((v) => '\t\t<release version="${v.version}" date="${v.date}" />')
.join('\n');
final releasesSection =
'<releases>\n$joinedReleases\n\t</releases>'; //TODO check this
if (origAppStreamContent.contains('<releases')) {
return origAppStreamContent
.replaceAll('\n', '<~>')
Expand Down
65 changes: 43 additions & 22 deletions flatpak/scripts/flatpak_shared.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,9 @@ class Icon {
_fileExtension = path.split('.').last;
}

String getFilename(String appId) =>
(type == _symbolicType) ? '$appId-symbolic.$_fileExtension' : '$appId.$_fileExtension';
String getFilename(String appId) => (type == _symbolicType)
? '$appId-symbolic.$_fileExtension'
: '$appId.$_fileExtension';
}

class GithubReleases {
Expand Down Expand Up @@ -74,7 +75,8 @@ class GithubReleases {
final releaseJsonContent = (await http.get(Uri(
scheme: 'https',
host: 'api.github.com',
path: '/repos/$githubReleaseOrganization/$githubReleaseProject/releases')))
path:
'/repos/$githubReleaseOrganization/$githubReleaseProject/releases')))
.body;
final decodedJson = jsonDecode(releaseJsonContent) as List;

Expand All @@ -85,19 +87,23 @@ class GithubReleases {
await Future.forEach<dynamic>(decodedJson, (dynamic releaseDynamic) async {
final releaseMap = releaseDynamic as Map;

final releaseDateAndTime = DateTime.parse(releaseMap['published_at'] as String);
final releaseDateString = releaseDateAndTime.toIso8601String().split('T').first;
final releaseDateAndTime =
DateTime.parse(releaseMap['published_at'] as String);
final releaseDateString =
releaseDateAndTime.toIso8601String().split('T').first;

if (latestReleaseAssetDate == null ||
(latestReleaseAssetDate?.compareTo(releaseDateAndTime) == -1)) {
final assets = await _parseGithubReleaseAssets(releaseMap['assets'] as List);
final assets =
await _parseGithubReleaseAssets(releaseMap['assets'] as List);
if (assets != null) {
_latestReleaseAssets = assets;
latestReleaseAssetDate = releaseDateAndTime;
}
}

releases.add(Release(version: releaseMap['name'] as String, date: releaseDateString));
releases.add(Release(
version: releaseMap['name'] as String, date: releaseDateString));
});

if (releases.isNotEmpty || canBeEmpty) {
Expand All @@ -118,7 +124,8 @@ class GithubReleases {
final downloadUrl = amMap['browser_download_url'] as String;
final filename = amMap['name'] as String;
final fileExtension = filename.substring(filename.indexOf('.') + 1);
final filenameWithoutExtension = filename.substring(0, filename.indexOf('.'));
final filenameWithoutExtension =
filename.substring(0, filename.indexOf('.'));

final arch = filenameWithoutExtension.endsWith('aarch64')
? CPUArchitecture.aarch64
Expand Down Expand Up @@ -214,7 +221,8 @@ class FlatpakMeta {
: _localReleases = localReleases,
_localReleaseAssets = localReleaseAssets {
if (githubReleaseOrganization != null && githubReleaseProject != null) {
_githubReleases = GithubReleases(githubReleaseOrganization!, githubReleaseProject!);
_githubReleases =
GithubReleases(githubReleaseOrganization!, githubReleaseProject!);
}
}

Expand All @@ -223,17 +231,20 @@ class FlatpakMeta {
final releases = List<Release>.empty(growable: true);
if (addedTodaysVersion != null) {
releases.add(Release(
version: addedTodaysVersion, date: DateTime.now().toIso8601String().split('T').first));
version: addedTodaysVersion,
date: DateTime.now().toIso8601String().split('T').first));
}
if (fetchReleasesFromGithub) {
if (_githubReleases == null) {
throw Exception(
'Metadata must include Github repository info if fetching releases from Github.');
}
releases.addAll(await _githubReleases!.getReleases(addedTodaysVersion != null));
releases.addAll(
await _githubReleases!.getReleases(addedTodaysVersion != null));
} else {
if (_localReleases == null && addedTodaysVersion == null) {
throw Exception('Metadata must include releases if not fetching releases from Github.');
throw Exception(
'Metadata must include releases if not fetching releases from Github.');
}
if (_localReleases?.isNotEmpty ?? false) {
releases.addAll(_localReleases!);
Expand All @@ -242,7 +253,8 @@ class FlatpakMeta {
return releases;
}

Future<List<ReleaseAsset>?> getLatestReleaseAssets(bool fetchReleasesFromGithub) async {
Future<List<ReleaseAsset>?> getLatestReleaseAssets(
bool fetchReleasesFromGithub) async {
if (fetchReleasesFromGithub) {
if (_githubReleases == null) {
throw Exception(
Expand All @@ -251,7 +263,8 @@ class FlatpakMeta {
return _githubReleases!.getLatestReleaseAssets();
} else {
if (_localReleases == null) {
throw Exception('Metadata must include releases if not fetching releases from Github.');
throw Exception(
'Metadata must include releases if not fetching releases from Github.');
}
return _localReleaseAssets;
}
Expand All @@ -263,20 +276,24 @@ class FlatpakMeta {
return FlatpakMeta(
appId: json['appId'] as String,
lowercaseAppName: json['lowercaseAppName'] as String,
githubReleaseOrganization: json['githubReleaseOrganization'] as String?,
githubReleaseOrganization:
json['githubReleaseOrganization'] as String?,
githubReleaseProject: json['githubReleaseProject'] as String?,
localReleases: skipLocalReleases
? null
: (json['localReleases'] as List?)?.map((dynamic r) {
final rMap = r as Map;
return Release(version: rMap['version'] as String, date: rMap['date'] as String);
return Release(
version: rMap['version'] as String,
date: rMap['date'] as String);
}).toList(),
localReleaseAssets: skipLocalReleases
? null
: (json['localReleaseAssets'] as List?)?.map((dynamic ra) {
final raMap = ra as Map;
final archString = raMap['arch'] as String;
final arch = (archString == CPUArchitecture.x86_64.flatpakArchCode)
final arch = (archString ==
CPUArchitecture.x86_64.flatpakArchCode)
? CPUArchitecture.x86_64
: (archString == CPUArchitecture.aarch64.flatpakArchCode)
? CPUArchitecture.aarch64
Expand All @@ -285,10 +302,11 @@ class FlatpakMeta {
throw Exception(
'Architecture must be either "${CPUArchitecture.x86_64.flatpakArchCode}" or "${CPUArchitecture.aarch64.flatpakArchCode}"');
}
final tarballFile =
File('${jsonFile.parent.path}/${raMap['tarballPath'] as String}');
final tarballFile = File(
'${jsonFile.parent.path}/${raMap['tarballPath'] as String}');
final tarballPath = tarballFile.absolute.path;
final preShasum = Process.runSync('shasum', ['-a', '256', tarballPath]);
final preShasum =
Process.runSync('shasum', ['-a', '256', tarballPath]);
final shasum = preShasum.stdout.toString().split(' ').first;
if (preShasum.exitCode != 0) {
throw Exception(preShasum.stderr);
Expand All @@ -303,14 +321,17 @@ class FlatpakMeta {
appStreamPath: json['appStreamPath'] as String,
desktopPath: json['desktopPath'] as String,
icons: (json['icons'] as Map).entries.map((mapEntry) {
return Icon(type: mapEntry.key as String, path: mapEntry.value as String);
return Icon(
type: mapEntry.key as String, path: mapEntry.value as String);
}).toList(),
freedesktopRuntime: json['freedesktopRuntime'] as String,
buildCommandsAfterUnpack: (json['buildCommandsAfterUnpack'] as List?)
?.map((dynamic bc) => bc as String)
.toList(),
extraModules: json['extraModules'] as List?,
finishArgs: (json['finishArgs'] as List).map((dynamic fa) => fa as String).toList());
finishArgs: (json['finishArgs'] as List)
.map((dynamic fa) => fa as String)
.toList());
} catch (e) {
throw Exception('Could not parse JSON file, due to this error:\n$e');
}
Expand Down
21 changes: 14 additions & 7 deletions flatpak/scripts/manifest_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,8 @@ void main(List<String> arguments) async {
'You must run this script with a metadata file argument, using the --meta flag.');
}
if (arguments.length == metaIndex + 1) {
throw Exception('The --meta flag must be followed by the path to the metadata file.');
throw Exception(
'The --meta flag must be followed by the path to the metadata file.');
}

final metaFile = File(arguments[metaIndex + 1]);
Expand All @@ -36,19 +37,23 @@ void main(List<String> arguments) async {

final fetchFromGithub = arguments.contains('--github');

final meta = FlatpakMeta.fromJson(metaFile, skipLocalReleases: fetchFromGithub);
final meta =
FlatpakMeta.fromJson(metaFile, skipLocalReleases: fetchFromGithub);

final outputDir = Directory('${Directory.current.path}/flatpak_generator_exports');
final outputDir =
Directory('${Directory.current.path}/flatpak_generator_exports');
outputDir.createSync();

final manifestGenerator = FlatpakManifestGenerator(meta);
final manifestContent = await manifestGenerator.generateFlatpakManifest(fetchFromGithub);
final manifestContent =
await manifestGenerator.generateFlatpakManifest(fetchFromGithub);
final manifestPath = '${outputDir.path}/${meta.appId}.json';
final manifestFile = File(manifestPath);
manifestFile.writeAsStringSync(manifestContent);
print('Generated $manifestPath');

final flathubJsonContent = await manifestGenerator.generateFlathubJson(fetchFromGithub);
final flathubJsonContent =
await manifestGenerator.generateFlathubJson(fetchFromGithub);
if (flathubJsonContent != null) {
final flathubJsonPath = '${outputDir.path}/flathub.json';
final flathubJsonFile = File(flathubJsonPath);
Expand Down Expand Up @@ -127,7 +132,8 @@ class FlatpakManifestGenerator {

const encoder = JsonEncoder.withIndent(' ');

final onlyArchListInput = fetchFromGithub ? _githubArchSupport! : _localArchSupport!;
final onlyArchListInput =
fetchFromGithub ? _githubArchSupport! : _localArchSupport!;

final onlyArchList = List<String>.empty(growable: true);
for (final e in onlyArchListInput.entries) {
Expand All @@ -143,7 +149,8 @@ class FlatpakManifestGenerator {
}
}

void _lazyGenerateArchSupportMap(bool fetchFromGithub, List<ReleaseAsset> assets) {
void _lazyGenerateArchSupportMap(
bool fetchFromGithub, List<ReleaseAsset> assets) {
if (fetchFromGithub) {
if (_githubArchSupport == null) {
_githubArchSupport = <CPUArchitecture, bool>{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ import '../test_data/workouts.dart';

Widget createDashboardScreen({locale = 'en'}) {
final mockWorkoutProvider = MockWorkoutPlansProvider();
when(mockWorkoutProvider.activePlan).thenReturn(getWorkout(exercises: getScreenshotExercises()));
when(mockWorkoutProvider.activePlan)
.thenReturn(getWorkout(exercises: getScreenshotExercises()));

final Map<String, dynamic> logs = {
'results': [
Expand All @@ -38,19 +39,22 @@ Widget createDashboardScreen({locale = 'en'}) {
},
],
};
when(mockWorkoutProvider.fetchSessionData()).thenAnswer((a) => Future.value(logs));
when(mockWorkoutProvider.fetchSessionData())
.thenAnswer((a) => Future.value(logs));

final mockNutritionProvider = MockNutritionPlansProvider();

when(mockNutritionProvider.currentPlan)
.thenAnswer((realInvocation) => getNutritionalPlanScreenshot());
when(mockNutritionProvider.items).thenReturn([getNutritionalPlanScreenshot()]);
when(mockNutritionProvider.items)
.thenReturn([getNutritionalPlanScreenshot()]);

final mockWeightProvider = MockBodyWeightProvider();
when(mockWeightProvider.items).thenReturn(getScreenshotWeightEntries());

final mockMeasurementProvider = MockMeasurementProvider();
when(mockMeasurementProvider.categories).thenReturn(getMeasurementCategories());
when(mockMeasurementProvider.categories)
.thenReturn(getMeasurementCategories());

final mockUserProvider = MockUserProvider();
when(mockUserProvider.profile).thenReturn(tProfile1);
Expand Down
Loading