From 8a57992fd5383e7c6456ecc243598d7e6d4219d6 Mon Sep 17 00:00:00 2001 From: daniel-michel <65034538+daniel-michel@users.noreply.github.com> Date: Sat, 11 Nov 2023 15:05:11 +0100 Subject: [PATCH] refactor: add method return types --- lib/api/wikidata_movie_api.dart | 88 ++++++++++++++++----------------- lib/model/date_format.dart | 56 +++++++++++++++++++++ lib/model/movie.dart | 4 +- lib/model/movie_manager.dart | 14 +++--- lib/view/movie_item.dart | 58 +--------------------- 5 files changed, 110 insertions(+), 110 deletions(-) create mode 100644 lib/model/date_format.dart diff --git a/lib/api/wikidata_movie_api.dart b/lib/api/wikidata_movie_api.dart index 97b9c0a..5d80940 100644 --- a/lib/api/wikidata_movie_api.dart +++ b/lib/api/wikidata_movie_api.dart @@ -27,7 +27,49 @@ class WikidataMovieData extends MovieData { } } -String createUpcomingMovieQuery(DateTime startDate, int limit) { +class WikidataMovieApi implements MovieApi { + ApiManager searchApi = ApiManager("https://www.wikidata.org/w/api.php"); + ApiManager queryApi = + ApiManager("https://query.wikidata.org/sparql?format=json"); + + @override + Future addMovieDetails(List movies) { + // TODO: implement addMovieDetails + throw UnimplementedError(); + } + + @override + Future> getUpcomingMovies(DateTime startDate, + [int count = 100]) async { + Response response = await queryApi.get( + "&query=${Uri.encodeComponent(_createUpcomingMovieQuery(startDate, count))}"); + if (response.statusCode != 200) { + throw Exception( + "The Wikidata request for upcoming movies failed with status ${response.statusCode} ${response.reasonPhrase}"); + } + Map result = jsonDecode(response.body); + List entries = result["results"]["bindings"]; + List movies = []; + for (Map entry in entries) { + String identifier = + RegExp(r"Q\d+$").firstMatch(entry["movie"]["value"])![0]!; + movies.add(WikidataMovieData( + entry["movieLabel"]["value"] as String, + DateTime.parse(entry["minReleaseDate"]["value"] as String), + _precisionFromWikidata(int.parse(entry["datePrecision"]["value"])), + int.parse(identifier.substring(1)))); + } + return movies; + } + + @override + Future> searchForMovies(String searchTerm) { + // TODO: implement searchForMovies + throw UnimplementedError(); + } +} + +String _createUpcomingMovieQuery(DateTime startDate, int limit) { String date = DateFormat("yyyy-MM-dd").format(startDate); return """ SELECT @@ -51,7 +93,7 @@ ORDER BY ?minReleaseDate LIMIT $limit"""; } -DatePrecision precisionFromWikidata(int precision) { +DatePrecision _precisionFromWikidata(int precision) { return switch (precision) { >= 11 => DatePrecision.day, 10 => DatePrecision.month, @@ -61,45 +103,3 @@ DatePrecision precisionFromWikidata(int precision) { _ => throw Exception("Unexpected precision value: $precision"), }; } - -class WikidataMovieApi implements MovieApi { - ApiManager searchApi = ApiManager("https://www.wikidata.org/w/api.php"); - ApiManager queryApi = - ApiManager("https://query.wikidata.org/sparql?format=json"); - - @override - Future addMovieDetails(List movies) { - // TODO: implement addMovieDetails - throw UnimplementedError(); - } - - @override - Future> getUpcomingMovies(DateTime startDate, - [int count = 100]) async { - Response response = await queryApi.get( - "&query=${Uri.encodeComponent(createUpcomingMovieQuery(startDate, count))}"); - if (response.statusCode != 200) { - throw Exception( - "The Wikidata request for upcoming movies failed with status ${response.statusCode} ${response.reasonPhrase}"); - } - Map result = jsonDecode(response.body); - List entries = result["results"]["bindings"]; - List movies = []; - for (Map entry in entries) { - String identifier = - RegExp(r"Q\d+$").firstMatch(entry["movie"]["value"])![0]!; - movies.add(WikidataMovieData( - entry["movieLabel"]["value"] as String, - DateTime.parse(entry["minReleaseDate"]["value"] as String), - precisionFromWikidata(int.parse(entry["datePrecision"]["value"])), - int.parse(identifier.substring(1)))); - } - return movies; - } - - @override - Future> searchForMovies(String searchTerm) { - // TODO: implement searchForMovies - throw UnimplementedError(); - } -} diff --git a/lib/model/date_format.dart b/lib/model/date_format.dart new file mode 100644 index 0000000..58958d0 --- /dev/null +++ b/lib/model/date_format.dart @@ -0,0 +1,56 @@ +String _durationApproximatedInWords(Duration duration) { + int seconds = duration.inSeconds; + int minutes = duration.inMinutes; + int hours = duration.inHours; + int days = duration.inDays; + int weeks = (days / 7).floor(); + int months = (days / 30).floor(); + int years = (days / 365).floor(); + int centuries = (years / 100).floor(); + if (duration == Duration.zero) { + return "now"; + } + if (seconds == 0) { + return "now"; + } + if (seconds < 60) { + return seconds > 1 ? "$seconds seconds" : "a second"; + } + if (minutes < 60) { + return minutes > 1 ? "$minutes minutes" : "a minute"; + } + if (hours < 24) { + return hours > 1 ? "$hours hours" : "an hour"; + } + if (days < 7) { + return days > 1 ? "$days days" : "a day"; + } + if (months == 0) { + return weeks > 1 ? "$weeks weeks" : "a week"; + } + if (years == 0) { + return months > 1 ? "$months months" : "a month"; + } + if (years < 100) { + return years > 1 ? "$years years" : "a year"; + } + return centuries > 1 ? "$centuries centuries" : "a century"; +} + +String _durationToRelativeTimeString(Duration duration) { + if (duration.isNegative) { + return "${_durationApproximatedInWords(-duration)} ago"; + } else if (duration == Duration.zero) { + return "now"; + } else { + return "in ${_durationApproximatedInWords(duration)}"; + } +} + +String dateRelativeToNow(DateTime date) { + DateTime dateOnly = DateTime.utc(date.year, date.month, date.day); + DateTime now = DateTime.now().toUtc(); + DateTime today = DateTime.utc(now.year, now.month, now.day); + Duration diff = dateOnly.difference(today); + return _durationToRelativeTimeString(diff); +} diff --git a/lib/model/movie.dart b/lib/model/movie.dart index 384d2fc..1d153bb 100644 --- a/lib/model/movie.dart +++ b/lib/model/movie.dart @@ -39,6 +39,8 @@ class MovieData extends ChangeNotifier { List? _titles; List? _reviews; + MovieData(this._title, this._releaseDate, this._releaseDatePrecision); + String get title { return _title; } @@ -139,8 +141,6 @@ class MovieData extends ChangeNotifier { return title == other.title && releaseDate == other.releaseDate; } - MovieData(this._title, this._releaseDate, this._releaseDatePrecision); - MovieData.fromJsonEncodable(Map json) : _title = json["title"], _releaseDate = DateTime.parse(json["releaseDate"]), diff --git a/lib/model/movie_manager.dart b/lib/model/movie_manager.dart index 6ba44ce..dc64894 100644 --- a/lib/model/movie_manager.dart +++ b/lib/model/movie_manager.dart @@ -53,11 +53,11 @@ class MovieManager extends ChangeNotifier { _loadCache(); } - _loadCache() async { + Future _loadCache() async { addMovies(await cache.retrieve()); } - _moviesModified({bool withoutAddingOrRemoving = false}) { + void _moviesModified({bool withoutAddingOrRemoving = false}) { cacheUpdater?.call(); if (!withoutAddingOrRemoving) { // only notify listeners if movies are added or removed @@ -90,7 +90,7 @@ class MovieManager extends ChangeNotifier { return actualMovies; } - _insertMovie(MovieData movie) { + void _insertMovie(MovieData movie) { int min = 0; int max = movies.length - 1; while (min - 1 < max) { @@ -105,7 +105,7 @@ class MovieManager extends ChangeNotifier { movies.insert(min, movie); } - removeMoviesWhere(bool Function(MovieData movie) test) { + void removeMoviesWhere(bool Function(MovieData movie) test) { bool removedMovies = false; for (int i = movies.length - 1; i >= 0; i--) { bool remove = test(movies[i]); @@ -128,11 +128,11 @@ class MovieManager extends ChangeNotifier { return addMovies(movies); } - expandDetails(List movies) { + void expandDetails(List movies) { api.addMovieDetails(movies); } - loadUpcomingMovies() async { + Future loadUpcomingMovies() async { try { loading = true; notifyListeners(); @@ -155,7 +155,7 @@ class LiveSearch extends ChangeNotifier { LiveSearch(this.manager); - updateSearch(String search) { + void updateSearch(String search) { searchTerm = search; } } diff --git a/lib/view/movie_item.dart b/lib/view/movie_item.dart index f21eaa3..b0005db 100644 --- a/lib/view/movie_item.dart +++ b/lib/view/movie_item.dart @@ -1,64 +1,8 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +import 'package:release_schedule/model/date_format.dart'; import 'package:release_schedule/model/movie.dart'; -String durationApproximatedInWords(Duration duration) { - int seconds = duration.inSeconds; - int minutes = duration.inMinutes; - int hours = duration.inHours; - int days = duration.inDays; - int weeks = (days / 7).floor(); - int months = (days / 30).floor(); - int years = (days / 365).floor(); - int centuries = (years / 100).floor(); - if (duration == Duration.zero) { - return "now"; - } - if (seconds == 0) { - return "now"; - } - if (seconds < 60) { - return seconds > 1 ? "$seconds seconds" : "a second"; - } - if (minutes < 60) { - return minutes > 1 ? "$minutes minutes" : "a minute"; - } - if (hours < 24) { - return hours > 1 ? "$hours hours" : "an hour"; - } - if (days < 7) { - return days > 1 ? "$days days" : "a day"; - } - if (months == 0) { - return weeks > 1 ? "$weeks weeks" : "a week"; - } - if (years == 0) { - return months > 1 ? "$months months" : "a month"; - } - if (years < 100) { - return years > 1 ? "$years years" : "a year"; - } - return centuries > 1 ? "$centuries centuries" : "a century"; -} - -String durationToRelativeTimeString(Duration duration) { - if (duration.isNegative) { - return "${durationApproximatedInWords(-duration)} ago"; - } else if (duration == Duration.zero) { - return "now"; - } else { - return "in ${durationApproximatedInWords(duration)}"; - } -} - -String dateRelativeToNow(DateTime date) { - DateTime dateOnly = DateTime.utc(date.year, date.month, date.day); - DateTime now = DateTime.now().toUtc(); - DateTime today = DateTime.utc(now.year, now.month, now.day); - Duration diff = dateOnly.difference(today); - return durationToRelativeTimeString(diff); -} - class MovieItem extends StatelessWidget { final MovieData movie; const MovieItem(this.movie, {super.key});